前言


云计算、大数据、人工智能等技术的发展及ICT(Information and Communications Technology,信息与通信技术)融合的趋势推动着新的软件应用形态、新的软件开发技术及新的软件开发过程不断涌现。在应用形态方面,软件以其极强的渗透性融入人们的日常生活,移动应用、小程序等网络化应用成为主流,而通信、能源、交通等基础设施也广泛采用了软件来实现数字化和智能化管理。在开发技术方面,以容器化和微服务为主要特征的云原生架构及相关软件技术成为越来越多软件项目的选择。在开发过程方面,敏捷方法已经成为主流,开发运维一体化(DevOps)与持续集成、持续交付等实践也得到了越来越多的应用,支撑这些新型开发流程与方法的云化开发平台也逐渐成熟。
本书面向现代软件工程所需要的基础知识和基本能力进行介绍,在覆盖经典软件工程方法与技术的同时突出体现了现代软件工程在开发过程和方法上的特点,例如,开发运维一体化及持续集成与持续交付、演化式设计、软件开发框架与平台复用、分布式与云原生软件体系结构、敏捷开发需求分析等。此外,本书还强化了高质量编码与可信软件开发的要求,体现了现代软件工程对于软件工程师个人的质量意识和可信软件开发能力的要求。
软件工程课程具有很强的实践性,所介绍的软件开发过程、方法和技术都需要结合软件开发实践进行理解和掌握。然而,传统的软件工程教材一般都是按照软件过程、软件需求、软件设计、软件测试这样的顺序进行介绍,而且对于版本管理、编码、构建与依赖管理等软件工程师的基本开发技能介绍较少。与之相对应的课程实践项目往往花费了大量时间在需求分析、设计及相关的文档撰写上,对于编码、构建、测试等基本能力的实践不够并且缺少一个循序渐进的体验过程。为此,我们与华为公司的软件人员能力提升变革项目团队一起合作,将华为多年来在ICT领域积累的软件开发方法、工具与相关实践融入软件工程课程,并按照软件工程师的学习和成长过程对相关内容重新进行了编排,首先围绕高质量编码所需的知识和能力进行介绍,然后逐渐过渡到更加抽象的软件设计和需求分析等内容。
建议通过本书学习软件工程的读者在按顺序学习各章内容的同时,能够围绕一个迭代化的软件开发项目逐步体验软件工程师的成长过程: 在初步理解软件开发过程以及版本和任务管理的基础上,首先能够高质量地实现比较小的代码单元(例如一个类),然后能够完成涉及多个类的局部软件设计并掌握一些常用的软件复用手段,接着了解更高层面上的软件体系结构特别是分布式软件体系结构设计,最后理解软件需求并掌握常用的需求分析方法。此外,完整的软件产品交付必须有相应的质量保障及交付过程支持,因此还需要学习并体验软件测试方法和技术,并了解软件产品是如何进行集成和发布的。
本书由复旦大学计算机科学技术学院CodeWisdom团队与华为公司软件人员能力提升变革项目团队合作撰写完成。其中,彭鑫负责第1章及第5~8章的编写,同时负责全书的修改及统稿; 游依勇负责第3~4章的编写,并基于华为软件开发经验进行了全书企业实践内容的归纳和总结; 赵文耘负责第2章及第9~10章的编写。除了三位作者外,复旦大学计算机科学技术学院CodeWisdom团队的吴毅坚、沈立炜、陈碧欢以及华为公司软件人员能力提升项目团队的赵亮、吕新平、王书建、纪朋、钱逢兵、李春华、吴刚等也参加了部分章节的编写和评审工作,为本书的出版做出了巨大的贡献,在此一并表示感谢。
为方便教师教学和学生学习,本书还配套教学课件、教学视频、示例代码和课程实践等资源,读者可在清华大学出版社官网该书主页下载。
感谢清华大学出版社的大力支持以及在本书撰写过程中的细心指导!同时还要感谢教育部高等学校软件工程专业教学指导委员会、全国高等学校计算机教育研究会、复旦大学计算机科学技术学院的领导和老师们对本书的大力支持!
由于作者水平有限,书中难免有不足和疏漏之处,恳请广大读者批评指正!

作者2021年12月