白板与编程面试:为什么不在电脑上编程更有帮助

在技术评估中的检查方法

白板编程可以检查出两方面的技能:

从一开始就可以写简洁的代码,以及

知其代码之所以然。

这两大技能对于一个出色的软件开发人员是至关重要的。通过进行白板编程,这两种技能都能被准确地检验出来。

从一开始就写简洁的代码。

不管我们是否喜欢,现代软件工程主要在于知道足够的模式,并在正确的规则中使用正确的模式。

几天甚至几周后的工作的结果,通常只是修改几百行的代码。

表面上看,原来的开发人员在写代码时需要多少协助并不重要。他们可能在写代码之前,在脑子里就已经想好所有细节了。或者也有可能他们写每一行代码的时候都查阅了API文档、实例、或者语法指导。

但是当我们深入探究的时候,就会发现这其中有很大差异。

理解概念要比理解现象更重要。

一段代码变得越复杂,仅仅依靠一些开发模式的知识去开发就会变得更难,甚至理解代码都会很艰难。

好的白板编程练习,可以检查出一个人到底是理解概念,还是通过记住大量模式来掩盖其基础知识的匮乏。

当我们问到“你最擅长哪种编程语言?”我们其实并不是想要简洁的代码。我们只是在寻找一个切入点,能深入了解一个人,看看他到底有多大能耐。

这里简单总结一下根据“候选人熟悉哪一领域”来决定“在面试中需要涉及哪些方面”:

面向对象编程——多继承,虚拟方法,对象构建与析构顺序,异常处理。

前端——异步逻辑与终止,REST API,验证用户输入。

算法与数据结构——动机,用法,平均及最差情况下的复杂度。

后端与架构——内存模型,垃圾处理机制,多线程,线程锁机制,benchmarking, profiling。

函数式编程——Lambdas,curring,排序操作,一元。

内核层次——文件系统,网络,POSIX,协议,标准的检验与分析工具。

测试——单元测试,逆向测试和端对端测试,必要测试,基于模型的测试,测试驱动的和行为驱动的开发,集成测试。

和候选人谈到上面这些的时候,最好的方法是从举一个例子开始。最好的例子就是让他们自己写一个短小简单的例子。

实际中,候选者写的大多数代码片段都是不完美的。这就提供了一个绝好的机会,看看候选者到底有多少知识。

白板编程很有用,是因为:

有限的写代码空间。

有限的写代码速度。

修改很麻烦,最好要避免。

没有补全,语法高亮和其他IDE的牛逼功能。

想明白代码到底要干嘛。

过一遍代码片段是如何运行的,这是非常好的练习。做技术面试的时候,绝对不要跳过。

如果代码写的是一个算法,有人可以写出所有步骤,有人可以考虑到特殊情况,有人可以写出不变式(invariants)并能证明。有人可以根据每个独立循环结构和递归调用解释其复杂性。

如果代码是面向对象编程,有人可以明确指出其具体功能,对象在何时如何被创建,如何被销毁,什么时候以什么样的顺序会调用构建与析构函数,以及异常出现会怎样,内存布局看起来是什么样的。

I代码是否整洁,或是否包含明显的bug,这非常重要。

观察候选人认真解释代码每一步实现的功能,可以了解他们的思考与说话方式。以及他们在其他领域有多深的了解。

最后,这些都是在技术面试中要用到的检验技巧。而不是使用API和使用IDE完成特定任务的技巧。

白板编程很有用,是因为:

白板上的内容或多或少是不变的。

用不同颜色的笔标出“候选人的原始代码”、“面试官的评论”、“候选人评论”,可以很好的将对话可视化。

不用白板是否有办法做到上面这些技巧呢?

能,也不能。

对于写整洁的代码,我觉得可以让候选人在自己的笔记本电脑上写。

但是要有这些条件:

代码要用投影仪投射在大屏幕上

字体要非常大。

关掉大多数IDE的牛逼功能。

要知道,在不熟悉的操作系统、键盘甚至是编辑器上,相比在白板上编程可能会更难。要么让他们在自己的电脑上写程序,要么确认你提供的环境他们能够接受。

至于理解代码的部分,白板要更有利。

理想情况下,如果是投影仪的影像就是投放到白板上,我会让候选人把投放投射的白板上,面试官再拿几支记号笔。

不过我要说明白,电脑上不允许使用“快速修改”之类的功能。

如果只有两个人的话,打印机又在旁边,那就用用大字体打印出代码,然后用几支彩色笔去分析也非常好。

教学可以帮助练习这些技巧。

我经常被问到,一个人要如何掌握上面的这些技巧。我的答案就是:教学(teaching)。

这对面试官和应聘者都是有益的。

我自己对我的知识水平有一个简单标准。如果我可以对一个领域不做准备就能进行讨论的话,我就算是有丰富的知识了。

在软件领域,这就意味着不用点退格就写出完美的代码,然后能一步一步解释它是做什么的。

如果你是那种经常要被叫过去解释一个算法或者API的人,那你基本上就不会对白板编程面试感到有困难。

白板编程是面试的必要环节么?

不可否认,白板编程很有帮助。但没有它也可以。

如果有一个大屏幕可以显示代码,如果屏幕本身就是个白板,可以在上面用彩色笔进行注释。

我个人喜欢鼓励别人走到白板前。而且这样做有什么不好呢?

