程序猿的终极噩梦,祖传代码,一动,修半年!

2,003 阅读4分钟

专栏 | 九章算法

网址 | www.jiuzhang.com

程序猿的终极噩梦应该是祖传代码了吧。

很多码农小萌新们,都经历过这样的时刻吧。矜矜业业检查前人代码时,发现了明显到觉得智障的漏洞,认真的你准备大刀阔斧地修改,但你的老司机同事可能会劝你最好不要动,并露出意味深长的表情。

因为他们知道,你遇到了祖传代码。

什么是祖传代码

祖传代码(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被两个小白给发现了。

——by知乎@Tim Chen

有些祖传代码,你一动, 我们就再也回不去了

我们组有一个著名的6000行后端JS,没有面向对象封装,纯靠函数。其中有好几个上千行的函数,带了二十多个形参,几个标志位,分别有十几个数字状态。注释?没有的。 每一个接手过这段代码的人都会不约而同的发一条朋友圈以示佩服。 但神奇的是,代码在执行上基本没太多的错。 直到几个月前,一个大牛在走之前把这段代码全部重写了一遍,留下了至今都没有改完的bug。

——by 网友

也许你只是想改个注释,但却出现了以下场景。

有时候,祖传代码是可以用来创造岗位的

刚来到这家公司的时候,看那些老旧代码觉得逻辑为何这么绕,本来是一个很直接的事,非要绕着圈子写,没必要共用一个函数还非要实现一个公共函数,结果该公共函数超级复杂。 后来发现负责的模块比较稳定的人都被fire了,明白了叔叔大爷们的良苦用心。 在某些国家的某些行业里,保住饭碗是多么不易啊! ——知乎网友 @砖头

一个祖传代码是如何代代相传的

面对祖传代码,每个接手的程序猿都会添点新料,但没有谁有勇气真的去解决,毕竟谁也不想给自己挖坑。

很多行业是前人栽树后人乘凉的,不过程序猿很多时候却是前人挖坑,后人填坑的

希望猿界,大家能多给后人留条活路。

欢迎关注我的微信公众号:九章算法(ninechapter)。
精英程序员交流社区,定期发布面试题、面试技巧、求职信息等
2d09fefd332a1a68bb1c.jpeg