这次在CSDN Blink发表了几篇关于Java编程学习的小作文,讲述了Java工程师的成长路线、Java学习的技能树和入门工作要关注的核心问题,我继续做一次文章的整合与延展,以文章的形式发表出来,勉励各位能在技术事业上不断突破。
我记得2002年的那一场雪之后快毕业了!有一天翻了一本杂志,好像是《程序员》,里面说Java将来牛逼,我就心动了,去招聘会面试Java开发,一点也不懂编程的我,被面试官怼得无地自容,就下定决心,买了本侯捷先生翻译的《Java编程思想》开始自学Java。从那时候起到现在,我自认已经是很高级别的企业级Java架构师了,好了不自吹了!
Java学习需要经历比较漫长的过程,才能达到高级别层次,具体来讲就是:编码级、效率级、模式级、架构级和骨灰级
编码级:一般常见于学习编程两年以内的Java程序员,当然不排除极高天赋的选手。在这个过程你并不追求代码质量(效率、结构和可扩展性),更多是模仿高工们的代码,实现应用逻辑。在这个过程一定要记住,要追求功能的完善与闭环,这个说起来简单,做起来往往有很多细节,千万不要指望产品经理,可能你们公司还没有此岗位。但是这对初级别程序员的习惯养成是关键时期。
效率级:当你对Effective Java这本书看的津津有味的时候,那么证明你开始进阶了!这一般常见3-5年的程序员,因为你开始对自己写的代码有讲究了,什么是单态,什么是工厂,如何控制异常等等,明白了代码重构的重要性,开始对各种技术框架品头论足,往往到了这个阶段的程序员前途光明!
模式级:设计模式不是书里面看出来的,而是经历了上个阶段的各种精益求精的技巧考究后,当你翻看不同的设计模式讲义时,心里会总有种似成相识的感觉,亦或者惊讶的赞叹:卧槽,原来可以这么搞啊!请相信我,这时候你的代码进入到了晦涩难懂的时期,源于过度运用设计模式会导致别人看不懂,当懂得推己及人的时候,自然就跳出来了!
架构级:进入这个阶段,应该有8-10年的开发经验,这个过程很容易进入管理路线,这是好事,但若能把持住自己,主心骨仍然继续深入技术探索当中,那么你就会发觉架构师的真正意义了,一件产品从创世到面世,架构师努力开拓出整体结构,又始终陪伴在产品的身边,守护着它的点点滴滴,就好像润物细无声一样,不断纠正和兜底技术团队在开发过程中的错误,让产品在正确的轨道静静等航行。
骨灰级:当你经历了很多事情,内功深厚,手中、心中已无剑,来什么新技术,直接了解技术框架就行了,再不成看看源代码,甚至可以提几个好的建议。这时候你更希望在某个应用领域成为名至实归的专家,更希望能将自己的所知所学用一种方式,也许是开源,也许是知识,影响更多的技术人。
接着就有同学问了,着重应该学习那些技能呢?我作为Java老架构师今天就不废话了,直接开讲!
首先刚开始学习Java除了语法之外就是数据结构了,一定要深刻理解和会用Java.util.collection框架,这是Java教父Joshua Bloch的传世之作,对于高频使用的List,Map脉系源代码建议通读,看看大师鬼斧神工的手法。
其次就是要记住Doug Lea这位大师,他是Java并发包的作者,要把学习Java多线程和并发控制作为Java学习的基础任务,因为这个复杂的互联网云平台时代,懂得多线程就是程序员的标配。
再次谈框架,很多新人一上来就是Springboot,殊不知它是一个技术栈的微型集成者。我们不要让它把所有技术封装屏蔽掉,而要从Servlet/Jsp规范,Tomcat容器的经典学起才能明白Web底层逻辑,再配上Springframework的Bean管理、ORM、AOP这才学到了根子上,当你明白了核心,看似高级的内容其实都是这些基本组件的集成!
Spring全家桶+Mybatis依然是主流,我至今依然认为这是一种程序员被码农化(开发简易自动)的趋势,但没办法,学习它们是必须的。不同于Hibernate的侵入性,MyBatis用起来更简易且更易于自定义,这是符合互联网发展需求的,但我更喜欢前者,充分的面向对象。
另外Java的学习离不开一些外部资源的高频结合:
第一就是数据库了,而数据库的学习重点在于设计范式和事务例如隔离级别,NVCC这些;
第二就是Redis,纯内存的K/V字典,主要为高并发查询缓存数据防止数据库穿透,这就是互联网发展的必然需求;
第三就是Http协议、SSL加密协议、操作Json和Restful架构风格的深刻理解,与前端主要的交互方式。
第四更高级别需要理解消息MQ的异步通讯机制和应用,Api网关对于微服务的调度,核心是Nginx,以及微服务的注册发现、RPC调用的技术实现。
第五目前物联网技术愈来愈普及,对于Netty,SocketIO这种网络通讯技术的掌握。
第六大数据技术方面,对于ES、Kafka、MongoDB、Cassandra这些适合与上层Java应用结合的框架会被大量应用。
最后就是容器技术,Docker必学,那么Linux Shell编程就要掌握了,容器太多要考虑K8s编排!
最后今天我再补充一点更实际的内容,就是Java学到什么程度就可以找工作了!
如果要着眼于找工作,那么就一定要了解真实的Java工作环境,在我二十年从业经验中,大概换了不同类型的公司不下六七家,面向包括能源、互联网、医疗、税务、金融、军工、政务等,都是以Java为主力,超过一半时间都是作为技术或项目管理者负责协助招聘。因此我说的更具有普适性。
Java的核心价值就在于互联网与企业的云应用,随着移动互联网时代成为主流,诱发了前后端分离的兴起,逐渐前端从Java web体系中异化出来(形成了前端h5+js框架(例如Vue),iOS和Android原生,微信小程序,以及原生统一开发框架Flutter),这是未来很多年都难以替换的移动化开发体系。
那么在以互联网业务为主的企业中Java工作机会就一定是向后端看齐,作为初中级工程师,关键是在非常成熟的开发框架下,将最基本的增删改查业务搞熟练。
很多程序员估计看到这里会嗤之以鼻,哪有高并发、性能调优、算法等等有难度,实际越高度复杂的问题往往在架构中会汇聚在很小的层面,需要的更少更富有经验的高程去解决。但是最直接的搬砖工作在架构中是树的枝叶,人体的毛细血管,遇到的业务问题比想象中要复杂得多。
重点就来了,熟练掌握Spring(Boot、IOC、MVC、Dao...)、Mybatis,仅仅是会用工具,
核心问题是流动在前后端之间的业务问题如何清晰的对象责任定义,就要对模型驱动、充血贫血有深刻的理解,不至于代码越写类越耦合越强,逻辑越混乱。
核心问题是分层间如何清晰的分工,多少的逻辑应聚合在一个事务内,多少逻辑应止步于控制层,就要对MVC深刻的理解与运用,形成服务接口与数据接口漂亮的扇形聚合,这也是对事务管理的极大可靠性保障。
核心问题是外界对接的不断干扰如何应对,可能今天要对接RPC,明天就是MQ,后天又是Restful,这些远程通讯协议不仅要掌握清楚,更关键是对象设计,如何利用适配器与主体结构解耦,如何避免远程接口调用耦合进本地事务操作导致拖死Jdbc。
这些问题都是在具体问题中高频发生,而又是毛细血管一样牵一发而动全身。因此作为实战经验丰富的开发组负责人,对新人在这些方面的考量才是重心。
因此作为初学者,不要一开始就把自己注水成胖子,什么都学,什么也学不好。另外不要忽视一个问题,这个行业还有大量传统的项目如同长尾一样,并不是目前互联网开发框架,有更老的ssh架构,很多时候前后端并不分离,那么对Web前端框架,例如像Struts这种JSP标签的Web前端体系扔需要掌握与学习。