先看一张图——“开发者山行图”:
这张图被我称为“开发者山行图”,它描绘了开发者的 4 个层级和不同层级大概的收入范围(图上标注的收入,以一线城市互联网行业为基准,非一线地区,请除以系数)。
4 个层级如下:
- 第1层:普通程序员
- 第2层:熟练开发者、高级开发工程师、技术组长
- 第3层:技术专家、架构师、一线经理
- 第4层:科学家、研究员、首席(资深)架构师、部门研发总监
今天的文章,我们先解释下层级划分,然后介绍是哪些差异造成了开发者的分层差距,最后说明一下我们的课程可以解决什么问题。
开发者的 4 个层级
按我的理解,开发者的 4 个层级,可依次对应普通、熟练、优秀、卓越四个词。
【1】 普通
普通开发者,能够使用一定的专项技术,完成别人分配的模块的开发。在工作当中,他们很少有机会决定自己做什么和怎么做,通常是在他人指导和安排下编码实现特定的细分功能。
当你还是一个普通开发者时,实际上处在体力化的代码打写阶段,很容易被替代。如果你不能精进技术水平,三两年后就失去竞争力了——因为你的技能水平对不起你的工作年限,你把一年工作经验重复用了 N 年。
在这个阶段,收入一般就在 5000 ~ 20000 元 / 月,很难突破 20000 元 / 月。同时,这个阶段的开发者,也很少有超过 30 岁的——因为超过 30 岁你还停留在这个阶段,基本上就混不下去了。(这个阶段会有大量的人退出,谋求转型……)
【2】 熟练
一般的开发者,会在普通开发者这个阶段停留 3 ~ 5 年,然后就进阶为熟练开发者,能运用一组技能树,完成较为复杂的软件模块的开发工作。进入这个阶段的标识有两个:
- 你可以做某个功能模块或子系统的软件设计工作;
- 你可以分配任务给普通开发者。
到了熟练阶段,你才算是有一技之长,才称得上是靠技术吃饭(因为普通开发者越来越多,初阶的编码能力已经算不上一技之长了)。有了一技之长,你的收入就能获得突破,拿 20000 ~ 40000 元的月薪。
你可能会在这个阶段停留 3 ~ 5 年。
这个阶段会有大部分人开始怀疑程序人生的意义,一方面对开发工作很熟悉了,也没激情了,另一方面又很难进入下一阶段获得突破,于是倦怠、空虚、无聊、意义匮乏等状况纷至沓来。在这个三十而立的年纪,很多人会考虑转型,一部分人因为看不到其它的机会又难以放弃开发技能的积累和高薪,在犹犹豫豫中蹉跎岁月;另一部分人未雨绸缪,在日常的开发工作中,已经发展了支线剧情,转型比较顺利。
如果你转型遇到困难,请到在行App内搜索“安晓辉”,约我广受好评的话题:聊聊程序员职业规划那些事儿。
在熟练开发者这个阶段,有一小部分人,能够在某个技术栈上持续精进,凸显出优势,靠这种技术优势,成为高级开发者;另有一小部分人,一手技术,一手业务,靠交叉优势,也成为了高级开发者。在这两类高级开发者中,又会诞生出 Team Leader 这种角色。
成为上面这部分人的典型标志就是:你被很多人需要,有各种疑难问题需要你参与或主持解决。
【3】 优秀
拥有技术优势的高级开发者和拥有技术+业务组合优势的高级开发者,他们当中有一部分人会晋级为技术专家或架构师。Team Leader 可能会晋级为一线经理(技术经理、项目经理、研发经理)。这算是开发者的第三个层级。
进入这个层级的开发者通常会:带人,带项目,安排别人做事情,在重要的技术决策上拥有话语权。
到了这个阶段,你的年龄应该在 30 ~ 35 岁,年收入会突破 50 万。
假如你过了 35 岁,还没到第三阶段,嗯,我猜,要么你待错了环境错失了进阶的机会,要么你主动放弃了职场成长,觉得拿个 2、3 万月薪过过小日子已经很舒服了。
处在这个阶段的朋友,都是独挡一面的优秀人才。已经超越了具体的技术能力,很好的建立了思维框架,解决问题的能力很强,所以你会看到,很多人能够迅速在非开发领域取得成绩。这就是大前研一所说的即战力。
有的人能在这个阶段待上十年八年,直到获得突破,进入第 4 阶段;还有的人,虽然不能进入第 4 阶段,也会想留在技术岗位上维持优势轻松赚钱,然后寄情别处,发展其他兴趣爱好,谋求和谐平衡的生活;另有一部分人,在这个阶段待上一两年就转型了——因为他们想有新的突破但往第 4 个阶段走又实在是比较困难。
【4】 卓越
通常你只能在大公司中看到处于第 4 个阶段的开发者。
很多小公司的技术领导者(包括首席架构师、资深架构师、CTO等),实际上多数是从第三阶段横跨出来的,利用相对优势(脑补吧)获得了职能和头衔上的提升。(汗颜,我就干过这事儿)
这个层级的朋友们,他们在做什么事情,我没有切身体会,先放这里,回头我会访谈一些朋友,弄明白。
谈收入的话,这个层级的开发者,年薪往往在 80 万以上,过百万的不在少数。除了薪酬福利,他们往往还持有股票。
6 种差异造成开发者之间的差距
我们把开发者分成了四个层次:
- 普通开发者
- 熟练开发者、高级开发工程师、技术组长
- 技术专家、架构师、一线经理
- 科学家、研究员、首席(资深)架构师、部门研发总监
在这四个层次里,有技术和管理两条常见的职业发展路径,我们这个系列文章,是研究的是技术通道,关注的是开发者如何修炼技术不断进阶,对应到开发者分层上,是这样的:
- 普通开发者
- 熟练开发者、高级开发工程师
- 技术专家、架构师
- 科学家、研究员、首席(资深)架构师
那么,从技术视角看,是什么造成了同时起步的开发者最终站在了不同的层次上呢?有六个方面:
- 知识
- 技能
- 动机
- 行动
- 习惯
- 环境
(一)知识差异
前端小白可能不知道在网页上显示一个图片用什么组件、什么标签,而熟练的前端开发者一定知道,并且能噼啪几下敲出来。
这是知识储备的差距。
知识和信息是你分析问题时的大变量,当你的知识储备量很小时,你往往是两眼一抹黑,不知道从何说起。
所以,知识差距,是不同层次的开发者之间最显著的差距。
(二)技能差异
一个普通的前端开发者,刚刚入门,会用 HTML 、 JavaScript 、 CSS 等完成静态页面,现在有一个新的项目启动,你让他负责这个项目前端模块的架构和设计,他大概率做不出来。
因为他还不具备胜任这类工作的架构能力、设计能力以及抽象能力,缺乏相应的技能。当你没有相关技能时,就不具备搞定复杂问题的基础条件。
不同层次的开发者之间,在技能层面存在显著差异,层级高的人拥有一个“工具房”,而层级低的开发者,手里往往只有一把螺丝刀。
(三)动机差异
如果你留意观察身边的同事,就会发现:
- 有的人积极主动,什么都愿意做,做什么都津津有味,都能快速学习、迅速行动并做出符合预期的结果
- 有的人你每次安排任务给他,就算是他可以搞定的,他也推三阻四,不情不愿
这就是动机差距。
当你一个人知道如何去做,但是却选择不做一件事时,往往是缺乏做这件事的动机:当你不想做一件事时,总是能够找到千万个理由来拒绝。
通常某个开发者不愿意做某件事,是因为:
- 他没有真正认同团队的目标
- 他觉得团队的目标没什么意义
- 焦虑或担忧,觉得这事儿做起来有难度,或者做了也不指定有好结果
- 心烦意乱,比如最近丈母娘催买房催得厉害
- 单纯的不想努力,就是要在这里混着
- ……
不管哪种原因,你不做一件事,就少一次磨练和收获的机会,久而久之,别人在行动中成长起来了,你还在原地踏步。
(四)行动差异
两个人都在不断做事,结果仍然可能不同:有的人三年精通某个技术栈,成为团队内的核心骨干;而有人的,做开发五年还只能写写静态页面。
你是遵循一定的方法和流程来开发,比如先完成设计、编写测试代码、再编码、跑单元测试,还是拿到需求就立马开始编码、边写边发现代码不符合需求不断推倒重来……
你是每次都给自己设定目标,希望这次任务用到的知识和技术点不同于上次,希望这次的代码设计和上次不同,还是根本不管这些,先写,能 Run ,完成任务交差……
你是每次项目(或版本)结束都回顾、反思、更新自己的知识图谱,还是项目一发布就完事大吉打游戏刷新闻?
这都些做事方法上的差异,会:
- 让同一件事有不同的结果
- 让做同样事情的人有不同的收获
一个团队在 Web 音视频会议项目中用到了 WebRTC,有的开发者会给自己定一个学习目标,排一个计划,逐步去了解 RTP/RTCP 、 ffmpeg 、 NetEQ 、 OpenH264 、 STUN 、 TURN 、 ICE 、 VP8 、 VP9 ……,通过持续的学习和时间,让自己对 WebRTC 有更深入的了解。
这就是持续行动:不以项目结束为结束,而是持续地去研究开发中用到的技术框架,丰富自己在该技术的知识结构。
这样的行为,会让你的知识体系像滚雪球一样越滚越大,会让你和别人的知识差距越来越大,会给你带来越来越多的优势。
知识、技能上的差距,是由行动上的差距导致的。
(五)习惯差异
有的开发者每天早上都琢磨下今天要做的事情,每天晚上都回顾下今天完成了什么事情、什么事情没完成、什么事情还没开始做,早计划晚回顾;有的开发者每天到了单位,开机,刷新闻,来两把游戏,然后喝茶,找人聊天,下班了吃个饭,打两局游戏……
有的开发者,每周都回顾总结,写周报,发给直属上司;有的开发者,经理强调一百遍“每周五要发周报”也充耳不闻……
有的开发者,遇见测试提 Bug ,就高叫“不可能”;有的开发者,则会说“我看看”……
有的开发者,遇见困难的问题或者难搞的醒目,会说“让我试试”;有的开发者遇见难题,两手一摊,“这太难了,我搞不定”……
在做项目时,有的开发者会把自己手上的任务按重要性、优先级排序,先做优先级高的、难度大的;有的开发者会每次都挑难度低的事情先做……
积行成习,积习成性,积性成命。
好的习惯,大概率产生好的结果;不良习惯,大概率导致不如意的结果。
你的将来,由你的习惯决定。所以,请看看自己身上,有哪些习惯会让自己积累越来越多的能力,巩固它们;有哪些习惯会让自己越来越 low ,弱化它们,扬弃它们。
(六)环境差异
开发者 D :“我想用 Vue.js 来做这个项目。”
经理 M :“引入新技术风险太大,出了问题你负责?先用 jQuery 做出来再说。”
在这样的环境里,你很难去尝试、学习新技术。
开发者 D :“我需要一台 MAC 电脑,这样才能为 iOS 开发 App 。”
经理 M :“太贵了,先装个黑苹果试试。”
在这样的环境里,你没有足够的资源做实情。
开发者 D1 :“D2 ,我遇到了一个问题,搞了一天了,毫无头绪,你对 CEF 最熟,能帮我看看吗?”
开发者 D2 :“我忙得很,你再搞搞。”
D1 接着找 D3 :“D3 ,我遇到了一个问题,搞了一天了,毫无头绪,想和你讨论下思路。”
D3 :“哎呀你那块我不懂,你去找 D2 问问。”
D1 接着找经理 M :“经理,我遇到了一个问题——”
M :“自己搞定!”
在这样的环境里,没有人愿意支持你,没有人愿意和你讨论技术问题,你貌似在一个团队里,却只能孤军奋战。
开发者 D :“经理,这个问题,实在搞不定,咱们公司还有谁熟悉这块?”
经理:“我们一共四个开发,你看看谁熟悉?”
在这样的环境,没有牛人指点你。
还记得我在“如何做到选择大于努力”一文中对比曾宪杰和我的履历吗?我们在 2007 ~ 2014 年所处的城市、行业、公司、团队这些大环境的差异,决定了我们后来的职场高度。
环境会在某种程度上塑造人,你会成为你身边人的平均数。你在一个技术氛围浓厚、优秀开发者众多的团队里,就有大概率更快地成长。
环境是可以选择的:你不幸进了处于衰退期的行业,可以转身去朝阳行业;你进了无所事事的、靠关系拿订单的传统软件企业,可以考虑去互联网领域的快节奏单位;你所在的项目组没什么技术氛围,你可以离开,找一个崇尚技术的团队……
怎么选择环境?我们下回再说。