主页 HomePage

260816-超大型软件项目复杂度与重建成本

——关于 Linux、Chromium、桌面 Linux、OpenJDK、.NET、Windows 及其他极大型软件系统的讨论归档

整理口径:主要讨论“如果今天不用 AI、从零重新实现一个具有核心功能、生产级稳定性、基本兼容性与基本硬件/平台覆盖的系统,大约需要多少工程投入”。除特别说明外,不计算市场教育、社区建设、合作伙伴发展、第三方生态培育等成本。

1. 估算方法与重要前提

这里的人月数字不是官方预算,也不是精确统计,而是将代码规模、子系统数量、兼容面、测试矩阵、硬件覆盖、安全性、性能优化、工程组织和长期稳定化等因素综合后得到的工程重建成本估算。因此这些数字更适合比较“数量级”和“相对复杂度”,不适合当成项目报价。

1.1 默认包含的工作

1.2 默认不包含的工作

1.3 为什么不能只看代码行数

代码量只能提供一个非常粗的下界。两个同为数千万行代码的项目,工程难度可能仍然完全不同。真正决定重建成本的因素通常包括:

一个简化模型可以写成:

\[ \text{总工程量} \approx \text{核心实现} \times \text{兼容系数} \times \text{可靠性系数} \times \text{平台覆盖系数} + \text{测试与稳定化成本} \]

其中“兼容系数”并非一个真正可单独分离的模块,而往往渗透在各个子系统中。

2. Linux 内核与 Chromium

2.1 如果要求接近当前完整成熟度

如果要求重新实现今天 Linux 内核和 Chromium 的完整功能、成熟度、兼容性与长尾覆盖,两者都属于“十几万到几十万人月”的超级工程。

项目完整成熟度重建粗估主要复杂性来源
Linux 内核约 15 万~40 万人月硬件驱动、CPU 架构、文件系统、网络、长期 ABI 与行为兼容、设备长尾
Chromium约 18 万~50 万人月Web 平台、JS 引擎、渲染、媒体、安全、多进程、网站兼容、测试基础设施

这时两者不是十倍级差距,而是处于同一数量级。Chromium 的语义深度非常高,而 Linux 的硬件与架构覆盖极其宽。

2.2 如果只做单一平台

一旦把目标缩小为“单一硬件/操作系统平台”,Linux 可以大幅削掉驱动和架构长尾,而 Chromium 很难削掉现代 Web 平台的大部分核心语义。

2.3 为什么 Chromium 在受限平台下仍很重

即使只支持一个桌面操作系统,现代浏览器仍需要实现:

浏览器最大的困难可以概括为:它必须正确解释一个极其庞大、持续演化、还背负大量历史行为的 Web 平台。

3. 去掉生态成熟成本后的变化

当目标变为“核心功能 + 稳定性 + 基本兼容性 + 基本硬件覆盖”,并明确不要求复刻几十年的生态成熟长尾后,两个项目的人月估算都会下降一个数量级左右。

项目较现实的目标范围粗估人月
Linux 内核替代品x86-64,最多加 ARM64;主流 PC/服务器;常见 Linux 用户态兼容约 10,000~30,000
Chromium 替代品一个桌面平台;主流现代网页可用;基本多进程、安全、音视频约 25,000~70,000

中心结论:这种口径下,Chromium 大约是 Linux 内核的 2~3 倍;宽松时可能只有 1.5 倍,严格要求安全、性能和网站兼容时可能达到 4 倍。

3.1 Linux 可以删掉什么

3.2 Chromium 可以删掉什么

但 Chromium 的削减存在更高下限:只要目标是“现代主流网页基本可用”,Web 平台的大量核心语义就不能省。

4. Linux 内核 + 主流桌面环境 vs Chromium

如果不再比较“Linux 内核”,而是比较一个真正可日常使用的 Linux 桌面平台,那么 Linux 一侧的复杂度会明显上升。

目标粗估人月中心估计
Linux 内核10,000~30,000约 18,000
Linux 内核 + 主流桌面平台30,000~80,000约 50,000
Chromium25,000~70,000约 45,000

