用维度概念来定义初级、中级、高级程序员
网络上众说纷纭,大都站立在对某一技术的知识掌握量上来界定,或者有些人说着说着,发现无法自圆其说,然后就说这三种人就是一种叫法,你觉得你是高级你就高级了,从概念上讲,这三者之间必然有质的区别,单纯以量是无法划分的,为此,我来定义这三个边界。
初级程序员(一维知识积累)
我以PHP的知识树来举例,这个知识树在其他语言也是通用的,按照这个知识树掌握完,则对一门语言就可以熟练使用,一个初级程序员要对一种语言达到全面掌握,不求深度,但求广度,用刀的人只需要把刀法练到极致,不必说需要去学怎么打铁,以及用什么铁质打得刀更硬,所以很多人硬要让新人去研究底层实现,看源码,都不是解决初级程序员的问题。
1. 一门知识的全貌,要通学三遍,将该门知识的任何一个细微的知识点都搞清楚,搞明白,记得清清楚楚,有案例,有对应,有实现,弄得明明白白,能随手写出来,背出来,才是对这门知识的一种切实掌握,这种牢固的基础,将在后期耍刀时,能耍的刚劲有力,垒墙垒得健壮;
2. 对于该门知识的相关配套,能干什么,做什么,都清清楚楚。一门语言就是一种粘合剂,负责将各种功能的东西粘合在一起。
中级程序员(二维知识组合应用)
针对每一种学习到的基础知识的组合应用,这是维度层面的上升,A+B+C 会组合出来各种灵活巧妙的解决方案,大量的组合并非赤裸裸单个出现,往往会结合大量的应用场景,所以一般中级程序员就是在公司内,经过常年累月的历练,积累了大量可操作性的方式,这些方式的集中体现就是工作经验。
1. 一种知识出现的必要性,要能有实际场景进行对应,如果一种知识对你来说可有可无,你没找到它的必然性或者替代品,那么这就是中级程序员需要关心的问题,如果你轻易的忽略了,久而久之,只会继续停留在初级程序员的知识积累过程,不能提升到组合式解决问题的能力上,也就只会垒砖,垒出来的墙还是经不起风吹的,新需求来了拆了重搞,下次再到一个新公司,再从零开发一套代码。
2. 中级程序员不可能在自己的公司中得到充足的经验,组合应用场景太多,太杂,而公司的工作单一重复,今天你写了一个函数,明天再写一个函数,这种重复工作不能助长你的能力,只是在消耗你的时间,就如你每天吃饭一样,并不会形成新的突破点。所以要通过大量的借鉴其他项目,其他教程,其他人的代码来提升自己对不同技术的组合能力 。
高级程序员(三维现实建模)
高级程序员,我也想了很久,如何给人一种高级程序员的感觉?后来还是从维度上继续突破,中级程序员经过大量的经验积累,不但对一门知识的基础掌握比较深,此外,对于知识的组合应用,以及场景应用也比较有经验,在处理常规工作和现有业务上都能得心应手,那么他还缺什么呢?
把现实写成代码。
一个中级程序员会模仿,模仿的好,已是佼佼者了,而在模仿的基础上能实现将现实中逻辑变成紧密连接的代码逻辑?这就是到了中级和高级的临界点了。
很多情况下,如果将一个业务高度浓缩之后,变成一套可协同运作的代码体系,这就不是一个熟练工能解决的问题,很多人称这个人为架构师,但是架构师只是技术的一种职业称谓,往往架构师也只不过是中级程序员的学了很多现有的架构知识,考虑性能,考虑存储等等,而拼凑的一套已成熟的技术架构体系,这种体系往往是死的。
举个例子,在2020年疫情刚爆发期间,公司就立马想到了社区团购的业务体系,该体系与传统电商和外卖不太像,但又有继承关系,下单过程也不相同,下单之后的任务分发也不同,采购的,分拣的,送货的,处理订单的,结算货款的,仓储管控的等等都需要实时获取自己需要的数据来进一步判断自己需要做的事情,这个体系当时是不存在的,如何将整个复杂的体系代码化,将公众号客服下单,客服体系,维护订单,自动退款,超时退款,退款审核,客服交接,推广人员佣金结算等各种环节都打通在一起,就需要一颗大脑在多线模拟,单线调度中运转,相当于这个人就是一台总控中的电脑。把整个过程归纳为一套Saas系统来处理,这种能力就是高级程序员,这个过程比传统的纯技术架构师更进一步,因为在还没有考虑性能的前提下,就要把现实形成代码,进而再思考负载均衡,服务拆分等。
另外一个例子就是微服务。
微服务架构可以想想成一个人进入政府办公大楼,从进门登记,鉴权,然后分配科室,科室间帮你处理任务,实现并发并行处理你的任务等各种环节,都与微服务完全类似,如果你想通了现实中可能遇到的问题,那么微服务中也会有同样的问题等待解决,借用这种归纳能力,你可以在不学习微服务具体知识的情况,就预测到一些问题的发生,比如一旦最终的结果是错的,那么到底是那个科室审核没有通过,导致了整个结果出错呢?或者你一旦等了2个小时之后,还没有结果,你要怎么追溯这个任务状态呢?如何找到具体的科室,让其发起重试?
对于软硬件的结合例子。
一颗炸弹无论软件方面做得多花哨,最终炸弹能扎的根本在于火线的电压增加,造成熔断,产生火花,火花引起火药爆炸。复杂点,就是有多个线路可以引发火药爆炸,让你找起来很崩溃,短时间内无法找全所有的点火开关。所以软件体系操控硬件,只需要搞清楚硬件和软件之间的通信机制即可,熟练掌握硬件的指令和通信机制,软件能发送信息过去,硬件跟着做,理论上就能实现复杂的机器运动,至于机器的运行速度的微调,就是考验算法的正负反馈的灵敏性问题了。在此基础上,一个程序员实现智能家装,只不过就是借助一些传感器控制电源开关,通过操作遥控器,或者在同一wifi下,调用硬件暴露的服务端口,按照协议发送指令就实现了所有的硬件系统的通信交互和连结。能想到这种程度,都不是中级程序员能达到的,因为全部过程都是高度归纳性的,对现实世界的理解与认识。
高级程序员,就不是对同类知识的组合了,而是对跨类知识的学习和补充,不再局限于某一门知识,而在于多门知识连结上多实践多思考。从现实入手,再进行代码层面的对应,实现对现实到代码层面的归纳。在更高维度上形成新产物,这就是高级程序员。
以上是以知识维度作为划分分界线,如果按照人数占比来说,你掌握的知识超过整体程序员80%的知识量,你也能成为高级程序员,这是一种相对性叫法,也比较简单,本来社会也是以资源稀有性作为划分标准,你变成了少数人,则就自带了稀有属性,稀有就是高级。