如何在面试中设计任意系统?[关闭]


36

技术采访中的一个常见问题是设计一个特定的系统,通常是公司的现有产品。例如,“设计Google文档”。

这个问题的预期答案是什么?我的意思是,这样的系统肯定具有复杂的设计,这超出了任何采访的范围。面试官在这么短的时间内期望什么?


4
+1前几天我的一个朋友刚刚被问到。我说了同样的话。我努力提出不限成员名额的面试问题。向受访者询问他们的项目以及他们的设计方式/原因。这样,他们可以告诉我他们已经知道并且已经完成的事情。与其绊倒白板设计
不去

6
如果是现有产品,我会回想:“您发现现有设计中有什么不足?”
Blrfl 2011年

5
“好吧。第一步是与律师联系,看看我们是否侵犯了任何商标或版权”
Steven Evers

12
“请问我是否看到需求文件?”
乔尔·埃瑟顿

4
“从未使用过。它的主要功能是什么?”
史蒂文·A·洛

Answers:


22

了解您的大脑如何看待这个问题。我可以从以下几个起点了解如何尝试进行此对话:

  • 自上而下-从很高的层次向下看,构建出一个设计并随着各种组件的完成而充实设计,下面是一些我可以看到的组件。

  • 自下而上-从头开始,这里是人们可以拼凑而成的点点滴滴……

  • 澄清需求-询问有关此设计使用的预计规模,规模,预算和团队的问题。您可以尝试让一个人的代码成为一个非常简化的文字处理器,或者您计划花费数亿美元来制作最终的文档管理系统,您认为这是Google Doc发挥到极致的方式。这里还可以问类似以下内容的功能:“您对Google Doc的意思是什么?要复制多少功能?” 问题。

关键在于您如何很好地交流您对解决此类问题的想法和方法,因为您可能会得到用户的欢迎并问:“对不起,您能否在2周内做出类似的决定?” 那实际上可能发生。因此,如何你给的答案是不是更重要的东西就是答案。


我个人认为过去的项目不是一个好主意。人们试图找到的是在领域中具有什么样的创造力和沟通技巧,而不仅仅是回忆过去的工作方式。可能是,虽然在新职位上发生的事情可能与过去发生的事情相似,但可能存在足够的差异,以致旧解决方案不可行。这就是为什么虽然构建的内容与现有应用程序相似,但是可能存在各种自定义功能,使解决方案与初始示例完全不同的原因。

面试是一条两条路。经理和其他开发人员很少是面试的掌握者,因此我不确定我是否认为试图在面试中说他们应该是主题专家是有价值的。我可以看到招聘人员期望知道如何进行面试,但是有很多贫穷的招聘人员可以用作示例,说明为什么这并不总是一个好主意。


2
最好向受访者询问他们熟悉的项目。通过这种方式,您可以了解他们的思想在他们实际工作过程中的工作方式。您可以阻止他们,要求澄清细节,以了解他们对该领域的了解有多深。“为什么不使用接口作为方法的参数?” 然后,由您作为面试官提出正确的问题。这是正确的,因为受访者在您的域中,而不是您自己的域。
P.Brian.Mackey,2011年

2
如果可以的话,请+1:“关键是您能很好地传达自己的想法”……不幸的是,我相信大多数访调员和候选人都缺乏这一领域。
匿名

2
“最好向受访者询问他们熟悉的项目。这样,您可以了解他们在真正的工作过程中的想法。” 实际上,所有要做的就是测试他们对已经完成的设计工作的回忆。面试官大多希望看到他们将如何解决新问题。
DJClayworth 2014年

16

特别是对于高级开发人员,我认为这些问题可能会很好。它们表明开发人员能够从大型的,复杂的描述过渡到实际的实现。即使系统完全不熟悉,您也应该能够为面试官做一些有趣的活动:

  • 收集要求以回答问题(例如范围)
  • 将问题分解为更易于管理的部分;可能会标识可能需要的接口或对象,或者将逻辑分解为前端,后端,DB等。
  • 展示对这种系统背后的结构和概念的熟悉程度,例如,对于Google文档而言,是Web应用程序
  • 展示在遇到设计问题(对象设计,SQL表或设计模式)时,您倾向于关注的重点
  • 向老板显示预览,与您一起开发新系统会是什么样子,老板会介绍一个规范并说:“构建此系统需要什么?”

这个问题只是“描述将用于此的对象层次结构...”的更高版本。“描述您将为此设计的界面...” “为此数据设计一组关系数据库表……”,等等,这些信息将提供给初级到中级开发人员。在较低级别的开发人员中,面试官可能正在评估此人在公司中的长期发展潜力,或者只是在遇到可能会让人难以承受的大问题时看到他们的工作。


2
因此,对该问题的预期答案是至少简化了一些UML图?
Shamim Hafiz

3
我认为简化的UML将是答案的常见部分。服务器图也可能出现。关键是要表明您并没有为问题的大小所困扰,并且可以从模糊的概念平稳地过渡到实际的体系结构(使用具体而不是模糊的问题来解决)。然后交流该架构。面试官还可能在聆听您是否寻求当前的最佳实践,或者正在寻求过时的解决方案。
Ethel Evans,

