十年的老代码,你敢动?

你入职一家新单位,被告知需要维护一个老产品,经理找质管给你开通了svn权限,告诉你迁出哪个分支——就是那个十年前已经定型的分支,就是那个超过6代程序员维护过的分支——然后告诉你说,就在这个分支上改,添加一个新接口,以便支持H5 Video。

于是你开始看代码,云山雾罩,各种痛苦,完全搞不懂业务逻辑和代码的关系,也闹不明白这块代码为什么这么写那块代码是几个意思。你战战兢兢如履薄冰思前想后寸步难行。

你去问进来5个多月还没转正的老同事,他告诉你他也不懂,让你凑合着加个新接口实现了功能就行。加了新功能就行。

你去问干了快一年的资格更老的同事,他叮嘱你千万别动里面的代码,千万别管里面什么样,就在外面包一层,先交付新功能,其它的有时间再说,里面的逻辑十年没人动过了,没有一个人能说清楚怎么回事,你要是改,一不留神就遍地狼烟。

你怎么办?

怎样不让猴子吃香蕉

我想起来猴子吃香蕉的实验:

铁笼里关了五只猴,实验者放进一挂鲜嫩甜美的香蕉,五猴顿时兴奋起来,环视了周围,其中一只率先伸手去抓。这时,实验者以高压水枪冲击,包括那四只仅有念头尚未行动的,也受到了惩罚。

过了会儿,看看没有动静,水果香气四溢,又一只猴跃跃欲试窜到香蕉前,高压水枪的集体惩罚再次启动。如此这般几个回合下来,猴都变得老实了,眼睁睁看着令之馋涎欲滴的果实,竟无一只敢再尝试——因集体受罚的经验令之胆寒。

此时,实验者撤出一只水淋淋浑身发抖之猴,换进只新猴,这个不知天高地厚的家伙一进笼就奔 香蕉而去;这时,一种现像出现了:四只吃尽苦头的猴一拥而上,撕扯、阻挠这冒失鬼,不让它接近深具诱惑力的美味,以免大家跟着受罪。

至此,高压水枪这专政手段暂且搁置,威慑效果依旧。等猴子一只只置换完毕,五只新猴面对香蕉皆不敢造次,个个循规蹈距,成就了“自律”的一群。

在这个笼里一个奇异的景象出现了:猴们最爱吃的香蕉,成了“禁果”!

    ——2006年第 3 期 《随笔》朱家泰

关于老代码的禁忌

对程序员来讲,维护老代码是最恶心的事儿之一。没说的,就是恶心,公认的恶心,连我这种自认为随意、灵活、代码适应性强、没有原则的老程序员也觉得维护老代码是一种罪。如果你恨一个程序员,就让他去维护年久失修摇摇欲坠的老代码吧。

然而,本文开始时提到的情况却几乎是每一个程序员都会碰见的。老代码啊,我们恨之厌之烦之远之却不可弃之。对一家软件企业来讲,老代码就是资产,是多年积累下来的核心资产和重要竞争力。尤其是软件产品,一份代码先后几波人维护过是常有的事。

这种时候,老代码就老而成精有了生命,每当有新人进来,它都会用特有的超出我们耳力边界的高频发出声音:警告,警告,一波新程序员正在赶来,快给它们点厉害杀杀它们的士气。

而且,部分熟悉老代码的老程序员也会谆谆告诫我们,这几个文件不要动,这几个类不要动,这里一改就奔溃,那里一改就连不上服务器,雷区标识很多。还有那一进来就因为被告诫而根本就没看过老代码的程序员也会告诫我们,那代码谁也不懂,多少年没人动过了,不动为妙,免惹麻烦……

故事就这样发生了,禁忌就如此这般传承下来。我们知道那里可能有问题,可是没人敢去动它,等最后一个熟悉一部分老代码的程序员悠然远去,此地空余叹息,从此以后,新来的程序员就成了想吃香蕉的猴子。

动,还是不动?

老代码成了禁忌,我们往往被迫(没时间或不愿意或害怕或不屑)在漂浮海面的冰山的尖尖上修修补补,深入了解深层代码成了谁也不愿言说的痛。

