IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

在白板上写代码是有难度的

腊八粥 2015-06-04 10:23:39 累计浏览 1,751 次
本机暂存

我最近收到一封来自印度读者的邮件,让我就技术面试谈下看法。关于这个话题,本文再现了我在 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. 对基本有序的序列排序算法 (2026-06-11 17:46:49)
  2. Four Levels Of Customer Understanding (2026-05-22 21:00:00)
  3. 除法的意义 (2026-04-12 20:52:17)

查看更多 算法 文章 →

建议继续学习

  1. 红黑树并没有我们想象的那么难(上) (累计阅读 21,493)
  2. 哪本书是对程序员最有影响、每个程序员都该阅读的书? (累计阅读 15,111)
  3. 为什么算法这么难? (累计阅读 12,393)
  4. 浅谈MySQL索引背后的数据结构及算法 (累计阅读 11,896)
  5. 加州求职记 (累计阅读 11,560)
  6. 海量数据面试题举例 (累计阅读 11,111)
  7. 基于Redis构建系统的经验和教训 (累计阅读 10,518)
  8. 在西方的程序员眼里,东方的程序员是什么样的? (累计阅读 9,915)
  9. 谷歌(Google)2011年校园招聘笔试题 (累计阅读 9,571)
  10. 浅谈redis数据库的键值设计 (累计阅读 9,352)