CategoryResourceRepost/极客时间专栏/设计模式之美/不定期加餐/加餐十 | 如何接手一坨烂业务代码?如何在烂业务代码中成长?.md
louzefeng d3828a7aee mod
2024-07-11 05:50:32 +00:00

44 lines
6.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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