程序猿的终极噩梦应该是祖传代码了吧。
很多码农小萌新们,都经历过这样的时刻吧。矜矜业业检查前人代码时,发现了明显到觉得智障的漏洞,认真的你准备大刀阔斧地修改,但你的老司机同事可能会劝你最好不要动,并露出意味深长的表情。
因为他们知道,你遇到了祖传代码。
什么是祖传代码
祖传代码(legacy code)就字面意思而言,就是前人程序猿给你留的“宝藏”代码。这些代码都存在着问题,但你要么就无从下手无法修改,要么就一改出大问题,这就是为什么这些宝藏会存在这么久流传到你的手上。
比如,你可能会遇到这样的代码。
//add by xxxx 201x-x-x: 这是一段神奇的代码。。反正这么写就对了
或是这样的
“曾经我一直不信还有能让人辞职的代码,
直到我遇到了祖传代码。”
——By 网友
几乎每个公司都存在着祖传代码
每家公司都会有那么些“历史遗留问题”。亚马逊的工程师形容说他们的代码:“一座很大的屎山,你见过的最大的山,每次你想修正一个bug,你的工作就是爬到屎山的正中心去”。
有网友曾发现了微软的祖传代码。
看过几年Windows内核的代码,也就只是看看,不能改。有时候看到一些奇怪的逻辑,不要慌张,这里面一定有一个很长的故事。
不过万事没有绝对。
有一次和同事一起调试一个蓝屏,看到一段内核内存管理的代码,有一个地方没看懂,貌似for循环多循环了一次。恩,这一定是我们的理解能力太差了。然后我们仔细看了一下午,终于想出了几个貌似合理的解释。为了确认,我们鼓起勇气写信给当时Windows内存管理的大牛Landy(他现在已经是tech fellow了)询问了此事。
结果人家很快回复了我们。"It is a bug since day 1. I have just checked in a fix." 留下我们俩一脸懵逼。
就这样一个从NT开始藏了十多年的bug被两个小白给发现了。
ps. 这个bug没有什么显著影响,只是内核态内存分配性能略微受损。
——by知乎@Tim Chen
有些祖传代码,你一动, 我们就再也回不去了
我们组有一个著名的6000行后端JS,没有面向对象封装,纯靠函数。其中有好几个上千行的函数,带了二十多个形参,几个标志位,分别有十几个数字状态。注释?没有的。
每一个接手过这段代码的人都会不约而同的发一条朋友圈以示佩服。
但神奇的是,代码在执行上基本没太多的错。
直到几个月前,一个大牛在走之前把这段代码全部重写了一遍,留下了至今都没有改完的bug。
——by 网友
也许你只是想改个注释,但却出现了以下场景。
有时候,祖传代码是可以用来创造岗位的
刚来到这家公司的时候,看那些老旧代码觉得逻辑为何这么绕,本来是一个很直接的事,非要绕着圈子写,没必要共用一个函数还非要实现一个公共函数,结果该公共函数超级复杂。
后来发现负责的模块比较稳定的人都被fire了,明白了叔叔大爷们的良苦用心。
在某些国家的某些行业里,保住饭碗是多么不易啊!
——知乎网友 @砖头
一个祖传代码是如何代代相传的
面对祖传代码,每个接手的程序猿都会添点新料,但没有谁有勇气真的去解决,毕竟谁也不想给自己挖坑。
很多行业是前人栽树后人乘凉的,不过程序猿很多时候却是前人挖坑,后人填坑的。
希望猿界,大家能多给后人留条活路。
相关阅读:
九章算法 | 帮助更多中国人找到好工作
全栈开发项目实战
美西时间1月6日周日 10:00-12 a.m
北京时间1月7日周一 02:00-04 a.m
九章基础算法班(Java)互动课
随时上课,正在报名中
拉到文末阅读原文,可免费报名!