《软件工程(第4版?修订版)》—第1章1.6节工程的方法

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章将探讨若干不同的软件开发过程。后面的章节中将研究从需求分析到维护的每个子过程和它们的活动。但是在研究它们之前,先来考虑一下谁开发软件以及软件开发面临的挑战在这些年发生了哪些变化。

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

时间: 2024-10-25 11:40:54

《软件工程(第4版?修订版)》—第1章1.6节工程的方法的相关文章

《软件工程(第4版?修订版)》—第1章1.5节 系统的方法

1.5 系统的方法 软件工程(第4版•修订版) 我们开发的项目并不存在于真空中.通常,我们装配在一起的硬件和软件,必须与用户.其他软件任务.其他部分的硬件.现有数据库(即仔细定义的数据集合和数据关系)甚至其他的计算机系统进行交互.因此,为任何项目提供一个背景是非常重要的,该背景就是项目的边界(boundary):项目中包含什么,不包含什么.例如,假设主管让你编写一段程序为办公室的人员打印工资单.你必须知道你的程序是否只是简单地从另一个系统中读入工作时间并且打印结果,还是必须同时计算工资信息.类似

《Ruby程序员修炼之道》(第2版)—第1章1.1节进入Ruby的世界

第1章 进入Ruby的世界 Ruby程序员修炼之道(第2版) 本章主要内容 Ruby语法的生存工具箱① Ruby基础编程指引:程序编写.保存.运行和错误检查 Ruby安装指南 Ruby的扩展机制 Ruby中易用的命令行工具,包括交互式Ruby解释器(irb) 本书的内容是Ruby基础,而本章是基础中的基石.本章的目标是让读者在开始学习Ruby之前掌握足够的知识和技巧. 接下来读者将看到Ruby的基本语法和技术,以及Ruby的运行机制:如何写一个程序,怎样使用Ruby运行程序,以及如何把一个程序分

《Ruby程序员修炼之道》(第2版)—第1章1.4节易用的Ruby工具和应用程序

1.4 易用的Ruby工具和应用程序 安装Ruby后,就可以得到一组重要的命令行工具,它们被安装在配置信息bindir所指定的文件夹中,通常是/usr/local/bin./usr/bin或者/opt同等的目录中.(可以使用require "rbconfig"去测试一下RbConfig::CONFIG["bindir"]返回的结果.)这些命令行工具具体是以下几个. ruby:解释器. irb:Ruby交互式解释器. - rdoc和ri:Ruby文档工具. rake:

《软件测试技术大全:测试基础 流行工具 项目实战(第3版)》—第1章1.6节模拟面试问答

1.6 模拟面试问答 本章介绍的是软件测试相关的背景,以及软件测试的发展情况等.身为软件测试员,应该或多或少地了解软件测试的发展动态,及其相关的历史事件等内容,这样无论是在与同行交流,向开发人员介绍和讲解测试,还是在应聘面试中,都会有更多的话题. 一般在应聘过程中,面试官可能会问到以下一些问题,读者可以根据自己的了解以及在本章中学到的内容做出相应的回答. (1)您觉得目前的软件测试行业的现状是怎样的? 参考答案:目前的软件测试行业在国内正在蓬勃地发展中,但是由于起步比较晚,虽然大部分公司都已经设

《Ruby程序员修炼之道》(第2版)—第1章1.3节Ruby扩展和编程库

1.3 Ruby扩展和编程库本节的要点并不是关于Ruby标准库的参考.曾在引言中解释过,本书的目标不是编写一本Ruby语言的参考文档,而是教会读者使用Ruby语言并掌握它,并最终拓宽视野. 相应地,本节的目标是讲述扩展的工作方式,即如何使用Ruby运行这些扩展.它们之间技术实现的不同,并最终能让用户自己编写扩展和库文件的扩展架构. 随Ruby发布的扩展通常全部作为标准库来引用.标准库包括为不同项目和任务所提供的扩展,如数据库管理.网络.数学领域.XML处理等.标准库精密的结构每次改变,哪怕只有一

《Ruby程序员修炼之道》(第2版)—第1章1.2节剖析Ruby的安装

1.2 剖析Ruby的安装在系统上安装Ruby意味着在许多磁盘目录中安装了Ruby语言的库和支持文件.大多数时候,Ruby都知道如何找到其所需要的这些目录而不用弹出提示.但是了解Ruby安装的知识对了解Ruby本身大有益处. 查看Ruby的源代码 除了Ruby安装目录体系之外,Ruby的源代码目录也安装好了.如果没有,可以到Ruby的主页中下载.源代码目录中包含了许多在最终安装中出现的Ruby文件和许多已编译为目标文件并安装好的C语言文件.另外,源代码目录包含了一些如ChangeLog和软件授权

《OOD启思录》—第2章2.2节消息和方法

2.2 消息和方法OOD启思录对象应当被看作机器,机器只为提出恰当请求的人执行公有接口所定义的操作.因为对象独立于使用者,也因为一些实现了面向对象概念的早期语言的语法,术语"发送消息"用于描述执行对象的行为.当消息被发送至对象,它必须判断是否理解该消息.如果理解,那么对象就把消息映射为一个函数调用,并把自身作为隐含的第一个参数传递过去.对解释语言而言,判断是否理解一个消息是在运行时完成的,而编译语言则是在编译时完成的. 对象行为的名称(或者原型)被称作消息(message).许多面向对

《软件工程(第4版?修订版)》—第1章1.11节本章对单个开发人员的意义

1.11 本章对单个开发人员的意义软件工程(第4版•修订版)本章介绍了许多概念,它们对于优秀的软件工程研究和实践来说都很重要.单个的软件开发人员可以通过下面的方法使用这些概念. 当有一个问题需要解决时(无论解决方案是否涉及软件),可以通过把问题分解成不同的组成部分和各部分之间的关系来分析问题.然后,解决单个子问题并把它们合并成为统一的整体,从而产生一个解决方案.必须理解需求可能发生变化,即使在分析问题.形成解决方案时需求也会变化.因此,解决方案必须是良好文档化的并且具有灵活性的,还应该把假设和使

《软件工程(第4版?修订版)》—第1章1.13节本章对研究人员的意义

1.13 本章对研究人员的意义软件工程(第4版•修订版)本章所讨论的许多问题是值得进一步研究的好课题.我们已经指出了软件工程中一些悬而未决的问题,包括需要找到以下几项. 适当的抽象级别:使得问题易于解决.适当的测度:使得问题和解决方案的本质可见且有用.适当的问题分解方法:使得每一个子问题都是可解决的.通用框架和表示法:允许方便有效的工具集成,使项目参加者之间的交流最有效.在后面的章节中我们会描述许多技术,其中一些一直在使用,并且是被软件开发实践充分证明的.而其他一些技术是提议性质的,只在一些小的