上个星期跟同事一起讨论什么是有经验的工程师的问题,使我我觉得很多人对“有经验”的定义有很大的偏差。因此我想分享我对这个问题的看法。首先看一下经验的定义。
第一种定义,工作时间越长越有经验。经常有人会问我这样的问题,“我们需要找一个有五年左右工作经验的.Net工程师,我们应该考什么样的题目”,猎头经常会问我:“你们需要的大约有多少年经验的工程师”。一般人会把经验值与工作年限画一个等号。其实这两者之间有一定的联系,但两者之间没有一个公式,更谈不上一种线性关系(工作时间越长,越有经验)。Bob大叔有一篇文章叫”Multi-Dimension Seniority“,分析了其中的道理。参见下图:
第二种定义,知识或技能越多越有经验。很多人热衷于研究很多新的技术,技巧,新的工具,热衷于考各种证书(曾经见过一个简历,这个Candidate在一年之内拿到了PMP, OCP, MCTS, IBM Certified Solution Designer, Microsoft Certified Business Management Solutions Specialist )。可是这只能证明这些人了解过这方面的东西,并不代表这些人能够熟练的使用这些技术技巧解决问题。一个看过了《七天学会Pascal》的人,掌握了Pascal的基本知识,但是这并不意味着他能够写出好的Pascal程序。有很多的知识和技能(Knowledge & Skill)当然不是坏事,但是这不等同于有能力。一个工程师即使了解很多新的技术,也不代表他能写出好的代码。如果一个工程师能优雅地设计出软件系统。写出整洁的代码(Clean Code),能够设计出巧妙的架构,这代表的就是能力(Competence)。知识和技能只能算是能力的一个必要条件。历史上有一个著名的例子,“纸上谈兵”。赵括熟读了很多兵书,应该说很有知识,而能力却很差,结果葬送了四十万大军和整个赵国。
那什么样的能力对工程师来说最重要呢?我认为有两种
- 首先是抽象(Abstraction)能力,对于任何的问题都能通过分析系统的表现,抽象出它的本质,然后使用相应的模式去解决。设计软件架构,说白了就是一个关于抽象的问题,设计架构其实就是要决定哪些地方需要预留扩展,因此需要抽象;哪些地方比较雷同,需要抽象出共同的模式。
- 其次是做权衡(Tradeoff)的能力,设计没有好坏,也没有绝对,并不使用最新的、最酷的技术就是最好的设计。大系统的设计都是受各种因素制约的(用英语说就是It depends),真正有经验的工程师能够根据各种项目因素做出合适的选择。