因此:Linux 桌面平台与 Chromium 基本进入同一复杂度等级。

4.1 “Linux 桌面平台”至少包含

4.2 Linux 桌面为什么会迅速变重

最大的新增成本来自 GPU、显示、音频、输入、电源和跨层状态协调。

应用
↓
GUI 工具包 / 桌面 API
↓
合成器 / 音频 / 网络 / 权限服务
↓
用户态硬件驱动
↓
内核驱动
↓
真实硬件

插入一个外接显示器这样的普通动作,可能同时触发硬件发现、GPU 输出配置、合成器布局、缩放策略、桌面设置更新与应用重排。各层分别正确并不够,跨层状态还必须一致。

4.3 与 Chromium 的复杂度分布差异

维度Linux 桌面Chromium
算法与语言运行时深度高极高
标准与行为兼容高极高
硬件覆盖极高相对较低
跨子系统集成极高高
安全攻击面极高极高
稳定性测试矩阵极高极高

Chromium 是“语义深度极高的应用平台”;Linux 桌面是“纵向跨度和硬件集成极广的操作系统平台”。

4.4 GPU 驱动是否自己写,会强烈改变结论

5. 其他开放源代码的极大型项目

真正能与 Linux、Chromium 同层级讨论的开放源代码项目并不多。可以分成几档。

5.1 第一档:最接近 Linux/Chromium

项目粗估人月主要复杂性
AOSP 上层平台30,000~80,000Framework、ART、Binder、图形、媒体、安全、HAL、系统服务、兼容测试
Firefox / Gecko25,000~70,000Web 平台、SpiderMonkey、渲染、多进程、沙箱、媒体、Web 兼容
OpenStack 核心项目群20,000~60,000计算、网络、存储、身份、多租户、升级、分布式故障处理

5.2 第二档:基础软件领域的超级项目

项目粗估人月主要复杂性
LLVM 项目群15,000~40,000Clang、优化器、后端、LLD、LLDB、libc++、Sanitizer、MLIR 等
GNU 工具链15,000~40,000GCC、Binutils、GDB、glibc、libstdc++、多架构与 ABI
OpenJDK12,000~35,000HotSpot、JIT、GC、Java SE 类库、javac、诊断工具
Wine8,000~25,000Windows 用户态 API、PE、COM、图形、音频、注册表、兼容性长尾
Mesa8,000~30,000OpenGL、Vulkan、EGL、着色器编译、多家 GPU 驱动
LibreOffice8,000~25,000文字处理、电子表格、演示、文档格式兼容、排版与计算
Blender8,000~25,000建模、动画、渲染、物理、合成、视频、几何与节点

5.3 第三档:专业领域中的极大型项目

这些项目中,真正与 Linux/Chromium 同层级的主要是 AOSP、Firefox 与完整 OpenStack 项目群;LLVM、GNU 工具链、OpenJDK 则属于技术深度极高、但领域跨度更窄的基础软件超级工程。

6. OpenJDK 与 .NET 的复杂度比较

.NET 现在已经是完整的开源开发平台,但“dotnet”这个词的边界比 OpenJDK 更宽。公平比较时必须拆分层次。

6.1 对等口径

范围粗估人月相对 OpenJDK
OpenJDK:HotSpot + Java SE + javac + JDK 工具12,000~30,0001.0
.NET 核心:CoreCLR + BCL + C# Roslyn + 基本 SDK14,000~34,000约 1.1~1.3
完整现代 .NET 基础平台:再含 Mono、NativeAOT、完整 Roslyn、MSBuild/NuGet18,000~45,000约 1.3~1.6
再含 ASP.NET Core、EF Core、WinForms/WPF 等25,000~60,000约 1.7~2.3

6.2 .NET 更重的地方

6.3 OpenJDK 更重的地方

核心结论:如果只比生产级基础工具链,.NET 通常比 OpenJDK 大约高 10%~30%,仍属于同一复杂度等级;把 Mono、NativeAOT、完整 SDK 和上层应用框架都算入后,.NET 才明显扩大。

7. 加入闭源软件后的极大型系统

