软件的定义
软件是计算机系统中与硬件相互依存的一部分,软件包括程序、数据与相关文档的完整集合。其中程序是按事先设计的功能和性能要求执行的指令序列,数据是使程序能正常操纵信息的数据结构,文档是与程序开发、维护和使用有关的图文材料。
在结构化程序设计时代,程序的最小单位是函数及子程序,程序与数据是分离的;在面向对象程序设计时代,程序的最小单位是类,在类中封装了相关的数据及指令代码。
软件生命周期
如同其他事物一样,软件也有一个孕育、诞生、成熟和衰亡的过程,我们称之为软件生命周期。软件生命周期由软件定义、软件开发、和运行维护 3 个时期组成,每个时期又可划分为若干个阶段。
软件定义时期的主要任务是解决“做什么”的问题,即明确工程的总目标和可行性;导出实现工程目标应使用的策略及系统必须完成的功能;估计完成工程需要的资源和成本;制定工程进度表。该时期的工作也就是常说的系统分析,它通常又分为 3 个阶段:问题定义、可行性研究和需求分析。
软件开发时期的主要任务是解决“如何做”的问题,即具体设计和实现在前一个时期定义的软件,通常由概要设计、详细设计、编码和测试 4 个阶段完成。
软件运行维护时期的主要任务是使软件持久地满足用户的需要,通常由 4 类维护活动:改正性维护,也就是诊断和改正正在使用过程中发现的软件错误;适应性维护,即修改软件以适应环境的变化;完善性维护,即根据用户的要求改进或扩充软件,使它更完善;预防性维护,即修改软件为将来的维护活动预先做准备。
软件危机
软件开发周期长、成本高、质量差、维护困难原因:
1、缺乏软件开发的经验和有关软件开发数据的积累,使得开发工作的计划很难制定。主观盲目的制定计划,往往与实际情况相差太远,致使常常突破经费预算,工期一拖再拖。而且对于软件开发工作,给已经拖延了的项目临时增加人力只会使项目更加拖延。
2、软件人员与用户的交流存在障碍,除了知识背景的差异,缺少合适的交流方法及需求描述工具也是一个重要原因,这使得获取的需求不充分或存在错误,在开发的初期难以发现,存在的问题往往在开发的后期才暴露出来,使得开发周期延长,成本增高。
3、软件开发过程不规范,缺少方法论和规范的指导,开发人员各自为战,缺少整体的规划和配合,不重视文字资料工作,软件难以维护。
4、随着软件规模的增大,其复杂性往往会呈指数型增长。
5、缺少有效的软件测评手段,提交用户的软件质量差,在运行中暴露出大量问题,轻者影响系统的正常使用,重者发生事故,甚至造成生命财产的重大损失
软件工程
1968 年 10 月在北大西洋公约组织(NATO)召开的计算机科学会议上,Fritz Bauer 首次提出“软件工程”的概念,试图将工程化方法应用于软件开发。许多计算机和软件科学家尝试,把其他工程领域中行之有效的工程学知识运用到软件开发工作中来,经过不断实践和总结,得出这样的结论:按工程化的原则和方法组织软件开发工作是有效的,是摆脱软件危机的一个主要出路。
软件工程是指导计算机软件开发和维护的工程学科。采用工程的概念、原理、技术和方法来开发和维护软件,把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来,以经济地开发出高质量的软件并有效的维护它,这就是软件工程。
软件工程的目标是运用先进的软件开发技术和管理方法来提高软件的质量和生产率,也就是要以较短的周期、较低的成本生产出高质量的软件产品,并最终实现软件的工业化生产
自从“软件工程”诞生,提出用工程学的基本原理和方法来组织和实施软件生产后,又发展了与软件有关的心理学、生理学、经济学等方面的学科。在此期间,研究软件工程学的科学家们陆续提出了 100 多条有关软件工程的准则,1983 年美国 TRW 公司 B.W.Boehm 将它们概括为著名的软件工程 7 条基本原理:
1、按软件生存周期分阶段制定计划并认真实施
软件从定义、开发、运行和维护,直到最终被废弃,要经历一个很长的时间,通常称这样一个时期为软件生存周期。在软件生存周期中需要完成许多不同性质的工作,所以应把软件生存周期划分为若干阶段,为每一阶段规定若干任务,制定出可行的计划,并按照计划对软件的开发和维护啊活动进行管理。
2、坚持进行阶段评审
软件的质量控制工作不能等到编码结束后再进行,因为大部分错误是在编码之前造成的,而且错误发现的越晚,为改正它所需付出的代价就越大,因此,在每个阶段都要进行严格的评审,以尽早发现在软件开发过程中产生的错误
3、坚持严格的产品控制
在软件开发过程中要及时识别所有影响产品质量的因素,并在开发过程中严格加以控制,如对于需求变更的控制。由于外界环境变化或软件工作范围的变化,在软件开发过程中需求的变更是在所难免的,所以必须依靠科学的产品变更控制机制来顺应需求的变更。就是说,当需求变更时,为了保持软件各个配置成分的一致性,必须实施严格的产品变更审查和基线配置管理,确保变更的正确性和有效性。
4、使用现代程序设计技术
随着软件产品规模和复杂性的不断增加,对于软件开发的方法和工具提出了更高的要求。实践表明,采用先进的程序设计技术可提高软件开发的生产率,还可提高软件产品的可维护性。
5、明确责任
为了提高软件开发过程的可见性并有效地进行管理,应当根据软件开发项目的总目标、任务分解结构和完成期限,规定开发组织的责任和产品标准,使得工作结果能够得到清楚的审查。
6、用人少而精
合理安排软件开发小组人员的原则是参与人员应当少而精,即小组的成员应当具有较高的素质,且人数不应过多。人员素质高能大大提高软件开发的效率,明显减少软件中的错误。开发人数减少,可以降低因交流开发进展情况和讨论遇到的问题而造成的通信开销。
7、不断改进开发过程
软件开发过程定义了软件工程方法使用的顺序、要求交付的文档资料、为保证质量和协调变化所需要的管理以及软件开发各个阶段应采取的活动和必要的评审。为保证软件开发的过程能够跟上技术的进步,必须不断地灵活改进软件工程过程。为了达到这个要求,应当积极主动地采取新的软件开发技术,注意不断总结经验。此外,需要注意收集和积累出错类型、问题报告等数据,用以评估软件技术的效果和软件人员的能力,确定必须着重开发的软件工具和应当优先研究的技术。
软件工程方法论
软件工程方法论包含 3 个要素:方法、工具和过程。
软件工程方法为建造软件提供技术上的解决方案(“如何做”)。方法覆盖面很广,包括沟通、需求分析建模、设计建模、编程、测试和维护支持。
工具为方法的运用提供自动的或半自动的软件支撑环境。
过程是为了获得高质量的软件所需要完成的一系列任务的框架,它规定了完成各项任务的工作步骤。