1.6 工程的方法
软件工程(第4版•修订版)
理解了系统的本质之后,就可以开始构造系统了。在这一刻,软件工程中的“工程”部分就是密切相关的,并且使我们到目前为止所做的工作更加完美。回顾一下,本章开始我们谈到软件的编写不仅是一门科学,而且是一门艺术。生产系统的艺术是指软件产品的工艺。编写软件作为艺术的一面是,我们开发技术和工具,这些技术和工具已经被证明有助于生产有用的、高质量的产品。例如,我们可能将一个优化的编译器作为工具,来生成在我们使用的机器上快速运行的程序。或者,我们可能将特定排序和搜索程序作为节省系统时间和空间的技术。这些基于软件的技术只是作为技术,而工具则被用于打造精美的家具或用于盖房子。实际上,流行的编程工具集被称为程序员的工作平台,因为程序员对它们的依赖如同木匠对工作台的依赖。
因为构建系统类似于盖房子,我们可以将盖房子作为例子,来说明为什么“艺术”方法对软件开发是很重要的。
1.6.1 盖房子
假设Chuck和Betsy Howell要雇人为他们造一所房子。由于工程规模大,比较复杂,通常需要由多人组成的建筑队。因此,Howell夫妇雇佣了McMullen建筑公司。建造房子涉及的第一件事是,Howell夫妇与McMullen公司面谈,解释他们想要什么。这次会谈不仅探讨了Howell夫妇想要的房子的外观,也探讨了房子应该具有什么样的特征。然后,公司草拟出房子的建筑平面图和建筑透视图。在Howell夫妇与McMullen公司讨论了细节之后,又进行了一些修改。一旦Howell夫妇认可McMullen公司的方案,房子的建造就可以开始了。
在盖房子的过程中,Howell夫妇很可能亲临建房的现场,考虑他们想要进行的改变。整个盖房子的过程中可能会发生若干变化,但最终房子会建成。在建造的过程中以及Howell夫妇搬进来之前,会对房子的若干部分进行测试。例如,电工测试配线电路,管道工确保管道没有泄漏,而木匠调整木板的变形,使地板更光滑平整。最后,Howell夫妇搬了进来。如果有什么地方不合适,Howell夫妇可以叫McMullen公司来修复,但最终Howell夫妇完全负责这所房子。
我们现在进一步讨论这个过程涉及了哪些内容。首先,由于房子是由很多人同时建造的,所以文档资料是必需的。不但建筑平面图和建筑透视图是必需的,而且还需要写下细节,以便管道工和电工等专业人员可以随着房子建造的过程,把产品装配在一起。
其次,如果Howell夫妇只在这个过程的开始描述他们的房子,然后直到房子建成再来看,这是不合理的。相反,Howell夫妇在建造的过程中可能会多次修改房子的设计。这些修改可能出于以下几种情况。
最初指定的材料现在无法买到。例如,某种类型的瓦可能已经不再生产了。
在Howell夫妇看到房子已经成形的时候,他们可能又有了新的想法。例如,Howell夫妇可能意识到,再花点钱就可以给厨房增加一个天窗。
材料或资金限制可能迫使Howell夫妇改变他们的需求,以满足进度或预算。例如,房子要在冬天来临之前建造完成,而Howell夫妇想要预订的特殊窗子在这个时间内无法准备好,因此,可能用现成的窗子作为替代品。
最初认为是可行的项目或设计,后来可能被证明是不可行的。例如,土壤渗透性测试表明,房子周围的土地不能支撑Howell夫妇最初要求的那么多个浴室。
在房子开始建造之后,McMullen公司也可能建议进行一些变更,其原因也许是由于有更好的想法,也许是由于建筑队的某个关键成员无法工作了。并且,即使房子的某一方面已经建造完成,McMullen公司和Howell夫妇也有可能改变他们关于该处的想法。
最后,McMullen必须提供蓝图、布线和管道图、用具操作手册和其他文档,使Howell夫妇在入住之后能够进行修改或修理。
这个建造过程的总结如下。
确定和分析需求。
提出并文档化房子的总体设计。
提出房子的详细规格说明。
识别并设计房子的组成部分。
构建房子的每一个组成部分。
测试房子的每一个组成部分。
把房子的各个组成部分集成在一起,在住户搬进来之前做最后的修改。
由房子的住户持续进行维护。
我们已看到,参加人员必须保持灵活性,并能够在建造过程的各个点改变初始的规格说明。
房子是在社会、经济以及它所处的政府体系的背景下建造的,记住这一点很重要。就像图1-10所示的水系监控系统描述的各个子系统之间的依赖关系,我们必须把房子看作是一个大方案中的一个子系统。例如,房子的建造是在市或县的建设法规和条例的背景下完成的。McMullen的员工必须经过市或县的许可才能工作,并且必须按照建设标准进行施工。建设场所要经过建筑监理的检查,他们确保相关标准得到遵守。建筑监理设定质量的标准,检查作为建筑项目质量保证的检查点。社会或习惯的限制也可能成为常识性的或为人们所接受的行为。例如,房子的前门直接对着厨房或卧室是不符合习惯的。
同时,我们必须认识到,不可能一开始就准确地规定建造房子的活动,必须根据经验为决策留有余地,以处理未预料到的或非标准的情形。例如,许多房子都是根据预先制好的部件建造的,门已经装在框架中,浴室使用预制好的淋浴房等。但是,有时需要对标准化的房子建造过程进行修改,使之适应于特殊的特征或请求。假设框架已经搭好,水泥墙已经砌好,地板已经铺好,下一步就是在浴室的地面上铺设瓷砖。建筑人员沮丧地发现,墙和地面并不正好是正方形。这个问题并不是由于过程不当造成的,建造房子的部件有一些自然的或制造上的变形,因此会出现一些不太精确的情况。如果按照标准方式用小正方形铺设地砖的话,这些不精确的地方就会更加突出。这正是艺术和专业技术发挥作用的地方。建筑人员可能从垫层上取下瓷砖,然后每次铺一块,并对每一块做一些小的调整,使得除了辨别能力极强的人,一般人察觉不到这种变形。
因此,盖房子是一项复杂的任务,在建造的过程中,过程、产品或资源很多时候会发生变化,但都可通过艺术和专业知识进行适当的调剂。虽然盖房子过程可以标准化,但是,专家的判断力和创造性总是需要的。
1.6.2 构建系统
软件项目的进展方式与盖房子过程类似。在上面的例子中,Howell夫妇是客户和用户,McMullen是开发人员。假定Howell夫妇让McMullen建造的房子是要让Howell先生的父母住,那么,用户和客户就是不同的人了。同样地,软件开发涉及用户、客户和开发人员。如果让我们为某个客户开发一个软件系统,第一步是与客户会面以确定需求。正如我们前面所看到的那样,这些需求是对系统的描述。如果不了解边界、实体和活动,要描述软件及其与它的环境的交互是不可能的。
一旦定义了需求,我们就可以创建系统设计来满足指定的需求。正如在第5章中将要看到的,系统设计告诉客户,从客户的角度看,系统会是什么样的。就像Howell夫妇查看建筑平面图和建筑透视图一样,我们向客户展示将要使用的视频显示屏幕的图片、将要生成的报表以及任何其他解释用户将如何与完成的系统交互的相关描述。如果系统有手工备份或覆写过程,也要对其进行描述。起先,Howell夫妇只对房子的外观和功能感兴趣。到后来,他们必须决定是用铜管还是用塑料管。同样,软件项目的系统设计(也称为体系结构)阶段只描述外观和功能。
接着,客户要对设计进行评审。当设计得到批准后,整个系统设计将被用来生成其中单个程序的设计。请注意,直到这个步骤才会提到程序。在功能和外观确定之前,考虑编码是没有意义的。在建造房子的例子中,这一阶段准备讨论的是管道的类型或电线的质量。我们之所以能够决定是用塑料管还是用铜管,是因为我们现在知道了在建筑物中哪里会有水流过。同样,当系统设计被大家认可之后,就准备开始讨论程序了。讨论的基础是关于系统的软件项目的定义明确的描述,系统设计包含功能以及所涉及的相互关系在内的完整描述。
当程序编写完之后,必须在把它们链接到一起之前将其作为单独的代码段进行测试。这是测试的第一个阶段,称为模块测试或单元测试。一旦确信每段程序都能够按我们的期望来运行,就把它们组合到一起,并确保它们能够正确运行。这是第二个测试阶段,通常称为集成测试,因为它是逐步加入一部分来构建系统的,直到整个系统可以运转。最后的测试阶段称为系统测试,是对整个系统的测试,用于确保起初指定的功能和交互得以正确实现。在这个阶段,会把系统和需求进行比较。开发人员、客户和用户共同检查系统是否达到了希望的目标。
最后,交付最终产品。随着它的使用,差异和问题就会暴露出来。如果我们的系统是一个交钥匙系统,那么在移交之后客户将对该系统负责。可是,很多系统不是交钥匙系统,如果出现任何问题,或者需求发生变化,开发人员或其他组织要对其进行维护。
因此,软件的开发包含下面的活动。
需求分析和定义。
系统设计。
程序设计。
编写程序(程序实现)。
单元测试。
集成测试。
系统测试。
系统交付。
维护。
理想情况下,一次执行一个活动,当到达上述活动的结尾时,就完成了软件项目。但是,实际上,很多步骤是重复执行的。例如,在评审系统设计时,你和客户可能发现有些需求还没有进行文档化。你可能与客户一起工作,加入需求,有时可能要重新设计系统。类似地,当编写和测试代码时,你可能发现某个设备并没按照其文档描述的那样运行。你可能不得不重新设计代码,重新考虑系统设计,甚至回过头与客户讨论如何满足需求。由于这样的原因,我们将软件开发过程(software development process)定义为包含前面列出的9个活动(部分或全部)的软件开发的描述,对这些活动加以组织,以便生产经过测试的代码。第2章将探讨若干不同的软件开发过程。后面的章节中将研究从需求分析到维护的每个子过程和它们的活动。但是在研究它们之前,先来考虑一下谁开发软件以及软件开发面临的挑战在这些年发生了哪些变化。
本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。