先说一下大多数新手的情况:就是对着视频敲 Java 项目,其中遇到的 BUG 还能解决,但就是每次敲完一个项目,就感觉很空虚,项目里面的知识点感觉懂了但又好像没懂,应该怎样才能掌握一个项目所用的知识点呢?
先分享一位好朋友丁威的经验吧,他是《RocketMQ技术内幕》一书的作者。他在尝试学习 RocketMQ 之前未曾接触过消息中间件,但硬是通过自己提炼的学习方法,最终成为 RocketMQ 社区的优秀布道师。这让他有了一个非常亮眼的标签,极大提高了职场竞争力。
他的总结有以下四点:
了解这个项目的使用场景、以及架构设计中将承担的责任。
寻找官方文档,从整体上把握这个项目的设计理念。
搭建自己的开发调试环境,运行官方提供 Demo 示例,为后续深入研究打下基础。
先主干流程再分支流程,注意切割,逐个击破。
我认为是非常有道理的。记得我一开始参加工作的时候,拿到领导安排的项目后,非常懵逼,完全不知道该如何下手,不知道自己该干嘛。去问领导,领导说没时间,要我自己先研究研究,研究什么呢?
一开始当然毫无头绪,后面就慢慢琢磨出来了一点小心得。
先从项目的需求文档下手,先了解这个项目是干嘛的,了解个大概,就不慌了。然后把这个项目的源码在本地跑起来,“跑起来”,说着简单,真正做的时候还是挺难的,我记得我当时跑第一个项目差不多用了一周多的时间,因为我的开发环境和项目要求的有一些不一样,就导致出了很多问题。
我印象很深刻的问题有两个,第一个就是乱码了,类似下图这种。
第二个就是编译出错,原因很简单,JDK 的版本不一样。
这两个问题虽然简单,但特别常见,真的,新手基本上都会遇到。一开始遇到的时候是很慌的,因为源码肯定不会有问题,有问题的肯定是自己的开发环境。
折腾了一周多的时间,项目终于跑起来了。
我让自己体验了一把测试的角色,就是把能操作的按钮全点一遍,体验一下项目哪些已经开发完成了,哪些还没有。没用多久,我就测出来了两三个新 bug,基本上都是一些非常规操作引起的,虽然我没能解决,但报告给领导后,领导还是很惊讶的,他看我的小眼神,多少有点看吴下阿蒙的感觉,“小伙子,有长进啊!”
然后,我并没有着急去开发领导安排给我的任务,而是去看同事已经完成的代码,当然是带着问题去看的,为什么他会这么写?这么写的好处是什么?如果换做是我,我会怎么实现?这其中的差别是我自己考虑不周吗?
当然了,我不会看太细致,因为有些内容超出了我的技术范围,我看不懂的,只能是“走马观花”,大致看明白是什么意思就“得过且过”了。
这里提醒大家一点的是,千万不要陷入技术细节,尤其是一开始做项目的时候,因为自己不了解业务,再加上技术水平可能达不到,研究技术细节很容易就阵亡了。
另外一点就是,基本功一定要扎实,不要连整体的代码脉络都看不懂,那样就很吃力了。我这里有一份 GitHub 上星标 115k+ 的 Java 教程,里面涵盖了 Java 所有的知识点,包括 Java 语法、Java 集合框架、Java IO、Java 并发编程和 Java 虚拟机,内容不多,只讲重点。
GitHub 星标 115k+的 Java 教程,超级硬核!
尽量花一点时间巩固一下基础,不要让自己太被动。遇到自己生疏的知识点,就主动去查一下。
看源码的时候,自己加一些日志啊,加一些断点啊,去跑一跑。有时候,不加断点,只是去看源码很可能会忽略掉一些关键的技术细节,因为 Java 是多态的,有些地方看源码只能看到类和类之间的层次关系,却看不到子类是怎么重写父类方法的,或者实现类是怎么实现接口的,通过调试就可以看的很明白。
还有一些分支语句啊,如果只是看源码可能不明白进入这个分支的条件是什么。还有一些比较关键的技术细节啊,只看源码可能懵懵懂懂的,跟着断点一步步地深入可能就全明白了。
举个例子,拿 StringBuilder 的 append() 方法来说吧。StringBuilder 的内部是通过字符数组(Java 8)实现的, 如果新添加的字符串长度超出了数组的长度,是要进行扩容的。加了断点后,遇到需要扩容的情况就能看到 JDK 的内部是怎么来进行扩容的啦,如下图所示。
一般来说,项目都是比较庞大的,代码会比较多,这时候最好只关注一个模块,就是自己通过需求文档,或者阅读源码了解最多的模块,尽量把这个模块的整体逻辑给吃透了,如果领导恰好安排你做的这个模块的业务代码,那你的上手难度就大大降低了!
再总结一下:
拿到项目后,不要着急动手,先看文档,尤其是需求文档。
把项目的源码在本地跑起来。
做一些测试,看能不能测出一些边界的 bug。
关注一个模块,去研究一下源码,但不要过于深究技术细节。
我再给大家推荐两个优秀的 Java 开源项目吧,如果你还没有参加工作,可以拿这两个项目作为练手项目。
SpringBoot 完整电商系统 Mall:包括前台商城系统及后台管理系统,基于 SpringBoot+MyBatis 实现。
vhr:微人事是一个前后端分离的人力资源管理系统,项目采用 SpringBoot+Vue 开发。
我之前做的一个电商项目还用了 mall 作为基层的架构!mall 的学习教程非常全面,作者直接做了一个在线的网站,基本上用的技术都讲述得特别明白!
vhr 目前在 GitHub 上已经有 20.8k 的 star,属于很强的那种了。
后端技术栈
Spring Boot
Spring Security
MyBatis
MySQL
Redis
RabbitMQ
Spring Cache
WebSocket
…
前端技术栈
Vue
ElementUI
axios
vue-router
Vuex
WebSocket
vue-cli4
…
基本上主流的前后端技术都用到了。作者为初学者特意录了项目的部署视频教程,很贴心~
文档写得特别全,我简单列举下。
权限数据库设计
服务端环境搭建
动态处理角色和资源的关系
密码加密并加盐
服务端异常的统一处理
axios 请求封装,请求异常统一处理
将请求方法挂到Vue上
登录状态的保存
登录成功后动态加载组件
角色资源关系管理
用户角色关系管理
基本上每个知识点都有对应的文档,文档齐全的话,对吃透项目是极好的帮助。
嗯,最后强调一点,大家在做练手项目的时候,一定记得写注释。我在很多地方看到这样一个观点,“请停止写注释,因为只有烂的代码才需要注释。”这个观点非常巧妙,它让我想起了孟子的一句话,“杨氏为我,是无君也;墨氏兼爱,是无父也。无父无君,是禽兽也。”
Java 源码的作者绝对是这个世界上最优秀的程序员,连他们都写注释,那些声称“请停止写注释”的号召者是不是要啪啪啪地打脸,直到打肿为止。
拿 String 来说吧,要了解这个类,直接看类的注释就足够了,写得非常详细。
一个优秀的 Java 项目也应该是这样的,注释必须到位,不然别人怎么吃透,吃不透的。只能说一句,Java 源码的作者,yyds(阴阳大师,hhh)。