我一直以为前言是写书前的激情和计划安排,如今才明白前言是对已完成工作的总结。执笔3年,既是对领域知识的总结,也是一个自我修行和自我完善的过程。   “盛年不重来,一日难再晨”。站在三尺讲台,看着一张张朝气蓬勃的面孔,我总是如履薄冰,担心误人子弟。相比于学生时代不谙世事的我们,如今年轻的学生面临更多的机遇与挑战,同时也有更多关于选择的迷茫。如何做好一名合格的“老师”,以及如何成就自己的“价值”,成为我著书期间思考最多的问题。   回顾从求学到工作的这些年,从用pctools修改内存数据、进行病毒分析到“单挑”一个中型项目,从小型项目管理到公司部门管理,从代码coding到市场竞标,从创业到创业失败,从研究转向教学……似乎冥冥中有一根线把我牵引到这里,让我在此留下三年值得回首的光阴。   与其他计算机课程解决“0→1”的问题不同,“软件工程”作为一门综合性的计算机课程,主要讲解软件开发中的基本原理、概念、技术和方法,需要解决“1→N”的问题。随着对软件工程领域知识的钻研和对相关内容的深入理解,原来信心满满的我才知所学内容仅为“沧海一粟”,也让我在编写本书的过程中“如临深渊”。为了准确理解程序效率,我在不惑之年再次挑战了“算法分析与设计”和“数据结构”两门课程;在编写云原生相关内容时又体会了《侠客行》中贝海石由“白首太玄经”反推前23句内容的艰辛。 编撰思路   经过多年的教学实践,且翻阅了可以获得的近乎所有软件工程教材及相关书籍之后,作者发现大部分的教材在形式上都将“软件过程”置于软件工程概述之后、软件开发方法之前。同时,由于各位作者对软件方法内容理解的深度和范围不同,不同教材对各种方法的强调侧重点也有所不同。   由于软件工程涉及的领域非常广泛,从不同的领域切入均可得到其合适的理由。不同于 “师者”的角度,本书是从“求学”的角度来组织课程知识。在介绍了软件工程概念、软件生命周期模型的基础上,本书直接进入软件开发方法的学习,而将“软件过程”置于软件开发方法之后。这种内容组织方式可以帮助读者在具备了基本的软件开发能力后更好地理解“过程”在项目开发和管理中的重要性。   与此同时,大部分学生在学习了结构化程序设计和面向对象程序设计后,并不了解应当如何区分使用这两种软件开发技术。如果仅将软件工程的相关知识进行罗列,而缺乏对实际问题的分析、设计和对实现方式的介绍,则无助于学生思维能力的提高,更不用说期待学生能够解决复杂软件工程问题。   随着软件开发技术的快速发展,结构化方法、面向对象方法已经在软件开发领域中占据了举足轻重的地位。同时,随着移动互联网和云计算技术的快速普及,新的软件开发技术如雨后春笋般快速出现,如何平衡各种软件开发方法在课程教学中的比例,也是软件工程教学中需要解决的问题。   本书在撰写过程中借鉴了“新工科”理念,邀请了腾讯科技股份有限公司TAPD团队协助编写敏捷开发方面的内容,并参考腾讯云专家的意见引入了云原生方面的内容。同时,在深圳大学的支持下,本课程团队与腾讯科技股份有限公司合作,将本书的内容制作成了高质量的MOOC课程,方便学生和读者通过多种方式了解和学习软件工程的相关知识。 内容组织   本书分为5篇、14章,涵盖了软件工程领域涉及的主要内容。   第一篇 软件工程基础   在引入软件工程相关内容之前,本篇从软件发展史及软件工程、软件生命周期两方面介绍软件的发展历程、软件的定义和特点,软件危机产生的原因,软件工程产生的背景以及软件生命周期中各个阶段的工作,帮助大家对软件工程有一个概念性的了解。   第二篇 结构化方法   由于结构化方法强调“动作”分解,因此本篇从结构化分析、结构化设计和结构化实现三个角度来介绍如何利用数据流图、处理加工逻辑说明、状态转换图和数据字典建模用户需求;如何采用层次图、IPO图及程序流程图设计软件;如何有效地将结构化设计结果转换为程序代码,并对完成的软件进行测试。   本篇除了参考其他优秀教材的内容以外,还针对结构化软件的数据设计、程序实现等内容进行详细解剖,对结构化方法的全过程进行介绍。   第三篇 面向对象方法   相对于结构化方法而言,面向对象方法从“类+对象”的角度来分析、建模客观世界。本篇首先对经典的UML进行介绍,然后以面向对象分析、面向对象设计和面向对象实现三部分内容介绍如何通过捕获用户需求、分析用户活动、建模系统状态、提取类的候选者和类关系、设计对象之间的交互来完成业务逻辑,如何实现面向对象设计结果,如何为以面向对象方法实现的软件设计测试用例等。   在编撰过程中,本篇融入了一些实际的项目经验,补充了与面向对象分析、设计和实现相关的经验和方法。同时,本篇也对面向对象软件设计中的经验和架构进行了介绍,帮助大家了解如何才能得到优秀的软件架构。   第四篇 软件过程及管理   尽管软件生命周期从技术角度为软件项目开发提供了指导,但是软件生命周期并未回答如何才能有效地开发软件,也未包含软件项目管理方面的内容。   本篇首先对经典的软件开发过程进行介绍,然后再过渡到现代主流的软件开发过程,帮助读者了解软件过程的产生和进化。接着,本篇从软件项目管理的角度出发,以软件项目开发过程为主线,对项目开发过程中的管理实践进行介绍。   第五篇 现代软件开发   为了及时响应快速变化的市场需求以及满足日益复杂的用户需求,现代软件开发组织将复杂软件分解为多个可以独立开发、独立维护、技术异构的微服务,并采用多个小而精的软件团队持续敏捷地响应需求变化。   本篇邀请了腾讯科技股份有限公司的TAPD部门协助,对腾讯公司内部的敏捷开发流程和开发平台进行介绍。同时,为了帮助大家了解现代软件应用的开发方法,本篇结合领域驱动设计,简单总结了如何分析、设计和实现云原生软件系统。最后,本篇对人机交互设计方面的内容进行了概述。 使用建议   “软件工程”课程与其他计算机相关课程不同,需要从软件工程“实践者”的角度来讲述软件开发过程中的基本原理、概念和技术,强调软件开发方法与技术的应用和评价。   正如软件项目开发没有“银弹”一样,“软件工程”课程的教学和组织方法也没有“银弹”。在教学过程中,建议教师合理利用本书提供的教学资源,以项目分组方式让学生完成自主学习、互动探讨、课堂学习(课程讲授)和项目实践四个环节。   1. 自主学习   由于“软件工程”课程涉及的内容繁杂,限于授课时长,教师不可能将细节内容一一讲授。为了帮助大家更好地学习课程内容,本书建设了对应的MOOC课程。大家可以借助MOOC开展线下学习、自主学习。   在MOOC课程中,我们除了对各章节的内容进行细致讲解以外,还收集整理了大量课程相关资料。同时,我们也会定期邀请行业专家与大家进行线上交流,组织各种沙龙,帮助大家了解现代软件企业的项目开发和管理过程。   2. 互动探讨   正如约翰·纽曼在《大学的概念》一书中所述,“当许多聪明、求知欲强、具有同情心而又目光敏锐的年轻人聚到一起时,即使没有人教,他们也能互相学习。他们互相交流,了解到新的思想和看法、看到新鲜事物并且掌握独到的行为判断力。”   教师可以结合课程内容为学生设定学习目标,要求学生在线下自主学习后针对设定的问题和开放问题进行讨论。   3. 课程讲授   教师在有限的课时内讲解软件工程涉及的全部知识内容是不现实的,也是不建议的。在课堂教学中,教师可以结合学生在互动探讨过程中发现的新问题、新方法及学生反馈的疑难问题开展SPOC教学,通过启发式教学,引导学生思考问题。   4. 项目实践   “软件工程”课程除了介绍方法和技术以外,还强调项目实践。教师可以通过项目实践环节来检验学生对相关方法和技术的掌握程度,强化学生的工程意识。   在项目实践环节,教师可以通过分团队、分项目方式让学生采用不同的软件方法来开展需求分析、软件设计、软件实现、测试等活动,并借助小组交叉互评、交叉考核等方式来体验项目管理。目前,敏捷软件过程可用于小型项目实施,获得较好的实践效果。   当然,本书的内容同样适合于传统的课堂讲授方式。教师可以结合实际课时情况对本书涵盖的内容进行裁剪,利用本书提供的资料来引导学生掌握相关知识。 结束语与致谢   本书由深圳大学杜文峰负责总体策划、主体部分的编写及统稿。深圳大学朱安民教授执笔第11章,腾讯科技股份有限公司TAPD团队撰写第12章。深圳大学计算机与软件学院的邱小淇、周杰民、莫子泓等同学参与了稿件的校对工作。   本书的部分插图由林冬晓绘制,MOOC平台的习题由伍鹏程收集。   为了完善本书的内容,提高可读性和MOOC视频的观赏性,我们参考了大量书籍和互联网文章,也借鉴了大量网络图片。在此谨向所有参考文献的作者以及网络资料的作者和版权所有者表示谢意,没有你们的无私奉献,本书和MOOC视频就无法圆满完成。   我经常和学生开玩笑:“我们是一边跑火车,一边修铁轨”。现在“铁轨”终于快修到终点,“火车”也将到达站台。感谢所有和我在这个过程中一起奋斗的人,感谢成长路上所有的帮助者和见证者。   感谢腾讯科技股份有限公司的袁琳,没有我们三年前的那次谈话,我们无法完成这本教材,也无法共同完成这门高质量的MOOC课程。   感谢腾讯科技股份有限公司的陆莹、吕芙洁、周玥婵,正是你们在前台、后台的默默支持,才让更多的读者能够学习腾讯公司的敏捷开发思想和敏捷开发平台,也让更多的人能够跟随我们的MOOC课程走入腾讯滨海大厦,体验他们梦想的工作空间。   感谢腾讯科技股份有限公司的叶聪,为我指出了云计算开发方面的撰写方向。   感谢和我一起陪孩子上兴趣班的梁春华,帮我一遍又一遍地梳理、改进云原生章节的内容。   感谢深圳大学吴涛老师在面向对象方法理念上的帮助。   感谢腾讯科技股份有限公司的胡玉玲,为本课程的云原生实践平台生态建设提供了帮助。   感谢清华大学刘强老师、国防科技大学毛新军老师、北京大学孙艳春老师在讲座中的无私奉献;感谢同济大学朱少民老师在软件测试方面的指导;感谢吴军先生的《文明之光》,让我有了撰写本书的动力。   感谢深圳大学计算机与软件学院的领导对本书编写工作的大力支持。   感谢深圳大学计算机与软件学院物联网研究中心、大数据研究所和学工办为本课程的MOOC拍摄提供了环境良好的会议室、走廊空间和学生工作坊。   感谢深圳大学MOOC办孙忠梅主任、吴燕玲老师对本课程MOOC建设的特批特办。有了你们的支持,我们才能在第一时间把摄影机架在腾讯滨海大厦,才能保质保量地完成MOOC课程建设。   感谢优课联盟制作团队,经过这么长时间的“磨合”,终于让MOOC课程按时上线。   感谢深圳大学图书馆给我提供了良好的写作空间,让我能够方便地查阅各种书籍资料;感谢深圳大学为老师们提供了如此好的运动设施,为了坚持写作,我从2019年开始在田径场挥洒汗水。   感谢我的父母、亲人和挚友。没有你们的“打Call”,我无法坚持到现在。   特别感谢在身后默默支持我的爱人和可爱的儿子,你们是我完成本书的支柱。   在编写本书的过程中,尽管我已尽力组织、编写、审查了每一行文字,但深感个人知识浅薄,唯恐出现知识、内容上的纰漏和错误。敬请读者带着思辨的眼光来使用本书,以宽容的心看待本书的谬误。也请大家将发现的问题通过邮箱(404905510@qq.com)反馈给我,协助我做一件对社会有意义的事情。   “行百里者半九十”,本书的出版和MOOC课程的上线并不代表着工作的结束。本课程的线上线下内容建设还在如火如荼地进行中,本课程的生态环境也在持续搭建中。希望有一天我们能够共同见证春暖花开的美好图景。   最后,希望本书能够帮助到你,也希望更多的人能够在学习中不断完善自我,实现人生价值。      杜文峰??????   2022年6月????   于荔园 软件工程(微课视频版) 前 言