作者:京东保险 王奕龙
从接触软件开发以来,一直对写出优雅的代码抱有执念,工作半年时,偶然接触到《代码整洁之道》,爱不释手,一口气读完,并在很长的时间内践行其中的观点,但是在这践行期间缺少思考和复盘,更多的是一味地信奉和遵守其中的原则,写了不少当时自认为不错而现在回过头看可读性不好的“坏代码”。
后来在员工培训时,导师介绍 《Head First 设计模式》 是影响他最大的一本书。我花了个把月读完,才渐渐理解设计原则和设计模式,并在项目中实际应用。慢慢地,开始考虑怎么设计更好,怎么解耦,怎么复用,如何满足开闭原则等等,虽然也经历过硬用设计模式的情况,但是我觉得这段时间对写代码的能力提升很多。
再后来对代码整洁有了新的理解是在读《软件设计哲学(第二版)》,其中提到的关于如何“提高可读性,降低复杂性”的观点是我之前没有接触过的,后来在对业务接口重构和代码评审中实践了其中的原则。这给了我一种别样的感觉:写好代码不再是“炫技”,而是时刻考虑“这段代码这么写,它好读吗?”,始终站在读者的角度去思考,将需求引入的复杂度降到最低。
有时候我也在考虑一个问题:在系统迭代的过程中,新功能的引入和开发人员的更替都可能会导致复杂性增加,进而使系统可维护性和可扩展性降低。但我却很少看到有团队花精力关注这件事情,通常是永不停止的需求迭代,等复杂性积累到一定程度,无法再满足业务需求时选择重构,而重构时面对欠维护的代码,需要再投入大量人力梳理、评估和研发设计,并且重构时大规模改动也伴随着产生 Bug 的风险,如果没有详细的测试用例或者没有对业务熟悉的测试工程师,该风险还会变大。此外,在中文互联网社区内也很少看到有我们国人写出的关于如何设计程序或什么是好的程序的内容或书籍,在程序员内比较流行的依然是08年出版的《代码整洁之道》,不得不说其中的观点并没有与时俱进,而适宜当前开发环境的《软件设计哲学(第二版)》是近两年的书籍,限于没有中文版导致传播范围有限。那我能帮大家做一些相关的事情吗?因为我觉得即使是老外写的较好的内容,面向的第一手开发者依然是以英语为母语的,适用于英语语境下的原则可能放在国内开发环境下并不适用。但限于能力和经验,也许我并不能将此写的很好,也希望大家能做勘误和内容补充,即使最后它没有非常棒的内容,那么能为新人开发者提供一些经验,少走一些弯路也是好的吧?
本专栏的内容基于我的开发、重构经验和一些代码整洁相关的书籍,主要参考书籍我会一一放在文末,也推荐大家去读原书。但是限于不能以实际业务开发代码为例,我一直在考虑以什么内容来承载这些,最终决定以 Mybatis 源代码为支撑,首先因为它足够简单,再就是源码采用了极简代码的风格,大家能够在追随源码的过程中,了解何时方法应该被拆分以增加可读性,何时书写长代码也是合适的,此外,还有一点是源码中注释信息很少,希望大家能在源码的阅读过程中了对“代码自解释”有自己的认识。在源码解析过程中,我会提到一些设计模式和原则,但更重要的是 自己真正深入到每一行代码中去研究才能真正理解,好代码永远都是写出来的而不是看出来的。除了了解这些方法以外,最重要的是希望大家能在平时工作中多应用和交流,多多参加代码评审,阅读其他人的代码,因为在读别人的代码时,更容易发现其中可读性差的点。希望大家能写出整洁、易维护和易扩展的代码,并能从中获取到软件设计和软件开发的快乐。
Mybatis 源代码中提供了非常完整的单元测试,文章中流程均采用其中单测进行验证,大家可点击如下链接下载源代码。
在所有内容开展之前,我想先给大家铺垫一个设计原则,它也是《软件设计哲学》中提到的最让人眼前一亮的观点:坚持“深”模块设计,如下图所示:
它会将每个模块看作一个矩形,矩形的面积代表模块提供的功能,顶部边缘代表模块公开出的接口,边缘长度代表接口的复杂性,越长接口越复杂。设计较好的模块会比较深,因为它在简单的接口后隐藏了许多功能,其内部的复杂性只有一小部分对开发者可见。坚持深模块设计也就意味着提供调用简单但功能强大的接口。
在接下来的内容中,请大家带着这个原则,并在阅读源码过程中时时考虑“这样设计够深吗?”,相信大家能对软件设计有更好的理解和认识。
巨人的肩膀
- [美]John Ousterhout.(2021).软件设计哲学(第二版)[M].San Francisco:Yaknyam Press
- [美]Robert C. Martin.(2020).代码整洁之道[M].韩磊,译.北京:人民邮电出版社
- [美]Elisabeth Freeman,Eric Freeman,Bert Bates,Kathy Sierra,Elisabeth Robson.(2007).Head First 设计模式[M].O'Reilly Taiwan公司,译.北京:中国电力出版社
- [美]Martin Fowler.(2019).重构(第2版)[M].熊节,林从羽,译.北京:人民邮电出版社
- [美]David Thomas,Andrew Hunt.(2020).程序员修炼之道(第2版)[M].云风,译.北京:电子工业出版社
- [美]Robert C. Martin.(2016).代码整洁之道:程序员的职业素养[M].余晟,章显洲,译.北京:人民邮电出版社
- [日]结城浩.(2017).图解Java多线程设计模式[M].侯振龙,杨文轩,译.北京:人民邮电出版社
- Mybatis: 中文官方文档
- Github: How To Read Code
- Bilibili: MyBatis源码阅读指南