11

这是关于观察您的思考过程的实际情况;他们对解决方案不感兴趣,但对解决问题的方式,要问的问题,要识别的问题等感兴趣。

以Google Docs为例,显而易见的问题是存储,安全性,可伸缩性,可用性,客户端界面设计,浏览器兼容性等问题。如何在服务器和客户端之间划分职责?您将如何处理备份?服务器故障时会发生什么?您将如何处理“被遗弃的”文档(长时间未访问或修改过的东西)?

同样,重点不是解决任何这些问题,而是识别它们,进行讨论,就如何解决这些问题进行集体讨论等。


9

我是那些经常在面试中问这类问题的有罪党之一。(出于记录,我也就他们的“最喜欢的项目”提出了类似的问题。)我问的原因是,这是我们在这里经常做的事情。我们从界面的各个方面邀请设计工程师,系统工程人员,测试人员以及对该功能的客户用例有一定了解的人员。我们站在白板上说:“好吧,我们将如何建造这个东西?” 在这一点上,您通常对新功能知之甚少,并且仅仅因为您在系统部分中的专业知识而就在那儿,但是仍然希望您能做出有贡献的贡献。这不只是一种假设的学术活动。

就我所期望的答案而言,例如,设计一个系统,可以通过中心局中的20个嵌入式线路卡从服务器下载新固件,以便一次在现场升级5000个机顶盒。假设服务器和线卡之间的链接上的备用容量很少。

错误答案:

嗯,我可能会使用以太网之类的东西。

好答案:

我们正在谈论多大的图像?[大约7 MB。]好吧,您想确保下载期间服务不会受到影响。您需要额外的闪存或RAM才能一次存储两个图像。您可能希望将图像缓存在线路卡上,以避免一遍又一遍地从服务器下载相同的图像。被嵌入时,您的线卡本身可能具有有限的CPU,因此您可能需要序列化下载内容,以便为服务留出足够的容量。您需要某种方法来验证图像是否良好,如果无法正常使用,请使用旧版本。您需要某种方式重试几次,如果升级失败,则向人类报告错误。如果您使用不同品牌的机顶盒,则需要某种方式来识别发送该图像所需的图像。

这些几乎是两个不同候选人的逐字逐句转录。大多数候选人都介于两者之间,但通常会在最后提示时到达目的地,这完全可以。我们不是在这里寻找下一个爱因斯坦,只是表明您实际上可以明智地思考我们每天处理的各种问题。


1
您在哪里工作,需要新员工吗?:D
Maggie

1
虽然所有您所谓的“好答案”示例都是相关的。问题是“设计一个……的系统”。考虑到这是一次面试的情况,因此预期最多只有5到10分钟的时间来回答,您发现的大部分内容似乎在面试解决方案的杂草中消失了。您的“好答案”的实际解决方案在哪里?一旦这个人有了“快乐的一天”的解决方案,他们就可以开始考虑您在“好的答案”中所指的“假设”。但是到那时,我认为时间已经过去了。
Dunk

5

我也问这种问题,我也同意其他大多数答案。也许这将有助于受访者理解为什么此类问题很重要?假设我们有一个重要的商业决策,为了做到这一点,我们需要构建一个新的系统。如果有人向您求助,并询问构建X的系统将需要什么,您能给他们一个有见地的答案,以预测所需的主要挑战和资源吗?

初级程序员不知道从哪里开始。没有详细的说明,他们还不准备开始交谈。一个高级程序员会立即发现该问题有很多方面,并会尝试应对挑战。您无需架构所有方面,只需确定架构难题,然后找出解决方案即可。

考虑一下Google文档问题:

一件有趣的事情是即将到来的请求的剪切规模。您不能只获得一台服务器并向其中部署代码-这是一项更大的任务。成功的受访者可能对此一无所知,并将描述所需资源的类型,以及在这种规模的实施中所遇到的一些技术挑战,因为应用程序不仅具有状态,而且还可以在多个用户之间共享状态。

关于Google文档的另一件有趣的事情是,多个人可以同时进行编辑。成功的受访者将能够讨论确保生成的文档不会成为垃圾的机制,真正的优秀候选人将意识到,同步或合并编辑的不同方法将对性能和用户体验产生重大影响。甚至可能讨论各种变体:用于编写代码的共享文档编辑器可能应该使用与典型的Google Doc不同的解决冲突的方法,因为以不同的顺序或以略有不同的结构发生的事情有不同的后果。

创建Google Docs这样的应用没有唯一正确的方法,您不必确定每次交易都会做什么,但是找到一个有趣的问题并清楚地说明交易内容是一件非常不错的事情-offs可能是。

-t。


我之所以赞成,是因为您是唯一将他们的答案用于“建筑”设计解决方案的答案。因为这是在给定范围内进行面试时最好的方法。一位了解架构解决方案是可以完成的全部工作的受访者表明,他们知道自己在做什么。
扣篮

2

我怀疑面试官想听的是:

Google Doc是文字处理器的网络界面。用户文档被键入和存储,并且可由用户在同一台​​或不同的计算机上检索。

