成为高手

用户画像

相信在学校的很多科班准程序员都会对该领域的高手有所憧憬和自己的定义,限于资历和能力的认知局限,大体有类似以下的定义:

  • 开发速度快;
  • 快速的解决bug的能力;
  • 各方面的问题都能解决,前后端,跨语言的能手;
  • 对新潮的技术熟练,玩转各种技巧;

以上便是大学时期的我在实验室的直观印象,很多人都有类似的看法,但都会觉得这种所谓”大神”,基本是别人,或许我们看到有这样的人,但是我们很少会主动思考如何一步步达到这样的能力层次,当自己慢慢能实现和解决一些貌似复杂的功能需求和bug的时候也会自喜;随着自己工作经历的丰富,看到了业界一些高手,慢慢会有自己的思考和沉淀,也会对程序员的练级进阶有了具体的步骤规划和实现,也许你慢慢会成为一个被同事倚赖的角色,只是内心愈加淡定,对自己的定位仍是一个在持续成长的程序员而已,笔者对”高手”的定义如下:

  • 扎实的编码功力,而不仅仅是外在招式;
  • 优秀的快速学习能力,语言和技术平台的更替皆能灵活快速切换;
  • 优秀的定位和解决问题的能力,是团队的问题终结者;
  • 开发质量高效可靠,是靠谱的负责人,对软件的可靠性负责,有架构意识,较好的预判需求变化和架构演进的意识;
  • 对技术有自己的独到见解,对业内知名技术框架有源码级别的本质理解,并能承担框架设计;
  • 在某行业有自己数年以上的沉淀并有志成为专家;
  • 良好的分享和指导初中级工程师的能力,"学习的最高境界是去教别人"
  • 享受解决问题和编码带来的愉悦,手艺人心态("无他,唯手熟尔");
  • 技术之外的其他素质:责任心,主导和推进项目的能力;

读者可能会觉得我的定义确实有点高,特别是中小创业公司的程序员来说,快速的需求迭代已足以令人乏力,何况是所谓的业务之外的技术精进和手艺人的心态呢?之所以这样定义是因为笔者觉得高手应该是一个持续追求自我进步和提升的状态,而不应该仅仅是一个标的,比如月薪几何,可能在持续进步的过程中有一些外部的阶段性反馈如对一些高阶领域的知识的明确掌握和成功晋级业界认可度高的技术基本如某厂P6,但我们还是要有空杯的心态来持续成长;很欣赏扔物线的一句话”我不和你比高低,我只和自己比成长”,到了一定阶段,成为高工之后,独挡一面成为负责人后,更加要有这方面的意识,进步和提升不管是体现在业务优化上还是自身能力都比固步自封来的更有意义;

如何成为高手

前文讲的是高手应该具备的能力素质,心态意识等,那么更重要和更具现实知道意义的问题来了,如何成为高手呢?

德雷福斯模型

先引入一个《程序员的思维修炼》中的能力定义模型—德雷福斯模型,在刚入行时,我们都是一个新人,如何成长成为一个领域内的专家呢(一万小时定理其实不太具体),该模型结合程序员的技术发展路线,依次定义了新手高级新手胜任者精通者专家5个阶段,不同阶段具备不同的能力和表现,给技术考察提供了相对清晰的参考,同事对从业者也是明确的努力方向,笔者对这不同的几个阶段的理解是:

  • 新手阶段,在校科班的我们都是从这个阶段进入,不能独立解决问题,遇到问题需要外部的帮助(甚至是手把手),区别在于悟性和基础不同的同学在该阶段待的时间差异;
  • 高级新手阶段,新手慢慢成长,随着踩坑经验丰富,学习能力提高,能慢慢独立解决一些逐渐复杂的问题,但对问题还是缺乏全局和本质的认知,但这个阶段的同学承担一般的模块开发不会有多大的问题,也需要老手的帮助(更多是思路上的点拨);
  • 胜任者阶段,在业务开发基本可以保证快速高效,独立解决问题能力强,也有较好的快速学习和迁移能力,并能给前面两个阶段的同学很好的帮助和指导,但是在更细致精深的领域还是有提升空间,而这个阶段的他更需要深耕某技术领域,开始更多注意到性能优化,软件架构和设计模式,所遇局限已不是所谓的实现层次而是思想上的稚嫩和架构意识的初步培养,关注技术和代码后的思想和意图取舍;
  • 精通者阶段,能否到这个阶段应该是大多数程序员的分水岭,悲观的是很多公司需要的是大量的胜任者就足够,如果没有大平台的机遇推进自己,这个时候更需要自觉的学习,到了这阶段技术主张并无对错,只有是否合适,自己的思想或者观点了,需要深耕开发之道,要么在业务领域是牛人,要么在业务相对无关的技术领域如中间件等是精通者,更多是在思考一些平台性的技术难题和通用的技术方案,如果在职业生涯的早期能拿进入一些平台技术架构组,起点足够高,遇到的问题更有普适性和高价值,随之可能会有较好的方案产出,比如框架(开发脚手架),基础组件库,SDK中间件等输出,这些的可测量和可放大性也可观;
  • 专家阶段,这个阶段需要更多的对业内技术的前瞻思考,更多的依靠方法论和心法解决问题,在业内知名,更多表现在于”手中无剑心中有剑”的境界;

进阶练级攻略

结合前述的能力模型,或许读者对自身的定位和要成长的下一阶段有更清晰的理解,结合笔者的自身经验,基础不错的应届生在1-2.5年都能成为不错的胜任者,姑且对标P6吧,一些知名互联网大厂对程序员的能力职级都会有清晰的定义和划分,比如校招的P5起,而中小公司则相对模糊和粗粒度,更多倾向于一专多能,多端开发的能手(高级or资深),对于成长的路线和攻略,笔者的经验和理解如下:

  • 在校便参与企业项目的开发,做1-3个开始便开始能悟到开发的共性问题,有复用意识,需求开发和bug处理基本不成问题;
  • 毕业可以找一个大厂或者某技术方向契合自身兴趣的知名公司,见识技术世面,直接面对更高复杂度的产品,逐步培养技术视野,软件嗅觉与架构意识(不强求,这阶段更多还是要着眼于开发效能);
  • 成长快速的同学2年的年限经历和思考的足够已经足够成为准P6或者小高级了,在中小公司也能在技术上独当一面,三年是一个分水岭,这个阶段除了要更加注重一些高阶的技术部分也要开始关注技术赋能驱动业务,带来的业务放大,关注业务领域的部分也是因为自身角色定位的提升和转变带来;

以上都基于一个假设:该同学科班四年至少在开发上没落下(代码量和工程开发不错),学习和思考能力不错(悟性还行),入职的公司还行,不会久待舒适区的假设,此时的你能力和潜力都足,基本是个不错的候选人了;不过相当一部分的程序员可能因为惯性或者其他原因落下了自我的追求,数年过去,尽管能力也有提升(外力驱使),但更多的是年龄的虚长和看似薪资的提升,所以我们更多的是要把技术,兴趣和业务结合,较好的自我驱动,使自己变得更优秀一些;

说到这里,其实笔者也是一直在朝着这个方向努力,也会反思自己的不足,成为高手何其难,但只有这个过程的一些艰难才会使我们成长历练,否则所谓的工作年限着实意义不大。