引言
软件设计是一柄利器。有些人不知道已经手握利器,而有些人使用时,抓住的是刀刃,而不是刀把。这就是我撰写本书的一个重要原因。它呼应了我的个人使命宣言:帮助极客在这个世界上感到安全。
这个使命有两个方面。有时,极客设计软件的方式并不安全,有些方式会不小心破坏系统的行为,有些方式会让软件维护者倍感压力。因不安全的行为产生不安全的感受是合理的,能感受到不安全远比毫不知情、毫不在意地感到安全要好得多。
帮助人们学会安全地设计是我的使命。因此在本书中,你会经常看到“小步、安全”这样的提法。我对短期加速不感兴趣。软件设计所创造的价值,是随着时间的推移体现出来的。
优先整理是个例外。当你优先整理时,你会立即感受到整理的价值。这是一种机制。我希望你习惯像调整代码行为一样调整代码结构。到深入设计时,我们将讨论那些具有长期回报的举措,以及那些能影响更多人的举措。
当我读到其他关于软件设计的描述时,我发现它们缺少两个关键要素:“多少”和“何时”。其他软件设计师似乎认为,设计要么是在没有烂代码阻碍的时候发生,要么是在没有时间限制、没有代码变更压力的情况下进行。我想探究这些问题,看看能否为回答这些问题提供有用的原则。
对我来说,软件设计一直是一道智力谜题。我喜欢思考的问题是:“是否存在这样一种设计,能将巨大的变化变成小菜一碟?”对我来说,编程有一种受虐般的感觉,我就像是在复杂性的祭坛上献祭的英雄。这个世界充满了挑战,我们不能忽视让事情变容易的机会,无论是为自己还是为他人。
软件设计谜题的另一个方面是弄清楚它的驱动因素,以及应对这些驱动因素的原则。许多设计建议都与实际案例相矛盾。为什么娴熟的设计师所设计的东西会与他们所信奉的原则背道而驰?这到底是怎么回事?
写书会让这些问题暴露无遗。如果作者对某个主题不完全理解,读者就会发现,而作者此时则无处遁形。一个例子就是“内聚”,15年前我就可以清晰地定义这个概念,但直到去年才能做出令人满意的解释。我希望通过写书来推动自己去理解。
完美的结果就是产生蝴蝶效应。在练习优先整理的过程中,我希望你能体验到一个特别的时刻。你整理了一小部分,使得某个功能变得容易开发。你整理了另一小部分,使得另一个功能变得容易开发。然后,这些整理开始产生化学反应,让一个功能变得容易开发的同时,另一个功能也因此变得容易开发。突然间,你不费吹灰之力、只需寥寥几笔就完成了一次巨大的简化。而且,由于每一步都有同事参与,他们也能充分了解你的能力。当大家都开始从这种由小及大的结构变化中获益时,他们也会更加欣赏你。
我最后一个写作动机是经济因素。正如我在其他地方写过的那样,我不会靠写作赚钱,但写作可以赚到钱,从而支持我继续写作。与所有技术书籍一样,我并不指望通过这些书籍获得巨额收入。如果写作能让我换一辆豪车,那我就有足够的动力去写。是的,我希望通过写作赚点小钱,但我提供的价值远远高于我收取的费用。