
可居住性不是清晰性。 清晰的危险在于它是不妥协的美,而改进一件不妥协的美是极其困难的。 抽象被过度崇拜的一个主要原因是,一个充满了正确抽象的完整程序是完美之美。但如果那套抽象做的是差不多对的事,你会忍不住扭曲整个周围结构去迁就它们。这导致了不可居住的程序。
简单的画面
想象一栋建筑学上如此完美的房子,你连画都不敢挂,怕破坏设计。你小心翼翼地住在里面,怕搅动任何东西。再对比一栋稍微粗糙、稍微不对称的房子,但每个角落都贴合你的生活,改哪里都不心疼。第二栋才是可居住的。第一栋是你睡在里面的博物馆。
可居住性作为首要美德
可居住性让一个地方可以像家一样住。一个可居住的程序能被舒适地理解从而被舒适地改变。易于维护的首要特征是局部性,只看一小块源码就能理解的能力。
压缩(从上下文推断意义)是局部性的反面。压缩的代码更稀疏,但程序员需要的上下文越多,需要的理解越多,来自误解的错误也越多。过度使用抽象和不当的压缩导致不可居住的程序。
这是局部最优应用于架构:完美抽象的系统是优雅的局部最优,抵制改进。波西格的质量是”一个与自身和平相处的系统”,Gabriel命名了同一件事:质量是一种微妙的、免于内部矛盾的自由。 一个系统在与自身和平相处时拥有这种质量。
要得到整体性,你必须粗糙地放过不重要的东西,把深度注意力留给重要的。 这是建造的否定之路:真正的财富是减法的,真正的质量来自知道什么不需要打磨。
总体规划冻结未来
总体规划的存在疏远了用户:按定义,社区几乎无法产生影响,因为最重要的决定已经做了。 在总体规划下,人们活在一个冻结的未来,只能影响琐碎的细节。
用户和决策者都无法可视化规划的实际后果。Bug不总是错误,它们揭示了我们没有能力生产总体规划。 它们告诉我们一些关于地图无法捕捉的领土的东西。
当人们失去了对自己生活环境的责任感,意识到自己只是别人机器中的齿轮,他们怎么能感到认同或目的?这是权力凝结:总体规划集中设计权威同时分散后果。系统圣经确认:系统在诞生的瞬间就发展出自己的目标,伟大的进步不来自被设计来产生伟大进步的系统。
一次性开发创造一个大制品然后任其退化,最小限度地解决问题直到可以抛弃和替换为止。渐进式开发,以小增量构建,每次都适应所学到的,是有机秩序涌现的方式。这是探索应用于建造:规划的过程有价值但产出的计划是无用的。
自恋的系统
当一个系统太有”自我”的时候,会显得死气沉沉和不真实。它被造物者的意志塞满了,没有空间长出自己的性格。
这是Tift关于神经症的洞见应用于软件:童年时必要的策略变成了成年的监牢。控制每一个细节的架构师阻止了系统发展自己的生命,就像控制每一个结果的父母阻止了孩子发展自己的意志。
有机秩序是部分的需求和整体的需求之间的完美平衡。它不能自上而下地设计,只能通过系统需要什么和居住者需要什么之间的持续协商来培育。这是波西格建筑形态中的静态质量和动态质量:静态质量保存现有结构,动态质量允许它演化。任何一方太多都会杀死系统。
约束催生创造力
创造力由约束催生,类似于诗歌。自动化的措辞被消除。约翰斯通观察到了同样的事:对约束说”是”产生即兴,而无限的自由产生瘫痪。我们从不教人造自己的词,但我们教新手程序员创建自己的词汇表。
结果的质量取决于建造者之间沟通的质量,而这取决于项目做起来是否有趣、是否对个人重要,而不只是在金钱上。 这是”够多的人”问题应用于建造:使命和社交满足必须同时解决,否则都不行。
常见误读
低水平理解:“别计划,直接写。”
中等水平理解:“好架构意味着完美的抽象,第一次就设计对。”
更好的理解:目标不是完美的设计而是可居住的设计,能被局部理解、舒适改变、并随时间被住进去的代码。 完美之美是可居住之善的敌人。系统是有多个中心的地毯,不是有单一顶点的层级。当你问作家为什么写作,他们说:为了知道结局会怎样。
核心收获
很多年来我们是解谜者,专注于把算法变成指令。我们享受复杂性,把晦涩当作技能的证据。现在意识到了我们人类的局限,我们开始把复杂性和晦涩视为缺陷,而非挑战。
模式不过是记住我们忘记的事情的方式,这样我们就不会忘记赋予系统生命、赋予它们无名之质所需要的东西。那种质量:一个与自身和平相处的系统,其中自由的运转不取决于满足需求,而取决于系统与自身达成和解、与它内部产生的力量保持平衡。
参考:
- Richard P. Gabriel, Patterns of Software: Tales from the Software Community
- Christopher Alexander, The Timeless Way of Building(全书引用)