一个3年Java程序员的坎与选择

时间:2023-03-08 17:05:31
一个3年Java程序员的坎与选择

前言

  LZ 15年本科毕业,不知不觉3年过去了,去年底裸辞回到成都来发展,年后开始找工作,面试了几家公司,现在整理整理做个总结,也方便规划下一个3到5年以及和广大想要进阶的Java程序员同胞们共勉。

  首先谈谈裸辞的感受吧:走之前部门很多同事都神秘兮兮的过来问我“小伙子下一家在哪呀?”,LZ很直白:“回家种田哟”,当然表面笑嘻嘻,其实内心心理压力还是有的,而且也在后面的求职过程中印证了这一点:“裸辞是多么痛的领悟”。

失败的面试

1)京东成都:在智联招聘上投了简历,半个小时不到HR就给我打电话约面试(不得不说京东这个效率还是很厉害,当然物流效率也很厉害)。

  面试是两个面试官,一个看起来35岁左右(应该是技术骨干)另一个年轻一点,当然基本所有面试的开场都是自我介绍,然后“骨干”开口了,“你是来面试的高级噶?”,LZ表示没有概念(智联的JD也只是说Java开发)但是没办法也只好随声附和了一下。

  “骨干”:“我看简历上写了你们项目也用到了微服务架构,那你说说Dubbo数据传输时你们是用的什么压缩算法?”,啊,,LZ有点懵,赶紧解释说我们是用的公司内部自己研发的一个服务治理框架。。

       “那你们数据压缩怎么处理的?”  --“骨干”毫不放弃希望

   LZ:“我们的服务治理框架只做了服务注册,发现和治理,服务间的通信协议是用的HTTP,数据报文没做压缩。。”  --Dubbo的数据压缩我真的不知道唉,第一个问题就被问倒。。

  “年轻面试官”:“你们注册中心怎么实现的?”,

   LZ:“也是用的ZooKeeper,原理和机制都类似Dubbo,只不过功能上要简陋很多。。”

  “年轻面试官”:“那你们怎么保证单点的问题?”

   LZ:“集群”  --是不是答错了。。

  各自沉默1分钟后“骨干”接着问:“问题基础点的吧,JDK1.8中 HashMap有哪些新特性?什么情况下HashMap会产生死锁?”

   LZ:“额,不知道”

  “骨干”还是不放弃:“那如果Hash表上的拉链太长,你怎么优化?”

   LZ:“调小加载因子,或者优化hash算法吧。。”

  “骨干”:“如果就是因为某些原因导致某个拉链太长怎么办?”  --绝望,平时工作中都只用到1.6 1.7也很少关注这类信息,再次被问倒

  后面还问了很多问题,两个人轮流问。。像ConcurrentHashMap原理,Netty和Mina,ThreadLocal,垃圾回收器,JVM调优,多线程,怎样设计一个高并发系统,分布式锁,Redis集群的hash一致性算法,Linux命令,Spring IOC,AOP原理和机制,MQ,JS缓存问题等等。

  总结:京东的面试还是很考验基础功底和知识面以及深入理解的程度,可惜LZ目前还是太菜,结果也就可想而知了。虽然失败的滋味很不好受,但是这何尝不是一种美妙的经历呢,把失败带来的沮丧转化成进取的动力,促进自己以后的学习和进步。

2)美团点评:在Boss直聘上投的简历,面试时间也是上午10点,面试开始,面试官问了几个Java基础问题,然后。。

  “说一下HashMap在1.8中有哪些改进?”  --唉,怎么都爱问这个呢,有了前面的教训,LZ当然是很庆幸的,现在想想面试官其实想考验的只是你平时对新知识新技术的关注程度和自我更新自我学习的能力(以后的工作中要注意这些,保持对新技术新知识的渴望)。

  接下来是数据库基础,MySQL索引的实现方式,存储引擎,优化经验,,  --这部分没答好

  传统关系数据库的ACID,事务隔离级别,数据库死锁,死锁产生的4个必要条件,怎么避免死锁

  JVM内存模型,volatile关键字,指令重排序,调优,垃圾收集算法,常用设计模式等等

  然后:手写单例,单链表倒数第K元素,青蛙跳台阶。。  --单链表的问题忘了做边界检查,青蛙的问题由于没时间了,问我思路,当时紧张也没想出来,就说是用排列组合或者递归。。

  总结:应对女面试官的方法就是好好复习书上的知识点,LZ虽然前段时间也把《Java编程思想》拿来出来再啃了一遍,不过还是没能背不出来死锁的必要条件,只是记得A占了B的锁,B占了A的锁,然后相互请求等待。。。美团应该是有一套面试题库,将近90分钟面试过程问了很多概念性的问题,框架,项目经历等等已经没时间问了,感觉这次的面试比较适合应届的毕业生,对概念性知识有很牢靠的记忆(当然这样说有点为自己开脱的嫌疑,总归还是自己基础不牢靠,面试没准备好)。

 3)蚂蚁金服:其实收到阿里的电话面试还是很意外,因为LZ认为以目前的渣渣水平肯定是没机会的,不过好在面试官是个态度很和蔼攻城狮,面试问的一些问题也不算很偏,但是LZ也只是把问题回答了出来,没有表现出亮点来,stop the world,分布式事务,幂等性这一块答的也不是很好,所以P6P7什么的就还是不要想了吧。

  还有其他几家通过的面试经历LZ这里就不再讲了,前面提到裸辞的感受,特别是在经历过几次失败的面试后这种无形的压力、惆怅和不知所措才更加让人刻骨铭心,当然所有好的不好的都是一种经历,也更加有利于以后对自己的鞭策,现目前在一家创业型的互联网公司,从做项目转换到做产品,对软件开发有了新的体会,不管怎样总算是定了下来,也可以抽时间好好想想以后的规划和自己的成长道路。

下一个3-5年

  首先回顾前一个3年,LZ一直在做电信核心系统的开发,虽然随着时间的推移,对整个系统架构,框架技术,业务知识有了更深入的了解,但是放眼整个互联网行业来讲自己的知识面和技术局限性就显露无疑了,通过最近的面试也得到很多体会,高并发,分布式,微服务等等,特别是Paas层的框架,有太多太多可以学的东西了,前面三年左右摇摆不定,没想清楚自己是要往业务线走下去还是深入技术扩大知识面,现在想想所有的技术都是为业务服务的,业务可能会有五花八门,但是技术的方向却是很明确的。以前看过京东成都研究院一个大拿写的一篇文章《逃离局部最优点》https://www.cnblogs.com/mindwind/p/7886278.html,里面写的很好,如果你感觉到在一家公司的上升空间(不管是职级还是技术方面)已经被挤压到自己不能忍受的地步的时候,那么你就应该好好考虑作为一个局部最优解的下一步的发展道路了。

  下一个3-5年,希望夯实基础,研究技术专题,研究框架,立足PaaS层向着中间件的方向发展。

构建自己的技术栈

  回顾这几次的面试经历,作为一名Java程序员,基础知识是重中之重,不管各种PaaS框架遍地生花,基础就是基础,再怎么强调也都不过分,《Java编程思想》是本很好的书,有空就应该拿出来翻一翻,书上的例题都应该亲自敲一敲,接下来是IO/Socket原理,多线程,RMI,reflect,JDK当中的API,JVM等的专题,再就是框架和设计模式:Spring全家桶,ORM,Redis,AOP,Dubbo,FastDFS,JMS等等。

这里再盗一张大拿的图:

一个3年Java程序员的坎与选择