程序视界

微信号 programmer_sight

功能介绍 聚焦职场生活、职业选择、适应、发展、转型、技能Get,有料,有趣,有能量。

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

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

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

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

你怎么办?

怎样不让猴子吃香蕉

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

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

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

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

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

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

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

关于老代码的禁忌

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

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

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

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

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

动,还是不动?

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

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

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

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

为什么这般讲?

情人还是老的好

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

哇咔咔咔,对吧。

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

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

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

  • 自己啃代码,啃代码,啃代码。

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

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

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

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

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

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

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

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

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

十年的老代码,你敢动?相关推荐

  1. 那些坑爹的老代码,究竟改还是不改?!

    在软件研发中,我们总会遭遇一个场景,就是要去改变或添加一项功能到既不是咱们创建.也不熟悉.更与自己负责的系统部分无关的代码中时,会遇到麻烦,而此时的内心更是崩溃的. 那么,面对前任程序员留下的代码,究 ...

  2. 2020年软件测试需要学什么技术?软件测试人员需要懂代码?软件测试工程师要经常加班吗?--华为十年测试老司机写给迷茫的你

    一:前言:谁的青春不迷茫 一直以来有很多初入测试职场或者想转行如软件测试的人,都会有很多的疑问,例如软件测试需要学什么技术?软件测试人员需要撸代码?软件测试工程师累吗?需要经常加班吗?软件测试一些工具 ...

  3. 六代单传的老代码,到底能不能动

    六代单传的老代码,到底能不能动 原2017.07.26程序人生 你入职一家新单位,被告知需要维护一个老产品,经理找质管给你开通了SVN权限,告诉你迁出哪个分支,然后告诉你说,就在这个分支上改,添加一个 ...

  4. [系统安全] 四十六.Powershell恶意代码检测系列 (1)Powershell基础入门及管道和变量的用法

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  5. ASP 三十二条精华代码

    整理收藏: ASP 三十二条精华代码 1. οncοntextmenu="window.event.returnvalue=false" 将彻底屏蔽鼠标右键 <table b ...

  6. 【深度学习】PyTorch 历史版本安装-祖传老代码运行刚需

    最新 PyTorch 安装 以及 CUDA 版本 如果要安装最新的 PyTorch 其实是很简单的,直接到官网首页就有各种系统的安装方法,如同所示: 这里有一个是 CUDA 版本,实测需要一模一样,这 ...

  7. m_Orchestrate learning system---二十、如何写代码不容易犯错

    m_Orchestrate learning system---二十.如何写代码不容易犯错 一.总结 一句话总结:能排序多排序 这次查错的启示: 1.代码数据更规整:要是取出的数据排序的话可以减少很多 ...

  8. jQuery Mobile高手必备的十大技巧和代码片段

    本文转自51ito布加迪编译版本: http://mobile.51cto.com/hot-276160.htm 其中未发现英文原作链接,为尊重版权,google之后附上: http://www.we ...

  9. 第十四题: 以下代码的输出结果是?

    第十四题: 以下代码的输出结果是? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public class B {     public static B t1 = n ...

最新文章

  1. qt学习之路3 ---信号与槽机制
  2. ubuntu开启ssh
  3. 【Qt】MainWindow窗口状态栏
  4. 一道非常经典C++面试题|大厂面试
  5. sql语句的经典练习
  6. kafka spark java_spark streaming中维护kafka偏移量到外部介质
  7. pytorch之BatchNorm
  8. 2019微博热点,盘一盘那些记忆中的大瓜
  9. Unix环境下PS1变量的设置
  10. Java入门基础及面试100题--初入门
  11. 好有作为的Java 程序员,年薪40W其实并不高。
  12. US-016超声波测距模块
  13. 递归查找树形状结(利用steam流的方式)leval值标明
  14. java使用poi实现excel保护工作表实例代码(支持.xls和.xlsx)
  15. mysql中utf8和utf8mb4的详解用法与区别
  16. Cow Gymnastics
  17. Windows平台下libnet的编译、安装以及使用
  18. 微信小程序文本换行问题
  19. 微信发语音,会被上司和客户骂?老外都知道这事儿了
  20. 【免积分】斯坦福大学2021年度AI指数报告PDF完整版

热门文章

  1. python中json模块博客园_python的json模块
  2. 2020-10-13 多智能体基本图论
  3. jq添加新节点赋予class属性并获取该对象
  4. 如何编写一个webpack插件
  5. bzoj:3110: [Zjoi2013]K大数查询
  6. MIN()与MAX()函数 的注意事项
  7. Android ImageView图片代码实现按屏幕宽度等比例缩放
  8. I2C总线以及GPIO模拟I2C
  9. 百度Logo月度首页人物--王正华:中国低成本航空第一人
  10. 淘宝服务端高并发分布式架构的十四次演进之路