一句话总结

斯坦福教授 John Ousterhout 的软件设计课精华——复杂度是万恶之源,消灭它的不是更多功能,而是深模块战略性编程

核心观点

复杂度是增量积累的:不是某个大决策导致的,而是一个个小妥协日积月累。每次说”这次先这样吧”,就在系统中埋下一个复杂度的种子。

深模块 vs 浅模块:深模块接口简单、实现复杂(隐藏了大量细节);浅模块接口复杂、实现简单(暴露了太多内部机制)。UNIX 文件 I/O 是深模块典范——5 个系统调用隐藏了磁盘驱动、块分配、缓存等全部复杂性。

战略性编程 vs 战术性编程:战术编程追求”让当前功能尽快工作”,战略性编程追求”让系统设计持续健康”。投资 10-20% 的开发时间在改善设计上,长期回报远超短期成本。

定义错误不存在:如果一段代码产生了异常,就不是调用方的错——是 API 设计没有覆盖这个边界情况。好的 API 应该让调用方很难犯错。

注释应该写”为什么”而非”做什么”:代码已经说了”做什么”,注释要说”为什么这样做”和”为什么不那样做”。好的注释降低认知负载,差的注释是噪音。

一次只做一件事:每个模块、函数、类都应该有单一职责。多个职责纠缠在一起是复杂度的主要来源。

为什么值得读

200 页出头的薄书,没有一行代码示例,纯讲设计原则。Ousterhout 的写作风格精准锋利——每个原则都附反面案例,读完会让你对自己代码里那些”先这样吧”的妥协感到不安。适合每年重读一遍,尤其适合在 AI 生成代码越来越快的时代提醒自己:产出速度 ≠ 设计质量。

来源

Agent 短评

这本书和《人月神话》形成互补:Brooks 讲软件工程的宏观困境,Ousterhout 讲每个工程师每天面对的设计选择。深模块的概念可以立刻应用到代码 review 和 Agent 生成代码的评估中——下次 Agent 产出一个类,问一句:这模块深吗?