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