前言
没有对比就没有伤害,没有伤害就没有上进心!
本文的出发点主要有以下两条:
- 让大家通过对比能力模型,发现自己的不足;
- 知道自己的不足后,提供一条学习的路线建议。
如果不害怕暴击10000000+的伤害,就请继续往下。。。
1年
一年经验还是职场菜鸟,你的立身之本就是扎实的基础知识,这也是你以后能走多远、走多快的保证。
--能力要求
- 数据结构与算法:一般对应届生的要求就是数据结构和算法的原理基本都理解,数据结构包括:数组、链表、栈、队列、树、图;算法包括:插入排序、快速排序、堆排序、广度优先、深度优先等。
所以工作一年后,就会要求对这些理论的东西在java语言中能一一对应起来,在实践应用中能应对自如; - 并发编程:理解concurrent包的用法,了解CAS、AQS的基本原理,熟悉线程池用法;
- IO:熟悉IO包的用法,理解BIO、NIO线程模型的区别和使用场景;
--学习建议
这个阶段,有两本书一定要啃下来的(这里说的啃,可不是读):《java数据结构和算法》、《java编程思想》
--面试模拟
比如,面试官先问你HashMap中插入一条数据的过程是怎么样的?
你估计会回答,HashMap底层是用数组来存储键值对,先对key做hash,然后根据hash值确定数组的下标,存入数据。那面试官就会继续问你,如果该下标处已经有数据,怎么办?
你如果这个时候说不知道的话,那这个问题就到此结束了。如果你说和已经存在的数据通过链表方式放到一起。
那么面试官接下来就可能会问你,除了链地址法,还有没有其他方法?
如果你回答不上来,那么到此为止。如果你依然回答上来了,那么面试官还会继续问你,你觉得它们两个各有什么优缺点?
如果你依然可以回答的话,那么面试官会继续问你,你觉得还有没有比它更好或者更高效的实现方式?
如果你还能说出来的话,那么就你所说的实现方式肯定依然可以问你很多问题。
3年
如果在其他行业,3年可能也就是个稍微高级点的菜鸟,但是在软件开发行业,3年已经可以算是码代码的主力军了,这个阶段要求你不仅更深入了解前面的基础,还要求对各种框架原理、设计模式广有涉猎。
--能力要求
- Java虚拟机:主要包括三部分:GC、类加载机制、和内存模型;
- 设计模式:四人帮搞出来的那一套基本都要能熟练掌握;
- 框架:结合设计模式熟悉springMVC、spring、mybatis等框架的实现原理;
--学习建议
同样有两本书要坚持啃下来:《深入理解Java虚拟机》、《Head First Design Patterns》;上面那三个框架的核心流程的源码也是一定要熟悉的,这个熟悉过程和设计模式的学习可以相互对照。
这个阶段啃下来,对并发编程、IO线程模型就会有更深入的理解了。
同时,可以根据这些框架的设计思想,自己去重复的造造轮子了。
--面试模拟
比如,面试官首先问你内存分为哪几部分,这些部分分别都存储哪些数据?
然后继续问你一个对象从创建到销毁都是怎么在这些部分里存活和转移的?
接着可能会问你,内存的哪些部分会参与GC的回收?
完事以后,可能还会问你Java的内存模型是怎么设计的?
你回答了以后,还会继续问你为什么要这么设计?
问完以后,还可能会让你结合内存模型的设计谈谈volatile关键字的作用?
你在谈的时候,肯定会提到可见性,那么接着可见性这三个字,还可以继续问你并发的内容。
5年
5年是开发人员的一个大门槛,到这个时期就要考虑个人往后的发展路线了,是继续深入技术,还是转向管理。当然对系统的全局把握能力是能跨过这个门槛的硬指标。这里就只讲技术发展的路线。
--能力要求
- 系统规划能力:熟悉主流框架的特点和适合场景,能根据业务特点架构起一套系统框架出来,这个框架不仅仅是让业务正常运转的框架,还要包括持续集成、自动化测试、运维、监控、告警等等一套完整的体系;
- 性能调优能力:虚拟机调优、中间件调优、数据库调优等;
- 领导力:逐渐建立在团队中的影响力;
--学习建议
- 深入了解各大开源框架的实现原理,做到按需选用,要快速的知道一个框架的优缺点,适不适合自己的业务场景,就需要前面深厚的基础了。
- 熟悉大型互联网系统架构的高并发、高可靠、伸缩性、可维护、安全等各个方面,学习BAT的成功经验;
- 在持续集成、自动化测试、运维、监控、告警等方面,打造一套成熟的方法论;
也推荐几本书吧:《大型分布式网站架构设计与实践》、《深入分析Java Web技术内幕》、《软件架构设计》、《Java并发编程实战》、《Effective Java中文版》
--面试模拟
到这个阶段,已经没有什么套路可言,就是根据以往的项目进行询问。作为被面试人,要提前准备好项目亮点,并引导面试官在这些亮点上深入交流。如果没有什么亮点的话,面试官可能礼貌性的问点框架原理问题,就over了。
总结
这段时间面试了不少开发人员,有不少工作可能六七年了,但真实水平还处于一年那个阶段,关键自己对此还没有一个清晰的认识,这里算是稍做总结,给准备换工作的人一个参考吧。
注 以上只描述了java相关的部分,并没有涉及到项目管理工具、数据库、前台界面开发,这些内容可能很多java岗位也是需要考察的