技术采访中的一个常见问题是设计一个特定的系统,通常是公司的现有产品。例如,“设计Google文档”。
这个问题的预期答案是什么?我的意思是,这样的系统肯定具有复杂的设计,这超出了任何采访的范围。面试官在这么短的时间内期望什么?
技术采访中的一个常见问题是设计一个特定的系统,通常是公司的现有产品。例如,“设计Google文档”。
这个问题的预期答案是什么?我的意思是,这样的系统肯定具有复杂的设计,这超出了任何采访的范围。面试官在这么短的时间内期望什么?
Answers:
了解您的大脑如何看待这个问题。我可以从以下几个起点了解如何尝试进行此对话:
自上而下-从很高的层次向下看,构建出一个设计并随着各种组件的完成而充实设计,下面是一些我可以看到的组件。
自下而上-从头开始,这里是人们可以拼凑而成的点点滴滴……
澄清需求-询问有关此设计使用的预计规模,规模,预算和团队的问题。您可以尝试让一个人的代码成为一个非常简化的文字处理器,或者您计划花费数亿美元来制作最终的文档管理系统,您认为这是Google Doc发挥到极致的方式。这里还可以问类似以下内容的功能:“您对Google Doc的意思是什么?要复制多少功能?” 问题。
关键在于您如何很好地交流您对解决此类问题的想法和方法,因为您可能会得到用户的欢迎并问:“对不起,您能否在2周内做出类似的决定?” 那实际上可能发生。因此,如何你给的答案是不是更重要的东西就是答案。
我个人认为过去的项目不是一个好主意。人们试图找到的是在新领域中具有什么样的创造力和沟通技巧,而不仅仅是回忆过去的工作方式。可能是,虽然在新职位上发生的事情可能与过去发生的事情相似,但可能存在足够的差异,以致旧解决方案不可行。这就是为什么虽然构建的内容与现有应用程序相似,但是可能存在各种自定义功能,使解决方案与初始示例完全不同的原因。
面试是一条两条路。经理和其他开发人员很少是面试的掌握者,因此我不确定我是否认为试图在面试中说他们应该是主题专家是有价值的。我可以看到招聘人员期望知道如何进行面试,但是有很多贫穷的招聘人员可以用作示例,说明为什么这并不总是一个好主意。
特别是对于高级开发人员,我认为这些问题可能会很好。它们表明开发人员能够从大型的,复杂的描述过渡到实际的实现。即使系统完全不熟悉,您也应该能够为面试官做一些有趣的活动:
这个问题只是“描述将用于此的对象层次结构...”的更高版本。“描述您将为此设计的界面...” “为此数据设计一组关系数据库表……”,等等,这些信息将提供给初级到中级开发人员。在较低级别的开发人员中,面试官可能正在评估此人在公司中的长期发展潜力,或者只是在遇到可能会让人难以承受的大问题时看到他们的工作。
我是那些经常在面试中问这类问题的有罪党之一。(出于记录,我也就他们的“最喜欢的项目”提出了类似的问题。)我问的原因是,这是我们在这里经常做的事情。我们从界面的各个方面邀请设计工程师,系统工程人员,测试人员以及对该功能的客户用例有一定了解的人员。我们站在白板上说:“好吧,我们将如何建造这个东西?” 在这一点上,您通常对新功能知之甚少,并且仅仅因为您在系统部分中的专业知识而就在那儿,但是仍然希望您能做出有贡献的贡献。这不只是一种假设的学术活动。
就我所期望的答案而言,例如,设计一个系统,可以通过中心局中的20个嵌入式线路卡从服务器下载新固件,以便一次在现场升级5000个机顶盒。假设服务器和线卡之间的链接上的备用容量很少。
错误答案:
嗯,我可能会使用以太网之类的东西。
好答案:
我们正在谈论多大的图像?[大约7 MB。]好吧,您想确保下载期间服务不会受到影响。您需要额外的闪存或RAM才能一次存储两个图像。您可能希望将图像缓存在线路卡上,以避免一遍又一遍地从服务器下载相同的图像。被嵌入时,您的线卡本身可能具有有限的CPU,因此您可能需要序列化下载内容,以便为服务留出足够的容量。您需要某种方法来验证图像是否良好,如果无法正常使用,请使用旧版本。您需要某种方式重试几次,如果升级失败,则向人类报告错误。如果您使用不同品牌的机顶盒,则需要某种方式来识别发送该图像所需的图像。
这些几乎是两个不同候选人的逐字逐句转录。大多数候选人都介于两者之间,但通常会在最后提示时到达目的地,这完全可以。我们不是在这里寻找下一个爱因斯坦,只是表明您实际上可以明智地思考我们每天处理的各种问题。
我也问这种问题,我也同意其他大多数答案。也许这将有助于受访者理解为什么此类问题很重要?假设我们有一个重要的商业决策,为了做到这一点,我们需要构建一个新的系统。如果有人向您求助,并询问构建X的系统将需要什么,您能给他们一个有见地的答案,以预测所需的主要挑战和资源吗?
初级程序员不知道从哪里开始。没有详细的说明,他们还不准备开始交谈。一个高级程序员会立即发现该问题有很多方面,并会尝试应对挑战。您无需架构所有方面,只需确定架构难题,然后找出解决方案即可。
考虑一下Google文档问题:
一件有趣的事情是即将到来的请求的剪切规模。您不能只获得一台服务器并向其中部署代码-这是一项更大的任务。成功的受访者可能对此一无所知,并将描述所需资源的类型,以及在这种规模的实施中所遇到的一些技术挑战,因为应用程序不仅具有状态,而且还可以在多个用户之间共享状态。
关于Google文档的另一件有趣的事情是,多个人可以同时进行编辑。成功的受访者将能够讨论确保生成的文档不会成为垃圾的机制,真正的优秀候选人将意识到,同步或合并编辑的不同方法将对性能和用户体验产生重大影响。甚至可能讨论各种变体:用于编写代码的共享文档编辑器可能应该使用与典型的Google Doc不同的解决冲突的方法,因为以不同的顺序或以略有不同的结构发生的事情有不同的后果。
创建Google Docs这样的应用没有唯一正确的方法,您不必确定每次交易都会做什么,但是找到一个有趣的问题并清楚地说明交易内容是一件非常不错的事情-offs可能是。
-t。
我怀疑面试官想听的是:
Google Doc是文字处理器的网络界面。用户文档被键入和存储,并且可由用户在同一台或不同的计算机上检索。
您想进一步讨论什么?
然后,球在面试官的法庭上。如果她想要更多细节,可以询问。面试官要寻找的是,您可以查看问题或产品并提取设计吗?
对我来说,如果这个人不从确定关键用例/故事开始,那么就足以知道他们没有为需要这种特殊技能的职位做好准备。
之后,他们应该能够根据关键用例/故事提出一个架构解决方案。希望他们使用一些系统的过程来识别模块,而不是将它们从模块中拉出来。...我不希望从面试情况中获得更多解决方案。
但是,我可能会选择一种架构模块,并要求进行更详细的设计,以查看它们是否具有一定的设计技能。很高兴看到他们考虑了故障案例/性能问题。但我怀疑在这一点上,我们会遇到时间限制。因此,我真的不会因为不考虑这些问题而受到惩罚,因为时间太长了,我认为他们有理由假设在有限的采访时间中不会考虑所有可能的情况是合理的。
为了处理这种类型的面试问题,您需要对“事物的工作原理”有一个总体的了解,不仅是您感兴趣的项目,而且是您觉得与您的经验相去甚远的项目。
这意味着阅读博客,文章,http://www.infoq.com、Hacker News等。甚至包括Coding Horror的硬件虚张声势。
尽管您会忘记大部分已读的内容(因为这些信息与您的个人工作无关),但还是有一些花哨的东西是“想象力的种子”,而其中的一小部分在遥远的将来遇到类似的问题时,它将发芽。
因此,面试官可能对您的阅读习惯(作为您的爱好的一部分)感兴趣,并查看您是否有固定的习惯来从随机的地方收集想法的种子。