p 第一篇 指南篇 2
书 第一篇 指南篇
第1章 软件工程概论 软件工程是在软件的应用得到逐步推广的过程中自然产生的。一方面,它逐渐发展出了 针对软件开发所遇到的共性问题的系列技术和方法,另一方面,它又遵从并不断借鉴了人类在 其他领域发展而来的工程化的思想。 通过回顾软件工程的历史,并了解其运用的工程思想,特别是目前流行的面向对象的软件 工程思想,有助于我们理解掌握软件工程方法。 1.1软件工程的发展历史 1.1.1第一台计算机和第一位程序员 世界上公认的第一台电子计算机是ENIAC(埃尼亚克),它问世于1946年2月14日,全 称是“电子数值积分计算机”,英文名为“Electronic Numerical Integrator and Computer”,它是 由美国宾夕法尼亚大学莫尔电子工程学院的莫尔小组承担研制的(见图1-1)。 图1-1世界上第一台电子计算机ENIAC |003
003 第1章 软件工程概论 软件工程是在软件的应用得到逐步推广的过程中自然产生的。一方面,它逐渐发展出了 针对软件开发所遇到的共性问题的系列技术和方法,另一方面,它又遵从并不断借鉴了人类在 其他领域发展而来的工程化的思想。 通过回顾软件工程的历史,并了解其运用的工程思想,特别是目前流行的面向对象的软件 工程思想,有助于我们理解掌握软件工程方法。 1.1 软件工程的发展历史 1.1.1 第一台计算机和第一位程序员 世界上公认的第一台电子计算机是ENIAC(埃尼亚克),它问世于1946年2月14日,全 称是“电子数值积分计算机”,英文名为“ElectronicNumericalIntegratorandComputer”,它是 由美国宾夕法尼亚大学莫尔电子工程学院的莫尔小组承担研制的(见图1 1)。 图1 1 世界上第一台电子计算机犈犖犐犃犆
但是,世界上首位程序员的出现却远远早于第一台电子 计算机,并且这个第一位程序员是位女士。她的名字叫 Augusta Ada LoveLace,l815年生于伦敦(见图1-2)。Ada设 计了巴贝奇分析机上求解伯努利方程的一个程序,并证明了 巴贝奇的分析器可以求解许多问题。在1843年Ada发表的 一篇论文里面提出机器可以用来创作音乐、制图以及进行科 学研究。同时,Ada还提出了循环和子程序等计算机的重要 概念,为计算设计了“算法”,并创作出了“程序设计流程图”。 因此,Ada被广泛地认为是世界上第一位程序员。为了纪念 她,1980年12月10日,一种新的计算机编程语言以她的名字 命名,那就是Ada。Ada曾广泛用于美国军方尖端武器开 发中。 图1-2世界上第一位程序员 1.1.2软件的发展和软件危机 Augusta Ada LoveLace 20世纪50年代,伴随着第一台电子计算机的问世,编程语言开始出现,相应地,计算机软 件诞生了,以写软件为职业的人也逐渐开始出现,他们是真正意义上的程序员。最开始,这些 程序员大多是一些有经验和经过训练的电子工程师甚至是数学家。 在计算机发展的初期(20世纪60年代中期以前),计算机主要用于军事领域,后来才慢慢 普及到民用领域。那时候硬件作用十分单一,通常只能用来执行一个程序。当时的计算机硬 件也非常昂贵,编程人员必须在有限的处理器性能和极小的储存空间限制下,编写出执行速度 快、占用空间小的程序,因而程序的编写充满了各种技巧,又带有个人色彩。当时的软件开发 主要依赖程序员的聪明才智,同时,软件除了源代码以外,几乎没有文档等附属产品。软件的 开发没有什么系统的方法。 20世纪60年代到70年代,计算机领域进入了比较快速的发展时期,正是在这一时期,软 件从军用扩展到了民用,并作为一种广泛存在的产品为人们所接受。这个时期的一个重要特 征是出现了“软件作坊”。但是,“软件作坊”采用的仍然是早期的个体软件开发的方式,几乎没 有团队的协调与沟通。随着软件需求量的急剧增长,软件的需求也日益复杂,个体化开发的方 式越来越难以满足社会的需求。复杂的软件也带来了大量的维护问题,然而许多程序的个体 化特征使得它们最终成为不可维护的。随着计算机应用的日益普及,软件数量急剧上升,失败 的软件项目也开始层出不穷,这一现象引起了普遍的关注,因而出现了“软件危机”这一说法。 1968年北大西洋公约组织的计算机科学家在联邦德国召开学术会议,正是在这次会议上,“软 件危机”第一次正式提出。 下面介绍5起历史上著名的软件灾难: 1)水手号(Mariner)的致命BUG(1962年) 损失:1850万美元 携带空间探测器的水手1号(The Mariner 1)火箭前往金星,在起飞后不久就偏离了预定 航线。任务控制系统不得不在起飞293秒后摧毁了火箭。原因是一名程序员把一条手写的公 式编写为错误的计算机代码,其中漏了一个横杠上标。少了横杠指明的平滑函数,软件就把速 率的正规变分视为严重的错误,并对该错误进行了修正,从而将火箭引导偏离了航向。 004
004 图1 2 世界上第一位程序员 犃狌犵狌狊狋犪犃犱犪犔狅狏犲犔犪犮犲 但是,世界上首位程序员的出现却远远早于第一台电子 计算机,并且这个第一位程序员是位女士。她的名字叫 AugustaAdaLoveLace,1815年生于伦敦(见图1 2)。Ada设 计了巴贝奇分析机上求解伯努利方程的一个程序,并证明了 巴贝奇的分析器可以求解许多问题。在1843年 Ada发表的 一篇论文里面提出机器可以用来创作音乐、制图以及进行科 学研究。同时,Ada还提出了循环和子程序等计算机的重要 概念,为计算设计了“算法”,并创作出了“程序设计流程图”。 因此,Ada被广泛地认为是世界上第一位程序员。为了纪念 她,1980年12月10日,一种新的计算机编程语言以她的名字 命名,那就是 Ada。Ada曾广泛用于美国军方尖端武器开 发中。 1.1.2 软件的发展和软件危机 20世纪50年代,伴随着第一台电子计算机的问世,编程语言开始出现,相应地,计算机软 件诞生了,以写软件为职业的人也逐渐开始出现,他们是真正意义上的程序员。最开始,这些 程序员大多是一些有经验和经过训练的电子工程师甚至是数学家。 在计算机发展的初期(20世纪60年代中期以前),计算机主要用于军事领域,后来才慢慢 普及到民用领域。那时候硬件作用十分单一,通常只能用来执行一个程序。当时的计算机硬 件也非常昂贵,编程人员必须在有限的处理器性能和极小的储存空间限制下,编写出执行速度 快、占用空间小的程序,因而程序的编写充满了各种技巧,又带有个人色彩。当时的软件开发 主要依赖程序员的聪明才智,同时,软件除了源代码以外,几乎没有文档等附属产品。软件的 开发没有什么系统的方法。 20世纪60年代到70年代,计算机领域进入了比较快速的发展时期,正是在这一时期,软 件从军用扩展到了民用,并作为一种广泛存在的产品为人们所接受。这个时期的一个重要特 征是出现了“软件作坊”。但是,“软件作坊”采用的仍然是早期的个体软件开发的方式,几乎没 有团队的协调与沟通。随着软件需求量的急剧增长,软件的需求也日益复杂,个体化开发的方 式越来越难以满足社会的需求。复杂的软件也带来了大量的维护问题,然而许多程序的个体 化特征使得它们最终成为不可维护的。随着计算机应用的日益普及,软件数量急剧上升,失败 的软件项目也开始层出不穷,这一现象引起了普遍的关注,因而出现了“软件危机”这一说法。 1968年北大西洋公约组织的计算机科学家在联邦德国召开学术会议,正是在这次会议上,“软 件危机”第一次正式提出。 下面介绍5起历史上著名的软件灾难: 1)水手号(Mariner)的致命BUG(1962年) 损失:1850万美元 携带空间探测器的水手1号(TheMariner1)火箭前往金星,在起飞后不久就偏离了预定 航线。任务控制系统不得不在起飞293秒后摧毁了火箭。原因是一名程序员把一条手写的公 式编写为错误的计算机代码,其中漏了一个横杠上标。少了横杠指明的平滑函数,软件就把速 率的正规变分视为严重的错误,并对该错误进行了修正,从而将火箭引导偏离了航向。
2)哈特福德体育场倒塌事件(1978年) 损失:7000万美元,以及给当地经济造成的2000万美元损失 当成千上万的球迷离开哈特福德体育场几个小时后,钢结构的体育场屋顶就被湿雪压垮 了。原因是CAD软件的程序员在设计体育场时错误地假设钢结构屋顶的支撑仅承受纯压 力。但当其中的一个支撑意外地因大雪垮塌后,引发了连锁反应,导致屋顶的其余部分像多米 诺骨牌一样相继倒掉。 3)苏联天然气管道爆炸(1982年) 损失:数百万美元,并严重破坏了苏联经济 控制软件出故障造成跨西伯利亚输气管道压力急剧上升,导致了历史上最大的人为非核 爆炸。据说,CLA侦探在苏联购买的用于控制输气管道的系统内植入了一个BUG。 4)几乎引发第三次世界大战的导弹误报事件(1983年) 损失:将近全人类的毁灭 苏联预警系统误报美国发射了5枚弹道导弹。幸运的是,苏联的执勤官认为如果美国真 的要攻击苏联的话,发射的导弹肯定不止5枚,因此他把这次攻击报告界定为一次误报。误报 的原因是苏联预警系统中有一个BUG,该系统误将阳光反射云顶识别为导弹。 5)医疗器械致死案(1985年) 损失:死亡3人,严重受伤3人 加拿大的Therac-25放射治疗仪发生了故障,令病人受到了致命的辐射。原因是软件中 一个称为竞态条件(race condition)的细小BUG,一名技术人员可能在病人尚未进行适当防护 的情况下意外地将Therac-25配置为高能模式。 在http:/www.devtopics..com/20-famous-software-disasters/上可以找到更多这样的 例子。软件危机的出现,让人们对软件的开发有了更深入的研究和更多的反思,并开始改变对 软件的一些不正确看法。易懂、易用、易修改、易维护等软件工程提倡的理念逐渐被大众所 接受。 1.1.3软件工程的提出 在1968年北大西洋公约组织的计算机科学家的会议上集中讨论了如何应对“软件危机”, 在这次会议上,第一次提出了“软件工程”。 “软件工程”是一门研究系统、规范、合理化软件开发的学科。软件工程运用工程学的原则 和方法重新制订了软件开发的流程和方案。具体来说,软件工程涉及两大方面主要内容,首先 是软件开发的技术,其次是软件开发的管理。这二者缺一不可。其中软件开发技术主要包括 了软件开发方法、工具、环境等,软件开发管理则包括了软件开发周期管理、开发人员管理、进 度管理等内容。 软件工程发展至今,大致可以分为结构化软件工程(也称为传统软件工程)和面向对象软 件工程(也称为现代软件工程)。结构化软件工程围绕功能、数据和数据流展开分析和设计,以 模块为中心,自顶向下、逐步求精完成软件设计,系统是实现模块功能的函数和过程的集合。 而面向对象软件工程则以对象为核心,通过识别系统中的类,定义对象之间的交互,考虑类的 代码实现从而完成系统分析和设计。 然而,软件工程目前依然不够成熟。不同的人对软件开发持有不同的观,点,如以C.A.R. |005
005 2)哈特福德体育场倒塌事件(1978年) 损失:7000万美元,以及给当地经济造成的2000万美元损失 当成千上万的球迷离开哈特福德体育场几个小时后,钢结构的体育场屋顶就被湿雪压垮 了。原因是CAD软件的程序员在设计体育场时错误地假设钢结构屋顶的支撑仅承受纯压 力。但当其中的一个支撑意外地因大雪垮塌后,引发了连锁反应,导致屋顶的其余部分像多米 诺骨牌一样相继倒掉。 3)苏联天然气管道爆炸(1982年) 损失:数百万美元,并严重破坏了苏联经济 控制软件出故障造成跨西伯利亚输气管道压力急剧上升,导致了历史上最大的人为非核 爆炸。据说,CIA侦探在苏联购买的用于控制输气管道的系统内植入了一个BUG。 4)几乎引发第三次世界大战的导弹误报事件(1983年) 损失:将近全人类的毁灭 苏联预警系统误报美国发射了5枚弹道导弹。幸运的是,苏联的执勤官认为如果美国真 的要攻击苏联的话,发射的导弹肯定不止5枚,因此他把这次攻击报告界定为一次误报。误报 的原因是苏联预警系统中有一个BUG,该系统误将阳光反射云顶识别为导弹。 5)医疗器械致死案(1985年) 损失:死亡3人,严重受伤3人 加拿大的Therac 25放射治疗仪发生了故障,令病人受到了致命的辐射。原因是软件中 一个称为竞态条件(racecondition)的细小BUG,一名技术人员可能在病人尚未进行适当防护 的情况下意外地将Therac 25配置为高能模式。 在http://www.devtopics.com/20 famoussoftwaredisasters/上可以找到更多这样的 例子。软件危机的出现,让人们对软件的开发有了更深入的研究和更多的反思,并开始改变对 软件的一些不正确看法。易懂、易用、易修改、易维护等软件工程提倡的理念逐渐被大众所 接受。 1.1.3 软件工程的提出 在1968年北大西洋公约组织的计算机科学家的会议上集中讨论了如何应对“软件危机”, 在这次会议上,第一次提出了“软件工程”。 “软件工程”是一门研究系统、规范、合理化软件开发的学科。软件工程运用工程学的原则 和方法重新制订了软件开发的流程和方案。具体来说,软件工程涉及两大方面主要内容,首先 是软件开发的技术,其次是软件开发的管理。这二者缺一不可。其中软件开发技术主要包括 了软件开发方法、工具、环境等,软件开发管理则包括了软件开发周期管理、开发人员管理、进 度管理等内容。 软件工程发展至今,大致可以分为结构化软件工程(也称为传统软件工程)和面向对象软 件工程(也称为现代软件工程)。结构化软件工程围绕功能、数据和数据流展开分析和设计,以 模块为中心,自顶向下、逐步求精完成软件设计,系统是实现模块功能的函数和过程的集合。 而面向对象软件工程则以对象为核心,通过识别系统中的类,定义对象之间的交互,考虑类的 代码实现从而完成系统分析和设计。 然而,软件工程目前依然不够成熟。不同的人对软件开发持有不同的观点,如以C.A.R.