白板编程,编程面试中的特点
原文链接:白斑编程浅谈
选取了一些与己有关的东西
技术面试中常见的问题
- 编码:考察面试者的编码能力,一般要求面试者在 20 ~ 30 分钟之内编写一段需求明确的小程序(例:编写一个函数划分一个整形数组,把负数放在左边,零放在中间,正数放在右边);
- 设计:考察面试者的设计/表达能力,一般要求面试者在 30 分钟左右内给出一个系统的大致设计(例:设计一个类似微博的系统)
- 项目:考察面试者的设计/表达能力以及其简历的真实度(例:描述你做过的 xxx 系统中的难点,以及你是如何克服这些难点)
(已绝迹)脑筋急转弯:考察面试者的『反应/智力』(例:如果你变成蚂蚁大小然后被扔进一个搅拌机里,你将如何脱身?)- 查漏:考察面试者对某种技术的熟练度(例:Java 的基本类型有几种?)
以上,第一点几乎是面试中无法逃避的内容,而除了有上机编程的情况外,还有经常出现的情况是白板面试,在不使用熟悉的IDE或编辑器。(IDE可以智能提示,帮助编译,调试程序找出bug)
白板编程面试的目的
通过白板编程,面试官可以有效的判定出面试者属于前者还是后者,从而招进合适的人才,并把老油条或是嘴遁者排除在外。除了判定面试者的开发效率,白板编程还有助于展示面试者的编程思路,并便于面试者和面试官进行交流。
白板编程的目标并不是要求面试者一下子写出完美无缺的代码,而是:
- 让面试者在解题的过程中将他/他的思维过程和编码习惯展现在面试官面前,以便面试官判定面试者是否具备清晰的逻辑思维和良好的编程素养。
- 如果面试者陷入困境或是陷阱,面试官也可以为其提供适当的辅助,以免面试陷入无人发言的尴尬境地。
合适白板编程面试的题目
首先是不适合白板编程的题目:
- 这里边,毕业生常见的就是编程之美,july的算法博客,和leetcode。这些算是被问烂的编程题,很多面试者只求记住,不求甚解。(当然,作为被面试者,刷通leetcode也许对自己的算法能力提高很有帮助)
- 脑筋急转弯类型的题目
- 复杂库或API调用
- 直接的基本算法
适合的题目:
技术面试题目不应该太难,也不应太简单,不能是脑筋急转弯,也不能直接来自网络。
强烈注意《编程珠玑》《TAOCP》后边的练习题。
- 不止一种解法,而有最优解
- 考察点比较明确
- 可延伸
面试者该如何准备
- 拥有扎实的数据结构/算法基础
- 知道如何利用 前条件/不变式/后条件 这些工具编写正确的程序
能够在白板(或纸上)实现基本的数据结构和算法(如果 1 和 2 做到这一步是水到渠成) - 在 leetcode 或 careercup 上面进行过练习,了解常见的技术面试题目(我个人不鼓励刷题,但在面试前建立起对面试题的『感觉』非常重要)
面试中:
确定需求:输入,输出,数据范围,时间要求,空间要求,其他限制。
先写出轮廓(大纲)
白板编程没法复制粘贴,所以后期调整代码结构非常困难。因此我们最好在开头写出程序的大致结构,从而保证之后不会有大改;确定前条件/不变式/后条件
我们可以通过注释的形式给出代码的前条件/不变式/后条件使用实例数据验证自己的程序
尽管不变式足以验证程序的正确性,但适当的使用实例数据会大大增强代码的可信性使用缩写
白板编程并不需要面试者在白板上写出能够一次通过编译的代码。为了节省时间,面试者可以在和面试官沟通的基础上使用缩写。例如使用 Iter 替代 Iterable,使用 BQ 替代 BlockingQueue。(此法尤其适合于 Java –_–#)至少留一行半行宽
出于紧张或疏忽,一般面试者在白板编程时会犯下各种小错误,例如忘了某个判断条件或是漏了某条语句,空余的行宽可以帮助面试者快速修改代码,使得白板上的代码不至于一团糟。
不会做怎么办
- 至少先给出一个暴力(Brute force)解法
- 寻找合适的数据结构(例如栈/队列/树/堆/图)和算法(例如分治/回溯/动态规划/贪婪)
- 从小数据集开始尝试
- 如果还是没有头绪,重新考虑题目的前条件,思考是否漏掉了条件(或是隐含的条件)
- 如果 3 分钟过后还是没有任何思路,请求面试官提示,不要觉得不好意思——经过提示给出答案远强于没有答案