从华为技术岗面试改革说开去,程序员的实力究竟应该被什么标准所定义?是技术上的深度与广度,还是大型项目的实战经验,还是对架构、趋势的把握程度?亦或是熟练的手写代码能力?
程序员面试,一个玄学问题
程序员的面试问题一直是个玄学。有的公司认为应该考量应聘者的技术深度与视野,有的公司则认为起码的白板手写代码是基本要求。而在面试者们看来,都是拧螺丝的 Crud Boy,你让我瞎造什么核弹。
前不久,华为宣布面试改革,将增加编程环节,充分考察程序员实际动手编程能力。改革中有几个要点:1.应聘人员要先在网上进行 90 分钟的网上编程,符合要求之后才能进入到面试环节;2.应聘人员须选择一种编程语言进行两轮面试,每轮约 45 分钟,30 分钟编程、15 分钟提问讨论。面试官独立进行面试考察,并根据岗位要求设计编程考察题目,应聘者需通过当面或视频编程的方式完成题目。
对于程序员来说,把需求转化为代码实现,并写出健壮程序是最基础也是最重要的能力。华为此举优化了软件类人才的面试流程,面试更以考察软件工程能力与编码能力为核心。
事实上,对此做法表示赞同的不在少数:
作为 IT 行业的资深 HR,我表示认可;
作为一个面试无数次被拒的程序员,我表示认可;
实际操作能力是得考察一下;
不编程怎么招聘程序猿?二十多年前我自己应聘,后来我负责招聘,都是要上机写程序的。
但是也有一些不同的声音,认为这样的考核标准太过严厉:
不说别的,就把华为最牛逼的人,最优秀的人拉出来,看看他徒手能写几行,用相同的方式去把华为程序员过一遍,估计 80%需要淘汰,大家同一个圈子,何必为难同胞。
这样的抱怨,也经常发生在一些“功成名就”的优秀老程序员身上:
“我现在接近 40 岁了。去年 12 月,我离开了我的创业公司,不再担任该公司的 CTO 职位。自那之后,我至少经历了 10 次失败的面试,这些面试都有编程测试环节。我有近 20 年的开发经验,包括早期电子工程开发和完整的分布式 Web 应用程序开发等。我创建的软件可以在全球大批量的专业生产工厂中实现完整的产品追溯。然而现在,我甚至找不到一个开发的职位,因为我通不过这些编程测试。”
同样的事情在大龄程序员不那么受“歧视”的国外也依旧存在。一位具有 10 年工作经验的计算机专业博士,不停地用网上题库进行练习,想加快编程速度。在此之前,他屡次被一些 IT 巨头公司拒绝。
这样的面试要求,不仅会淘汰很多不合格的软件人员,也为很多高级开发工程师敲响了警钟。如果想进大厂,面对这样的面试要求,你慌不慌?
对于面试现场编程,BAT 未必赞同华为做法
现场编程是最能直观体现程序员编程水平的一种方式,也是程序员证明自己的最好方式。我们也曾在报道中看到过程序员大佬现场编程拿到高薪职位的各种版本。
比如某位程序员去京东面试前端岗位,在技术面这一轮直接用 JavaScript 写了个魔方特效,通过终面,拿到高薪;
再比如某位去腾讯面试的程序员,现场用原生 JS+canvas 开发出了一款五子棋游戏,成功拿下该岗位…
华为面试改革后增加了现场编程的环节,那么 BAT 等 IT 大厂面试是否有现场编程这个环节呢?我们分别询问了阿里、腾讯和百度的同学。
根据反馈:阿里有笔试手写代码的环节,但没有现场编程的环节;腾讯各个团队的面试不一样,有的团队需要上机写代码和编译提交;百度没有现场编程环节,甚至有的团队连手写代码的环节都不需要。
这样来看,BAT 都不做的事儿,华为为什么要做呢?
对于华为来说,以前用大规模招聘来快速补充业务发展所需的人力压力,所以他们的面试步骤也是因为这个诉求而逐步建立起来的。在面试改革的文件里,他们提到“HR 看简历面试又不深刻,导致大规模进人、大规模走人”,这样来看,编程环节可以极大简化 HR 检查和审核的过程。
看来应聘华为的程序员同学应该是数量庞大,针对大批量申请者,这样的现场编程面试虽然会漏掉个别优秀的人,但是不会影响华为招聘的节奏。
对于华为这一面试做法,如果 BAT 都持保留意见,那么中小型公司是不是就更没必要了?
我们采访了一位 30 余人技术团队的负责人,他表示:“在我们这样体量的团队中,让程序员在面试时现场编程是完全没必要的,通过笔试题目和现场问答,完全可以了解到应聘程序员的实力。”
除了动手编程,还能如何了解程序员的软硬实力?
写代码是程序员的生命力所在,无论是现场编程还是手写代码,面试官总是试图从这些代码中看出应聘者的代码水平和习惯,例如代码的可读性、可维护性如何;界面、功能的设计能力如何;思维、代码结构是否清晰等等。
但是有时候面试官的水平和眼光也决定着这种做法是否真的那么禁得起考验。
Facet 的 CEO 曾抱怨自己在 Netflix 时,不小心拒绝掉了亚马逊Prime Air的创始人。另一位从业 30 多年的业内人士看到这个消息,也感慨自己的一位同事,一位公司内排名 Top 5 的程序员,在面试其他公司时,首轮就被刷掉了。这说明不仅程序员本身拥有过硬的实力很重要,招聘者是否具备伯乐的眼光更重要。
招聘新思路——建立工作样本测试
“如何在短时间内了解程序员的软硬实力”是每个招聘者的必修课。诺贝尔奖得主 Daniel Kahneman 因其在判断和决策方面的成绩而闻名,他在早些时候接受采访时表示,面谈对于选择最佳岗位候选人来说是非常糟糕的,但遗憾的是他并没有提出替代方案。不过,著名的工程师兼评论员 Thomas Ptacek 在发表的招聘方法论的文章中提出了这样一个招聘方法——建立工作样本测试。相比于询问应聘者的工作内容,让应聘者实际操作是更好的一个方式。
工作样本测试需要具备以下特征:
尽可能地反映出应聘者在未来将要完成的实际工作;
要是标准化的,每个应聘者都要进行同样的测试;
最终生成数据和评分,而不是简单的及格或不及格。
Thomas Ptacek 曾尝试使用工作样本测试,他们在一个单文件 Sinatra 项目中构建了一个电子交易系统,接口为定制的二进制协议,同时构建了 web 接口来驱动协议。应聘者需要找出这个交易体系中的缺陷。
“这样一个小测试需要应聘者在几小时内编写出几百行代码,比其它任何面试都更有预测力”。Thomas Ptacek 表示:“相比于传统的面试方法,应聘者似乎更喜欢这样的测试。另外,在工作样本中做的评估越多,面谈中需要谈的内容就越少。”
这样的工作样本测试也适用于纯开发任务,例如面试官可以实际构建和部署一个应用程序,并从应用程序中划分出一些功能区域,删去某些功能,让应聘者重新添加。
招聘常规思路——历史项目描述及笔试题目
如何才能快速了解到程序员的软硬实力?“交流历史项目是一个很好的方式”。某位技术团队负责人表示:“我一般的面试时间是 40 分钟到 1 个小时左右。从历史项目的描述中,我可以验证他是否曾真正参与到该项目中,也能很快地了解到他之前在团队中扮演的角色、做的事情,同时还可以就该项目发散到其它技术细节。另外,这样的描述也顺带考察了应聘者的表达能力和对技术细节的关注和处理能力。”
某公司 HR 表示:“HR 面试程序员的时间大概在 25 分钟左右,来公司以后先做一套题,简单粗暴有效。笔试题目除了考察基础的技术功底之外,也会增加一些场景题,考察应聘者的应对能力。”
面试高级岗位,还需要进行技术细节笔试吗?
前几日,一篇题为《我是技术总监,你干嘛问我技术细节?》的文章在技术圈火了,文章的起源是猎头妻子向作者抱怨,“现在的客户真难伺候,招的是 VP,问的全是与细节相关的问题,最终,候选人抱怨企业小瞧了他,企业则吐槽这哥们很水。”这一话题也引发了大家对于面试高级岗位是否还需要进行技术细节笔试的讨论。
针对这一话题,我们也咨询了专业猎头,他表示:“如果你在沟通中已经获知了应聘者有非常好的编程底子,或者招聘的是高级技术总监这样级别的岗位,一般是不需要进行现场编程或笔试题目考察的。我们会通过他在行业中的影响力、之前的项目经历、对于问题的解决思路和前瞻考虑等方面来考察面试者能力。”
上善伐谋,次善伐交,下善伐城。由于国内很多科技公司尚处于发展阶段,所以类似 CTO、技术 VP 等职位可能仍需要在前线“攻城略地”。但是无论是否要冲在一线,技术管理者的工作优先级,肯定是要放在对前瞻技术的预判、对团队的管理、与业务线的协作上。如果这些事情占据他们绝大部分精力,他们是不会有时间去写代码的,很多大厂 CTO 也坦言”自己现在不写代码了“,当然这并不意味着他不会写代码。
此前我们在采访蚂蚁金服 CTO 程立(鲁肃)的时候他曾经表示:“虽然我不碰代码了,但支付宝到底有多少个系统,当用户第一次点击这个系统会呈现什么样的状态,整个过程我都非常清楚。所以如果支付宝出任何故障,我会第一时间知道哪里可能会有问题,哪个关键点会出问题。”
如果是你,工作十年之后再次求职,你还愿意和刚毕业的求职者一起,做一份动手编程题吗?
评论