社区编辑申请
注册/登录
面试时,为什么写代码不如读代码? 译文
开发
所有编程工作都更需要代码阅读,而不是编写代码。

编译 | 文昭

在招聘开发人员时,我们需要考核多轮面试来确保候选人的能力合格。在众多的能力之中,我认为,原始编码能力,几乎可以说是最重要的品质。我可以很快地训练一个人掌握某个领域的知识,但即便再广泛深入实践的训练,也很难弥补缺乏原始编码能力的短板。

那么如何在面试中,较快测试出候选者的原始编码能力呢?我发现传统的 coding 办法并不好用,反而某些别的方式更能发掘到人才。

传统方法的弊端

典型的 Coding 笔试是这样开始的:“编写一个函数,反转字符串中单词的字母顺序。”然后在接下来的半小时或更长的时间里,候选人在白板上划掉一些东西(或者也可以是共享的线上文档)。

这种方法看起来能筛掉不少人,但其实作用很“弱”,根本达不到测试能力的要求。

首先,同样的问题也会被传来传去,考生通常会非常努力地练习记忆答案。你是在考核他们的编程技能还是记忆答案的能力?

其次,这些问题通常是“吊诡”问题,需要某种深刻的洞察力才能提出 O(log(n)) 解决方案。在面试的时间范围内,即使是最聪明的候选人,也几乎从来没有真正的洞察力。

这样,面试主动权的天平向有利于面试官的方向倾斜。谁喜欢在法官面前笨拙地编写代码,而面试官却将决定你未来几年的职业前景?

最后,在白板甚至文本文档上编写代码既不自然又缓慢。没有人在白板或记事本上“画”代码作为日常工作的一部分。大家真正做的是:在一个 IDE 中用大量的 Google 来编写代码。

我在实践中是如何做到这一点的

在实践中,我面试候选人的过程一般是这样的:

对于每一个新的面试周期,我都会创建一组预测输出的练习,这些练习一开始很容易,然后变得更难。我当前的设置从一个基本函数调用开始,然后是多级函数调用,然后是递归,然后是 side effects 。这些通常都是“假装”的功能,旨在让应聘者迅速取得成功,并为我提供面试剩余部分的一些线索。

对于更高级的问题,我会从我写的东西中提取代码。目前,我考核的“难题”,是探索对“读”操作和异步操作的同时进行的抽象能力,其他的,比如阅读一段未标记的例程,它们执行大家相当熟悉的算法,例如排序或树遍历,以及从错误输出中查找错误等。

举个具体的例子

在向应聘者提问之前,我会根据与同事校准面试题,以便对如何衡量应聘者的技能有一个现实的期望。校准这些问题也有助于我完善它们,剔除令人困惑的部分。

在面试开始时,我会提前解释:

一、我不是在考核语法知识。可以把我当成真人版的“谷歌”,我会告诉你一些函数或操作符的功能。

二、我不指望你能完成,因为没人能完成。20 分钟后我们会停下来。

三、我也不希望你得到正确的答案。如果答案是错的,我很想看到你回去调试你的想法。这对我来说和其他东西一样有价值。

面试过程如下:

  1. 我展示了一行被注释的代码,它将调用某个函数并返回一个输出。
  2. 候选者阅读代码并预测输出。
  3. 我取消对这行的注释并运行程序,这样他们就可以看到答案了。
  4. 如果答案与他们的预测不同,他们会回去解释原因。

我会给候选人 20 分钟的时间,让他们尽可能地去运行更多的代码。这给了我额外的时间去问后续问题。在面试报告中,我写下他们运行了多少行代码,以及他们表现出的优势和劣势。

显然,这些编码技巧并不是面试中唯一需要考查的东西。领域知识和文化契合度很重要,但我发现,阅读代码能很好地剔除那些不具备最重要的基础能力的应聘者。

面试者如何提升技能

每年都有大量的开发者前来应聘,他们可能想知道如何提升自己的技能,以便在这样的面试中表现出色。我的答案很简单:多动手写代码,因为常规的练习是无法替代的。

