Learning Software Architecture
609 points • 6 days agoArticle Link

作者以自己从生物信息学实验室转向担任 IntelliJ Rust 项目负责人的经历为例,认为学习软件设计更适合通过实战而不是依靠正规教育。大学课程能打好基础,但真正的理解来自于在真实项目中动手、解决问题。因为软件工程本质上是讲逻辑的,好奇的人可以通过试验和阅读逐步掌握。

一个重要的洞见是 Conway's Law:软件架构会映射出构建它的组织的社会结构。作者认为,科学软件与工业软件的差别更多源自激励机制而非技术水平。例如,学术界受到发表期限等压力,会影响科学软件的开发方式。他建议两条策略:一是在可能的情况下去影响激励机制(如 TIGER_STYLE 这样的项目所示);二是接受现有约束,在其范围内高效地工作。

以 rust-analyzer 为例,作者指出它既"深"(具有编译器级的复杂性)又"广"(包含大量 IDE 功能),因此需要针对不同类型的贡献者采取不同策略。为了吸引专注的核心开发者,他把优先级放在干净、快速的构建系统和核心架构的高质量代码上;而对于添加孤立功能的偶发贡献者,他则降低了准入门槛,允许质量要求较低的代码,只要这些改动的失败可以被限制住、对用户不可见。这种务实做法在质量与社区增长之间取得了平衡。

他也提醒,迎合既有激励机制存在风险,因为未来的需求难以预测。 rust-analyzer 最初只是一个用于验证 rustc 架构的实验性原型,后来竟发展成了完整的编译器;同样,uutils 最初是 Rust 开发者的练习项目,后来成为 Ubuntu 的 coreutils 实现。这些例子说明项目常会因环境变化而超出最初的设想。

在具体学习资源方面,作者推荐了若干有影响力的作品。 Gary Bernhardt 的 "Boundaries" 演讲提供了实用的设计建议,并引发了他对软件架构的更深入思考。他自己关于测试的随笔反映了在意识到许多传统测试观念无效之后总结出的宝贵经验。 Pieter Hintjens 关于 ZeroMQ 的著作让他接触到以 Conway's Law 为出发点的思维和"乐观合并"等概念,这些都影响了 rust-analyzer 的开发模式。另有值得关注的还有 Jamii 的反思性编码文章和 Ted Kaminski 的博客,后者把软件开发作为一个连贯的理论体系来探讨。

尽管像 Software Engineering at Google 和 Ousterhout 的 A Philosophy of Software Design 这样的书很有价值,作者认为它们仍不及亲身实践带来的改变深刻。他的结论是:在软件设计上达到精通,主要靠做、观察和不断迭代,而不是依赖某一本权威书籍。整个过程需要接受不确定性,适应社会性动态,并通过现实世界的挑战不断打磨自己的理解。

120 comments • Comments Link

软件架构既需要儒家式的实践学习,也需要道家式的化繁为简;真正有价值的架构是在组织现实中经受考验、存活下来的,而不是纸上谈兵的设计。用"code on, code off"去类比《龙威小子》里的"wax on, wax off",把学写代码看作学武艺,是一种有益的思路。越来越多非英语母语者依赖 LLM 来提升写作质量,对这种做法的指责并无太大意义。

像 Shaw 和 Garlan 的 Software Architecture: Perspectives on an Emerging Discipline 这样的经典著作仍然很重要,同时也应研究 Unix 管道、 REST 、六边形架构等成功模式,并探讨如何在编程语言中把连接器做成一等公民。 Residuality 理论提供了与实践经验相符的架构视角,既有专门论述该理论的书籍,也有讨论架构哲学的配套著作。

把系统看作代数数据类型的转换序列等心智模型非常有力且具跨领域迁移性;折叠、展开及其对偶等概念为各种编程环境提供了通用的抽象框架。尽管这些抽象代数模型是跨领域可迁移的有益例子,但它们并非普适;文章对社会约束和组织背景的强调对于理解为何某些架构能成功仍然至关重要。

全栈开发在处理枯燥项目时会消磨编程的乐趣:当每周花 40 小时做无趣的工作,很难保持建设系统性深层心智模型的动力。架构案例研究对帮助非编码背景的人判断 LLM 提出的架构决策非常有价值,类似于医学生通过临床轮转学习;《 Architecture of Open Source Applications 》等资源提供了关于约束如何塑造架构决策的真实案例。

总体而言,讨论揭示了软件架构中理论与实践之间的张力:一方面重视抽象心智模型,另一方面也不得不面对现实组织约束。大家认识到,架构既受社会和商业因素影响,也受技术决策影响,学习需要实践经验与对成功模式的研究相结合。对话还涉及更广泛的议题,包括编程工作的持续演变、 LLM 在沟通中的角色,以及在既定工程实践中寻找创造空间的挑战。