闭源世界中最复杂的软件往往不是单一代码库,而是持续几十年演化的“平台族”或“系统之系统”。

7.1 第一档:全球级系统之系统

系统粗略重建量特点
AWS / Azure / Google Cloud 核心平台30 万~100 万+ 人月全球计算、网络、存储、身份、计费、容灾、自动化和海量服务
Google 搜索 + 广告 + 全球基础设施30 万~100 万+ 人月搜索、索引、广告、分布式存储、机器学习、全球基础设施
Microsoft 365 完整云平台20 万~60 万人月Office、Exchange、SharePoint、Teams、OneDrive、身份与协作
Meta 社交平台与基础设施20 万~80 万人月社交图谱、消息、广告、推荐、存储、全球分发、机器学习
大型银行支付/清算/风控平台族10 万~50 万人月高一致性、审计、支付网络、反欺诈、合规、灾备

这类系统通常比任何单一开源代码库高一个数量级,但严格来说它们已经不是“一个软件项目”,而是由数百到数千个子系统组成的企业级平台组合。

7.2 第二档:极复杂单一平台或紧密产品族

项目/平台粗估人月
Windows 基本生产级平台约 6 万~15 万
Windows 广泛历史兼容版本约 10 万~20 万;极端长尾可达 15 万~40 万
Apple 操作系统平台族约 10 万~25 万
z/OS + CICS + IMS + Db2 等主机平台约 10 万~30 万
SAP S/4HANA + HANA 核心平台约 6 万~18 万;完整行业与历史兼容可更高
Adobe Creative Cloud 核心产品族约 6 万~18 万
完整 EDA 套件约 8 万~25 万
大型 CAD/CAE/PLM 产品族约 5 万~20 万

7.3 第三档:单领域技术深度极高

7.4 第四类:验证成本极高的软件

有些系统代码量未必比 Chromium 大,但验证成本极端高:

这些项目的难点不仅是“写出来”,而是要证明它在各种故障和边界条件下仍然正确。

7.5 Mermaid:复杂度层级示意

flowchart TD
A[全球云/互联网系统之系统
30万~100万+人月] B[操作系统/主机/ERP/EDA/大型产品族
5万~30万人月] C[Chromium / Linux桌面 / Firefox / 大型数据库与引擎
2万~10万人月] D[OpenJDK / .NET核心 / LLVM / Wine / Mesa / Blender
1万~5万人月] E[QEMU / PostgreSQL / Kubernetes核心 / Ceph 等
数千~2万人月] A --> B B --> C C --> D D --> E

8. Windows 的历史兼容负担

Windows 的历史兼容负担确实非常大,但不能简单理解成“Windows 里面额外藏着两个操作系统”。更准确地说,兼容性是一个横向乘数,它渗透到 API、ABI、文件系统、注册表、图形、安装器、安全、驱动和测试等各层。

8.1 更合理的量化

目标粗估人月
全新设计、不兼容 Win32 的生产级桌面系统3 万~7 万
Windows 基本平台 + 主流现代 Win32 兼容6 万~12 万
广泛兼容近二三十年的桌面、企业与游戏软件10 万~20 万
近乎复制全部历史行为、驱动和应用长尾15 万~40 万,且可能不可完全实现

8.2 为什么兼容性这么贵

API 名称不是重点,行为才是重点

旧程序可能依赖:

从设计角度看可能是 bug,但如果大量商业软件依赖它,它就变成了事实上的接口。

二进制兼容比源码兼容昂贵

Windows 需要长期维护:

WOW64 本身就像一个小型兼容环境

64 位 Windows 运行 32 位程序,需要处理:

应用兼容 Shim

Windows 可以针对特定程序启用兼容修复,例如:

单个 shim 往往很小,真正昂贵的是发现、定位、验证和长期维护。

8.3 为什么兼容性不能单独切出来

现代 Windows 子系统
├─ 文件系统
│   └─ 同时背负旧路径、共享、权限和重定向语义
├─ 装载器
│   └─ 同时处理多代 PE、DLL、manifest 和运行库
├─ 图形与窗口
│   └─ 同时保留旧消息、旧控件和旧 GDI 行为
├─ 注册表
│   └─ 同时支持历史键路径、重定向和虚拟化
└─ 安全
    └─ 新安全模型必须避免破坏关键旧应用

