专业书籍精读 · 持续交付 · 第 14 章

高级版本控制

Continuous Delivery · Ch 14 · Jez Humble & David Farley · 2010

EN →

这一章讲什么?

一个软件,几十上百号人同时改同一堆文件,最后还得拼成一个能发出去的整体。让这件事不乱套的工具叫版本控制。这一章不讲怎么用工具,只问一个所有团队都逃不掉的问题:大家该各自开一份副本分头干、最后再合到一起,还是每天都把手头的活并回共用的那一份?

先说个怪事

两个同事分头改了两个月,合并那天工具很爽快地说「没冲突」,一行都不用手动处理。结果代码一跑就出错。

为什么?工具只会看两边有没有改到同一行字。一个人把某个共用功能的算法悄悄换了,另一个人在别处新写的逻辑正好指望着老算法——两边动的文件都不一样,工具当然说没冲突,可合出来的东西已经坏了。「合并顺利」和「合并正确」是两回事。

旧世界为什么难

分头干的痛苦不是按时间平摊的,而是滚雪球。各自干一周,两人多半碰的是不同角落;各自干两个月,两边都把同一批文件翻新过一遍,合并就从「几处打架」变成「谁也说不清合出来的还对不对」。更坏的是它会让人变懒:你明知道某段代码该整理,可一整理别人合并时就要多遭一遍罪——于是谁都不动它。

这章的办法:别分头干

书的主张很干脆:每个人每天都把自己的改动并回大家共用的那一份,让两边分开的时间短到来不及长出麻烦。

「可活没干完就并进去,不就露馅了吗?」这一章的价值全在这个追问上,它给了三个办法:先把门关上——新功能的代码早早并进去,只是暂时没有任何入口能走到它,做完了再开门;把大改拆成一串小改——每一步都完整、随时能发布;搭一层脚手架——要换掉一个到处在用的老零件时,先在中间加一层转接,新旧两个零件同时挂着,把用户一点点挪到新的那边,全挪完了再把老零件和转接层一起拆掉。装修不搬家,一间一间来。

该怎么选

分开几个小时到一天,问题不大;分开几周几个月,才是真正的敌人。所以今天流行的「开个分支、当天就合回去」的做法,和这本书的主张其实是一路的。

代价也得说清楚:那些开关和脚手架本身就是债——用完必须拆干净,不然哪天有人误碰一个早该删掉的旧开关,麻烦会比当初分头干还大。

一句话记住

分头干看着是在隔开风险,其实是在攒着风险、最后一次性付。分开的时间越长,合到一起时越危险——而且危险常常不报警。所以办法是:每天都合回去,用「关着门开发」和「搭脚手架换零件」来解决「活没干完」这个真问题。

想进到具体机制、四种分支模型的账单和示意图? → 切到精读版