1. 1. 序:什么是软件工程?
    1. 1.1. 软件工程 vs 计算机科学
    2. 1.2. 软件工程的核心要素
    3. 1.3. 讨论的范围和前提
  2. 2. 一、回顾《人月神话》:半个世纪前的智慧
    1. 2.1. 1.1 人月神话的本质
    2. 2.2. 1.2 没有银弹
    3. 2.3. 1.3 外科手术团队
    4. 2.4. 1.4 概念完整性
  3. 3. 二、AI 时代的异同:新的可能与不变的本质
    1. 3.1. 2.1 相同的地方:本质复杂性依然存在
      1. 3.1.1. 需求的复杂性
      2. 3.1.2. 系统的复杂性
      3. 3.1.3. 人的复杂性
    2. 3.2. 2.2 不同的地方:偶然复杂性的大幅降低
      1. 3.2.1. 代码编写的加速
      2. 3.2.2. 学习曲线的平缓化
      3. 3.2.3. 调试和修复的便捷化
    3. 3.3. 2.3 生产力的非线性跃升
  4. 4. 三、AI 时代影响软件工程的几个核心因素
    1. 4.1. 3.1 从”写代码”到”与 AI 对话”:理解问题/提出问题/解决问题
      1. 4.1.1. 表达能力的重要性上升
      2. 4.1.2. 验证能力的重要性上升
      3. 4.1.3. 迭代速度的指数提升
    2. 4.2. 3.2 知识的民主化与专业化的分化
      1. 4.2.1. 入门门槛的降低
      2. 4.2.2. 高端能力的新要求
    3. 4.3. 3.3 团队协作模式的演变
      1. 4.3.1. 小团队的超级生产力
      2. 4.3.2. 沟通成本的结构性变化
    4. 4.4. 3.4 软件质量的新挑战
      1. 4.4.1. 代码质量的两极分化
      2. 4.4.2. 安全性和可靠性的新风险
  5. 5. 四、回到本质:软件工程的永恒命题与我们能做的
    1. 5.1. 4.1 软件工程的本质:管理复杂性
    2. 5.2. 4.2 人的价值:理解、判断、创造
      1. 5.2.1. 深度理解
      2. 5.2.2. 准确判断
      3. 5.2.3. 创新创造
    3. 5.3. 4.3 我们能做什么:三个核心方向
    4. 5.4. 4.4 从”人月神话”到”人日神话”
  6. 6. 结语

人日神话-聊聊AI时代的软件工程

软件开发的核心难题不是技术,而是人类组织与复杂性管理

笔者最近重温了下大学时候浅读过的《人月神话》,在最近几年中伴随着 AI 的发展以及自己的实践,想要再聊聊当下时代的软件工程。

序:什么是软件工程?

在深入讨论 AI 时代的软件工程之前,我们需要先明确:我们在谈论什么?

软件工程 vs 计算机科学

计算机科学(Computer Science) 是一门研究计算的理论、算法和计算系统的学科。它关注的是:

  • 算法的正确性和复杂度
  • 数据结构的设计和分析
  • 计算理论、形式语言、自动机
  • 编译原理、操作系统、网络协议等基础理论

计算机科学问的是:”这个问题理论上能不能解决?如何高效地解决?”

软件工程(Software Engineering) 则是一门关于如何系统化、规范化、可量化地开发、运行和维护软件的学科。它关注的是:

  • 如何在有限的时间、预算、人力下交付可用的软件
  • 如何组织团队、管理项目、控制质量
  • 如何应对需求变化、技术债务、系统演化
  • 如何在不确定性中做出工程权衡

软件工程问的是:”如何在现实约束下,构建出满足需求、质量可控、可持续维护的软件系统?”

用一个类比来说:

  • 计算机科学像是物理学和数学,研究世界的基本规律
  • 软件工程像是建筑学和工程学,在现实约束下建造可用的系统

一个优秀的算法(计算机科学的成果)未必能变成一个成功的产品(软件工程的目标)。反之,一个成功的产品也不一定在每个细节上都使用了最先进的算法。

软件工程的核心要素

软件工程可以用一个简单的框架来理解:在约束条件下,由人通过过程和技术交付有质量的软件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
              ┌─────────────────────────────────────┐
│ 约束 (Constraints) │
│ 时间·预算·资源·性能·合规·兼容性 │
└──────────────┬──────────────────────┘

┌──────────────▼──────────────────────┐
│ │
┌────────┤ 软件工程核心三角形 ├────────┐
│ │ │ │
│ └─────────────────────────────────────┘ │
│ │
┌────▼─────┐ ┌──────────┐ ┌────────▼────┐
│ │ │ │ │ │
│ 人员 │◄────────────►│ 过程 │◄────────────►│ 技术 │
│ People │ │ Process │ │ Technology │
│ │ │ │ │ │
└────┬─────┘ └─────┬────┘ └──────┬──────┘
│ │ │
│ • 产品经理 │ • 需求分析 │ • 编程语言
│ • 架构师 │ • 系统设计 │ • 框架/库
│ • 工程师 │ • 编码实现 │ • 基础设施
│ • 测试/运维 │ • 测试部署 │ • 工具链
│ │ • 迭代优化 │
│ │ │
└──────────────────────────┼──────────────────────────┘

┌──────────▼──────────┐
│ 质量 (Quality) │
│ 功能·可靠·性能·安全 │
└─────────────────────┘

五个核心维度:

  1. 人(People):产品经理、架构师、开发工程师、测试与运维人员——技能、协作、经验
  2. 过程(Process):需求→设计→编码→测试→部署→运维→迭代——方法论与流程
  3. 技术(Technology):编程语言、框架库、基础设施、工具链——实现的手段
  4. 质量(Quality):功能性、可靠性、性能、安全性、可维护性——交付的标准
  5. 约束(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 的辅助下,我们有了更锋利的工具、更广阔的视野、更多的可能性。关键在于,我们如何运用这些工具,去解决真正的问题,创造真正的价值。

这或许就是”人日神话”的真谛:速度提升了,但智慧依然不可或缺