《现代软件工程》
TL;DR
- 软件工程是发现和探索的过程,成功的软件工程师必须成为学习专家和复杂性管理专家
- 解决工程问题的本质是控制复杂度,这一点在AI时代不但没有失效,反而更重要了
- 这里没有永恒的最佳实践,当你停下来的时候,你就脱离了软件工程本身
最近半年我的工作内容和AI辅助编程紧密相关。作为一个软件工程领域的咨询师和工程师,我的工作流在短短几个月内被彻底改变了,我不可能再像过去一样工作和写代码了。就像Kent Beck说的:"LLM让我90%的技能好像价值归零了,却让剩余10%的技能放大了1000倍。"所以我在实践的过程中一直在学习和探索,AI到底给软件工程带来了什么本质的变化。
书名里"现代"两个字让我误以为是我要找的东西,但翻看之后才发现英文原版出版于2021年12月,彼时AI还没有大规模影响这个行业。即便如此,我仍然很快读完了,书中的观点和我最近对上一个软件工程时代的总结不谋而合。这本书系统且简洁地说清楚了"软件工程"的真正含义。
本书这样定义软件工程:
软件工程是对经验主义和科学方法的应用,目的是为软件中的实际问题找到高效、经济的解决方案。所以软件工程是发现和探索的过程,成功的软件工程师必须成为学习专家和复杂性管理专家。
这个定义很朴素,但我觉得极其准确。多年的工作经历里,除了行业里知名的前辈,其实极少听到身边有同事谈论或深入思考软件工程本身。在国内软件大厂的氛围和互联网浪潮里,我们疲于也乐于堆砌新功能,淹没在基于感觉的工具评价和脱离事实的技巧考核上,相当一部分从业者的确缺乏对专业知识的提炼和总结。所以在浪潮退去的时候,许多没有真正获得沉淀的朋友也不得不离开自己的岗位。那个时代给了我们丰厚的经济回报,但也把不少人变成了消耗品。
书里的核心框架很简洁,建议各位去看看原文:
- 软件工程的五个原则:迭代、反馈、增量主义、实验、经验主义
- 管理复杂性的五个要素:模块化、内聚、关注点分离、抽象、松耦合
- 开发的五个理念:可测试性、可部署性、速度、控制变量、持续交付
我所理解的软件工程
先说结论:AI时代,软件工程的本质及过去总结出来的经验并没有失效,甚至更高效了。
多年以前,我在《计算机程序的构造和解释》里读到一句话,至今奉为真理:"解决工程问题的本质是控制复杂度。"软件工程里控制复杂度的手段离不开三板斧:黑盒封装、接口约束、语言抽象。
AI时代的软件工程
我在进行了大量AI辅助编程的实践之后和同事做过一些讨论。我的经验已经明确告诉我,在软件研发的每一个环节——定义、设计、开发、测试、部署、运维——AI都可以发挥巨大的作用。但很多人并不这样认为,相当大一部分原因是对软件工程在上一个时代总结的经验和方法理解不够透彻,所以很难在当下真正用好AI。
AI时代,一个新的复杂度类别出现了——"人机协同的复杂度"。它很有意思,有点把基于物理世界的复杂度和基于人的复杂度综合到一起的意思,所以细想来其实很多场景"新酒"仍能找到"旧瓶"装,就像Kiro在产品设计中集成基于用户故事的工作流,就像我们对Prompt也需要做分层治理。
所以你看,我们需要不断探索,永远对学习专家和复杂度管理专家保持追求。这里没有永恒的最佳实践,不论什么原因,当你停下来的时候,你就脱离了软件工程本身。致敬敏捷宣言:"我们一直在实践中探寻更好的软件开发方法,身体力行的同时也帮助他人。"
25.08.25
欢迎交流
如果你觉得文章有帮助,欢迎加我微信或关注公众号,获取更多内容

