课程要求:
软件工程学的演变:全面概述
第一章:软件工程学概述
计算机时代的黎明与软件危机的出现
计算机系统经历了四个不同的发展阶段,这个旅程既革命性又充满挑战。尽管技术不断进步,但“软件危机”的阴影仍然笼罩在这个领域上方,软件已成为计算机系统发展的瓶颈。这一持续的问题促使人们在20世纪60年代末开始认真研究解决软件开发和维护的复杂性,从而逐渐形成了一门新的学科——软件工程。
1.1 理解软件危机
在计算机系统的早期,即20世纪60年代中期之前,软件是为特定应用而专门编写的,导致了高度个性化的软件环境。这个时代的特点是规模较小的程序,通常由同一个人或同一个团队开发和使用。然而,这种个性化的方法意味着软件设计大多是一个隐含的、未记录的过程,留下的只是代码本身。
随着我们从20世纪60年代中期到70年代中期的转变,景观开始改变,出现了“软件作坊”和产品软件的广泛使用。尽管如此,开发方法从早期的个性化实践中几乎没有变化。这一时期标志着软件量的快速增长,导致在维护、适应新硬件或操作系统以及满足不断变化的用户需求方面面临重大挑战。这些挑战促成了日益加剧的“软件危机”,这一术语是在1968年由北约科学家在召开的国际会议上正式提出并使用的,标志着软件工程学科的正式诞生。
1.1.1 软件危机的介绍
软件危机包括在软件开发和维护过程中遇到的一系列严重问题。这些问题不仅仅是软件无法正常运行,几乎所有软件在不同程度上都存在这些问题。危机包括如何开发软件以满足对软件日益增长的需求,以及如何维护不断增加的现有软件库。有人建议将软件危机更名为“软件萧条”或“软件困境”,以更好地反映其持久性和不那么明显的性质,尽管“软件危机”一词因其强调问题的严重性而被广泛接受。
软件危机的典型表现:
- 估计的不准确性:软件开发的成本和进度常常被严重低估,导致项目的实际资源和完成时间大大超出预算和计划。
- 用户不满意:用户对“已完成的”软件系统不满意的情况经常发生,这主要是因为开发人员对用户需求理解不足或缺乏准确的问题认识。
- 质量问题:软件产品的质量经常不可靠,部分原因是质量保证实践没有在开发过程中一贯地应用。
- 维护性问题:许多软件系统最终变得难以维护,无法适应新硬件、满足新的用户需求或加入额外的功能。
- 文档缺失:恰当的文档经常缺失,使得跟踪进度、促进沟通和支持维护活动变得困难。
- 成本上升:软件成本在计算机系统总成本中的比例持续上升,尽管硬件成本因微电子学技术的进步和自动化程度的提高而降低。
- 生产率滞后:软件开发的生产率提升速度远远跟不上计算机应用的迅速普及和深入。
软件危机强调了软件开发和维护面临的众多挑战,突出了采用系统化、基于工程的方法来解决这些问题的必要性。随着我们深入探讨软件工程的原理,我们将探索旨在缓解软件危机影响并推动更可靠、可维护和以用户为中心的软件系统发展的策略和方法论。
产生软件危机的原因
软件危机是一个历史上的现象,指的是随着计算机应用领域的不断扩大和软件复杂度的增加,软件开发和维护面临的困难急剧增加,导致软件项目延期、成本超支、软件质量难以保证等一系列问题。产生软件危机的原因是多方面的,既包括软件本身的特点,也包括开发和维护过程中的方法问题。
软件的特点与挑战
逻辑性与“不可见性”
软件与硬件不同,它是计算机系统中的逻辑部分而非物理部分。这种逻辑性和缺乏“可见性”导致软件的开发进度和质量难以衡量,使得软件开发过程的管理和控制变得极为困难。
维护难度
软件在使用过程中不会因时间过长而损坏,但可能因为开发期间引入的错误而出现问题。软件维护通常意味着对原设计的改正或修改,增加了软件维护的难度。
规模与复杂性
软件的规模庞大,且复杂性随规模增加而指数上升。大规模软件的开发需要多人分工合作,如何保证合作产出的软件系统高质量是一个复杂且困难的问题。
开发与维护方法的问题
错误的方法和技术
尽管长期实践中积累了许多成功经验,但许多软件专业人员仍存在糊涂观念,采用错误的方法和技术,这是软件危机发展的主要原因之一。
忽视需求分析
在软件开发的早期阶段,忽视软件需求分析的重要性,错误地将软件开发等同于编程,轻视软件维护,是许多软件项目失败的主要原因。
编程急躁症
急于求成,没有对用户要求有完整准确的认识就匆忙编写程序,是导致软件开发失败的常见问题。正确地理解用户需求是软件成功的前提。
软件生命周期的忽视
软件从定义、开发、使用、维护到废弃,经历一个漫长的生命周期。软件开发的初期工作应是问题定义和需求分析,而编程只是其中的一个阶段。忽视这一点会导致开发过程中的许多问题。
结论
解决软件危机不仅需要澄清错误认识,建立正确的软件开发和维护观念,还需要一系列综合措施。提高软件可维护性,减少维护成本,是软件工程学追求的重要目标之一。理解产生软件危机的原因,对于改进软件开发和维护过程,提高软件项目的成功率具有重要意义。
消除软件危机的途径
消除软件危机不仅是一个技术挑战,也是管理和组织的挑战。要有效应对软件危机,需要从多个方面入手,这包括改变对软件的基本理解、采用有效的开发方法、利用先进的工具,以及实施有效的组织管理措施。
正确理解软件
-
软件的定义:软件不仅仅是程序,它是程序、数据及相关文档的完整集合。这个定义强调了软件的多维性,包括了程序执行的指令序列(程序)、使程序能够适当处理信息的数据结构(数据)、以及开发、使用和维护程序所需的所有图文资料(文档)。
-
软件的复合性:理解软件作为一个整体,包含多个配置成分,这些成分共同工作以实现预定的功能和性能。
采用组织良好的开发方法
-
工程化方法:软件开发应被视为一个工程项目,需要组织良好、管理严密、各类人员协同配合完成。这意味着软件开发不是一种孤立的个体劳动,而是一个团队合作的过程。
-
吸取经验:充分吸取和借鉴从事各种工程项目,特别是计算机硬件研究和开发的经验教训。这包括从实践中总结出的成功技术和方法,以及研究探索更有效的技术和方法。
开发和使用软件工具
-
软件工具的作用:软件工具可以“放大”人类的智力,帮助开发人员高效完成开发过程中的繁琐重复工作。使用合适的软件工具可以提高开发效率和质量。
-
软件工程支撑环境:将各个阶段使用的软件工具有机地集合成一个整体,以支持软件开发的全过程。
实施有效的组织管理措施
- 管理和技术结合:解决软件危机需要技术措施(方法和工具)与组织管理措施相结合。软件工程作为一门学科,正是从管理和技术两方面研究如何更好地开发和维护计算机软件。
结论
消除软件危机是一个复杂的过程,需要深刻理解软件的本质,采用正确的开发方法,利用先进的工具,并实施有效的组织管理措施。通过这些综合措施,可以提高软件开发和维护的效率和质量,从而有效应对软件危机。软件工程作为一门学科,为我们提供了解决这些问题的理论基础和实践方法。