第一章 软件工程概述
软件是计算机程序及其有关的数据和文档的结合。
软件危机是指在计算机软件开发和维护时所遇到的一系列问题。
软件危机主要包含两方面的问题:一是如何开发软件以满足对软件日益增长的需求;二是如何维护数量不断增长的已有软件。
软件工程是软件开发、运行、维护和引退的系统方法。
软件工程是指导计算机软件开发和维护的工程学科。软件工程采用工程的概念、原理、技术和方法来开发与维护软件。软件工程的目标是实现软件的优质高产。
软件工程学的主要内容是软件开发技术和软件工程管理。
软件开发方法学是编制软件的系统方法,它确定软件开发的各个阶段,规定每一阶段的活动、产品、验收的步骤和完成准则。常用的软件开发方法有结构化方法、面向数据结构方法和面向对象方法等。
习题参考答案:
1.什么是软件危机?为什么会出现软件危机?
答:软件危机是指在计算机的开发和维护过程中所遇到的一系列严重问题。这些问题决不仅仅是不能正常运行的软件才具有的,实际上,几乎所有软件都不同程度地存在这些问题。 出现软件危机的原因:一方面与软件本身的特点有关,另一方面也和软件开发与维护的方法不正确有关。软件不同于硬件,它是计算机系统中逻辑件而不是物理部件。管理和控制软件开发过程相当困难。软件是规模庞大,而且程序复杂性将随着程序规模的增加而呈指数上升。目前相当多的软件专业人员对软件开发和维护还有不少糊涂观念,在实践过程中或多或少地采用了错误的方法和技术,这是使软件问题发展成软件危机的主要原因。总结如下:
1) 取得正确的用户需求和正确地描述需求很困难 2) 开发人员对需求的正确理解也有困难 3) 常常在没有正确理解之前就仓促开始编程 4) 软件项目缺乏有效的组织、管理和内部交流 5) 缺乏软件开发方法、模型和工具的支持 6) 软件维护的困难性
2.假设你是一家软件公司的总工程师,当你把图1.1给手下的软件工程师们观看,告诉他们及早发现并改正错误的重要性时,有人不同意你的观点,认为要求在错误进入软件之前就清除它们是不现实的,并举例说:“如果一个故障是编码错误造成的,那么,一个人怎么能在设计阶段清除它呢?”你怎么反驳他?
答:在软件开发的不同阶段进行修改付出的代价是很不相同的,在早期引入变动,涉及的面较少,因而代价也比较低;在开发的中期,软件配置的许多成分已经完成,引入一个变动要对所有已完成的配置成分都做相应的修改,不仅工作量大,而且逻辑上也更复杂,因此付出的代价剧增;在软件已经完成时再引入变动,当然付出的代价更高。一个故障是代码错误造成的,有时这种错误是不可避免的,但要修改的成本是很小的,因为这不是整体构架的错误。
3.什么是软件工程?它有哪些本质特性?怎样用软件工程消除(至少是缓解)软件危机?
答:软件工程是指导计算机软件开发和维护的一门工程学科。采用工程的概念、原理、技术和方法来开发和维护软件,把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来,以经济地开发出高质量的软件并有效地维护它。
软件工程本质特性:1)软件工程关注于大型程序的构造;2)软件工程的中心课题是控制复杂性;3)软件经常变化;4)开发软件的效率非常重要;5)和谐地合作是开发软件的关键;6)软件必须有效地支持它的用户;7)在软件工程领域中是由具有一种文化背景的人替具有另一种文化背景的人创造产品。 消除软件危机的途径:为了消除软件危机,首先应该对计算机软件有一个正确的认识。必须充分认识到软件开发不是某种个体劳动的神秘技巧,而应该是一种组织良好、管理严密、各类人员协同配合、共同完成的工程项目。应该推广使用在实践中总结出来的开发软件的成功的技术和方法,并且研究探索更好更有效的技术和方法,尽快消除在计算机系统早期发展阶段形成的一些错误概念和做法。应该开发和使用更好的软件工具。为了解决软件危机,既要有技术措施(方法和工具),又要有必要的组织管理措施。
6.美国某科幻电影中有一个描写计算机软件错误的故事,很富于戏剧性。故事情节如下:
由计算机HAL控制的宇宙飞船在飞往木星的旅途中,飞机指挥员鲍曼和HAL之间有一段对话。鲍曼命令道:“HAL,请对备用舱进行故障预报测试。”10秒钟后HAL报告:“一切正常。”
但是,地面上的飞行指挥中心在重复做了故障预测报告后,却得出了相反的结论:“鲍曼,我是飞行指挥中心,你的计算机在预报故障时可能犯了错误,我们的两台HAL计算机都得出了和你的计算机相反的结论。”
鲍曼用手指敲着控制台说:“HAL,是不是有什么东西干扰了你,以致出了这个差错?”
“听着,鲍曼,我知道你很想帮助我,但是我的信息处理是正常的。不信就查看我的记录吧,你会看到它是完全正确的。”
“我看过你的服务记录,但是……谁都可能犯错误啊。” “我并不固执己见,但是,我是不可能犯错误的……。”
“喂,我是飞行指挥中心,我们已经彻底分析了你所遇到的麻烦,我们的两台计算机得出了完全一致的结论。问题出在故障预报系统中,我们确信是程序设计有错误。你必须断开你的计算机并改为地面控制模式,我们才能改正这个错误。”
当鲍曼断开计算机时,HAL立即又把自己接了上去。最后,鲍曼只好拆下计算机的存储器,才得以控制他的宇宙飞船。 请问:
(1)为什么鲍曼拆下存储器就能摆脱计算机的干扰而独自控制宇宙飞船?我们现在遇到的软件问题有这么严重吗?
(2)如果不依靠飞行指挥中心,鲍曼怎样才知道HAL的故障预报有问题? (3)应该怎样设计计算机系统,才能避免出现故事中描述的这类问题? 答:(1)计算机通过运行程序来控制宇宙飞船,而程序指令存放在存储器中。拆下存储器之后,计算机因取不来指令而无法运行程序,因此也就无法控制宇宙飞船了。
我们现在遇到的软件问题没有这么严重,还没有出现计算机不服从人的命令的情况。
(2)除非鲍曼能亲自分析有故障的部件,或者在计算机上还安装有另外一套故障检测系统,否则不依靠飞行指挥中心他很难知道HAL的故障预报有问题。
(3)应该把HAL设计成具有若干个储存的问题,供周期性测试之用。通过把应有的测试结果和HAL实际测试结果加以比较的方法,有可能发现HAL的故障预报问题。
此外,不论怎样具体设计HAL系统,都应该设置一种人工操作模式,并把人工操作模式设置为最高等级的控制模式,在任何情况下计算机控制都不能取消人工操作命令。
第二章 软件过程
软件过程定义了运用方法的顺序、应该交付的文档、开发软件的管理措施、各阶段任务完成的标志。
软件过程必须科学、合理,才能获得高质量的软件产品。
软件产品从问题定义开始,经过开发、使用和维护,直到最后被淘汰的整个过程称为软件生命周期。
根据软件生产工程化的需要,生存周期的划分有所不同,从而形成了不同的软件生命周期模型(SW life cycle model),或称软件开发模型。
软件开发模型有以下几种。
? 瀑布模型:规范的、文档驱动的方法。开发阶段按顺序进行,适用于需求分析较明确、开发技术较成熟的情况。
? 快速原型模型:构建原型系统让用户试用并收集用户意见,获取用户真实需求。
? 增量模型:优点是能在早期向用户提交部分产品和易于维护,缺点是软件的体系结构必须是开放的。
? 喷泉模型:适用于面向对象方法。
? 螺旋模型:适用于大规模内部开发项目,有利于分析风险和排除风险。 ? 统一过程:适用于面向对象方法,使用统一建模语言UML,采取用例驱动和架构优先的策略,采用迭代增量的建造方法。
进行软件开发时可把各种模型的特点结合起来,充分利用优点,减少缺点。
习题参考答案:
1.什么是软件过程?它与软件工程方法学有何关系?
软件过程是为了开发出高质量的软件产品所需完成的一系列任务的框架,它规定了完成各项任务的工作步骤。
软件过程定义了运用技术方法的顺序、应该交付的文档资料、为保证软件质量和协调软件变化必须采取的管理措施,以及标志完成了相应开发活动的里程碑。
软件过程是软件工程方法学的3个重要组成部分之一。
2.假设要求你开发一个软件,该软件的功能是把读入的浮点数开平方,所得到的结果应该精确到小数点后4位。一旦实现并测试完之后,该产品将被抛弃。你打算选用哪些软件生命周期模型?请说明你作出选择的理由。
答:对这个软件的需求很明确,实现开平方功能的算法也很成熟,因此,既无须通过原型来分析需求也无须用原型来验证设计方案。此外,一旦实现并测试完之后,该产品将被抛弃,因此也无须使用有助于提高软件可维护性的增量模型或螺旋模型来开发该软件。所以,为了开发这个简单的软件,使用大多数人所熟悉的瀑布模型就可以了。 1)需求明确;2)功能单一,规模小;3)潜在功能变化少。
3.假设你要为一家生产和销售长筒靴的公司开发一个软件,使用此软件来监控该公司的存货,并跟踪从购买橡胶开始,到生产长筒靴、发货给各个连锁店,直至卖给顾客的全部过程。以保证生产、销售过程的各个环节供需平衡,既不会有停工待料现象,也不会有供不应求现象。你在为这个项目选择生命周期模型时使用什么准则? 答:快速原型模型。
1) 软件系统的使用人员繁杂,需求确定困难。
2) 软件应用环节多,功能变化多,初期需求变化多,在修改原型的过程中明确功能。