作者 | 王争
作者王争,前 Google 工程师,内容摘自《设计模式之美》专栏。
在我们的职业生涯中,很少有机会可以从零开发一个项目,大部分都是接手别人的代码继续开发,或者做些维护性开发。而且,对于大部分业务系统来说,因为业务导向,需求倒逼,开发工期紧,团队往往都不是很重视代码质量,快速上线是第一要务。
所以,很多团队的代码质量一般都不怎么高。埋坑无数、没有文档、也没有注释,代码读不懂、也不敢改,这对于新人来说,会非常苦恼。今天,我们就聊一聊,如何接手一坨烂业务代码,以及如在烂业务代码中的成长?
如何接手一坨烂业务代码?
在我过去 10 年的工作经历中,我接手过很多个代码质量比较烂的项目。这些项目都有很多共性的特点,大部分都已经维护了两三年,甚至五六年之久,代码量很大,有十几万行以上,并且大部分代码都没有任何注释,业务功能非常庞杂,也没有对应的业务文档。
除此之外,代码中还充斥着各种临时解决方案(Workaround)、硬编码(Hard Code)、遗留代码(Legacy Code),还有很多匪夷所思的设计。对于有些设计来说,我们称之为“反人类”设计或者“故意挖坑”,一点都不为过。如果没有老员工给你解释上下文,你万万都想不到它为什么这么设计和实现。
实际上,要想接手一个业务系统,前提是要读懂代码,而读懂代码的关键,是要熟悉业务。只要业务搞清楚了,代码只不过是对业务的翻译,对照着业务看代码实现,看懂并不是件难事。不过,我所接手的这几个项目,基本上都是零文档,所有的业务知识都是靠口口相传。所以,搞清楚业务,就成了接手项目最难的事情了。
面对如此庞大的项目代码,没有文档,几乎就是两眼一抹黑。原来参与这个项目开发的老同事,有的离职,有的去做其他新项目,一直问他们也不好意思,所以,大部分情况下,我都只能硬着头皮,通过阅读代码反推业务功能。
如果代码质量比较高,模块划分清晰,命名规范,那通过读代码反推业务,也并非不可能的事情。但真实的情况往往事与愿违,就像我们前面提到的,代码中充斥着临时解决方案、硬编码、遗留代码等各种坑,这就使反推业务变得非常困难。对于代码中的这些坑,尽管我不想一直麻烦同事,但也只有多问才能最快速地解决。
在读代码的过程中,我非常重视知识的文档化,我会把读懂的每个业务都写到文档中。当然,这其中也包括前面提到的各种坑。对于复杂的业务流程,我还会画一些流程图。读代码的过程非常痛苦,花了好几个月,我才有信心说,自己几乎把所有代码都搞清楚了。
同时,我也做了一件过去几年都没有人做的事情,那就是补充完整了技术文档和业务文档,之后再有新同事加入,看了我的文档,就可以很快了解代码、了解业务,很快就能上手开发代码。
总结一下,即便代码再烂,只要有完善的业务文档,先理解业务,再去看代码,几乎就没啥难度了。对于零文档的项目,大部分情况下,我们只能通过代码来反推业务。当然,对于有些坑来说,必要的情况下,我们也要询问前辈来搞定。
在读代码的过程中,我们要将得到的知识文档化,这也是对公司和团队来说最有价值的部分。
如何在烂业务代码中成长?
有人一遇到这种烂业务代码,就觉得很心烦,我反倒不一样。恰恰相反,相比接手好代码,我觉得接手烂代码,虽然过程更加痛苦,但同时也会给我更多施展才华的空间、锻炼技术的机会,我的成长也会更多。
除此之外,很多人觉得做偏底层的开发(基础架构、框架、中间件等开发)才锻炼技术,做业务系统没有挑战,技术上没有成长,对此非常苦恼。实际上,我觉得这种看法是比较片面的。做业务开发的难度不亚于底层开发,做好也不是件容易的事情,同样可以积累技术、锻炼能力。
偏底层的开发更加考验程序员在某一细分领域的技术深度,偏业务的开发更加考验程序员的能力,比如沟通能力、分析问题解决问题能力、权衡取舍能力、架构能力等,毕竟业务多种多样,问题千奇百怪,单一细分领域的经验很难应对所有问题。
实际上,业务系统的开发难度一般来自两个方面:高性能要求和业务复杂。
解决性能问题,你需要具备一定的架构能力,有一定的技术广度,需要对各种基础架构、框架、中间件都有所了解。光了解还不够,还要有一定的技术深度,最好能对原理甚至是源码有所研究。
除此之外,还要有一定的使用经验。广度、深度、经验三者配合,这样才能做到恰到好处组合这些技术搭建架构,解决性能问题,并且在出现问题之后才能快速地解决。
应对大型项目的业务复杂性,要想让项目代码一直在你的掌控范围内,你需要有很强的业务建模能力、复杂逻辑的抽象能力、代码翻译能力等。对于一个人的基本素质、基础能力的要求要更高。
实际上,对于复杂业务系统来说,对业务的熟悉也能成为你的竞争壁垒,成为升职加薪的砝码。我前面也讲到,低级别的晋升靠技术,比如升阿里的 P7,高级别的晋升靠业务,比如升阿里的 P8、P9,或者换个说法,高级别的晋升,靠业务比单纯靠技术,更容易一些。
如果你参与的项目,性能要求高、业务也复杂,那恭喜你,好好干就成了。如果你参与的项目,在性能和复杂度上,只兼具其中一点,那也不错,值得一做。如果你参与的项目,既没有性能压力、业务也不复杂,那也别太着急,走着瞧,实在不行再跳槽。
在过往的项目经历中,你有没有像我一样,接手过代码质量比较差的代码?你又是如何顺利接手的呢?欢迎在评论区分享你的想法。如果有收获,也欢迎你把这篇文章分享给你的朋友。
本文摘自《设计模式之美》,限时特惠,立省 ¥120
点击「阅读原文」