然而都不懂看代码都不动老代码,老代码只能越来越老越来越陈腐,越来越没人敢动。越往后动的代价越高越没人敢动。这对公司和团队都不好。裹一层又一层,终将积重难返成为裹脚布,无人问津。

而一旦老代码没人能够把握,这些作为资产的代码实际上已经丢了,不再有价值增长了,原本领先的优势随着同行们百舸争流的追赶渐渐失去了。

这是对企业是一种损失。读程序员其实也是一种损失。

为什么这般讲?

情人还是老的好

程序员有个毛病:自己不写文档却老抱怨别人的代码没文档,而碰见了有文档的代码却又往往弃文档如敝履。所以,业界流传一句话:代码即文档。所以,业界的代码和文档,少见匹配的。

哇咔咔咔,对吧。

所以,我们只能接受这个现实:代码即文档。

所以,对维护老产品的程序员来讲,要想弄明白老产品的逻辑,就只要如下两个办法:

  • 找到熟悉产品的前辈,让他给你讲讲。如果你找了产品经理,他只能告诉产品设计上如何如何。如果你找了程序员,他通常会说就是这样那样,然后说一句高深莫测又拉仇恨的话:看看代码就明白了。
  • 自己啃代码,啃代码,啃代码。

Ok,维护旧产品,弄明白产品设计逻辑和代码实现逻辑是非常重要的。

对于本文一开始提到的问题,其实也可能有在外围包装的办法,比如你封装一个本地的HTTP Server,用旧API拿到数据作为HTTP流转发一下就能支持H5 Video标签了。也可能很多情况都存在折衷的替代办法。

然而,能弄懂代码是如何实现产品和业务的,还是有非常重要的好处——对程序员来讲很重要的好处:

文档是会过时的,代码是不会说谎的,读懂代码,你就真真正正明白了业务是如何实现的。对于没人敢动而又核心的老代码,你搞明白了,就占领了战略要地。

这里我要引用格力空调的一句广告词:掌握核心科技。不管这是吹的还是怎的,话说得不错,掌握核心科技才有竞争力,对程序员来讲也是一样,唯有掌握核心业务和代码,才能彰显自己的价值

除此之外,读代码也是非常重要的学习途径,尤其是经历过线上考验的代码,必然尤其过人之处。在阅读的过程中,我们可以学到很多东西,既可以学到业务,也可以学到设计。退一万步讲,即便你认为你水平远超一般人属于一针顶破天的那位,也还是可以从当时、当地的选择中学到东西:见贤可以思齐,见过可以自省。

所以,我的主张是:老代码,动啊,为什么不动!

不能拒绝时就接纳,无需排斥,何时何地都可以修行,只要有心,处处都是成长的机会。最不济,也锻炼了阅读代码的能力,庖丁解牛之技成了,也可以在将来以无刃入有间,发挥用武之地。

至于怎么读代码改代码,相信比学宋仲基撩妹容易多了,一句话:多读读就好了。当然展开来讲也可以有很多技巧,我后面会有一篇文章来谈。



相关阅读:

更多程序员职业生活与发展的文章,请关注我的微信订阅号“程序视界”(programmer_sight):

时间: 2024-10-10 21:20:44

十年的老代码,你敢动?的相关文章

我动了十年的老代码…

老代码的禁忌- 如果你恨一个程序员,就让他去维护年久失修的老代码吧! 尽管这样,我们对老代码仍是恨之厌之烦之远之却不可弃之,它已经老而成精有了生命. 每当有新人来时,它都会- 禁忌就这样传承了下来.我们知道它有很多问题,可是没人敢去动它. 于是,故事开始了- 新版51CTO家园,哪里不一样了? 呵呵,我们下手,还能让它有一样的地方吗?! 像小编这么清新脱俗的画风,那新版51CTO家园也是带有清新气息的! But!如果你只看到了清新脱俗的UI设计,那我只能说:你将错过整个银河系- 我们还有- 精准

ASP 三十二条精华代码 (1)

