第二章 软件开发过程及其组织
1、软件危机:指随着软件功能越来越多,规模越来越大,复杂性越来越高,引出一系列的问题:软件产品交付拖延、错误多、不可靠、费用增大、不能适应应用变化等,因此怀疑大型软件的复杂性是否超越了人的处理能力。
2、水波效应:因修改程序带来的连带影响。当人们修改程序的某一处时,由于没有充分考虑到这一修改对相关部分带来的影响,结果出现了新的错误。(名词解释)
3、黑箱检验:输入一些信息,通过观察是否能得出预期输出来判断软件是否正确的一种软件测试方法。黑箱检验只能证明程序有错,而不能证明程序没错。(名词解释)
2.1 软件开发的困难
(1)软件开发中的两个转换过程
对于单个程序员来说,以下两个转换是做好软件工作的关键。首先是从用户的理解到程序员的理解之间的转换;程序的理解与程序的实现之间的转换。
保证第一个转换的手段:利用尽可能标准化的方法编写程序设计任务书,用明确的语言或图形、表格,把程序要处理的信息的内容、格式、来源、去向、存储与处理清楚地表达出来,作为双方共同的理解。
保证第二个转换的手段:提高程序员的知识水平与实践经验。
(2)大型软件开发中困难及原因
大型软件开发中的困难有:1)一致性的保持成为十分困难的问题。2)测试的困难大大增加。3)工作进度难以控制。4)文档与代码的协调十分困难。5)版本更新带来的问题。
困难产生的原因有:1)这些困难来自大系统的复杂性;2)许多具有主动性的个人和组织与协调带来大量的困难;3)各个应用领域之间的差别导致困难的加重;4)时间的因素,变化的因素给软件开发带来许多困难。
2.2 软件开发方法的发展
(3)为提高软件开发的水平和效率,人们提出的软件开发方法
面对软件开发中的种种困难和问题,几十年来,软件工作者先后提出的软件开发方法有:结构化程序设计方法、软件工程方法、面向对象的程序设计方法、即插即用的程序设计方法、面向开源软件的程序设计方法。
(4)用户、项目负责人、程序员和计算机四种角色在软件开发中应承担的任务?
用户:提出需求,验收软件,使用软件,提出修改要求;项目负责人:需求分析,分配任务,验收模块, 联调,交付使用,分析修改需求,验收修改成果;程序员:编写程序,模块高度,模块交付检验,修改软件,修改的软件交付检验;计算机:试运行。
(5)结构化程序设计的基本思想、原则(20世纪60年代产生的)
结构化程序设计的基本思想:把程序的结构分解成三种基本模块:处理单元、循环机制、二分决策机制,并保证模块的划分符合‘结构良好’的要求:1)模块的功能在逻辑上尽可能地单一化、明确化,最好做到一一对应;2)尽可能地减少模块之间的联系及相互影响,对于必需的联系都应当加以明确的说明。应当尽量避免逻辑耦合,而仅限于数据耦合;3)模块的规模应当足够小,以便使它本身的调试易于进行。
结构化程序设计的原则:1)限制甚至不用 GOTO 语句,绝对禁止超越模块边界的 GOTO 语句。2)子程序尽可能做到只有一个入口、一个出口。3)程序风格应尽量明确、清晰,包括适当增加注释,书写格式体现层次结构(如循环内的语句一致地右移两格),变量名称的选用尽量具有逻辑意义等。4)在程序编写的同时完成有关的文档编撰,不要拖延时间。
结构化程序设计的方法主要是为程序员服务的。其缺点是它增大了程序工作量,增加了编程中的麻烦与琐碎的工作,并且降低了程序的运行效率。但是它保证了软件的可靠、准确,而且使软件易于修改。
***模块的凝聚性:模块的功能在逻辑上尽可能地单一化、明确化,最好做到一一对应。即每一个模块实现一项明确的任务,反之每一项任务仅由一个模块来完成。此即为模块的凝聚性。
***模块间的耦合(耦合性):模块之间的联系及相互影响称为耦合。
***模块间逻辑耦合:如果模块间传递的是控制信号,则称模块间具有逻辑耦合。
(6)软件工程的基本思想和方法(20世纪80年代)
软件工程的思想来源于传统工程,要想大幅度地从根本上提高软件开发的效率和质量,就应当吸取人们在各种传统产业中的成功经验,从组织和管理的角度加强力量,使软件生产从程序员的个人劳动提高成为有组织的、可控制的工程。软件工程借鉴于传统工程的思想,从软件开发的经验中归纳出相应的工作步骤和交流标准,大家都来遵守和执行,从而保证软件开发的进度与质量。
软件工程的实施方法:
首先,对软件开发的工作过程进行规范。如IBM的AD/Cycle,对应用软件的开发过程做了如下划分和规定:
第一阶段,需求分析。了解企业的结构与功能,掌握组织及管理者的信息需求,弄清信息流通的实际情况。
第二阶段,分析设计。进行功能分析及数据分析,完成处理过程及数据库的逻辑设计。
第三阶段,编程阶段。完成具体的程序编写工作。
第四阶段,测试阶段。对已有代码进行认真检测与试用。
第五阶段,使用及维护阶段。组织使用者有效的使用,并及时检查与修正发现的错误。
在标准化方面主要从两个方面探索:1)表达方式的标准化,如统一规格的数据流程图、数据字典、模块结构图等。2)对工作的质量及检查制订标准,如在一定时候,作一定的检查。
(7)面向对象程序设计的基本思想
面向对象的方法是人们试图解决软件危机的一种尝试。面向对象的程序设计的基本思想归纳为以下几点:1)客观世界的任何事物都是对象,它们都有一些静态属性,也都有一些有关的操作。作为一个整体,这些对象对外不公开这些属性与操作。2)对象之间有抽象与具体,群体与个体,整体与部分等几种关系。这些关系则构成对象的网络结构。3)抽象的、较大的对象所具有的性质,包括静态属性和动态操作,自然地成为它的子类的性质,不必加以说明或规定。4)对象之间可以互送消息,这一消息可以是传送一个参数,也可以是使这个对象开始某个操作。
***对象与类的关系:类是对一组几乎相同的对象的描述。从一组对象中出公共数据与方法,并将它们保存在一类中,是面向对象功能的核心。类是创建对象的框架,而对象是类的实例。
(8)即插即用的程序设计的基本思想
即插即用程序设计:即插即用程序设计是一咱软件开发方法,它的基本思想是用制造硬件的思路来生产软件。
基本思想是:一部分人专门生产软件组件,而另一部分人则构造整个软件的结构,并且把软件组件插入这个结构,以便迅速完成大型软件的研制工作。
***开源软件:开放源代码的软件。由开发者或知识产权所有者开放该功能模块的源代码,提供给后继开发者免费使用。
2.3 软件开发过程的管理
(9)软件评价的主要方面(什么样的软件才是好软件?)
答: 1)正确性:正确地实现所要求的功能,准确地给出预定的输出结果;2)易用性:用户界面友好,符合实际用户的使用习惯与知识水平;3)效率:具有足够的速度,能在符合用户要求的时间限度内,给出所要求的处理结果;4)可靠性:具有足够的可靠性,能够在各种干扰下保持正常的工作;5)可维护性:程序易讯,结构良好,文档齐全,从而保证易于修改。
(10)一个好的项目组至少应当具备的条件
答:(1)有严格的工作规范和文档标准必须要有严格的、成文的工作规范和文档标准,而且应当为全体成员所熟知,并且切实得到遵守。(2)人员之间有严格的分工。除了程序员之外,必须有专门的秘书(负责文档的收集、审核 及保管),必须有专门的测试人员(负责测试和验收有关的部分),特别是要有专职的,不限于具体编程的项目负责人。(3)每个项目有详细的时间安排并严格执行每个项目都要事先制定详细的时间表,并且得到严格执行。每一项 目完成之后都有完整的资料,并得到妥善保存,一旦需要修改或更新版本时可以立即使用。
(11)项目组与程序员的关系(项目组对程序员的约束有哪些?)
答:(1)保证严格地在本模块范围内操作,决不要使用可能干扰其它模块的命令或函数。(2)严格按总体设计的要求和理解去传递参数值,决不要随意修改其内容或含义。(3)在对公用的文件或数据库进行存取时,必须完全地、 准确地按统一规定的格式去操作,决不能擅自改变。(4)在使用标识符时,应按照统一的原则,尽量使用易于看出逻辑含义的名称。特别是涉及公用数据及参数的时候。(5)严格按照统一的要求编写文档,在内容、格式、表达方 式、符号使用上遵循项目组的统一规定。(6)尽量保持程序风格的一致。如注释行的安排,行首空格的使用等。