面试杂谈:怎样才算“精通xx”?
招聘时,我经常收到一些非常彪悍的简历,这个也精通,那个也精通。比如下面这样的:
精通php、java、c#、mysql、python、javascript、html、css⋯⋯
这样的简历是不可能得到面试机会的,我认为这么写简历的人根本没搞明白“精通”的定义,并可以简单推导出以下结论:
- 他列出的这些技术没有一项是他“精通”的;
- 他缺乏学习能力和工作经验;
- 他写的代码结构性和可读性很差;
- 他是一个“表现型”选手,而非“进取型”选手。
然而,“精通”的定义到底是什么呢?
何谓精通?
有位同学在简历里写着“精通:……、ajax、……”,于是我问他:
问:你给我讲讲ajax跨域是怎么一回事呗。
答:ajax跨域啊,用jsonp就行,在html里加一个⋯⋯
问:不好意思打断一下,你先给我讲讲跨域问题是一个怎样的问题,导致这个问题的原因是什么?
答:跨域就是一个网站请求另一个网站的资源啊。原因嘛⋯⋯(沉默)
问:那jsonp是怎么解决跨域问题的,是什么原理?
答:记不太清楚了⋯⋯
问:除了jsonp,你还知道其他解决ajax跨域问题的方案么?
答:⋯⋯
“知其然,不知其所以然”是当下很多技术人的弊病。有问题百度一下,拿着找到各种“大神”的解决方案生搬硬套,解决了就认为自己把这个问题搞明白了,并没有深入去思考:
- 这个问题发生的原因是什么?如何重现?
- 当前这个解决方案的原理是什么?
- 还有哪些解决方案?原理分别是什么?
- 这些方案各有什么优缺点?适用于什么场合?
- 业界主流方案是哪几种?为什么?
就解决某个技术问题的能力水平来说,大致上可以分为这么几个层次:
会:至少知道一种解决方案,并能独立实施。
懂:了解问题发生的原因和解决方案的原理。
有研究:了解业内主流各种解决方案的原理及其优缺点,能在不同case下进行合理选择。
有创新:熟知业内各种现有方案的局限性和不足,并能提出自己的改良方案。
当对某个领域的绝大多数常见问题都达到了“有研究”层次后,便可称之为“精通XX”了。不过,往往在到达这个层次时,你已经充分领略了技术世界的博大精深,不敢轻言“精通”了。
如何描述自己掌握的技术/技能?
一般来说,在简历中对某项技术或技能的描述有以下几个级别:
了解:理解基本概念,有过简单的使用经验 —— “用过”
熟悉:基本操作很熟练,有过密集的使用经验 ——“用得不少”
精通:深入理解其底层原理及各种实现方式,并有丰富的项目经验——“有研究”
由于一次面试的时间有限(一般为一个小时),不可能对候选人的技术水平做到全面考察。因此面试官往往会抽样提问简历中候选人自称比较熟悉的方面、做过的业务等。如果候选人连自称最熟悉的技术水平也不行,那其他的技术点就不用再考察了。
作为WEB开发程序员,技术栈的构成一般都较复杂(后端语言、数据库、前端语言、基本运维……)。在简历中描述的能力点一定要分清主次,按照擅长的程度排序,并实事求是地标注级别,能够具体描述自己的运用程度更佳,比如:
- 精通PHP,熟练使用Yii2、Lavarel框架,了解TP、Symfony框架
- 熟悉MySQL及数据建模,了解索引优化、分库分表原理
- 熟悉AJAX、HTML、JS、CSS,了解LESS
- 能编写简单的Shell脚本
……
让面试官感到惊喜,自然要比让他感到失望好得多。简历描述一定要符合自己实际能力,如果能稍稍低于则更好。在描述技术/技能时,切忌轻言“精通”,更不要声称自己“精通”多个领域。如果没有十足的把握,建议都使用“熟悉”这个级别。
后话
不管从事什么领域,都免不了依次经历下面这几个阶段:
- 以为自己“精通”,其实才刚入门 —— “不知道自己不知道”
- 意识到自己的不足,开始勤学苦练 —— “知道自己不知道”
- 被人尊为“大神”,却不敢言“精通” —— “不知道自己知道”
- 无欲无求,随心所欲 —— “知道自己知道”
我们需要“空杯心态”;只有承认自己在无穷无尽的知识海洋面前是极其渺小的,才能使自己不断成长。
我们需要“格物致知”;只有深入分析思考并理解事物的原理,才能让自己拥有解决问题的能力。
我唯一知道的,就是我一无所知。——苏格拉底