团队里的程序员张三丰要离职,领导让你接手他的工作,叮嘱你一定要尽快掌握张三丰的代码。你的心儿扑通扑通地跳动,你的脑海里萦绕着三个选择:是拒绝呢,还是拒绝呢,还是拒绝呢?你强颜欢笑但实际上心烦意乱怨气纵横——接手别人的代码,那可是程序员要面对的最痛苦最可怕的事啊。

你记起江湖前辈黄药师说过的一句话:如果你恨他,就让他去接手别人的代码。

你的内心是拒绝的,可是你却不由自主地说出了“可以啊”三个字,于是你悲催的旅程拉开了序幕。

这,就是程序员的工作啊~~~~你有什么办法……你特别担心自己会被别人的代码玩儿死,你忧心忡忡却无计可施……此情无计可消除,才下眉头却上心头……

我能理解你的感受,因为这样的事情,我经历了没十回也有八回。你不是一个人在战斗,想想这个你也许能得到些安慰,再不行,就看看下面的故事吧。

铁中棠不堪老代码的摧残而离职

下面的故事发生在我做流媒体产品的时候。

那一年我招募了一个有三年工作经验的程序员,叫铁中棠(借用一下古龙《大旗英雄传》中的主人公的名字)。我让铁中棠接管产品代码里的网络传输模块(P2P协议实现),我告诉他这个模块很重要,公司的视频点播产品最关键的就是这块代码,掌握了这块代码,就掌握了软件的关键。

然后我又告诉铁中棠,现在的代码前后有四个人维护过,可能有些凌乱,读起来有一定难度,如果遇到问题,随时可以来问我。我还告诉他可以用SourceInsight来读代码,效率比较高。

铁中棠面色凝重,没有说什么,只是点了点头,回到自己的工位,打开了Qt Creator,开始看代码了。

一个星期后,我问铁中棠代码看得怎么样,他面露难色,但却什么困难也没说,只说正在看,正在了解。我再次叮嘱他,有问题随时问我,因为我也维护过那块代码,对代码的逻辑有所了解。

又过了一个星期,铁中棠找到我,犹犹豫豫地说觉得自己不太适合做软件开发,准备离职。我大惊,难道别人的代码真的像江湖传言那样能够杀人于无形吗?像铁中棠这样坚毅果决、铁血无双的大英雄、大豪杰居然也会被代码杀死?

我问铁中棠是不是觉得代码太难懂了,他说确实有点儿难,但也不是因为代码难懂就要离职,而是通过接手别人的代码让他意识到自己其实不太适合做开发,所以决定转行,离开软件开发了。

我心如刀割却无话可说。

铁中棠离职后,我又招了一个刚毕业的大学生阳顶天,聪明绝顶,意气风发,我打算把P2P协议这模块交给他。阳顶天看了几天代码,说现在的代码虽然有点凌乱有点儿难懂,但自己有把握重构好它。我和他讨论了重构计划,他就开始重构了。

过了半年,阳顶天还在重构,重构的代码还不能正常和服务器通信,而且他不看老代码而是通过抓取并分析老程序的网络报文来琢磨怎么写新代码!于是我和他进行了一次艰难的谈话,结果差点儿吵起来。再后来,阳顶天离开了公司,出国了……

怎样才能不被玩儿死

卡夫卡说:一切障碍都可以粉碎我。这话如果从铁中棠口中说出来,就是:任何代码都可以玩儿死我。

你估计不愿意像铁中棠那样被别人的代码玩儿死。So,假如你真的要接手别人的代码,怎样才能不被玩儿死呢?

虽然你可能会说,听了很多道理,依然交接不好代码,可作为经常被别人的代码玩儿的欲仙欲死的老司机,我有些话如鲠在喉,不吐不快。

当你被要求接管要离职的程序员的代码时,如果能注意以下几点,就有可能活着从他的代码里爬出来,而那些不能将你击溃的代码,都将成为你成长的垫脚石。

  • 1. 产品需求与业务流程文档

产品需求与业务流程文档,这些是你先要找到的,你接手的代码,必然和某个产品需求相对应,必然实现了某个业务流程,先了解产品需求和业务流程,才能更好的读代码。

