什么是软件工程

论坛 期权论坛 金融     
s997i   2022-6-17 15:42   2748   0
软件工程是组织一个团队、协作进行一个大型软件开发的学问。
请注意我这里强调的两个词,“协作”和“大型”。很多大学生在学习这门课的过程中,容易产生这门课“不实用”的偏见,但这只是因为你们现在所接触的事情,完全没有到达可以称之为“工程”的程度。
软件的规模,我们常常用“人月”这个单位来形容,1人月,就是说一个开发人员,工作一个月的工作量。也许你会觉得60人月,你也可以自己埋头苦干五年,而不需要任何协作,但实际上的大型工程,通常需要数百甚至数千人月的工作量,这是一个人不可能完成的事情。
规模的扩大还会引来各种各样的问题。举例来说,如果你的小软件,只有三五个用户,那么当它出现了一个小问题——一个常见的情景是,这个问题你可以通过训练用户,采取另一种使用方式来规避,又或者,你可以花上一个星期来修复它。对于用户数很少的情况,显然前者是更划算的——它大概只需要培训一小批用户大约1-2小时。但如果用户规模高达数百万呢?那你只能选择后面的方案。这意味着,软件的规模越大,它对质量的要求也会随之增加。
软件工程,就是一门告诉你如何做好大型软件的学科。对于想要在这个行业一直走下去的同学来说,这门课非常重要。因为软件最大的价值就是规模,软件和传统行业相比,最大的优势就是边际成本——软件多一个用户使用,对于开发者来说,是几乎没有成本的。因此,软件必然朝着大规模的方向发展。而你,作为这个行业的参与者之一,随着你的水平提升,你所接触的软件规模也会越来越大。
我们今天首先讲讲,在开发软件的过程中,我们究竟要关注哪些指标——而后,在这门课中,我们会陆续的讲解,如何做好这些事情。
可维护性
可维护性,是指我们编写出的代码,是否容易理解,是否容易修改。
从现代软件的发展情况来看,需求的频繁变更和扩展是大势所趋,并且它已经成为了软件开发过程中的最消耗时间的部分,以至于我们需要从最初开发软件的时候,就重视起这个问题。
可维护性的一个重要特征是代码具备良好的文档。一个优秀的文档应该描述清楚工程的主体结构,它应该像是一个工程的蓝图,一本图书的大纲和目录。它的目的是让人们能够无须阅读数千万行的代码,就能了解这些代码的工作原理、核心流程。
可维护性的另一个重要特征是代码的局部性。意思是说,当我们需要对代码进行修改时,原代码应该保证我们需要修改的东西尽量集中在一个很小的范围——可能是一个模块,一个类,一个函数,甚至一个配置文件中。我们以后会学习到的各种编码原则,设计模式等,都是为了这个目标服务的。一个优秀的软件项目,在你为其添加一个功能时,你只需要为其添加一些你新编写的文件,并只修改源工程中一两行代码。而一个糟糕的项目中,你可能需要在原工程中按照某个冗长的操作指南,修改分散在数十个文件中内容,才能让你的新功能嵌入到工程中。
性能
性能这个词可能很多新手也已经非常熟悉了,它指的就是软件运行的效率,占用的硬件资源。但新人最容易忽视的一点是——性能一定是和软件的运行场景密切相关的。
一些情况下,我们需要极致的时间性能。这通常是一些实时系统,例如汽车驾驶,无人机控制,或者一些科研仪器中。这些场景的共性是,毫秒、甚至微秒级的延时都是不可接受的。
另一些情况下,我们需要极致的空间性能。这常见于一些单片机系统,这可能是因为我们的软件要部署的目标位置对空间或重量限制较大,没有足够的内存供我们使用。
还有一些情况下,我们需要极致的并发性能。这常见于大规模的互联网应用,他们通常需要承载数千万,甚至数亿的人同时访问。
而大多数情况下,我们根本不需要极致的性能——很多软件工程师都把他们的时间浪费在无意义的性能优化上,而没有意识到他们的软件根本不会在这些场景下使用。而性能优化,恰恰是软件行业中技术含量最高,最昂贵的内容之一。
了解你的工程会被应用到什么场景,需要什么样的性能标准,是非常重要的。
安全性
安全性主要包括了两个方面,一个是软件本身的可靠性,另一个则是软件中的信息是否会被窃取。
软件本身的可靠性在某些情况下尤其重要——比如火箭发射控制程序,医疗设备控制程序等。如果为病人供应氧气的设备的软件系统在运行中崩溃了,如果你的汽车在高速公路上自动驾驶时驾驶软件崩溃了,后果都是非常可怕的。
而信息安全出现的场景则更为常见一些,普通的信息泄露,可能导致你的账号密码丢失,严重的信息泄露,可能导致你的网络交易被冒名顶替,甚至银行账户被盗刷。在你开发和密码、金融相关的软件项目时,你需要尤其注意这些事情——但他们不属于软件工程这门课的探讨范围,你需要专门学习一门叫做信息安全的课程。
移植性
随着现代设备越来越多样化,可移植性也变得越来越重要。可移植性是指把你的软件从一个平台潜移到另一个平台有多容易。理想情况下,我们可以只开发一套代码,它可以在任意平台,无论是windows、linux、MacOS、还是各种各样的手机。有很多软件开发库为我们提供了技术方案。例如Qt就号称支持所有常见的设备和系统,UniApp则号称支持所有常见的手机原生系统和各类嵌入式小程序(例如微信小程序、支付宝小程序)
除了这些软件指标,我还想和大家强调一下这个行业的一些基本道德准则。
首先,不要做违反法律的事情——很多人对这件事毫无概念,他们毫无心理压力的利用自己的技术优势和对方工程师犯下的错误窃取、篡改各种敏感信息(很多人还骄傲的自诩为黑客)。作为一个成年人,你应该知道什么是法律禁止你做的,并且你应该清楚的知道违反法律的后果。在我国,你还需要注意各种信息管理条例——他们通常涉及对公众散播信息(例如你想自己搭建一个可以注册账号,可以自由发布言论的网站,你应该先仔细了解我国对相关内容的规定)
第二,不要做违背公众利益的事情——实际上这些事情大多数也可以概括到第一条里,但有时候法律可能没有那么完善,但并不代表你不会为此付出代价。一个简单的例子是,想象你现在是疫情期间健康码的开发者,你的领导要求你为他留一个后门,可以在后台偷偷将某些人的红码标记为绿码——这就是典型的不能做的事情。一旦事情曝光出去,最后你这个实际代码提交人肯定脱不了干系。
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:
帖子:
精华:
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP