如何真正学习软件架构?matklad 谈实践、康威定律与激励结构
发布日期:2026-05-13 阅读时间:10 分钟 软件工程 / 架构
这篇文章源于 matklad(Aleksey Kladov)最近的一封邮件回信。matklad 是 IntelliJ Rust 和 rust-analyzer 的作者——这两款工具是 Rust IDE 生态中影响力最大的项目。他这篇回复在 Hacker News 上拿到了 500 分和 101 条评论,说明软件开发社区对超越教科书的、真实可用的架构智慧有多么渴望。
以下是我们的深度解读,结合中文开发者的语境,让你不用看原文也能吃透其中的核心洞见。
核心理念:软件架构是"做"出来的,不是"学"出来的
matklad 一上来就说了一句大实话:那些正式的软件设计课程,大部分不过是"过家家,小孩玩消防员游戏"。他自己在大学里上过形式化的"架构"课,甚至还当过课程项目的"架构师"——但这些经历远不如真正被扔进 IntelliJ Rust 项目的实践中教会他的东西多。
这话说出来有点残忍,但它是真的。你可以读完 GoF 设计模式,背熟 SOLID 原则,考试拿满分——但这些东西一点也帮不了你面对一个被几千人使用的、活着的代码库。架构能力的唯一来源是在真实项目中犯错、踩坑、然后爬起来重构。
好消息是:"软件工程简单到只要你有好奇心,从第一性原理出发(再加上读一些随机博客文章),就能掌握它。"
康威定律:代码是组织结构的投影
matklad 指出,康威定律(Conway's Law)是理解软件架构最重要的概念。这条定律说:组织设计出的系统会复制该组织的沟通结构。但 matklad 引用 neugierig 的话,把这条定律推得更远——也更有杀伤力:
"我们谈论编程时总以为代码是最重要的——但实际上,代码不如架构重要,而架构不如社交问题重要。"
这一句话彻底重新定义了整个学科。工业代码和科研代码之间的差异,根本不是知识水平上的差异——而是驱动人们写代码的激励结构不同。
当一个博士生需要在三个月内发论文,他写出来的"科研代码"糟糕,不是因为他不会写好的代码,而是因为激励结构奖励的是"快点发出论文"而不是"可维护、干净、正确的代码"。
这个洞察放之四海而皆准。你公司那团乱麻般的微服务?去看组织架构图。那堆没人敢动的、没有文档的巨石应用?去看谁在升职、为什么升职。
激励结构比代码质量更重要
这是 matklad 文章中最精华的部分。他描述了两种应对激励结构的方式:
1. 设计激励结构(罕见但影响巨大)
有时候你能得到一个机会,去塑造一个项目的激励机制。这是 TIGER_STYLE 背后的"秘密武器"——不是那些具体的编码规则本身,而是让这些规则变得合理的社会语境。当你能够设定项目规范、招聘标准、评审流程和成功指标时,你就是在做最高层次的架构设计。
2. 适应激励结构(这才是日常)
大多数时候你根本无法改变激励机制。博士的时间线、季度的营收目标、创业公司的"快速迭代"文化——这些是约束条件,不是 bug。matklad 的建议务实的近乎佛系:"你可以速通悲伤的四个阶段,直接接受现实。"
接受永远没有时间把事情做得"完美"这个事实。在约束条件下做到最好——这不是悲观主义,而是让你能实际交付软件、而不是把完美架构打磨到永远不见天日的现实主义。
案例研究:rust-analyzer 的双轨架构
matklad 文章中最具体也最精彩的部分,是他如何设计 rust-analyzer 来吸引两种完全不同的贡献者:
- 深度贡献者——能处理编译器内部的优秀开发者(借用检查器、类型推断、名称解析)
- 周末战士——正在学习 Rust 的人,用一两个小时解决自己的痛点,提交一个功能 PR
这种双轨设计解释了很多 rust-analyzer 的技术决策:
对深度贡献者:降低参与门槛
matklad 坚持 rust-analyzer 不需要构建 rustc 本身,在 stable Rust 上就能编译,没有 C 语言依赖,全部测试套件只需几秒就能跑完。每个决定都是为了让人能"不用想别的事情"就去改借用检查器。没有构建系统的折磨,不用等编译,没有环境配置的摩擦。
对周末战士:用 catch_unwind 隔离质量
这是最有创意也最有争议的设计决策。matklad 把 rust-analyzer 的内部拆分成多个独立功能,每个功能在运行时由 catch_unwind 保护。提交一个功能 PR 的门槛被刻意放低:"happy path 能跑 + 写了测试就行"。
代码会崩溃?没关系——这反而会吸引更多贡献者来修复,只要满足两个条件:
- 质量问题被限定在单个功能内部,不会扩散到其他地方
- 运行时崩溃对用户不可见——所有功能基于不可变快照,不会污染共享数据
与此同时,支撑所有功能的"核心脊柱"则得到了远为严格的质量把关。架构本身强制执行了质量的梯度分布。
这非常巧妙,因为它承认了:不是所有代码都需要高质量。周末战士写的代码可以不够完美,只要架构能把不完美控制住。架构创造了周末战士愿意贡献的激励,而激励隔离——不是代码审查或风格指南——保护了项目免受他们的错误影响。
未来不确定,还会以最不方便的方式发生
matklad 分享了 rust-analyzer 自己的警示故事。这个项目的初衷是为了避免为 IntelliJ Rust 写一个并行编译器,以及原型化一个更好的 LSP 架构,以便把学到的经验回馈给 rustc 本身。核心代码一开始就是故意实验性的。
"唉。现在多了一个编译器要维护,我猜?"
这句轻描淡写的话下掩藏着巨大的转变:一个实验项目成了事实上的 Rust 语言服务器。未来以最不方便的方式发生了——实验项目变成了生产项目,而且没有回头路。
matklad 怀疑 uutils 项目也经历了类似的事情:它一开始是让学 Rust 的人练手的地方,最后却成了 Ubuntu 的核心工具实现。
推荐的资源:到底该去哪学架构?
matklad 说他不认识任何一本包含了所有架构真理的书。他开玩笑说"这样的书大概只有在博尔赫斯的伪经短篇小说里才能找到"。不过他还是列出了几个值得花时间的东西:
- Boundaries——Gary Bernhardt 的传奇演讲。既有具体的编程建议,也能触发元层面的思考。
- How to Test——matklad 自己的文章,精准拆解了大多数测试建议中"神棍式的狗皮膏药"。
- ØMQ 指南 和 Pieter Hintjens 的著作——康威定律思维的来源,塑造了 rust-analyzer 的乐观合并策略。
- Reflections on a decade of coding——Jamii 的元层面反思。
- Ted Kaminski 的博客——"最接近一套连贯软件开发理论的东西。"
- Software Engineering at Google 和 A Philosophy of Software Design(Ousterhout)——他说这些也不错,但对他而言不是颠覆性的。
给开发者的实践建议
- 别指望从课程里学到架构。最好的方法是去构建真实的东西,犯错误,然后读诚实的复盘文章。
- 把公司的组织架构图当作架构文档来读。康威定律不是理论——它是诊断工具。
- 当改变不了激励时,接受它并适应它。世界上最完美的代码,如果在约束条件下无法交付,那就是废纸。
- 为不同类型的贡献者设计你的项目。不是所有人都需要写出完美的代码。用架构来安全地容纳不完美。
- 用架构创造质量梯度。核心用严格标准保护,外围对新人友好。
- 为未来会以最不方便的方式发生而做准备。你今天做的实验项目,明天可能是别人的生产依赖。
matklad 的这篇文章是软件工程写作中一个罕见的瑰宝:它提供了实用的智慧,同时承认这个世界并不干净整洁。它告诉我们代码是整个软件中最无趣的部分——架构更重要,而社会动力则是最重要的。读完它,就像从一个真正构建过世界级软件的人那里得到了职业建议,而不是从一个只教过相关课程的人那里。
更多推荐阅读: Matt Pocock 谈 AI 时代的技能投资、优秀抽象的隐藏成本 和 瓶颈从来不在代码。
阅读原文: Learning Software Architecture by matklad (2026-05-12)