接手别人的代码,死的心有吗?

Reading time ~3 minutes

当我们阅读面前的源码时,无非有以下几种目的:纯粹学习、添加新功能、重构旧代码、修复他人的Bug

为了学习去读源码,这是最愉快的最放松的,而重构旧代码、在代码功能上添加新功能、修复他人的bug等任务,大程度上我们心理感觉到比兴奋更大的是不爽,尽管如此,该是你干的活还是得继续干….

阅读旧代码的关键点

既然无法避免阅读旧代码,那么如果能注意以下几点,就有可能把历史的代码代码转换成为你成长的垫脚石

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

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

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

  • 测试环境

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

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

负责交接代码给你的那位同事,要么在办离职,要么已经介入了其他产品,眼下很可能已无心恋战,但你心里要清楚,只有他才能提供代码层面的东西,比如:类图、模块划分说明、数据流图、时序图、状态图。

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

  • 读代码,不死不休

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

while(不懂){ 读 }

  • 开发环境与调试

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

  • 调试

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

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

程序员的工作交接,尤其是代码交接,怎样才算顺利完成呢?这简直就是一个谜!没人说得清楚。所以,你最好给自己梳理一些可衡量的、可实现的目标。比如读懂A、B、C三个业务流程……

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

  • 输出、分享与重构

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

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

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

一些的心得体会

  • 理清某一业务如何映射在代码执行流程上的,这点很关键。

  • 理清不同模块间的业务关系,代码调用关系,很关键

  • 调试是弄明白代码调用流程的最快方式,之一

  • 找出关键代码(代表实际对象的类、衔接不同模块的类、代表业务关键节点的类)

  • 分析日志可以帮助分析代码执行流程和业务流程

  • 先用已有的可运行软件,体验业务,琢磨你点这里一下点那里一下代码可能是怎么做出反应的

  • 阅读应该围绕目的,把实现目标放在第一位,比如修改Bug,如果有期限,在最后日期前搞定是第一要务,然后有时间就继续读源码或改进Bug修复方案,力求没有副作用和后遗症,再有时间就修修别人留下的破窗户(你也可以顺带鄙视下前任维护者)

  • 千万次的问,还记得前面说要弄明白谁维护过你要读的代码吧,别不好意思,问吧,问吧,问吧

  • 对着设计文档、接口文档或测试用例看代码

  • 心理调试,勿畏难,别放弃。我有时看代码,看两天也不知道看了个甚,一头雾水两眼发花是常有的事儿,有时真是觉得搞不定了,然而,这要么是你基础知识没准备好,要么是你找错了入口,要知道,任何一份代码,都有一条隐形的线串着,耐心点,总会找到。这样不行就那样,多换换角度,多换换方法,读不行,就调试,调试不行,就运行,运行不行,就研究日志,都不行,我靠,while(!i.isDead())i.analyzeCode(),跟Y死磕!总之,你不放弃自己,就没人能放弃你!

  • 给自己设置小奖励,弄明白某个逻辑或某个模块的代码后奖励自己休息一下,5~10分钟,走出办公室转转,或者干脆在网上瞎逛一下,浏览自己喜欢的网站

  • 读不懂才要读,想不明白才要想,这是进步和成长的开始。那些阻挡你的蹂躏你的而又杀不死你的,终将帮助你成长让你变得更强大。

参考资料

  1. 接手别人的代码,死的心有吗?

jdk-timer、spring-task、quartz的比较

这篇文章将简单介绍目前常用的定时任务框架! Continue reading

小岛经济学-读书笔记

Published on May 10, 2018

java常见的http请求库

Published on May 05, 2018