软件工程教育“守破离”
南京大学 邵栋 2020.03.26
软件工程是建立在计算机科学基础之上的一个工程性学科。它不是单纯的编程问题求解,在时间维度、规模维度、多因素权衡博弈维度上对工作人员提出了更高的要求。
作为一个工程学科,软件工程教育与科学教育有很大不同。
“守破离”是日本剑道中合气道训练弟子,进行技艺培养的方式。“守”指的是按照某位师傅教授的内容,不做任何修改的进行实践、训练,并不要求理解背后的原理。“破”的阶段,弟子除了学习自己师傅(流派)教授的内容,还需要了解其它流派的技艺,并思考、理解这些技艺背后的背景和原理。“离”是高级阶段,弟子这时候已经可以出师了。弟子从这门技艺的原始思想和背景出发,独创性的发展新的认识和技艺,并且基于实际情况进行测试。
软件工程的教育建立在计算机科学学习基础之上,在掌握了计算机科学原理知识之后,也有一个“守破离”的学习过程。
“守”的阶段学习并严格遵循软件工程规范,这里包含相应的实践和工具的使用。例如:
- 写程序时,遵循编码规范(比如开发汽车等高安全性领域C语言软件,遵循国际编程规范MISRA C:2004.)。
- 使用版本配置工具(Git)管理自己的代码,并且按照规定至少每天提交一次代码。
- 遵循TDD测试驱动开发实践,编写任何重要代码前,先编写相应自动化测试脚本。
- 采用Jenkins进行持续集成。
- 团队每天召开站立会议(Standup Meeting),并且按照规定每人轮流回答三个问题:“我昨天做了什么”,“我今天打算做什么”,“我有没有遇到障碍”。
这里的实践和工具,即包含技术方面和包含管理方面。守的阶段,并不要求学生对这些实践背后的原理有深刻的认识,仅要求学生能够按照老师的要求严格执行。守的阶段是破的阶段的基础,如果连守的技能都不能掌握,高谈阔论破和离是没有意义的。
而仅有守,在软件工程中是不够的。大家经常用“货物崇拜”的例子在软件工程中解释为什么仅有规范,但不懂其背后的原理,是不够的。
“货物崇拜”(Cargo Cults):第二次世界大战太平洋战争时,美军于塔纳岛建立了一个临时基地,修建了机场,当时岛上的原住民看见有一些“大铁鸟”(军用飞机)为美军运送物资,美军也会分配一些物资给当地人。二次世界大战结束后,美军离开塔纳岛。后来,原住民制造了跑道以及机场相关设施,还安排一个人坐在一个木制小屋里,头上带着两个木制件,像耳机和天线一样,假装是机场塔台工作人员。他们按照原来观察到的美军做法做了所有事情,看起来完全像以前一样,但没有飞机降落。
“破”的阶段,需要理解软件工程规范背后的原理。例如:
- 演进式软件设计为什么要和自动化测试、持续集成、重构联合使用?
- 为什么DevOps团队做微服务时最好使用容器技术?
- 版本配置工具中的分支什么情况下使用最佳?
- 学习敏捷软件开发方法论,除了学习Scrum、eXtreme Programming、Kanban和精益软件开发基本实践之外,还需要思考它们和传统瀑布模型的区别?敏捷软件开发为什么适合快速变更的软件开发?
只有理解了这些背后的原理,才能够正确的进行软件开发,而不是“货物崇拜”:
- 不是看到一家软件公司加班996,就认为我们也学996,就会成功;
- 不是看到一家公司通过CMMI5级,就也要求开发团队通过,认为开发的可预测性会大幅度提升;
- 不是看到Google每隔几年重新编写一次软件,就也每隔几年抛弃自己的软件重新开发。
“离”的阶段,是一个独创性的阶段。这时,结合对软件行业的深刻认知以及分析,可以提出一些新的软件工程认知。当然,这些认知必须放在实际环境进行检验,比如:
- 软件工程不是工程,而是“博弈”?
- 敏捷软件开发宣言
对于一个软件开发组织,定制一整套符合自己的软件工程规范同样是“离”的一种体现。这时候,你了解了全世界关于软件工程已有的知识,并深刻认知了背后的原理,结合自己组织的人员技能、业务场景,设计一整套符合自己的软件工程规范,这也是一种创造性的工作。
“守破离”这样一个顺序,适合大部分软件工程知识传授的内容,教学时尽可能不做变动。理解软件工程“守破离”的学习过程,我们可以更好明确学习的内容和顺序,遵循教学规律,合理安排教学内容。
敏捷软件开发的教学:
可以先进行实践和工具的教学;再介绍敏捷宣言、价值观等抽象理论;最后给出一些企业的具体实践方案,并说明其定制的原因。如果先进行概论教学,会导致学生在学习概论时没有任何背景,难以理解。
在组织中导入软件工程体系或引入新的软件工程实践(比如DevOps或敏捷软件开发)时,同样可以参考“守破离”的过程,先严格的导入规范和实践;在大部分人可以熟练掌握适应后,再理解相关背景和原理,针对本组织情况进行适当调整;最后根据自己的具体情况,裁剪和定制最适合自己的软件工程体系。