如何练习?最简单的方法是启动一些你感兴趣的、非琐碎的次要项目。一个游戏,一个网站,一个应用程序等等。每周花 4-8 个小时研习这些代码,让它成为你喜欢使用的东西,并能引以为荣。此外,这样也方便应聘者将来的面试呈现,比如将源代码放在 github上,以便未来的雇主可以看到候选人平时的功底积累和工作方式。

希望这能有所帮助。

面试应当结合实际

事实上,所有编程工作都更需要代码阅读,而不是编写代码。能够清晰地思考,并辨别出别人的胡说八道是至关重要的。

通过让某人反转字符串或排序数组来面试他们,简直是在考核错误的能力。我不在乎你以前是否见过这个问题,是否像许多算法测试一样记住了答案——唯一重要的是你能否思考、理解问题、设计和实施解决方案。能够阅读真实世界的代码并说出它的优点和缺点,这比粉碎一个冒泡式的练习更能说明你的能力。

基于浏览器的编码环境使情况变得更糟。在工作中,开发者所习惯的编辑器使用自动完成的建议、脚本、宏、代码片段等进行调整。而在代码考试中,却经常使用 CoderPad 之类的东西,它不具备上述调整功能,而且不时会造成浏览器窗口关闭或其他情况,浪费更多的时间。

后记    

开发者参与面试时,往往会被要求手写一段代码,这种做法在网络上一直持有反对的声音:“考察的背题能力”、“代码写得好,不代表能当面写算法”等等。通过文中“阅读一段代码,要求候选人预测输出”的面试过程,不失为一种有效的初步技术筛选手段,能节省淘汰不适合者的时间成本。 输入代码是工作中最不重要的部分。阅读、理解和解决问题才是工作中更被重要的能力。毕竟如果让面试者参加40-60 分钟的编码挑战,你实际上只是在选择速度最快的打字员。

从这种角度上看,面试时,阅读代码比手写代码更重要!

责任编辑:薛彦泽
相关推荐

2022-04-11 11:38:44

Python代码游戏

2022-04-15 14:31:02

鸿蒙操作系统

2022-05-03 22:25:57

Python浏览器语言

2022-05-24 12:42:24

物联网

2022-05-11 15:08:52

驱动开发系统移植

2022-05-17 16:56:33

开发工具前端

2022-04-07 15:28:16

HarmonyOS鸿蒙操作系统

2022-05-24 07:51:05

测试模型测试单元测试

2022-04-19 11:23:26

release3.1子系统鸿蒙

2022-04-15 09:23:29

Kubernetes面试题

2022-05-07 10:09:01

开发Java日志

2022-04-01 15:18:04

HarmonyHDF 驱动鸿蒙

2022-05-16 08:33:54

漏洞微软安全补丁

2022-04-18 09:16:47

层次聚类Python代码

2022-05-07 07:26:05

PyScriptHTMLPython 代码

2022-03-18 07:44:59

插件VSCode代码

2022-05-02 16:27:01

JavaScriptHTMLPython

2022-04-15 06:19:30

低代码无代码代码安全

2022-03-31 07:52:01

Java多线程并发

2022-04-01 12:38:32

cookie代码面试

同话题下的热门内容

让程序员心动的11种新编程语言为什么说Python是数据科学领域的最佳语言?软件开发生命周期(SDLC)完全指南风口上的低代码,技术人需要考虑哪些?如何将Windows 11 Sandbox用作虚拟机?2022 年 SaaS 安全调查7 大焦点2022年远程办公需要的8个工具Flutter vs ReactJS:2022年应该选哪个?

编辑推荐

初学者最容易学的六种编程语言五大自动化测试的Python框架2018年最流行的十大编程语言,其中包括你用的语言吗?2018年7款最佳免费数据分析工具Safari不是唯一选择:8款优秀iPhone Web浏览器应用!
我收藏的内容
点赞
收藏

51CTO技术栈公众号