网络上众说纷纭,大都站立在对某一技术的知识掌握量上来界定,或者有些人说着说着,发现无法自圆其说,然后就说这三种人就是一种叫法,你觉得你是高级你就高级了,从概念上讲,这三者之间必然有质的区别,单纯以量是无法划分的,为此,我来定义这三个边界。
初级程序员(一维知识层面)
我以PHP的知识树来举例,这个知识树在其他语言也是通用的,按照这个知识树掌握完,则对一门语言就可以熟练使用,一个初级程序员要对一种语言达到全面掌握,不求深度,但求广度,用刀的人只需要把刀法练到极致,不必说需要去学怎么打铁,以及用什么铁质打得刀更硬,所以很多人硬要让新人去研究底层实现,看源码,都不是解决初级程序员的问题。
1. 一门知识的全貌,要通学三遍,将该门知识的任何一个细微的知识点都搞清楚,搞明白,记得清清楚楚,有案例,有对应,有实现,弄得明明白白,能随手写出来,背出来,才是对这门知识的一种切实掌握,这种牢固的基础,将在后期耍刀时,能耍的刚劲有力,垒墙垒得健壮;
2. 对于该门知识的相关配套,能干什么,做什么,都清清楚楚。一门语言就是一种粘合剂,负责将各种功能的东西粘合在一起。
中级程序员(二维组合应用)
针对每一种学习到的基础知识的组合应用,这是维度层面的上升,A+B+C 会组合出来各种灵活巧妙的解决方案,大量的组合并非赤裸裸单个出现,往往会结合大量的应用场景,所以一般中级程序员就是在公司内,经过常年累月的历练,积累了大量可操作性的方式,这些方式的集中体现就是工作经验。
1. 一种知识出现的必要性,要能有实际场景进行对应,如果一种知识对你来说可有可无,你没找到它的必然性或者替代品,那么这就是中级程序员需要关心的问题,如果你轻易的忽略了,久而久之,只会继续停留在初级程序员的知识积累过程,不能提升到组合式解决问题的能力上,也就只会垒砖,垒出来的墙还是经不起风吹的,新需求来了拆了重搞,下次再到一个新公司,再从零开发一套代码。
2. 中级程序员不可能在自己的公司中得到充足的经验,组合应用场景太多,太杂,而公司的工作单一重复,今天你写了一个函数,明天再写一个函数,这种重复工作不能助长你的能力,只是在消耗你的时间,就如你每天吃饭一样,并不会形成新的突破点。所以要通过大量的借鉴其他项目,其他教程,其他人的代码来提升自己对不同技术的组合能力 。
高级程序员
高级程序员,我也想了很久,如何给人一种高级程序员的感觉?后来还是从维度上继续突破,中级程序员经过大量的经验积累,不但对一门知识的基础掌握比较深,此外,对于知识的组合应用,以及场景应用也比较有经验,在处理常规工作和现有业务上都能得心应手,那么他还缺什么呢?
会模仿,模仿的好,则是这个社会上的佼佼者了,而在模仿的基础上能实现创新性的突破的点在哪里?这就是区分中级程序员和高级程序员的临界点。
让现实写入机器。
当对知识有了深入的掌握和灵活的应用之后,就会对知识进行抽象化,抽象化之后,知识就能在更高维度与现实对应上,这样你就能很快找到两者的共同点,有了这种共同点,你就可以拿现实规律来推测技术实现,并且证明技术实现的合理性与正确性。例如微服务可以想想成一个人进入政府办公大楼,从进门登记,鉴权,然后分配科室,与科室之间协作帮你处理任务,实现并发并行处理你的任务等各种环节,都与微服务完全类似,如果你想通了现实中可能遇到的问题,那么微服务中也会有同样的问题等待解决,这就实现了创新和预知。
同样,市场上还不存在某种产品,但是你已经搞清楚通信机制和技术执行逻辑,那么将硬件结合收集数据,软件负责计算和整理,就能实现新的产物,此时物联网就应运而生。
高级程序员,就是要达到这种抽象能力,不再局限于某一门知识本身,而在于多门知识的相似性,共同性上面有了新的认识。再掌握和学习新知识时,从更高维度先从已有知识中抽象出来,再推演新知识的可能性。这种能力就是高级程序员。