软件开发的核心难题不是技术,而是人类组织与复杂性管理
笔者最近重温了下大学时候浅读过的《人月神话》,在最近几年中伴随着 AI 的发展以及自己的实践,想要再聊聊当下时代的软件工程。
序:什么是软件工程?
在深入讨论 AI 时代的软件工程之前,我们需要先明确:我们在谈论什么?
软件工程 vs 计算机科学
计算机科学(Computer Science) 是一门研究计算的理论、算法和计算系统的学科。它关注的是:
- 算法的正确性和复杂度
- 数据结构的设计和分析
- 计算理论、形式语言、自动机
- 编译原理、操作系统、网络协议等基础理论
计算机科学问的是:”这个问题理论上能不能解决?如何高效地解决?”
软件工程(Software Engineering) 则是一门关于如何系统化、规范化、可量化地开发、运行和维护软件的学科。它关注的是:
- 如何在有限的时间、预算、人力下交付可用的软件
- 如何组织团队、管理项目、控制质量
- 如何应对需求变化、技术债务、系统演化
- 如何在不确定性中做出工程权衡
软件工程问的是:”如何在现实约束下,构建出满足需求、质量可控、可持续维护的软件系统?”
用一个类比来说:
- 计算机科学像是物理学和数学,研究世界的基本规律
- 软件工程像是建筑学和工程学,在现实约束下建造可用的系统
一个优秀的算法(计算机科学的成果)未必能变成一个成功的产品(软件工程的目标)。反之,一个成功的产品也不一定在每个细节上都使用了最先进的算法。
软件工程的核心要素
软件工程可以用一个简单的框架来理解:在约束条件下,由人通过过程和技术交付有质量的软件。
1 | ┌─────────────────────────────────────┐ |
五个核心维度:
- 人(People):产品经理、架构师、开发工程师、测试与运维人员——技能、协作、经验
- 过程(Process):需求→设计→编码→测试→部署→运维→迭代——方法论与流程
- 技术(Technology):编程语言、框架库、基础设施、工具链——实现的手段
- 质量(Quality):功能性、可靠性、性能、安全性、可维护性——交付的标准
- 约束(Constraints):时间、预算、资源、性能、合规——现实的边界
这五个要素相互影响、相互制约。优秀的软件工程就是在这些要素之间找到最佳平衡点。
讨论的范围和前提
在本文中,我们主要讨论的是:
角色的站位:
- 软件开发人员
聚焦的场景:
- 互联网产品和企业应用为主
- 快速迭代、需求多变的场景
不涉及的领域:
- 嵌入式系统、航天/军工等对可靠性要求极高的系统
- 科学计算、高性能计算等偏算法研究的领域
前提假设:
- 团队成员具备基本的编程能力
- 有一定的项目管理和团队协作机制
- 使用现代的开发工具和实践(版本控制、代码审查等)
明确了”what”之后,让我们回到半个世纪前,看看 Fred Brooks 是如何思考软件工程问题的。
一、回顾《人月神话》:半个世纪前的智慧
Fred Brooks 在 1975 年出版的《人月神话》中提出了许多至今仍然深刻的洞见。这本书的核心观点可以概括为以下几个方面:
1.1 人月神话的本质
Brooks 的核心论断是:向进度落后的项目中增加人手,只会使进度更加落后。这个看似反直觉的观点背后,揭示了软件开发的几个本质特征:
- 软件开发不是简单的劳动堆叠:不同于搬砖等可以简单并行的工作,软件开发涉及大量的沟通、协调和知识传递
- 沟通成本随人数指数增长:n 个人的团队有 n(n-1)/2 条沟通路径,随着团队规模增加,沟通成本呈指数级上升
- 新人的培训成本:新加入的成员需要时间学习项目背景、代码库、业务逻辑,这会占用老成员的时间
1.2 没有银弹
Brooks 在 1986 年的论文《没有银弹》中进一步阐述:软件工程中不存在任何单一的技术或管理上的进展,能够独自承诺在十年内大幅度地提高软件的生产率、可靠性或简洁性。
他区分了软件开发中的两种复杂性:
- 本质复杂性(Essential Complexity):源于问题本身的复杂性,无法消除
- 偶然复杂性(Accidental Complexity):由于工具、语言、环境等因素引入的复杂性,可以通过技术改进来减少
Brooks 认为,到了 1986 年,大部分偶然复杂性已经被消除,剩下的主要是本质复杂性。因此,即使出现新的编程语言、开发工具或方法论,也很难实现数量级的生产力提升。
1.3 外科手术团队
针对沟通成本的问题,Brooks 提出了”外科手术团队”的组织模式:
- 由一个”首席程序员”(主刀医生)负责核心设计和编码
- 其他成员扮演辅助角色:副手、工具开发者、文档编写者等
- 这样可以保持小规模团队的生产力,同时获得大团队的支持
1.4 概念完整性
Brooks 强调,优秀的软件系统必须具有概念完整性:
- 系统的设计理念应该统一、连贯
- 最好由一个人或少数几个人负责架构设计
- 实现可以由更多人参与,但必须遵循统一的架构原则
二、AI 时代的异同:新的可能与不变的本质
时光荏苒,距离《人月神话》出版已经过去了近 50 年。AI 技术,特别是 2022 年 ChatGPT 的发布和 2023-2024 年大语言模型的井喷式发展,正在深刻改变软件开发的面貌。那么,《人月神话》中的观点在今天还适用吗?
2.1 相同的地方:本质复杂性依然存在
尽管 AI 工具日新月异,但软件开发的本质复杂性并未消失:
需求的复杂性
- 用户需求往往模糊、多变、相互矛盾
- 理解业务场景、用户心理、应用上下文仍然需要深度思考
- AI 可以帮助我们快速实现功能,但不能替代我们理解”为什么要做这个功能”
系统的复杂性
- 现代软件系统的复杂度不断上升:移动互联网时代的微服务、分布式系统、多端适配等等;大模型时代非确定性输出的系统管理
- 系统各部分之间的依赖关系、数据流、状态管理等问题依然棘手
- 概念完整性在当下更加重要
人的复杂性
- 团队协作、沟通成本、知识传递的问题并未因 AI 而消失
- 产品经理、设计师、开发者、运维人员之间的协调依然必要,甚至 AI 笔者同样认为是一个角色而非简单工具
- 组织结构和文化对软件质量的影响依然深远
2.2 不同的地方:偶然复杂性的大幅降低
AI 时代最显著的变化是:偶然复杂性正在以前所未有的速度被消除。
代码编写的加速
- AI 辅助编程工具(GitHub Copilot, Cursor, Codeium 等)让代码编写速度提升数倍
- 样板代码、常见模式、API 调用等可以瞬间生成
- 从想法到可运行的原型的时间大幅缩短
学习曲线的平缓化
- 新语言、新框架、新工具的学习成本大幅降低
- AI 可以实时解释代码、提供示例、回答问题
- 从”不会”到”会用”的时间从几周缩短到几小时
调试和修复的便捷化
- AI 可以快速定位 bug、解释错误信息、提供修复建议
- Stack Overflow 式的问题搜索变成了实时对话
- 代码审查、重构建议、性能优化建议都可以自动生成
2.3 生产力的非线性跃升
与 Brooks 预言的”没有银弹”不同,AI 似乎正在成为一个接近”银弹”的东西。但是,这种生产力提升是否达到了”数量级”的程度?
从笔者的实践来看:
- 对于熟练开发者,生产力提升大约在 2-5 倍
- 对于初级开发者,生产力提升可能达到 5-10 倍
- 对于原型开发和探索性编程,生产力提升可能达到 10 倍以上
- 但对于架构设计、需求分析、系统优化等工作,提升相对有限
关键在于:AI 降低的主要是”写代码”这个环节的成本,而这只是软件工程的一部分。
三、AI 时代影响软件工程的几个核心因素
AI 不仅改变了我们写代码的方式,更深刻地影响着整个软件工程的各个环节。以下是几个核心的变化因素:
3.1 从”写代码”到”与 AI 对话”:理解问题/提出问题/解决问题
传统的软件开发流程:思考 → 设计 → 编码 → 测试 → 调试
AI 时代的软件开发流程:思考 → 对话 → 验证 → 迭代 → 集成
这个转变带来了几个深刻的影响:
表达能力的重要性上升
- 能否清晰、准确地向 AI 描述需求,成为了新的核心能力
- 自然语言表达、问题拆解、上下文管理变得更加重要
- “Prompt Engineering”成为了一种新的工程技能
验证能力的重要性上升
- AI 生成的代码质量参差不齐,需要快速判断正确性
- 阅读理解代码的能力变得比从零编写代码的能力更重要
- 完整性的产品意识更加重要,不仅仅局限于 AI 实现的单一功能
迭代速度的指数提升
- 从想法到可验证的原型的时间大幅缩短
- 快速试错、快速调整成为可能
- 敏捷开发、精益创业的理念得到了技术层面的支撑
3.2 知识的民主化与专业化的分化
入门门槛的降低
- 不懂编程的人也能通过 AI 实现简单的功能
- 单方向的软件工程师能够一定程度上更加「全栈」
高端能力的新要求
- 深度的系统理解、架构能力、工程判断力变得更加稀缺
- “知道让 AI 做什么”和”判断 AI 做得对不对”成为核心竞争力
- 顶尖工程师与普通工程师的差距可能会进一步拉大,尤其是公开资料较少的知识领域
3.3 团队协作模式的演变
小团队的超级生产力
- 一个 3-5 人的小团队,在 AI 辅助下可能完成过去 20-30 人团队的工作
- Brooks 的”外科手术团队”模式得到了技术层面的支持
沟通成本的结构性变化
- 代码层面的沟通减少(AI 可以帮助理解和解释代码)
- 但需求、设计、架构层面的沟通依然关键
- 文档的重要性可能下降(AI 可以随时解释代码),但架构文档和设计决策记录依然必要
3.4 软件质量的新挑战
代码质量的两极分化
- 好的 AI 实践可以产生高质量、可维护的代码
- 坏的 AI 实践可能产生大量技术债务
- “能跑就行”的代码变得更容易产生,但长期维护成本可能更高
安全性和可靠性的新风险
- AI 生成的代码可能包含安全漏洞(这可能是因为提问者而非 AI)
- 对 AI 的过度依赖可能导致对底层原理的忽视,出现复杂异常时很难排查问题
四、回到本质:软件工程的永恒命题与我们能做的
在 AI 的浪潮下,我们需要回到软件工程的本质,思考什么是真正不变的东西,以及我们应该如何应对。
4.1 软件工程的本质:管理复杂性
无论技术如何发展,软件工程的核心使命始终是:在有限的时间、资源和认知能力下,管理和控制系统的复杂性。
这包括:
- 概念的清晰性:系统的设计理念是否清晰、连贯
- 模块的独立性:各个模块之间的耦合度是否合理
- 接口的简洁性:组件之间的交互是否简单明了
- 演化的可持续性:系统能否随着需求变化而持续演进
AI 可以帮助我们快速实现功能,但不能替代我们对复杂性的管理。实际上,如果滥用 AI,可能会产生更多的复杂性。
4.2 人的价值:理解、判断、创造
在 AI 时代,人的价值体现在哪里?
深度理解
- 理解用户的真实需求,而不只是表面的功能要求
- 理解系统的运行机制,而不只是表面的 API 调用
- 理解业务的本质逻辑,而不只是流程的简单复刻
准确判断
- 判断 AI 生成的代码是否正确、安全、高效
- 判断技术选型是否合适、架构设计是否合理
- 判断什么时候该相信 AI,什么时候该质疑 AI
创新创造
- 创造性地解决新问题,而不只是套用已有方案
- 设计用户体验,而不只是堆砌功能
- 思考产品的差异化价值,而不只是跟随竞品
4.3 我们能做什么:三个核心方向
AI 时代的软件工程师,需要在三个方向上持续精进:
1. 驾驭 AI - 学会提问和验证
- 精准表达需求,快速验证结果
- 建立自己的 AI 协作工作流
2. 深耕本质 - 理解”为什么”而非”怎么做”
- 架构设计、系统思维、工程权衡
- 需求洞察、业务理解、用户体验
3. 保证质量 - 建立 AI 时代的质量标准,这是团队开发一个大型软件工程的基础
- AI 生成代码的审查机制
- 自动化测试与安全保障
- 关键设计决策的文档化
4.4 从”人月神话”到”人日神话”
Brooks 用”人月”来衡量项目规模,反映了那个时代软件项目的时间尺度。在 AI 时代,我们或许可以谈论”人日神话”:
- 许多过去需要几周甚至几个月的工作,现在可以在几天内完成
- 但这并不意味着我们可以用”加人”来”加速”
- 反而,高质量的软件依然需要深度思考、精心设计、持续打磨
AI 改变的是”速度”,但没有改变”方向”。我们依然需要:
- 明确我们要去哪里(需求和目标)
- 设计如何到达那里(架构和设计)
- 确保我们走在正确的路上(质量和验证)
- 持续优化我们的路径(迭代和改进)
结语
《人月神话》告诉我们,软件开发的核心难题不是技术,而是人类组织与复杂性管理。半个世纪后,这个论断依然成立。
AI 是一个强大的工具,它大幅降低了偶然复杂性,让我们能够更快地将想法变成现实。但是,软件工程的本质复杂性——需求的模糊性、系统的复杂性、人的因素——并未因此消失。
在 AI 时代,优秀的软件工程师不是被 AI 替代的对象,而是能够有效利用 AI、管理复杂性、创造真正价值的人。我们需要的不是”银弹”的幻想,而是对本质的清醒认识和对专业的持续追求。
正如 Brooks 所言,软件工程没有银弹。但在 AI 的辅助下,我们有了更锋利的工具、更广阔的视野、更多的可能性。关键在于,我们如何运用这些工具,去解决真正的问题,创造真正的价值。
这或许就是”人日神话”的真谛:速度提升了,但智慧依然不可或缺。