您想进一步讨论什么?

然后,球在面试官的法庭上。如果她想要更多细节,可以询问。面试官要寻找的是,您可以查看问题或产品并提取设计吗?


1
答案是好的,但不要认为采访者会对此感到满意。到目前为止,在阅读文章时,似乎这样的问题在受访者中并不受欢迎。
Shamim Hafiz

-1 @Gilbert Le Blanc-在《神话人月》中布鲁克定律所定义的“加速”时间充其量是愚蠢的。如果我们知道要花大约6个月的时间来学习如何为软件项目增值,那么仅用6个小时就可以“提取设计”?en.wikipedia.org/wiki/Brooks%27s_law
P.Brian.Mackey 2011年

1
@Shamim Hafiz:基于您的问题和评论,我想说这个问题并不受欢迎,因为您和其他人很难缩小问题的范围。JB King的答案比我的完整。他的要点是缩小问题范围的所有有效方法,尽管我首先是自上而下的,然后才是要求澄清的部分。用简单的英语来说,先画一个比喻,然后突出差异。
吉尔伯特·勒布朗克

4
如果我正在面试,我将不会对这个答案感到满意。这里的答案只是告诉我什么是Google文档,这是我已经知道的。
whatsisname 2011年

1
@whatisname-我认为面试官希望在面试过程中知道问题的答案(或球场)。
Morgan Herlocker 2011年

2

对我来说,如果这个人不从确定关键用例/故事开始,那么就足以知道他们没有为需要这种特殊技能的职位做好准备。

之后,他们应该能够根据关键用例/故事提出一个架构解决方案。希望他们使用一些系统的过程来识别模块,而不是将它们从模块中拉出来。...我不希望从面试情况中获得更多解决方案。

但是,我可能会选择一种架构模块,并要求进行更详细的设计,以查看它们是否具有一定的设计技能。很高兴看到他们考虑了故障案例/性能问题。但我怀疑在这一点上,我们会遇到时间限制。因此,我真的不会因为不考虑这些问题而受到惩罚,因为时间太长了,我认为他们有理由假设在有限的采访时间中不会考虑所有可能的情况是合理的。


1

最近我接受了一次采访,被要求设计电梯控制系统。基本上,他们希望看到您执行任务的方法。如果有人问您这个问题,他们可能会为您准备一个非常高级的工作。恭喜。


1

关键是要如何解决问题而不是所提供的解决方案的优点,以及是否有能力处理重大问题。

我认为要做的一件重要事情是询问有关要求的问题。不要仅仅做出使宠物解决方案能够正常工作的假设。例如,您可能碰巧知道一些打印文档的极好方法,因此您可能会想直接进入描述。但是Google文档不会直接打印。它生成一个PDF,然后由客户端打印。因此,如果从此开始,您将花费一半的时间来解决不属于问题的问题,并且证明您比使用解决客户的问题对使用热门技术更感兴趣。


0

为了处理这种类型的面试问题,您需要对“事物的工作原理”有一个总体的了解,不仅是您感兴趣的项目,而且是您觉得与您的经验相去甚远的项目。

这意味着阅读博客,文章,http://www.infoq.com、Hacker News等。甚至包括Coding Horror的硬件虚张声势。

尽管您会忘记大部分已读的内容(因为这些信息与您的个人工作无关),但还是有一些花哨的东西是“想象力的种子”,而其中的一小部分在遥远的将来遇到类似的问题时,它将发芽。

因此,面试官可能对您的阅读习惯(作为您的爱好的一部分)感兴趣,并查看您是否有固定的习惯来从随机的地方收集想法的种子。


嗯,我不认识您,但是对于那些根据事实和经验来制定设计而不是一次在博客上读到东西的开发人员,我的看法要好得多。
亚伦诺特2011年

@Aaronaught:当然,来自类似项目的真实经验比听过的想法更有价值。但是,当您在一个没有经验的地区执行项目任务时,您只是放弃机会了吗?(假设您让雇主知道您没有相关经验,而雇主也可以接受)。如果您决定接受,那么如何开始?您从其他人,其他公司等汲取的教训开始。你不可能从无处开始。也许您是对我的
不满

(续)请不要低估从其他来源学到的教训的重要性。
rwong

足够公平,也许那票选票是不应该的(尽管我目前无法将其删除)。不过,我真的不认为采访员会问这样的问题来了解您所阅读的内容。如果是的话,他们只会问你读什么。最重要的是使你了解它是如何提出正确的问题应该工作,没有熄灭半竖起基于信息散位,可能会或可能不相关。
亚伦诺特,2011年

0

提出此类问题的目的在于深入了解您的想法。我使用的一个常见问题是要求程序员设计一个可以模拟PacMan的系统。

是的,我首先寻找用例,这表明我在思考这个人。然后,对于多线程,首先要考虑数据结构(可以用于问题的结构,然后考虑决策原因的更合适或更具体的结构)。

对于高级开发职位,这是必须考虑的。在这种开发人员经验水平上,人们坐下来回答排序实现问题既愚蠢又毫无意义。系统设计是我期望在此级别上实现的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.