在白板上写代码是有难度的
我最近收到一封来自印度读者的邮件,让我就技术面试谈下看法。关于这个话题,本文再现了我在 2004 年写的一篇文章。(注意,这是我在参与到 C# 团队之前写的,因此充满了 C++ 的感觉)
下次在 FAIC,我将就同样话题转载另一篇文章。
我偶尔为我的团队和其它 Visual Studio 团队的开发岗位面试应聘人员。关于微软的面试情况,有太多的人写了太多的文章,因此我不再赘述。我今天想提的是,给面试开发岗位的应聘人员提供一些建议。这肯定不是完整的——我想重点谈谈面试的一个重要方面。
应聘开发人员:如果你看过这方面的资料,你就明白,大部分面试都涉及到在白板上写代码。一句忠告:在白板上写代码是有难度的。多加练习!
难的部分原因在于,你不具备平时写代码所拥有的智能感知、语法着色或其它工具。我理解,我会注意到的。我不介意当你想写 memset(&b, 0x00, cb)
时却写成了memset(&b, cb, 0x00)
——我也不记得这个语法。我不介意你是否忘记了半成品或犯了其它的语法错误。我不是要寻找当即能够写出语法正确的、完美代码的人;这根本不是代码练习的初衷。我在试着弄清楚你是怎样解决问题的。
你没有首先想通这个问题就开始匆忙地写代码吗?
是找到模棱两可的地方、整理清楚,还是做出一堆假设?
分解问题了吗?
处理容易的部分,把自己逼到墙角,企图使自己走出困境;还是优先解决有难度的部分?
对于你的解决方案的正确性,有自信吗?
做了什么,向你自己和我证明它是正确的?
对我而言,这很容易看出来你是有着良好的问题解决技巧、且善于组织的人,不错。留下足够空间——你或许需要深入某些代码行。一边慢慢写、写清楚,一边解释你在做什么。如果代码干净、组织良好、清晰、模糊最少、语法正确,我们两个就更容易分辨出代码是否设计良好、没有 bug。经过一些简单的测试用例——不要只是扔出某些代码说“搞定,没问题了!”
面试者表现出来的、大多数代码问题不需要任何“Aha!”式的领悟或火箭科学式的算法。没人会要求你实现一个带有 4-5 种不同的龙格-库塔法【注1】方程求解。我们将要求你实现一个哈希表或在带有“bar
”的字符串里替换每一个“foo
”的实例。Eric Carter【我当时的经理和合著者】的办公室有一本《C++编程习题与解答》,因为它是面试问题的宝典。有一场技术面试?挑选一本入门级的编程文本,随机挑选一些问题,在白板上搞定。嘿嘿,我会立即随机浏览一下。下面是从这本书不同地方摘录的一些简单问题:
实现一个函数,它能计算出字符串指针必须累加多少个字符才能指到末尾的
null
。实现一个类的小于操作符,将有理数表示为整数对儿(分子/分母)
实现一个函数,返回整数数组的最大值、最小值和平均值。
把一个“栈”的抽象类型实现为一个
template
实现一个函数,把数组以随机顺序打乱
上面随便一条都是高度经典的编程问题。在你对它们说“这个简单!”之前,请在写代码之前想想你从这些问题描述中遗漏了什么:
字符串指针:它指向哪种字符编码?7-bit ASCII chars、UTF-8、UTF-16、或某种 ANSI 编码?你打算要求应聘人员,或者你打算假设你正在为以前就有的某种操作系统编写 C 代码,它不存在包含中文字符的字符串?提示:微软为 PDP-11 机编写了非常少的 C 代码。类似地,程序员从来不必处理非罗马字符集。
小于操作符:你不得不处理了非最简分数的情形了吗,比如 2/4
?不合法的分数,比如 2/0
呢?你能够假设关于数字的大小吗?
你正在打乱数组:你注意到了黑客是否能够预测其次序?我们需要加密长度的随机性,或者可重现的伪随机?这是用于涉及金钱的在线扑克游戏、还是一种算法的测试用例?等等。
如果不把这些问题搞清楚,就无法很好地设计,也就无法愉悦地编写生产环境的高质量代码。
应聘人员经常在关注代码上犯错误,就像代码本身凭空存在一样。这是非常不现实的臆测!代码不但要组织精良和正确,而且还要可维护、可测试、且解决一个真正的客户问题。当你去面试时,在写代码的时候,要考虑:
测试人员将怎样攻击它?这份设计是可测试的吗?
对于友好的/糟糕的调用器将来抛出的东东,能做处理吗?空指针、大分母、大数组?
和其它技术能协同工作吗?它使用了 COM 或 ALT 的规范了吗、或与之相斥?
它是正确的、健壮的、可维护的、可调试的、可移植的、可扩展的?
你是怎么知道,这是客户想不想要的代码?
这不是说,当听到“字符串”就不自觉地想到 char *
的人应该被排除在外。但是,如果你知道 BSTR 的存在,我就更加确信你简历上写的“精通 COM 编程”!还有,我明白,刚走出校门的应聘人员经常在这种“真实世界”的考虑上欠缺经验;我将放宽这部分要求,以关注他们天生的智力、代码天赋和长期潜力。
最后,让我重申,技术面试是很难的,甚至聪明人有时候也会搞错。在我面试全职工作时,两个团队没有雇佣我!不过这是另一个故事了。
注1:数值分析中,龙格-库塔法(Runge-Kutta)是用于非线性常微分方程的解的重要的一类隐式或显式迭代法。这些技术由数学家卡尔·龙格和马丁·威尔海姆·库塔于1900年左右发明。http://zh.wikipedia.org/wiki/%E9%BE%99%E6%A0%BC%EF%BC%8D%E5%BA%93%E5%A1%94%E6%B3%95
原文地址(original source):http://ericlippert.com/2015/06/01/writing-code-on-whiteboards-is-hard/
作者(author):https://twitter.com/ericlippert
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:viviworld 来源: 腊八粥
- 标签: 白板 面试、考察
- 发布时间:2015-06-04 10:23:39
- [45] 如何拿下简短的域名
- [45] IOS安全–浅谈关于IOS加固的几种方法
- [44] 图书馆的世界纪录
- [44] Oracle MTS模式下 进程地址与会话信
- [42] android 开发入门
- [41] 界面设计速成
- [41] 【社会化设计】自我(self)部分――欢迎区
- [39] 读书笔记-壹百度:百度十年千倍的29条法则
- [38] 视觉调整-设计师 vs. 逻辑
- [34] 程序员技术练级攻略