假如你的团队就是没文档,Ok,也可以要求离职或转移战线的这位程序员把需求描述出来,把业务流程画出来。

  • 2. 测试环境

了解了产品需求和业务流程,最好能体验一下软件,从用户的角度来理解软件的使用。这个时候你要么需要生产环境,要么需要测试环境。哪个环境不重要,重要的是,你需要一个能Run,能体验的软件。

  • 3. 业务流程在代码层面的体现

负责交接代码给你的那位同事,要么在办离职,要么已经介入了其他产品,眼下很可能已无心恋战,但你心里要清楚,只有他才能提供代码层面的东西,比如

  • 类图
  • 模块划分说明
  • 数据流图
  • 时序图
  • 状态图

所以,你需要他整理一些文档和图表出来。你可以告诉领导你需要上面的东西,让领导和他沟通,让他在离开之前准备好这些文档给你,并留一些时间以便你熟悉。

  • 4. 读代码,不死不休

有了产品需求,有了业务流程,有了代码设计相关的文档和图表,接下来你就该死磕代码了:

while(不懂)
{读
}
  • 5. 开发环境与调试

有的产品需要比较复杂的开发环境配置,一定要提前做好,让即将离开的同事辅导你搭建好开发环境,这样你就可以利用“调试”这个强大的武器来快速理解代码了。

  • 6. 调试

调试是接手别人代码时的利器,如果你看不明白一个业务在代码层面是怎么体现的,也看不懂代码之间的调用关系,那最好的办法就是调试。从一个业务的起点所对应的代码开始调试,一步一步跟进去,就能快速理清函数调用链。

  • 7. 树立可实现可衡量的目标

程序员的工作交接,尤其是代码交接,怎样才算顺利完成呢?

这简直就是一个谜!

没人说得清楚。

所以,你最好给自己梳理一些可衡量的、可实现的目标。比如读懂A、B、C三个业务流程……

最好,找一个Bug或者一个新增的功能,带着目的去读代码、修改代码,有目的,有目标,有时间盒,就容易投入,容易读进去,容易掌握与Bug或新增功能相关的代码的逻辑与流程。

  • 8. 输出、分享与重构

你在读代码时,如果能撇开给你交接工作的程序员提供的文档,按自己的理解,自己绘制类图、数据流图、时序图、关键业务流程对应的函数调用关系链等,就能更快的掌握别人的代码。

如果你还能将你理解到的东西,讲给其他人听,并且讲明白,那Ok,你真的理解了别人交接给你的代码。

再进一步,如果你在理解现有代码的基础上,可以识别出哪些部分实现得逻辑不清晰或有待改善,然后可以结合业务与自己的理解将其重构,那就真的是完全接手了别人的代码,别人的代码与你的代码就没有差别了,它们终将成为你的代码。

最重要的事儿

如果你总是看见代码多就发愁,看见代码脏乱差就诅咒埋怨,看见代码逻辑复杂就头疼,搞不清调用关系就放弃,那你可能永远也变不成代码的主人,只能一次又一次被代码蹂躏。

所以,其实交接代码最重要的事儿,就是:

不要被浩渺如烟并且陌生怪诞的代码吓得不敢动弹,现在就开始读,立刻,马上,坚持十分钟,再坚持十分钟,你就能妙悟真谛。

