本文目录
每一个「顺便加上」,都会给未来留下一点重量。
复杂性从小决定里长出来
软件变复杂,未必始于一个宏大的错误。更多时候,它来自许多看似合理的小决定:为了一个尚未出现的场景保留选项,为一个临时需求添加分支,为方便将来复用提前抽象。每一个决定都很轻,加在一起却会改变理解系统的成本。
这并不意味着选项与抽象没有价值。问题在于它们出现的时间,以及所服务的需求是否真实。一个解决了眼前问题的直接实现,有时比一套预想未来的结构更容易维护,也更容易在需求变化时被替换。
让边界清楚,让内部简单
简单并不是省略必要的处理。输入校验、错误反馈、数据安全,都是系统可信赖的条件。它们需要被认真放在恰当的边界上,而不是因为追求少几行代码就消失。
边界清楚之后,内部往往可以更直接。一个功能是否已有合适的工具?平台是否已经提供相应能力?同一规则是否可以集中处理?这些问题帮助删除重复,也让下一位读代码的人更快知道系统在做什么。
给删除留出空间
增加一个功能时,我们很容易讨论新增多少价值;移除一个功能时,却容易忽略减少多少负担。每一项能力都需要解释、测试与维护。一个不再使用的选项仍然存在,就会持续要求后来的人理解它。
我想把简单看作一种持续的工作:确认真实需求,写下足够的实现,用恰当的检查证明它能工作,再允许它随着需求变化而改变。好的代码不仅能完成任务,也应该让下一次修改有处下手。


