经常在网上的论坛里看到讨论程序员的级别,尤其在跳槽类的信息里可以看到对标阿里P7,百度T6,腾讯3.1等字眼,似乎大厂的级别俨然可以成为业内的通用货币,类似于高考分数一样,哪一档就对应着什么样的待遇。
有人说现在的程序员级别也开始浮夸起来了,以前觉得从刚毕业开始算初级软件工程师,到中级软件工程师,高级软件工程师,要熬上三五年乃至更高的时间。而现在接到同行的名片,往往高级开发经理、算法专家、首席科学家等层出不穷。
我从毕业后一直在海外工作,自己的头衔从一开始的软件开发工程师到现在全栈开发工程师,并没有“级别”上的跨越。反观我在国内发展的同学,已经很多是“总”级别的人物了。细细交流之后,觉的和自己做的事情也并无不同。
我在两三年前,曾经非常重视在公司里的晋升,花了大量的时间精力去“面向升级编程”。在跳槽的时候,也会常常对比不同的职位,往往会对那些头衔“高贵”的职位另眼相看。如今反思,当年的自己其实是掉入了级别的陷阱中。
程序员的级别重要吗
程序员的级别到底重不重要?重要也不重要。
级别重要,是因为级别常常和你的待遇挂钩。国内的大厂一般有很稳定的薪资体系,什么样的级别代表着什么样的工资、股票,和钱相关对个人来说当然重要。
级别重要,是因为常常和程序员的话语权相关。即使如谷歌,Facebook这样的公司,没有能够达到高级软件工程师(Senior Software Engineer)的级别之前,也很难获得“搞事”的权利,不能为自己争取到更多的资源。能够给自己带来更多表现的机会,当然很重要。
级别不重要,是因为级别并不决定你的能力。你不是因为被称作高级软件工程师所以你的技术厉害,而是因为你的技术厉害所以有可能成为高级工程师。技术厉害的程序员评不上高级工程师,也不会影响他的技术水平。
级别不重要,是因为级别并不能限制你的输出。级别低的程序员在大公司可能只能做CRUD,但也可能在创业公司中做出千万用户的产品。级别高的程序员或许位高权重,但也有可能完全没有时间写代码。
级别是相对的稀缺性
级别更多是代表对应人才在其组织、行业中的稀缺性,并且往往只有内部纵向比较意义,一旦跨组织,其意义就很有限。
在创业公司里的CTO,很有也就是大公司的高工(高级软件工程师)出身;而默默无名的独立开发者,也有可能成为行业巨擘。
在一些新兴的领域比如最近很火的人工智能,入门的门槛很高,人才比较稀缺。一些名校的博士生可能一毕业就可以成为“高级”、“资深”AI工程师。
相对来说,比如前段计算的门槛不高,并且技术日新月异。所以前段工程师可能需要很多年的积累,才能说的上“登堂入室”。
开头说的大厂的级别似乎可以成为业内通用货币,为何是这样呢?
因为大厂的规模和业务都很庞大,一些大公司之间,由于业务上有重叠,并且经过长期的人才流动(跳槽),在市场的调节之后,互相之间的级别形成了一些对接。不但国内的大厂有这样的现象,国外的大厂之间也会有这样的情况。
而一些规模较小的公司,可能聚集了一些大厂的程序员,或者创始人本身从大厂毕业,也会倾向于从大厂去借鉴级别系统。但是正如上面所说,由于受到公司规模的限制,吸引到的人才分布不可能和大厂保持一致,其级别可信度就会比较低。
小公司的级别是否一定是有水分呢?也不竟然。这里得分公司和不同的岗位。
技术驱动型公司的核心程序员岗位,尤其需要技术过硬甚至是行业领军的人物。 在这样的公司里,可能挂着软件工程师头衔的员工都是在其他公司都是高级软件工程师以上的职务。
业务驱动型的公司,更多的会靠销售团队来推广业务,技术团队往往并不是决定公司发展的关键。在这样的公司里,往往可以看到高级程序员多是公司元老,并且主要的职责是管理,让更多的程序员更高效的为产品服务。
级别不是衡量单维度的能力
对于程序员的级别到底应该对应何种能力,有很多极左或极右的认识。
极左派认为级别越高的程序员应该写代码越厉害。那么到底什么是厉害?
厉害是算法的能力嘛?如果是这样的话那些国际编程竞赛的金牌们应该是最顶级的程序员,但显然不是。
厉害是做产品的能力嘛?Linux之父Linus一个人在1994年就写出了第一版Linux内核,然而他1998年加入全美达公司后也只远远不是最高级别的技术人员(CTO或者是VP of Engineering)
极右派认为级别越高的程序员代码能力越不重要。
他们觉得级别高的程序员只是会吹牛,或者会做PPT,把身下的程序员的功劳都揽在自己身上。
从一个角度上来说这是倒果为因,级别越高的程序员往往写代码的时间很少,而并不是他们的代码能力不行。纵观各个公司的技术高级职位,鲜有之前没有在一线技术岗位干过很长时间的。比尔盖茨、雷军这些大家耳熟能详的人物都是技术出身,并且技术能力都很强。
无论是极左派或者极右派,他们都忽视了一个事实:程序员的级别不应该只是衡量单维度的能力。
软技能和硬技能
一个人的技能可以分为硬技能(Hard Skills)和软技能(Soft Skills)。
对于程序员来说,硬技能包括并不限于算法,设计,实现,测试,架构等多个方面。高级程序员不比是写代码快,也不是比写的代码多,更不在于能写出多么“精妙”的代码。
程序员的硬技能实力应该表现在:
- 解决难的,复杂的,抽象的问题。
- 设计和实现出高效、可扩展、可维护的软件、框架、系统。
- 推动组内、组间的技术方向发展。
如果你观察一些公司里的大拿程序员,他们都或多或少的会在以上的方面展示过人的一面。做好以上的几点,可以让程序员变成一个好的“技术人”。
在硬技能方面之外,同样还有软技能,程序员的软技能包括:
- 学习能力——快速掌握自己所不擅长的领域,并结合自身实际吸收和运用。
- 沟通能力——和技术和非技术性同事之间的进行高效流畅的沟通,能够接受和传达必要的信息。
- 协调能力——分清任务轻重缓急,把握住短期目标和长期目标之间的平衡,解决人与人之间的冲突。
- ……
程序员的软技能和硬实力同样重要,有的时候甚至要大于硬实力,为什么呢?
因为往往你不是一个人在工作,一个人的输出和团队相比是很有限的。一个人的硬技能再强,也突破不了自身的物理极限(时间、身体),而现代化的企业中,需要团队的合作,才可以在短时间内完成庞大的工作。
再说Linus,他的硬技能强到可以一个人去写操作系统,但是在所在他的公司里也不能做到最高级别的技术人员,究其原因,一个是他可能没有野心不想去做,另一个重要原因是他的软技能——特别是沟通能力上有很大的缺陷。如果由他来带领团队的话,那么可能还达不到他一个人的输出能力。
但我们是否可以一味的只追求软技能的提升软技能,而不重视硬技能的发展呢?软技能不是万能的,软技能也要硬技能做为依托。 学习、沟通、协调能力都是基于你自身对需要学习、沟通、协调的对象(技术)有清晰的认识,而这些认识来自于你的硬技能储备。一个刚毕业的程序员,无论他的软技能多么逆天,没有技术上的积累,也很难胜任高端的职位。
我们可以用一个公式来总结一下:
程序员的影响力(Impact) ∝ 自身的硬技能 * 自身的软技能 + 所在团队的能力 * 自身软技能
如果理解了这个公式,那么对于第一段中各个公司的级别不对称现象就有清晰的认识,我们可以分析以下一些团队的例子:
- 高技术小团队 => 强调单兵技术作战能力 => 程序员的级别 ∝ 自身的硬技能
- 低技术小团队 => 强调单兵技术作战能力和协力其他团队的能力 ≈ 程序员的级别 ∝ 硬技能(少) * 自身的软技能
- 高技术大团队 => 需要协调高技术人才 => 程序员的级别 ∝ 自身的硬技能(多) * 自身的软技能
- 低技术大团队 => 需要充分的协调、管理能力 => 程序员的级别 ∝ 自身软技能
总结
每个人都有自己擅长的和不擅长的,能够扬长避短则事半功倍,反之盲目的追求不合适自己的高级级别,则事倍功半。看清自己的长处和短处,寻找最适合发挥自己的空间,这样升级也会顺利不少。
希望看完这篇博文,能够让大家开启思索自己的升级之道,也祝大家早日步步高升。