罗宾·斯隆(Robin Sloan)在他的小说《酵母》(Sourdough)中将尖端的机械手与一个古老的发酵母发酵剂并列放置,主要角色是学习面包制作工艺。一种是以食物形式传承下来的几代知识和实践创造出来的。另一个是由虚构的硅谷初创公司制造的具有未来主义意义的设备,其雄心壮志是消除重复劳动。阅读本书后,我开始将这两种技术视为对每个贡献者都有自己想法的技术。随着我的组织在2020年转移到远程工作,我意识到代码没有什么不同。代码是酵母
酸发酵剂或培养物,如生物学上已知的,是必须培养才能生长的细胞的集合。耕作包括定期喂面粉和水。在任何时候,这都是耕种者过去做出的所有决定的组合,无论是试验饮食还是饲喂经过尝试和真正混合的饮食。上下文在每个批次中无处不在。即使将某个片段剪掉以共享,新的混合也继承了过去的决定。每行新代码都以相同的方式构建代码库
代码库是过去决策,假设和折衷的历史。在我担任软件工程师的《纽约时报》上,我的团队浏览了许多代码库,其中一些代码在整个组织中都是共享的,而某些代码是我们自己拥有的。与许多公司一样,我们今年转移到了远程工作,而通常在办公室或通过自发的Zoom呼叫(针对分布式队友)进行的讨论和麻烦开始在Slack和Google Docs中异步进行。结果,我能够参与公司内更多的讨论,并对最终将被翻译成代码的决策获得新的见解
每个文档和讨论都将历史和上下文添加到我们工作的代码库中。每次添加或大或小都会改变混合物,例如面包师通过向面团中添加不同品牌的面粉或向面团中添加少许酸奶或蜂蜜来改变发酵面团。在阅读代码库和代码审查时,我已经认识到了相同的历史和上下文。我能够了解取舍和折衷,细微的分歧和限制;我可以推测是什么促使工程师决定,例如,构建一个新组件而不是使用现有的标准化版本。我也看到遗留代码,尽管可能是有害的,但构成了我们可以学习的集体历史
由于不再依赖会议室和实际的聚会空间,沟通变得更加灵活:与团队成员进行通话以了解他们的思路从未如此简单。有一些我从未亲自见过的工程师,但是我已经了解了他们想解决的问题类型以及他们如何解决代码中出现的问题。我可以投入更多的时间并不仅关注解决方案,而且还要关注其背后的因素和历史。我能够理解为什么有些团队成员更喜欢稳定性和一致性,而另一些团队却愿意以实验的名义冒险
就像许多面包师(一些新手,一些经验丰富的人)手中经过的发酸发酵剂一样,一个代码库反映了队友之间如何交流。这是我们的思想以及我们对规范和假设进行编纂的最佳尝试的快照。每个人都参与其中的对话,并与他们之前的人进行对话。通过每个新功能或错误报告,我们可以更好地理解我们的代码。我们确定新逻辑与现有逻辑不太相符的区域。我们一直在与自己和同事的过去决定保持联系。我们正在共同努力,以协调和匹配彼此的思维方式和假设。我们彼此信任,为团队和组织的利益做出决定。每段新代码都增加了文化并培养了我们共同的理解
如果代码很糟糕,我们就有机会更好地欣赏其中的历史和上下文。在软件中,我们倾向于将遗留代码视为应该丢弃或重写的东西,通常将代码库的年龄与它的健康和生存能力混为一谈。但是代码不会在真空中老化。如果数十年来酵母可以在人与人之间传递,那么编码也可以。决策和经验的保存与我们代码库的保存联系在一起。即使不再更新代码本身,有关逻辑或底层平台以及相邻技术的文档也可以使代码库及其文化保持生机勃勃。然后,您可以将这种文化传递给另一个团队来烘烤。它的味道可能比您预期的要好