ASP 三十二条精华代码 (1) 2009-08-10 09:53:03  www.hackbase.com  来源:互联网 1. oncontextmenu="window.event.returnvalue=false" 将彻底屏蔽鼠标右键 <table border oncontextmenu=return(false)><td>no</table> 可用于Table 2. <body onselectstart="return

十分钟的Python代码知识点总结

#-- 寻求帮助:dir(obj) # 简单的列出对象obj所包含的方法名称,返回一个字符串列表help(obj.func) # 查询obj.func的具体介绍和用法 #-- 测试类型的三种方法,推荐第三种if type(L) == type([]):print("L is list")if type(L) == list:print("L is list")if isinstance(L, list):print("L is list") #-

写二十来行python代码,让图灵机器人陪你玩耍,(附源码)

写二十来行python代码,让图灵机器人陪你玩耍,感觉不是非常的智能. import os import json import urllib2 class Chat(object): key = "申请的key" # turing123网站 apiurl = "http://www.tuling123.com/openapi/api?" def init(self): os.system("clear") print "尽情调教把!&

【rabbitmq】Queueingconsumer被废止后老代码如何做的解决方案

amqp-client 3.x之前的rabbitmq版本有个消费者的写法是借助于Queueingconsumer的: QueueingConsumer consumer = new QueueingConsumer(channel); channel.basicQos(1); channel.basicConsume(QUEUE_NAME, false, "consumer_test",consumer); while (true) { QueueingConsumer.Deliver

十准二新老动所按养十规

打开地图显示的名称是龙域 当我将毒牙放在鉴定桌上的时候那中级鉴定师立刻微微惊诧随即道鉴定费金币 大步上前抬头一个冰风刺解决掉一名级弓箭手另外的几个弓箭手立刻吓得面无人色道这个人的攻击太变态了谁能挡住他魔法师魔法师用火球术齐射 成功了我惊喜交加十分钟的时间已经足够我做很多事情了当我将的属性共享在队伍里的时候凌月不由得神色一凛道大家小心点了这个的攻击力好高 扯窃耐沦脊辆俸彰圆尤谫缘http://p.baidu.com/ihome/center?uid=314c6162633632373230333d

五行代码实现 炫动滑动 卡片层叠布局,仿探探、人人影视订阅界面 简单&amp;优雅:LayoutManager+ItemTouchHelper

转载请标明出处: http://blog.csdn.net/zxt0601/article/details/53730908 本文出自:[张旭童的博客](http://blog.csdn.net/zxt0601) 代码传送门:喜欢的话,随手点个star.多谢 https://github.com/mcxtzhang/LayoutManagerDemo 概述 前几天看有人实现了仿人人美剧的订阅界面,不过在细节之处以及实现方式我个人认为都不是最佳的姿势. 于是我也动手撸了一个,还顺带撸了个探探的界面

u-boot分析(十)----堆栈设置|代码拷贝|完成BL1阶段

u-boot分析(十) 上篇博文我们按照210的启动流程,分析到了初始化nand flash,由于接下来的关闭ABB比较简单所以跳过,所以我们今天按照u-boot的启动流程继续进行分析. 今天我们会用到的文档: 1.        2440芯片手册:http://download.csdn.net/detail/wrjvszq/8358949 2.        6410芯片手册:http://download.csdn.net/detail/wrjvszq/8358965 3.       

服务器上class文件是新的,但就是执行的老代码

故事是这样的. 上周末回老家,n个测试和开发找我,说我写的代码哪儿哪儿不行,吓得我赶紧打开电脑,连上阿里云数据库,修改了代码,测试们拉包重新测试后,还是不行,通过看打出的日志,还是执行的修改之前的代码.但是从服务器上捞class文件,却是最新的, 百思不得其解(原谅我是新人),第二天测试说自然而然又好了.原本以为这样就结束了..... 但是周一项目实施现场的开发打电话给我,说我那儿的功能不可以使用,已经上线了.吓得我呦....然后找运维,捞class,找日志,怎么都是新的,但就是执行的老的,终于