本文将讲一下如何高效地理解一个现有java项目的结构,并在此基础上能做基本的开发。
1 一定得搭建好环境。
在公司里,相关搭建环境的步骤包括,从github等地拿下项目代码,在本机安装好mysql或oracle数据库的客户端,比如是navicat,并通过配置连接到数据库,在本地代码里,确认并修改必要的配置,比如让dubbo指向公司的zookeeper或dubbo服务器,通过配置,让本地的redis指向正确的缓存服务器。
搭建好环境的标志是,能在本地启动服务,比如能通过启动spring boot服务器跑通项目。这个过程是很漫长,甚至是很艰难的,因为只要有一个配置文件不对就有可能出错,但只要能在本地启动代码,理解项目的工作就可以说是成功了一半。
在这个过程中,遇到问题一定别自己猜,因为像数据库等配置参数,只有相关人员才知道,在一些文档里记录的参数未必是最新的,而且万一配置出错,本来应该是连到测试环境结果连接到生产环境,那么可能出问题,所以在这个过程中,有问题或项目没跑起来,一定得问,哪怕把人家问烦了也得问,大不了换个人问,但人家告诉你的细节,你最好得用纸和笔记录下来。
2 搭建好环境以后,结合一个业务流程看。
看业务时,别去看前端,因为大多数java开发做的是后端,即从控制器开始接收请求,处理业务,操作数据库,并返回结果。
所以此时开发者一般会通过postman或jmete等工具发请求,不同的组可能用的工具不同,但一定会有这个过程,甚至有些组需要在本地把项目打成jar或war包,放到测试环境上重启后再通过输入url看结果。总之看项目代码一定别直接看代码,这样很枯燥,很少有人能坚持,但结合业务流程看就不一样了。
此时一般的做法是,用debug模式启动项目,如果不能用debug启动,那么就在项目里业务的位置用打印语句输出若干个标记位,然后再跑一个业务流程,往往是用postman发一个请求,或者干脆通过url发一个请求,当然里面还要注意参数等细节,此时就可以通过断点或事先输出的标记语句看流程了。
3 看流程时,先看主流程,忽略(缓存或dubbo等)细节。
一个业务流程哪怕再复杂,一般会包括检查参数,通过mybatis或jpa和数据库交互,调用其它模块的业务方法做些业务动作。此时你可以结合多个业务请求,综合看到整体业务的执行流程。
在一个项目里,开发业务的大致流程是基本相同的,甚至代码样式都会很雷同,因为大多是用通用的方法,或拿现成代码后稍作修改。所以看明白一个或多个业务流程并不困难,看好以后就可以上手干活了。
4 通过开发新业务进一步熟悉细节。
新人在入职以后,会有一段时间的学习期,但这个时间不应该超过一周。事实上按上述做法,外带态度端正多问人,在一周内应该能在本地启动项目并跑通一些业务流程。
后面一般就会被分配业务。分配业务时,除了了解业务要做哪些事情以外,如果可以,就多问下可以参照哪个功能点写。开发业务时,一定别标新立异,一定得多参考现有代码,这样一来方便,二来不会出错。
而且在开发代码时,能进一步熟悉项目的细节,比如诸多业务方法的参数和返回对象,有哪些现成的通用性方法。而且开发完成后,一定得需要通过连到数据库或缓存等方式,确认业务的正确性,同时需要通过日志确认每个关键步骤的参数和调用步骤是否正确。
做到这里,其实已经能算掌握了项目的流程和框架,而且还能在此基础上做新的开发。但是此时对项目的理解,可能仅仅停留在做增删改查业务的层面,为了提升架构方面的能力,程序员还应该在后继开发任务的过程中观察并掌握如下的要点。
1 和分布式组件相关的代码要点。
这里就以Redis缓存为例,程序员可以结合代码和业务需求,了解为什么要用redis,不用redis会有什么问题,用的时候是用哪些API,键和值的参数是怎么定义的。尤其地,更需要了解“异常情况”下的处理步骤。
什么叫异常情况?比如Redis缓存穿透,dubbo过载,消息中间件消息重发,或者因其它分布式组件异常而可能导致的情况。
这样通过从正反两个角度,结合业务观察到分布式组件的代码,一定能具备“相关分布式组件的项目经验”,之后跳槽时,可能面试官不会问太多的分布式组件的理论,就会问此类的相关经验。
2 项目部署和发布的代码要点。
Spring boot或SSM等代码一般是部署在linux上运行的,所以程序员还需要了解把开发好的项目打包部署到linux上的相关路程和脚本。
比如有些组可能会用jenkins做CI/CD,此时程序员就应当了解相关的脚本和流程。又如项目代码在部署好以后,会用nginx或网关等配置文件对外提供服务,那么程序员也应当去了解相关配置文件以及细节。
为什么要知道这些呢?会打包部署项目,甚至只是java高级开发的要求,至于架构师,默认是需要掌握这些技能。但反之如果不知道这个流程以及相关细节,那么可能只能停留在初级开发阶段,可能只局限于windows操作系统下的开发和测试了。
3 基于高并发的实践要点。
比如限流,熔断,分布式锁,优化数据库或者是确保幂等的代码。这些代码和业务没有直接关系,但确实属于架构级别。
为了掌握这部分的代码,程序员可能就得一方面多解决些相关问题,另一方面多去问架构师。这部分技能是升级到高级开发乃至架构师的必备条件。
4 分布式组件或微服务组件搭建和配置要点。
这部分的技能包括,服务扩容或是服务节点迁移,在数据库层面引入Redis或Redis集群,甚至是引入Mycat分库组件,或者是在服务器上搭建各种中间件。也就是说,这块技能属于搭建服务环境,具体包括在linux系统上安装组件,通过配置或命令搭建集群,或者是通过配置或命令整合组件和业务模块。
这块工作在平时开发过程中实践的机会不多,但项目发布时会干这个。这些虽然是架构的活,但相关命令和配置,哪怕是初级开发,上点心的话也能理解。如果能在面试时证明这方面的能力,就会给面试官留下“能搭建分布式组件环境”的能力,甚至是“能搭建高并发集群”的能力,大家可以感受下其中的分量。
总之,技能来自项目,但如果仅在项目里关注开发方面的要点,可能很难升级到高级开发,就别提再升级到架构。
但如果在结合项目熟悉Spring Boot等框架开发技术的前提下,进一步结合需求熟悉项目的部署能力,以及高并发组件的开发能力甚至是高并发组件的搭建能力,那么哪怕是初级开发,也能在短短的一年甚至是半年的时间内飞速提升。