软件工程是建造软件的系统方法。软件是计算机的程序和相关文档。软件工程关注大型软件的建造过程。软件需要按时完成。软件需要在预算内完成。软件需要满足用户要求。软件需要可靠运行。软件需要容易修改。软件需要容易维护。这些目标看起来简单。实际工作中很难全部实现。
早期的编程依靠个人技巧。程序员自己设计程序。程序员自己编写代码。程序员自己测试程序。这种方法适合小型程序。程序规模变大后问题出现。个人难以理解全部代码。修改代码可能引入新错误。项目进度经常延迟。软件质量无法保证。软件维护非常困难。这种情况称为软件危机。软件工程正是为解决这些问题而产生。
软件工程将工程原则应用于软件开发。工程强调计划、设计和过程管理。建造桥梁需要工程设计。建造楼房需要工程设计。建造软件同样需要工程设计。软件工程建立系统化的开发流程。这个流程包括多个阶段。每个阶段有明确任务。每个阶段产生具体文档。文档记录设计决策。文档方便团队沟通。文档帮助后续维护。
需求分析是第一个阶段。这个阶段回答一个问题:软件需要做什么?开发人员与用户交谈。开发人员观察用户工作。开发人员记录用户需求。需求分为功能需求和非功能需求。功能需求描述软件功能。例如:系统需要记录学生成绩。系统需要计算平均分。系统需要生成成绩报告。非功能需求描述软件属性。例如:系统需要响应速度快。系统需要每天运行二十四小时。系统需要支持一百个用户同时使用。需求分析产生需求文档。需求文档描述全部需求。用户需要评审需求文档。用户确认需求文档正确。需求文档是后续开发的基础。
设计阶段是第二个阶段。这个阶段回答一个问题:软件如何构建?设计分为总体设计和详细设计。总体设计确定系统结构。系统分解为多个模块。每个模块完成特定功能。模块之间定义清晰接口。详细设计描述每个模块内部逻辑。设计人员选择算法。设计人员设计数据结构。设计人员考虑性能问题。设计阶段产生设计文档。设计文档指导代码编写。
编码阶段是第三个阶段。程序员根据设计文档编写代码。程序员使用编程语言。程序员遵循编码规范。编码规范规定代码格式。编码规范规定命名规则。编码规范提高代码可读性。可读代码容易理解。可读代码容易修改。可读代码容易测试。程序员编写注释解释代码。注释说明代码目的。注释说明复杂逻辑。代码需要经常检查。程序员自己检查代码。程序员互相检查代码。代码检查发现潜在错误。代码检查改进代码质量。
测试阶段是第四个阶段。测试目的是发现软件错误。测试人员设计测试用例。测试用例描述输入数据。测试用例描述预期结果。测试人员执行测试用例。测试人员比较实际结果与预期结果。实际结果不符合预期结果就是错误。测试分为多个层次。单元测试检查单个模块。集成测试检查模块组合。系统测试检查整个系统。验收测试由用户执行。用户确认软件满足需求。测试发现错误需要修复。修复错误可能引入新错误。修复后需要重新测试。测试不能保证软件没有错误。测试只能提高软件可靠性。
维护阶段是最后一个阶段。软件交付后进入维护阶段。维护阶段时间很长。维护阶段成本很高。维护分为改正性维护、适应性维护和完善性维护。改正性维护修复运行中发现的错误。适应性维护使软件适应环境变化。例如:操作系统升级需要修改软件。完善性维护增加新功能。例如:用户需要新的报表格式。维护人员需要理解原有代码。维护人员需要修改原有代码。维护人员需要测试修改部分。良好的设计简化维护工作。清晰的结构简化维护工作。完整的文档简化维护工作。
软件开发需要团队合作。团队包括不同角色。项目经理管理项目进度。项目经理分配工作任务。项目经理协调团队沟通。系统分析师分析用户需求。系统分析师编写需求文档。设计师负责软件设计。程序员负责编写代码。测试员负责测试软件。文档员负责编写文档。配置管理员管理软件版本。团队成员需要有效沟通。定期会议讨论项目进展。书面报告记录重要决定。电子邮件传递日常信息。沟通问题导致项目失败。需求理解错误导致软件错误。任务分配不清导致工作重复。信息传递不及时导致进度延迟。
软件开发需要管理。项目管理制定项目计划。项目计划估计工作时间。项目计划安排任务顺序。项目计划分配人员任务。项目计划识别项目风险。风险是可能发生的问题。例如:关键人员可能离职。新技术可能不成熟。用户需求可能变化。项目管理监控项目进展。实际进度与计划进度比较。发现偏差采取纠正措施。质量管理确保软件质量。质量计划设定质量目标。质量活动包括设计评审、代码检查和软件测试。配置管理控制软件变更。变更请求记录修改要求。变更评估分析修改影响。变更批准决定是否修改。版本控制记录文件历史。版本控制避免文件丢失。版本控制支持多人协作。
软件开发模型描述开发过程。瀑布模型是早期模型。瀑布模型划分阶段为需求分析、设计、编码、测试和维护。每个阶段完成后进入下一阶段。前一阶段的输出是后一阶段的输入。瀑布模型强调文档。瀑布模型适合需求明确的项目。瀑布模型缺点是不灵活。需求变化导致大量返工。迭代模型多次重复开发活动。每次迭代产生可运行软件。第一次迭代实现基本功能。后续迭代增加新功能。迭代模型及时获得用户反馈。迭代模型适应需求变化。敏捷开发强调快速交付。敏捷开发强调团队协作。敏捷开发强调响应变化。敏捷开发减少文档工作量。敏捷开发适合需求不明确的项目。选择合适的模型很重要。
软件工程面临许多挑战。用户需求不断变化。市场环境不断变化。技术发展不断变化。软件开发需要应对变化。软件规模越来越大。软件功能越来越复杂。软件开发需要管理复杂性。软件质量要求越来越高。软件安全要求越来越高。软件开发需要保证质量。软件开发时间要求越来越短。软件开发成本要求越来越低。软件开发需要提高效率。软件工程研究新方法。软件工程研究新工具。软件工程研究新技术。这些研究改进软件开发实践。
软件工程是实践性学科。理论知识需要实际应用。项目经验非常重要。初学者参与实际项目。初学者学习开发过程。初学者学习团队合作。初学者积累经验。工具使用也很重要。开发工具编写代码。测试工具执行测试。管理工具跟踪任务。工具提高工作效率。学习软件工程需要耐心。学习软件工程需要实践。学习软件工程需要思考。软件工程不断发展。新的方法不断出现。旧的方法不断改进。开发人员需要持续学习。开发人员需要适应变化。这是软件工程的特点。这也是软件工程的挑战。