我在做技术面试官的时候,面试对象大多数是初级开发和高级开发,偶尔也会面试架构师。我发现,IT人的工资固然和相关技术的使用年限有关,但如果候选人的技能无法跨越到更高层次的话,他们的收入也就会停留在当前级别,哪怕工资年限再多,也无法提升工资水平。
比如,我就面试过不少工作了5,6年的程序员,他们的技能也就停留在增删改查阶段,那么只能领到初级程序员的工资。更可悲的时,在面试过程中我发现他们甚至不知道上升的途径和方式,这样的话,可能当他们有10年经验时,或许还只是初级程序员。
对此本文将围绕着初级程序员,高级程序员和架构师这三个职位,说明下这些级别的技能瓶颈,并给出若干突破瓶颈的建议。
哪怕是非相关专业,从培训班出来的程序员,要找个工作也不难,更何况是计算机相关专业出身的学生。
在一般的公司里,对初级程序员的要求大多也是会增删改查,熟悉基本的业务,而且不少公司不会让他们干更高级的活。所以我在面试过程中,不少3年以内的初级程序员的水平和一些有5年经验的人差不多,这就进入了初级程序员的收入瓶颈。
比如Java方面,他们仅仅会用技能,比如集合,多线程,数据库等,也会在Spring框架下干活,SQL方面,仅会写基本的SQL语句,或许还会使用简单的索引等技能。但如果我问及底层代码,他们知道得很少,问及Spring等框架知识,他们只会告诉我如何配置,如何在现有框架里干活。至于一些高级技能,比如分布式组件,或者LInux下的部署和日志排查,他们大多就不知道了。对于项目管理的工具,比如Jenkins,sonar等,他们可能都没听说过。
如果面试时仅表现为会干活,不会调优,不会分析和解决问题,那么能力上也就是初级开发。这样的话,在上海,按当前行情,估计最高也就12k了,同时,如果干了5年还是这样的话,那么竞争力会大大降低。那么如何提升到高级开发呢?
1 在平时得熟悉调试代码,并且,一旦组里出了问题,得尽量参与,刚开始可能分析和解决问题的能力不行,但慢慢就行了。
2 多看些优化方面的技能,以及比较热门的技术,比如数据库方面,别单纯看JDBC的增删改查,可以看些NoSQL甚至redis缓存,然后看下SQL调优技能。
3 多关注些项目开发和管理的技能,比如敏捷开发,站会,单元测试,集成部署,通过Sonar看代码质量等。
4 这点比较关键,得多和别人交流,比如多和需求方沟通需求,多和测试方沟通问题重现步骤,多和组员领导沟通问题的实现方式。
其实初级开发升级到高级开发还是相对容易的,只要主观上态度上端正,别固步自封,然后到处看些资料多和人交流即可。如果进互联网公司,在大压力环境下,身边大牛再多些,升级过程会更加顺利。
高级开发论技术,有一定的调优经验,也有一定分析日志解决问题的能力,也能debug。论解决问题的能力,也能和别人沟通,从而接简单的需求,并能分析和解决一些问题。论团队合作,也能带3,4个人一起开发。其实这类能力,对工作个3年的程序员来说,不难达到,如果在节奏比较快的互联网公司里,甚至2年即可。
论工资水平,当前在上海,高级开发拿个15k都算低,如果进个大公司,外带5年左右开发经验,估计能到20k,如果在互联网公司甚至能更高,但瓶颈估计在25k左右。
我面试高级开发,他们一般基础知识比较扎实,比如Java集合内部的实现代码,高并发的诸多类,或者Spring框架的一些关键底层代码,都能说得上来。一般给我的高级开发的面试标准是,所需初级开发的技能,并在此基础上具有一定的调优能力,通过日志定位问题,设计解决方案和解决实际问题的能力,而且linux上也能部署代码。只要能说得上来,一般能给到高级开发的工资,就多少的问题。
但我面试时,感受非常深的是,和架构师相比,高级开发对于分布式组件或基于云组件(比如k8s)或其它高并发分布式组件,有些人可能用过,但仅限于会用其中的API,让他们搭建一个集群,他们可能就力所不能及了,如果再问他们分布式组件在项目开发时经历过的坑,他们大多也说不上来。
比如我问,Dubbo里通讯协议有哪些?高级开发一般能说得上来,因为这有现成资料,但我再问,根据你们的业务实际情况,你们用的是长连接还是短连接方式?为什么要用这种协议?他们估计就很难回答。如果我再问,如果要处理高并发的请求,需要在Dubbo里做哪些配置?如何同其它组件搭建成集群以达到容错效果?高级开发就更难回答了。
同初级开发升级到高级开发相比,高级开发升级到架构师更难,因为在一般的工作环境里,高级开发很难有相应的实践机会。不过话说回来,如果程序员有8年经验后还是高级开发,那么竞争力会逐步下降,一方面很难再要到更高的工资,另一方面很难通过面试争取到架构师的工作机会。那么高级开发如何升级到架构师呢?这个时候光靠态度就不行了。
1 理论知识不可少,还需要在自己电脑上,可以搭建个脚手架项目,比如自己装个虚拟机,搭建个dubbo集群等,这样能熟悉基本的配置和用法。
2 最好找个互联网公司实践下,哪怕在互联网公司干的是高级开发的活,一定也有机会接触分布式组件,这样就有相关经验了。我在一家外企自学了1年多架构师的技能,然后到一家互联网公司,发现3个月的实践抵得上1年多的自己探索。
3 比如高级开发,架构师更得了解集群,而不是单机版的代码,所以更得关注一些技术以外的技能,比如负载均衡,容错处理,通讯协议和流程等。积累着方面的经验别无他法,只能多动手排查和解决实际问题。
4 虽然说光靠态度不行,但没态度也不行,在升级过程中,可能因定位问题不及时不准确,或者提出的方案有瑕疵,从而受到别人挑战,相反如果回到高级开发的舒适区也能稳定地过日子。我自己也有体会,我幸亏遇到了好师傅,而且我师傅的师傅是大牛,也为我指明了不少进阶方向。否则的话,这条升级路能坚持下来,还能难说。
目前在上海,架构师的月薪普遍在30k以上,如果稍微资深点的话,35k也不是问题,如果是一个公司的主心骨的话,那工资就更没上限了。
虽然不多,但我好歹也面试过Java方面的架构师,我在面试过程中发现,一些资深的架构师,相关实践经验相当丰富,更有部署上线和在线排查问题方面的经验。
比如MyCAT分库分表方面,高级开发会使用,一般的架构师会搭建集群,也会排查产线问题,而资深架构第一能知道该如何上线,上线时如何采用分组发布确保数据兼容性,上线后又该如何清洗数据,如果上线过程中出现问题又该如何回退。再比如针对Netty的OOM问题,资深架构的脑海里会出现若干个优先排查点,在这些范围内找到问题的概率很大,不行再具体看日志分析。
如果说,架构师还有人可以问的话,资深架构则没人可问,有问题得靠自己之前踩坑获得的经验,或者自己找资料。从这个意义上来讲,在架构师级别,如果技术上再要提升,那么只能多靠解决实际问题时积累的经验,而且更得结合业务,把负载均衡,容错处理等处理高并发的理念用分布式组件实现。这方面,我们可以参照下BAT或知名互联网公司的架构知识体系。
不管是面试初级程序员还是高级开发或者是架构师,我发现一些表现好的,都是比较积极向上的。
比如回答问题时声音洪亮,沟通时也有尽量向表达清楚的愿望,哪怕某个方面回答不正确,但也能看出平时在不断积累知识,当被追问比较深时,也能比较耐心地一一解答,总之通过交流,给人的印象是比较踏实靠谱。有些人甚至平时会写博客,或者出过书,或者想尽一切办法来积累和提升自己。这类人大多能过,哪怕个别过不了,但努力的大方向没问题,完成进级也仅仅是时间问题,未来潜力也是非常可观的。
但相反,有些回答不好的候选人,总会给人些得过且过敷衍的感觉,比如回答问题比较简单,或者总是想套面试官的话,或者总想用些模棱两可的回答来蒙混过关。
我和其它的面试官沟通以后,对此感受很深,总是先自己要了,然后再肯上进,再自发地归纳出好的学习方法,并能有效地进行时间和工作任务管理。
我见到过不少反面的案例,这些人论资质不错,但或者光有决心没行动,或者干脆陷入在舒适区不可自拔,这些人很难有技术上的突破。相比之下,初级程序员在有决心有行动后,升级所需的时间不会超过1年,有些半年就够了,高级开发升级到架构师可能有些难度,但一般不会超过2年。
所以说,要升级,首先态度要端正,人要上进,这话说起来太容易,但能做到的并且能坚持下来的人数并不多,所以态度也是升级的瓶颈,这话虽然通俗,但不无道理。
本文提到的各级别程序员的瓶颈和突破建议,都是我和其它多位面试官在面试过程中总结而来,希望能对大家有所帮助。
再者,除去因升级而带来的收入提升外,在任何技术前提下,都有对应的挣钱手段。比如我在博客园等地,看到不少大学生朋友靠写文章挣钱,而开专栏也并不是要多高深的技术积累。同时,当程序员升级到高级开发后,就能通过写书或者录制视频等方式挣钱。此外,如果是接项目,在各技术层面都有对应的项目。不过话说回来,对我们程序员来说,在任何公司任何职位任何场景,都有机会进入到舒适区“享福”。
有道是“技术穷但志不能短”,我在博客园里就见识过不少靠努力翻身的例子,在我身边的同事朋友里,也经常看到“半年后技术大变样”的例子,这些榜样能激励我不断上进。所以本文在给出突破瓶颈建议的同时,更希望大家要有不断上进的信念。
如果大家感觉本文有帮助,请推荐本文,也欢迎大家通过评论来交流。
有不少网友转载和想要转载我的博文,本人感到十分荣幸,这也是本人不断写博文的动力。关于本文的版权有如下统一的说明,抱歉就不逐一回复了。
1 本文可转载,无需告知,转载时请用 链接 的方式,给出原文出处,别简单地通过文本方式给出,同时写明原作者是hsm_computer。