因此更准确的说法不是“现代 Windows 需要 X,人为追加一个兼容层再需要 Y”,而是:历史兼容让几乎所有核心子系统都变得更难设计、更难演进、更难测试。

8.4 兼容性的复利效应

兼容性不仅增加当前代码,还会限制未来架构选择:

于是新系统会不断叠加:

新 API
旧 API
兼容包装层
版本选择机制
应用专用 shim
架构转换层
测试矩阵

这也是为什么历史兼容具有“复利”性质。

8.5 Windows 并非无限兼容

微软会主动划边界,例如:

因此现代 Windows 的策略更接近:优先保留商业价值最高、使用量最大且可以安全兼容的旧软件。

9. 综合复杂度分层

将前面的估算放在同一张表中,可以得到一个非常粗略的“从零重建基本生产级版本”的复杂度阶梯:

复杂度层级典型项目粗略重建量
超大规模系统之系统AWS、Azure、Google 全球基础设施、Microsoft 365、Meta 平台20 万~100 万+ 人月
超大型平台族完整 Windows、Apple OS 平台族、z/OS 栈、SAP、EDA、Adobe CC5 万~30 万人月
极大型单一平台Chromium、Firefox、Linux 桌面、AOSP 上层、Office 核心、Oracle DB 产品族2 万~10 万人月
超级基础软件OpenJDK、.NET 核心、LLVM、GNU 工具链、Wine、Mesa、Blender1 万~5 万人月
大型基础项目QEMU、PostgreSQL、Ceph、Kubernetes 核心等数千~2 万人月

9.1 不能只按“代码量”排序

9.2 单一代码库与平台族要分开

Chromium、Linux 内核、OpenJDK 更接近“清晰边界的软件平台”;而 AWS、Microsoft 365、SAP、EDA 套件、Creative Cloud 则更接近产品族或系统之系统。后者总工程量可以远大于任何单一开源仓库,但比较时必须明确边界。

10. 核心结论

  1. Linux 内核与 Chromium:如果追求今天的完整成熟度,两者都是十几万到几十万人月级;如果只做基本生产级版本,Linux 内核约 1 万~3 万,Chromium 约 2.5 万~7 万。

  2. Linux 内核 + 桌面:一旦加入图形、GPU、音频、输入、网络、电源、会话、更新和桌面服务,整体会升至约 3 万~8 万人月,与 Chromium 基本同级。

  3. OpenJDK 与 .NET:核心工具链属于同一复杂度等级;.NET 因 Roslyn 平台化、统一 SDK、多运行时与 NativeAOT 等,通常略大约 10%~30%,完整现代 .NET 平台则可高出更多。

  4. 开放源代码领域:AOSP、Firefox、OpenStack、LLVM、GNU 工具链、OpenJDK、Wine、Mesa、LibreOffice、Blender 等都属于极大型项目,但真正和 Linux/Chromium 同层级的仍是少数。

  5. 闭源领域:Windows、Apple OS 平台族、z/OS、SAP、EDA、Adobe Creative Cloud、Office、Oracle Database 等都可能达到或超过 Chromium 级别;全球云和互联网平台则可能高一个数量级。

  6. Windows 历史兼容:其成本确实足以相当于一个甚至多个大型软件平台,但它不是独立的一块“兼容代码”,而是把 Windows 几乎所有子系统的设计、实现、演进和测试成本都放大。

  7. 最重要的估算原则:“核心功能”“生产稳定性”“基本兼容”“完整历史兼容”“生态成熟”是完全不同的项目目标。只要改变其中一个词,人月估算就可能改变数倍甚至一个数量级。

10.1 一句话总结

真正的“超大型软件”不是因为代码行数很多,而是因为它同时承担了庞大的语义、兼容性、硬件/平台覆盖、可靠性、安全性与测试状态空间;Linux、Chromium、Windows、OpenJDK/.NET、数据库、EDA 和全球云平台只是这种复杂性的不同形态。