文章转载自 开源中国社区[http://www.oschina.net]

时间: 2024-10-29 17:49:53

白板与编程面试:为什么不在电脑上编程更有帮助的相关文章

小弟用vb编程,但是拷到别的电脑上就成这样了。望高手解答!

问题描述 解决方案 解决方案二:点那个显示调用堆栈,看看源码解决方案三:缺少控件,或者.net版本不匹配.解决方案四:是不是用了第三方控件哟,其他电脑也要

编程面试中的十个常见错误

身为程序员,你肯定知道和其他技术工作面试比起来,编程工作的面试流程略有不同. 这篇文章会就你在编程面试中应当避免的10个问题展开讨论. 1.从未在纸上或白板上写过代码 这是求职者最容易犯的大错之一.绝大多数编程面试都会安排在纸上或白板上.而与电脑上大量的编码练习相比,绝大多数求职者极少在纸上或白板上进行编码练习. 用惯了IDE(或是文本编辑器)的求职者会在如何保持纸间良好代码规范这第一步上磕磕碰碰.众所周知,编码规范是编程面试的必要条件.而且,在纸上 写代码的时候,没有编译器帮你指出明显的编译时

在新的平台上编程 ----微软 .NET平台系列文章之一(译文/赵湘宁 )

编程|微软 在新的平台上编程 ----微软 .NET平台系列文章之一 译文/赵湘宁     一年多来,我将注意力一直放在微软的.NET CLR(公共语言运行时:Common Language Runtime)平台.在我看来,今后大多数新的开发都将面向这个平台,因为它使应用程序的开发变得更容易.更简单.同时,我还期望现有的应用开发能迅速移到.NET平台上来.    为了帮助开发人员掌握这个新的平台,本文以及以后的系列文章将专门针对.NET讨论各种编程问题.我将假设你已经熟悉面向对象的编程概念.每一

弱弱地问一下:可以用电脑opencv编程,用手机做摄像头来识别物体吗?

问题描述 弱弱地问一下:可以用电脑opencv编程,用手机做摄像头来识别物体吗? 大致有哪几模块或步骤(手机仅仅做摄像头,需要在安卓手机上编程吗)?谢谢大神们 解决方案 参考:http://jingyan.baidu.com/article/1876c852d587a9890b1376a3.html

qt-QT编程client端怎么和server端在不同电脑上连接

问题描述 QT编程client端怎么和server端在不同电脑上连接 写了一个简单的QT程序进行client端与server端的连接,运行在同一台电脑上client端输入localhost可以连接,但是运行在不同电脑上client端输入服务器IP无法连接,求大神指教 解决方案 查看具体错误信息,先看服务端的端口是否正确侦听.其次是否有防火墙等拦截 解决方案二: 应该是防火墙的问题,如果两个电脑都在局域网同一个网段并且各自网络没问题的话.

编程面试的10大算法概念汇总(http://blog.jobbole.com/52144/)

以下是在编程面试中排名前10的算法相关的概念,我会通过一些简单的例子来阐述这些概念.由于完全掌握这些概念需要更多的努力,因此这份列表只是作为一个介绍.本文将从Java的角度看问题,包含下面的这些概念: 1. 字符串 2. 链表 3. 树 4. 图 5. 排序 6. 递归 vs. 迭代 7. 动态规划 8. 位操作 9. 概率问题 10. 排列组合 1. 字符串 如果IDE没有代码自动补全功能,所以你应该记住下面的这些方法. 1 2 3 4 5 6 toCharArray()// 获得字符串对应的

会编程就得会修电脑么?请不要再误解IT男了,好吗?

IT男在生活中总会被各种人误解,不懂IT的亲戚会认为IT行业就是修电脑的或者就是打字的,还有一些朋友会提出各种奇葩的请求,比如帮我写一个游戏外挂吧,帮我破解密码吧,帮我重装系统吧,帮我PS照片吧,甚至帮我清理一下垃圾吧....还有各种想什么就来什么的老板以及一天只能能够修改好几次需求的产品经理.你们以为会写代码就能用电子器件组合出一个电脑么?你以为这个功能真的很好实现么?不要再误解IT男了,少点误解就少点伤害. 曾经在网上有个广为流传的程序员段子,段子名为<钱多话少死得早>,这里替大家找来了完

程序员编程面试取胜的8个技巧

IT职位现在相当热门.程序员和软件开发人员在今年将有大量的就业机会.可是,面试成了招聘过程中的拦路虎,成为了很多程序员的噩梦.下面教你8个技巧,希望能有助于你成功取胜编程面试. 1.知道如何写算法 如果你申请的是软件工程师的工作,那么显然你需要知道如何编码.写代码脚本其实与写算法来解决软件问题略有不同.用人单位可能会提出这样的问题,"写一个算法,可以从链表中找到某个元素,并将此元素挪到列表末尾."所以,你必须知道如何写算法. 只需具备一点点的数据结构知识以及知道如何实现不同类型的算法,

昨天做了套C++笔试题,面试官说从代码看出编程缺经验

问题描述 昨天做了套C++笔试题,面试官说从代码看出编程缺经验 忽略字母大小写,下面是我当时写的代码,求各位大婶指教怎么改进不会让人觉得缺经验,或者贴下你的代码,感谢 { if((s1==null)||(s2==null)) exit(1); int c='a'-'A',i=0; char *temps1=s1,*temps2=s2; while(*temps1!='') { int i1=0; while((*temps1==*temps2)||({*temps1+c)==*temps2)||