作者 | 郝安康
有这么一句名言“Talk is cheap, Show me the code.” 不管是新人还是老手,都特别想提高自己的代码质量,至少让别人看着舒服。我在以往的工作经历中,并没有太重视个人编码的能力,包括正确性、美观性还有效率。工作几年的人还写出那么难看的代码,说出去会很丢人的,所以提升自己的编码水平显得尤为迫切。
那么可以从哪些方面着手去提升自己的能力呢?
书籍推荐
《重构》
世界顶级、国宝级别的 Martin Fowler 的书籍,可以说是软件开发领域最经典的几本书之一。目前已经出了第二版。
这是一本值得反复阅读的书籍,配合工作上的实践进行学习。
《重构》一书已经有明确的定义,分名词和动词两种形式。
- 重构(名词):对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本。
- 重构(动词):使用一系列重构手法,在不改变软件可观察行为的前提下,调整其结构。
《Clean Code》
《Clean Code》是 Bob 大叔的一本经典著作,强烈建议小伙伴们一定要看看。
Bob 大叔将自己对整洁代码的理解浓缩在了这本书中,真可谓是对后生的一大馈赠。
《Head First 设计模式》
《大话设计模式》
设计模式用于承载复杂的业务逻辑,使写出的代码简洁、易扩展。简单地说,你需要去了解业务中哪些是变化的,哪些是不变的。这些变化的东西就是复杂的业务逻辑,你需要思考如何用一种合适的设计模式去承载它,使得当它发生变化的时候,能具有很好的扩展性。这时候如果你学过设计模式,对每种设计模式的使用场景都谙熟于心,那你做起来会更加得心应手。
《Effective java 》
《Effective Java》是 Java 领域的经典著作,其影响力不亚于《Java 编程思想》。
对于一个 Java 工程师而言,在新技术不断涌现和迭代的情况下,学习的能力以及如何快速学习的能力是成长的关键。学习的方法、思维和能力给一个人成长的助推是巨大的。
其他
- 阿里巴巴 Java 开发手册 :https://github.com/alibaba/p3c
- Google Java 编程风格指南:http://www.hawstein.com/posts
优秀源码推荐
因个人作为后台开发者,主要学习使用 Java 语言,所以此处推荐的也是 Java 相关的源码学习,不过大道至简,语言千千种,核心不会变。
Github 上有不少 star 数极高的项目,大部分功能性比较强,涉及到的技术点也比较先进,用来学习技术确实不错,但并不是所有的代码风格都值得学习,为了避免踩坑,这里就不列举这类项目。这里推荐的源码都是 Java 生态的框架源码。
JDK
为什么要看 JDK 源码?
- JDK源码是其它所有源码的基础,看懂了JDK源码再看其它的源码会达到事半功倍的效果。
- JDK源码中包含大量的数据结构知识,是学习数据结构很好的资料,比如,链表、队列、散列表、红黑树、跳表、桶、堆、双端队列等。
- JDK源码中包含大量的设计模式,是学习设计模式很好的资料,比如,适配器模式、模板方法模式、装饰器模式、迭代器模式、代理模式、工厂模式、命令模式、状态模式等。
- JDK源码中包含大量Java的高阶知识,比如弱引用、Unsafe、CAS、锁原理、伪共享等,不看源码是很难学会这些知识的。
JDK 源码阅读顺序:
- java.lang 包下的基本包装类(Integer、Long、Double、Float等),还有字符串相关类(String、StringBuffer、StringBuilder等)、常用类(Object、Exception、Thread、ThreadLocal等)。
- java.lang.ref 包下的引用类(WeakReference、SoftReference等)
- java.lang.annotation 包下的注解的相关类
- java.lang.reflect 包下的反射的相关类
- java.util 包下为一些工具类,主要由各种容器和集合类(Map、Set、List等)
- java.util.concurrent 为并发包,主要是原子类、锁以及并发工具类
- java.io和 java.nio 可以结合着看
- java.time 主要包含时间相关的类,可以学习下 Java 8 新增的几个
- java.net包下为网络通信相关的类,可以阅读下 Socket 和 HTTPClient 相关代码
源码量那么大,不要妄想一口气都看完。最好符合你当前的目的,比如你想搞懂多线程,你就主要看 JUC,想搞懂IO 就多去看 NIO,想看常量池就去看 ClassFileParser。看模块的时候,要注意接口大于一切,或者说函数大于一切。先不要妄想搞懂所有细节,先找几个比较关键的函数,搞懂函数的作用(比如应该仔细分析一下函数名称和参数名称)然后再往下进行。
在看 Java 类库的时候要多注意类是不是 abstract 的,是不是用的模板方法,多关注函数前的修饰词,这一般说明这个函数是给谁用的。多注意这些细节而不是傻傻过一遍逻辑,能从里面学到不少关于设计的东西。还可以注意什么地方是为了之前的设计而委曲求全的做法,毕竟一个这么多年的类库,肯定不是什么地方都是完美的。
JDK 源码一定要看 Java 并发相关的源码, Doug Lea 的并发源码比较漂亮,一行行都是精华,非常值得阅读学习。
工具
看类库首推IDEA,多用 Structure,多自动生成 UML 图。先搞清楚接口和类之间的关系,再去分析函数。
最后在学习源码的过程中,不要介意看别人的博客,不要介意手抄笔记。
Spring-Framework
Spring Framework 是一个开源的 Java/Java EE 全栈(full-stack)应用程序框架,以 Apache 许可证形式发布,也有 .NET 平台上的移植版本。该框架基于 Expert One-on-One Java EE Design and Development(ISBN 0-7645-4385-7)一书中的代码,最初由 Rod Johnson 和 Juergen Hoeller 等开发。Spring Framework 提供了一个简易的开发方式,这种开发方式,将避免那些可能致使底层代码变得繁杂混乱的大量的属性文件和帮助类。
图片出处:Spring官方文档
Spring 是一个开源的设计层面框架,它解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。包括在此基础上衍生的 Spring MVC、 Spring Boot 、Spring Cloud 等,在现在企业中的应用越来越广泛。无论是设计思想,代码规范,还是设计模式,接口设计,类加载,都是非常优秀的源码。
个人学习心得如下:先去看视频,大概熟悉一下 Spring 的使用情况,然后再去学习源码,此处可以阅读《Spring源码深度解析》,除了看书之外,记得打开 IDEA 查看对应的源码,如果能调试看看具体调用逻辑那就更好了。
Google Guava
Google Guava 是 Google 公司内部 Java 开发工具库的开源版本。Google 内部的很多 Java 项目都在使用它。它提供了一些 JDK 没有提供的功能,以及对 JDK 已有功能的增强功能。其中就包括:集合(Collections)、缓存(Caching)、原生类型支持(Primitives Support)、并发库(Concurrency Libraries)、通用注解(Common Annotation)、字符串处理(Strings Processing)、数学计算(Math)、I/O、事件总线(EventBus)等等。
实践
通过上述两大途径的学习,我们必须要将吸收的东西加以实践,有输入就要有输出,不然输入也就毫无意义。
这里需要着重强调 Code Review 的好处,简单整理有如下三点好处:
1. 互相学习,共同成长
无论身处什么团队,团队成员的技术能力、经验都是有差异的。
通过 Code Review,对于同样的功能实现,有经验的工程师可以给经验尚浅的工程师提供合理的优化建议。经验尚浅的工程师可以通过阅读优质代码,快速学习相关技术运用的最佳实践。如果大家技术实力相当,可能就是互相刷新思想了。
2. 知识共享
进行 Code Review 不仅仅是为了讲述代码如何编写,还要介绍其背后涉及的业务知识,在此过程中,根据提交者的描述阅读代码的逻辑,看代码实现是否跟描述一致。
通过 Review,让团队成员不再局限于项目的某一块业务,避免项目只有一个人了解项目的尴尬情况。特殊情况下,也可以及时代替别人来维护相关代码,尤其是在没有相关业务功能说明文档的情况下。
3. 统一编码风格,提升质量
代码质量大概分为以下层级:
可以正常运行——可以测试通过——容易阅读——容易维护。
Code Review 至少要让代码达到易阅读的级别。
要想做到易阅读,可不是光靠 Code Review 就够了,首先需要观察整个项目的风格,按照已有的规范编写相同风格的代码,当然每个人的风格不可能完全相同,但是要保证整体风格相似,这样维护起来不至于难受。
总结
如今写代码就像以前上学时写字一样,能写得好代码就相当于写了一手好字。如果你隔段时间回头看自己的字都不忍直视,那么可以通过临摹练字来提升自己,最终习得一手好字。
练字多了就会成为习惯,再往后写字就变成下意识的习惯。而写代码可没有那么简单,写之前需要用大脑思考,选用什么模式,如何设计,写完后要想着如何优化。
按照上文的学习方法,慢慢改善自己的编码习惯,最终达到下笔如有神的境界。