第一颗子弹

软件不软的一个主要原因,是其经常处于变化之中。所以,当策略分离不同的变化方向被提出后,一个随之而来的问题也就产生了:何时分离?

尽管一个软件已经满足了当前所有需求,作为富有经验,伤痕累累的程序员,我们却毫无喜悦,因为我们很清楚,事情还远未结束:用不了多久,新需求就会再次排山倒海般涌来。而当前设计能否顶得住下一波的冲击,没有人心里有底。

怀着不安的心情,我们打开IDE,调出代码,翻页跳转,试图从字里行间揣测未来变化的可能性。可深究起来,几乎每一行代码,每一项知识都似乎存在变化的可能性。但如果把每一种可能的变化方向都进行分离的话,系统又会陷入无边无际的复杂性。这种两难的境地让我们感到绝望,强大的无力感让我们一度怀疑自己是否选错了行。

一段时间之后,大批新需求终于来了。经过一番分析,变化的方向逐渐清晰明了。但交付期限所带来的急迫感和焦虑感,让我们觉得自己根本没有足够的时间深入思考如何对原有设计进行合理的修改以应对这些变化,而对于修改已有代码所可能带来的潜在风险,也在不断提醒我们应该“保守稳健”。于是,我们再次祭出杀手锏——copy-paste-modify 三步曲——这不仅可以让我们看似很快的完成交付,还可以让管理层看到:我们又在短时间内产出了如此巨量的代码,从而认为我们有着惊人的生产力。至于带来的可维护性问题,呵,堆自己的代码,让别人去重构吧……

这两种倾向在实际项目中都并不罕见。前者经常造成设计师徒劳无功的预测未来,其过度设计的倾向给系统带来诸多不必要的复杂度;后者则快速让一个系统陷入步履维艰的“焦油坑”。

与此有关的另外一个例子是,当年第一次读到单一职责原则时,对其含义一个类只应该有一个引起它变化的原因大惑不解:这个类未来会以怎样的方式变化我是无法预知的,我怎能在当下就判定一个类是否符合单一职责

多年之后,我才意识到,对于这个问题的答案其实已经给出,只是隐藏于别处:当谈到何时应用开放封闭原则时,Uncle Bob给出的答案是:被第一颗子弹击中时

这是一个绝妙的隐喻。

它首先强调了时机:不早不晚,第一颗。早了,过度设计;晚了,则成为再次被愚弄的傻瓜。

其次,它还隐含着变化的方向:当第一颗从某个方向射来的子弹击中你后,你就必须首先解决来自那个方向的威胁,尽管子弹还可能从任何其它方向射来,但那是另外一个问题。所以,开放封闭原则不可能对所有的扩展都开放,对所有的修改都封闭。只有每次当你被来自某个方向的第一颗子弹击中后,你及时运用了此原则,筑起针对此方向的防御工事,随后,你才可以对来自此方向的其它子弹做到“开放封闭”。

换一个说法,这个世界里,本质上只存在三个数字:0,1,和N。

0意味着当一个需求还没有出现时,我们就不应该在系统中编写一行针对它的代码。

1意味着某种需求已经出现,我们只需要使用最简单的手段来实现它,无需考虑任何变化。

N则意味着,需求开始在某个方向开始变化,其次数可能是2,3,... N。但不管最终的次数是多少,你总应该在由1变为2时就需要解决此方向的变化。随后,无论最终N为何值,你都可以稳坐钓鱼台,通过一个个扩展来满足需求。而这正是我们苦苦追求的正交性

0,1,N就是简单设计的精髓。

从而,就不难理解:所谓单一职责,就是当变化还没有发生时,我们可以认为任何一个类都是符合此原则(除非特别明显的职责耦合)。当变化初次发生时,将一个个变化的原因分离出去,然后,得到了一组类,它们依然符合单一职责

变化与职责,共生共灭。

最后需要强调的是:在被第一颗子弹击中时,能否做出正确的应对,除了辨别和解决问题所需的敏锐嗅觉之外,还需要勇气。当有人问我为何总是敢于在遗留系统上大刀阔斧时,答案很简单—— 胆大心细

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,843评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,538评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,187评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,264评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,289评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,231评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,116评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,945评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,367评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,581评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,754评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,458评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,068评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,692评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,842评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,797评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,654评论 2 354

推荐阅读更多精彩内容

  • 渊博,精深而广博,形容知识广且深,博学多才。在我的世界里渊博的并不像刘瑜一样需要了解澳大利亚选举制度和加拿大...
    蓬松的芥末阅读 295评论 0 2
  • 酉年伊始凤凰来,雏凤一声天自开。 天下熙攘衣锦绣,吉祥祝福满四海。
    今天不说话阅读 139评论 0 0
  • 加西亚.马尔克斯说:“《没有人给他写信的上校》写了九遍,它是我所有作品中最无懈可击的,可以面对任何敌人。” 文学评...
    王栎涵阅读 2,371评论 2 5
  • 你是穿堂而过的风 你是隐于黑夜的眼 你是黯淡人生的光 我想抱你 吻你 感受你冷的肤 温的脸 和那微厚的下唇 始终没...
    我睡过文艺阅读 295评论 0 1