代码虐我千百遍,我待代码如初恋。相关推荐

  1. 奇葩代码虐我千百遍,我却待它如初恋

    这是哪个天才写的代码?真是神逻辑!!! 告诉我你家的地址,我保证不打你-- 大哥,你真会取名!你的英语是体育老师教的吗? 这八层嵌套是谁写的?老板,我屏太小,能换个显示器吗-- 在你们多年的程序生涯中 ...

  2. Recycleview 虐我千百遍 我待Recycleview如初恋

    Recycleview(一) 第二天正式入门android,还以为门槛刚迈进去,谁知道我连鞋都还没脱呢,第一次接触Recycleview,直接懵逼,写一些源代码以防自己忘记 第一步 新建一个包 -ad ...

  3. 我虐小车千百遍,小车待我如初恋

    None 转.转.转,转它个天昏地暗. 卓大大,来调侃下.****这轮胎能比赛吗? 无语 大哥,拐弯悠着点.****一脚油门,车毁人亡. 我是车模中的白马王子

  4. Netty虐我千百遍我待Netty如初恋

    段一 刚开始接触Netty时, 主要是通过浏览文章, 好的差的统统浏览, 慢慢的也就会发现几个好的博主, 包括他们录播的视频我也会去看. 甚至还买了书籍, 不求甚解的看, 反正就是多看吸收. 一开始还 ...

  5. 算法虐我千百遍,我待算法如初恋

    转自:算法虐我千百遍,我待算法如初恋 算法虐我千百遍,我待算法如初恋. 学习方法  1) 把所有经典算法写一遍  2) 看算法源码  3) 加入算法学习社区,相互鼓励学习  4) 看经典书籍 基本数据 ...

  6. Maven 虐我千百遍,我待 Maven 如初恋 侵删

    前言 在如今的互联网项目开发当中,特别是Java领域,可以说Maven随处可见.Maven的仓库管理.依赖管理.继承和聚合等特性为项目的构建提供了一整套完善的解决方案,可以说如果你搞不懂Maven,那 ...

  7. VMware虐我千百遍,我却待她如初恋

    文章目录 一.相关环境 1.操作系统 2.VMware版本 二.我遇到过的bug 1.VMCI驱动程序无法自动安装,需要手动安装 2.Vmware提示以独占方式锁定此配置文件失败 3.VMware提示 ...

  8. 那些曾虐我千百遍的计算机组成原理

    那些曾虐我千百遍的计算机组成原理 本笔记知识点来源于b站狂神说:聊汇编先导课,有兴趣的小伙伴点这里:狂神聊汇编先导课 文章目录 那些曾虐我千百遍的计算机组成原理 进制的本质 有符号数和无符号数的区别 ...

  9. 客户虐我千百遍,我待客户如初恋

    误闯误撞,进入了IDC行业,从事了服务器租用及托管的销售工作.很多人问我,什么是IDC,什么是服务器?我知道我解释的过于专业那么会有更多的问题,毕竟自己也不是百科全书,只好简答回复"没有显示 ...

最新文章

  1. 性能超FPN!北大、阿里等提多层特征金字塔网络
  2. 地区的json数据_Python 连接开放航空交通数据,轻松构建航班跟踪应用!
  3. vue 根据后台数据 判断显示_【开源】el-admin 后台管理系统,v1.9 发布
  4. 【温故知新】CSS学习笔记(字体样式属性)附加篇
  5. IPFS: BitSwap协议(数据块交换)
  6. foreach jdk8 递归_[Java 8] (8) Lambda表达式对递归的优化(上) - 使用尾递归 .
  7. 计算机系统基础:磁盘调度知识笔记
  8. textview点击展开全部或收起,内容过长显示省略号,设置行间距,字间距,跑马灯显示
  9. 同时两个版本php,查看“实现多个PHP版本共存和互相切换”的源代码
  10. allwinner 全志uboot git网址 及其他相关链接
  11. 《分布式系统原理与范型》习题答案 5.同步
  12. 超详细|一篇搞定操作系统——文件管理
  13. OpenPose 命令行说明
  14. 利用一阶谓词逻辑求解猴子摘香蕉问题
  15. 简历python技能怎么写_老鸟教你如何写好技术简历
  16. 过程控制第四章到第六章
  17. Windows中Latex应用排版、常用引用、公式、表格等
  18. 直流充电桩和交流充电桩有什么区别?
  19. docker ps出错
  20. php项目如何上传服务器,php项目上传到云服务器

热门文章

  1. 广西投资集团推出“数字广投”,为广西数字化转型打版
  2. 黑金AX7350注意事项
  3. 如何使用Spring Boot促进java开发?高级java架构师为您详解!
  4. 【Open3d报错】 无法使用open3d显示图像
  5. Mac上的经典播放器——Elmedia Player
  6. 四川省教育考试院计算机准考证打印,四川省教育考试网官网准考证打印
  7. 团购服务升级战打响:围绕移动、差异、精细化
  8. pencv 二值图像的孔洞填充
  9. 谈谈PLC的抗干扰能力(转载)
  10. 扒一扒你不知道的《经济学人》大家族