在面试毕业生时,我经常向他们询问有关数据结构,算法和复杂性理论的问题。我真的想问一个问题,使他们能够展示他们对多线程概念的熟悉程度,而不必考虑语言特定的问题。
有什么好问题吗?我能想到的唯一问题是如何编写支持多线程访问的Singleton。
答案 0 :(得分:3)
我发现经典的“给我写一个消费者 - 生产者队列”的问题非常好。你可以预先用手工谈论同步五分钟左右(例如以“Object.wait()
做什么为其开始?Object
上有哪些其他方法与你有关?你能给我一个例子吗?什么时候可以使用这些?在实践中你可能会使用哪些其他并发技术[因为实际上,实际使用wait / notify原语是非常罕见的最好的方法]?)。确保候选地址(或至少表明他知道)原子性(“错过更新”)和波动性(其他线程上新值的可见性)
然后,在您讨论了这些理论之后,让他们花几分钟实际编写原始生产者 - 消费者队列的代码。对于那些真正理解他们上面谈论的内容的人来说,这应该是直截了当的,但是它会淘汰那些能够“说话”但实际上并没有真正理解它的人(可以说是最危险的群体)。
我喜欢这些迷你编码练习,它们通常很容易扩展。例如,如果候选人轻松完成任务,您可以询问他们如何为情况XXX扩展它 - 发明您知道的要求将推动您要求的点头解决方案的限制。这不仅可以让您定制问题的深度,还可以深入了解候选人如何处理需求的澄清以及对现有设计的修改(这在该行业中非常重要)。
答案 1 :(得分:1)
您可以在这里找到一些可供讨论的主题:
答案 2 :(得分:1)
答案 3 :(得分:1)
与他们讨论一个流行的,但不是众所周知的主题,其中线程处理是必不可少的。
我建议您与他们一起构建网络服务器,当然,这只是纸上或文字。结果看起来应该是这样的:有一个主线程,它正在侦听套接字。当某些东西到达时,它将套接字传递到池中,然后该线程返回到套接字侦听。该池具有固定数量的插槽。请求处理线程专用于从池中获取作业。如果线程同时检查池,或者列表器主线程为新的传入请求选择一个空闲槽/线程,那么找出更好的方法。尝试为池处理的两侧写一个小的伪代码或图形。
让我们介绍一个小应用程序:页面计数器,它告诉自服务器启动以来已经有多少页面请求。不要告诉他们必须保护计数器免受并发修改,让他们找出如何使用互斥或同步或其他任何方式执行此操作。也许您可以跳过Web服务器部分,页面计数器应用程序更容易指定。
另一个例子是聊天,有2个以上的客户端和服务器,找出,如何解决问题,所有消息应该以相同的顺序到达所有客户端。或者反射游戏:服务器随机等待1到5秒,然后说“peek-a-boo”,玩家赢得谁先按空格键。用2个玩家指定它,然后尝试将其扩展为N个玩家。
另外,要注意核电厂。 NPP代表:“非编程程序员”。有些人可以谈论编程问题,他们知道所有3/4字母的缩写(Java世界中有 lot ,EJB,JSP,XSLT和我最喜欢的:POJO,这意味着Pure Old Java Objects,lol),他们理解和修改代码,或者从基础创建类似的程序,但即使遇到小问题它们也会失败,它必须自己做,例如找到数组中基数的最近元素。有时它需要几个月,直到事实证明。他们在面试时表现很好,因为他们为此做准备。也许他们甚至不知道,他们是核电厂,这是一个众所周知的效果:http://en.wikipedia.org/wiki/Dunning-Kruger_effect
很难认识到那些没有听说过时髦的图书馆或模式的相反的家伙,但他们甚至可以在面试时学习它。 (个人评论:我上次的采访是在1999年,似乎我不再采访了。我以前从未听说过动态网页,但我在采访中找到了“会话”一词,问题是如何构建一个简单的悬挂式Web应用程序。我被录用了。)