软件工程是一门涉及软件开发全生命周期的学科,涵盖了从需求获取系统维护的各个阶段。在软件定义上,它被理解为一组能够提供所需功能和性能的指令或计算机程序,包含处理信息的数据结构,以及描述程序功能和使用方法的文档。软件的特性包括抽象性,意味着软件可以对现实世界的问题进行抽象表示;没有物理磨损性,意味着其寿命主要受制于逻辑错误和维护;以及重用性,指的是代码和设计元素可以在不同项目中重复利用。软件危机的出现源于软件规模和复杂性的增加,导致开发成本上升、开发效率降低,同时软件维护成为难题,造成大量资源浪费。软件危机的具体表现包括项目延期、超出预算、交付时仍存在错误等问题。经济方面,引入新技术虽能提高效率,但需考虑成本,而维护阶段的费用常常被忽视,这些都是危机的体现。软件生命周期包括问题定义、可行性研究、需求分析、概要设计、详细设计、编码与测试、综合测试、运行与维护八个阶段。问题定义阶段,系统分析员通过调查确定工程目标和规模,可行性研究则为决策提供依据,只有预期效益显著的项目才会继续。需求分析是明确系统应具备的功能,通常用数据流图、数据字典等工具表示逻辑模型。概要设计确定实现方式,详细设计则细化每个模块,编码与测试阶段将设计转化为代码并进行验证。综合测试关注整个系统的功能和性能,运行与维护阶段则确保系统持续满足用户需求,分为改正性、适应性、完善性和预防性维护四种类型。瀑布模型强调阶段间的顺序,适合需求稳定的情况,但不适应需求频繁变动。增量模型允许分批开发,适合资源有限的企业,但需求变化可能导致控制难度增加。螺旋模型引入风险管理,适用于高风险项目,但过多迭代可能导致成本和延迟。在原型模型中,探索型用于需求分析,实验型验证设计,演化型则发展为最终产品。可行性分析是决定项目是否进行的关键,需求规格说明书是需求分析的成果,也是后续工作的基础。结构化分析采用“分解”和“抽象”思想,数据字典包括数据项、数据流、文件和基本加工,顶层数据流图可以进一步细化到一层数据流图。软件设计则是将需求转换为实现结构的过程,涉及模块划分、接口定义和数据结构设计等。