一亩三分地论坛

 找回密码
 获取更多干货,去instant注册!

扫码关注一亩三分地公众号
查看: 3009|回复: 4
收起左侧

[找工就业] 有空谈谈system design的面试

[复制链接] |试试Instant~ |关注本帖
zxzczvb 发表于 2015-12-19 16:06:16 | 显示全部楼层 |阅读模式

2015(10-12月)-[]CS硕士+1-3年 - Other| 码农类全职@其他

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看,没有帐号?获取更多干货,去instant注册!

x
很多朋友最近忙于找工作也私下问过我一些如何准备的问题,于是干脆在这里主要分享一下在面试里面如何答好系统设计这一环节,以及一些需要注意的地方。我在大家常说的FLAG中某些组也做过一些infra相关的工作,前前后后也shadow和主面过很多设计轮,见过不少很优秀的国人candidate算法轮没问题,code bug free行云流水,但非常可惜的败在设计这一轮,因为得分过低而导致了整个onsite的失败,相反某邻国的很多candidate在这一轮表现得很不错。。
首先大公司为什么要考察系统设计?
我觉得工作中用到fancy的算法还是非常少的,基本上现在市面上做web的公司实现新的feature都是利用client搭积木。但是实现功能A可能有几个path,问题在于如何把积木搭好,然后让系统的performace更好,latency更低,scalability, 利于maintainance和 debug,公司更赚钱,这可能需要你作为开发这个feature的一员做出决定, take ownership。 当然,你需要给出最后方案的理由,说服组里的其他人都照着你的计划来实施。我记得原来我的老板对我说过,做一个成功的产品,很多时候写代码通常只占很小的一部分时间,大多数的时间应该在讨论这个产品的requirement和最后站在customer的角度来看产品的功能是不是符合实际,让用户爽。这里的customer不仅是传统意义上的付费用户,也可能是一个公司里面别的team使用你开发工具的人,以及同一个组里面将来维护你code的同事。没有任何一个程序员愿意维护shitty code。所以,系统设计这一轮在面试里面往往占的比重很大,实际上也是在考察在短时间内,你能不能作为一个feature的owner自圆其说,权衡利弊,给公司给客户设计一个"能用"的feature。于是,我们也时常能听到经典的比如设计一个fb online chat, google calendar之类的题目。


面试中系统设计的关键点?
明白了为什么考察系统设计,关键点就很容易列出了。
1)产品的requirement是什么?
很多candidate常犯的错误就是拿到题目夸夸其谈,罗列概念词汇。比如我这个系统要有app server, 要有load balancer, 要用nosql 数据库。这其实是一个本末倒置的思考方向,从技术到功能,而不是从功能到技术。我们首先要问自己,为什么要设计这个产品?假设我们忘掉所有现在的技术,假如我们是最后这个产品的使用者,我们需要这个产品具备什么功能?比如google calendar,我们要能create personal calendar;我们要能book time slot,并且time slot要可以设置不同的权限,对不同的group显示不同的内容;time slot要能解决event conflict的问题;如果一个用户可以create多个canlander,这些calendar能够confict吗?用户可以tag calendar吗? 怎么做calendar third party integration?  有了这些想法, 剩下的时间就是和面试官讨论其中的一个或者多个功能的实现。讨论requirement的过程就是一个交流的过程,你也可以从交流中得到面试官的喜好,然后实现他想要看到的功能。面试开始的头几分钟,其实就是一个头脑风暴的过程,从点到面,再收回到点。 很多candidate缺少这一个过程,很容易留下communication不足,缺少detail的印象。


好了,和面试官讨论好具体实现的功能,那么再描述一个整体的flow。 我们可以在白板上画出sequence chart, 什么是request, 什么是response。 request里面有哪些信息? 作为一个client我需要你返回什么信息? 简而述之,就是把上面的功能讨论抽象成一个一个的service。 这时候,如果知道如何serialize这些data比如用json,avro, 知道如何network中data encryption,checksum 就是加分
Class ServiceFoo {
    Response CoworkerNotComplainedAPI (Request coworkerNotComplainedRequest)
    Response CustomerSatisfiedAPI (Request customerSatisfiedRequest)
    Response AwesomeAPI (Request awesomeServiceRequest)

....-google 1point3acres
}

awesomeServiceRequest Json
{
"awesomeServiceRequest" {
     "name" : "foo",
     "address":"bar"
    ....... 鐗涗汉浜戦泦,涓浜╀笁鍒嗗湴
}
}

有了这些, 进一步的可以再谈如何储存这些data,以及这些data之间的关系是什么样的,这些API怎么interact?怎么样optimize这些API?如何modularize? 再选取世面上的技术就变得理所当然,我就不往下细说了。


2) 如何把积木搭好?
有了产品的flow,剩下的就是如何让performace更好,latency更低,scalability。 假设我们现在产品只有10个用户,我们可能只用一台机器,但是当用户x 1k后,我们的瓶颈又在哪里呢? 假设你是这个feature的owner,你可能会遇到哪些问题? 比如IO, CPU?  怎么处理exception?可能我们一开始为了快速迭代快糙猛什么都是sequential,后来需要queuing task,batch write以解决database的IO问题,可能最后再加个Kafka来做streaming,run hadoop 来做offline computation。 到这一步我们可能需要站在稍微高一些的角度来解决user growth pain。 这一部分可能需要平时看engineering blog或者视频对目前的技术做一些学习积累了。推荐aws reinvent的youtube视频,http://highscalability.com/, https://code.facebook.com/posts/

3) take ownership
很多candidate能够提供一个reasonable的solution,但是通常没有办法比较不同solution的trade off。 很多时候面试官更在乎的是思考的过程,在不同的solution中为什么选A而不选B,或者换句话说,什么时候选A好, 但是换一个环境以后选B更reasonable? 你有什么论据来论证你的观点呢? 比如,我们要多少的资源存储那些data,我们的data center为什么要建在地点A而不是地点B呢?如果需要更新功能,我们怎么合理的设置好AB testing? 面试的过程里面,不会期望 candidate了解所有的tech stack,包括面试官在某些方面也一定比你了解得少,但是你要始终把这次面试讨论的问题当做日常工作中讨论的一个部分,事实上,工作的时候也是如此。

遇到一些表现特别出色的candidate,他们有时候具体讨论到如何设置service alert以及他们想到实际中可能会出现的一些意外的解决方法,这非常能impress到面试官。Nobody wants to figure out how to handle the accidents in the early morning.

一些面试的加分点?

1) 利用好白板。 one picture is worth 1000000 words.  善用不同颜色的马克笔 字写好 :)
2) 把握面试的主动权。 不要让面试变成Q&A
3) 了解公司的一些open source project或者有名的产品。不了解公司来面着干嘛 ?-google 1point3acres
4) 不要过多challenge面试官 把面试官当朋友
5) 把抽象的问题具体化 站在系统的角度来优化功能
. From 1point 3acres bbs
曾看过一些帖子说几天速成面试技巧拿大offer我觉得都是扯淡,巧妇难为无米之炊,95%还是需要通过平时的知识积累。
本帖子只是从另外一个角度谈谈面试中我觉得需要注意的一些内容,希望帮助到现在找工作的一些同学,欢迎指点 :)



. From 1point 3acres bbs










. 鍥磋鎴戜滑@1point 3 acres




评分

13

查看全部评分

本帖被以下淘专辑推荐:

sheepmiemies 发表于 2015-12-20 11:10:41 | 显示全部楼层
赞观点!问题在于思考要怎样从实际出发一步步解决问题,从basic到advanced,而不是单纯抛出一堆fancy的技术。没有通用的技术完美的技术,只有最适合的技术。
到北美学习最大的收获就是要尽量静下心来,三思后行,虽然现在依然很浮躁。。。
回复 支持 反对

使用道具 举报

bin 发表于 2015-12-20 11:50:18 | 显示全部楼层
请问申请google, linkedin, apple, facebook的new grad职位(entry level),也会考设计吗? 求普及。- 谢谢
回复 支持 反对

使用道具 举报

 楼主| zxzczvb 发表于 2015-12-20 15:06:37 | 显示全部楼层
bin 发表于 2015-12-20 11:50
请问申请google, linkedin, apple, facebook的new grad职位(entry level),也会考设计吗? 求普及。- 谢 ...
. 涓浜-涓夊垎-鍦帮紝鐙鍙戝竷
apple不了解 f对phd的new grad会有考察 L一定有至少一轮design(system track的有两轮) g和amazon可能会有 但现在amazon new grad貌似变成oa了? 总的来说 随着工作经历的增加 design面试的比重占得越大
回复 支持 反对

使用道具 举报

yucheyang2 发表于 2015-12-20 15:17:50 | 显示全部楼层
貌似楼主提到的很多的错误我都犯了。。。一语惊醒梦中人。。。
回复 支持 反对

使用道具 举报

本版积分规则

请点这里访问我们的新网站:一亩三分地Instant.

Instant搜索更强大,不扣积分,内容组织的更好更整洁!目前仍在beta版本,努力完善中!反馈请点这里

关闭

一亩三分地推荐上一条 /5 下一条

手机版|小黑屋|一亩三分地论坛声明 ( 沪ICP备11015994号 )

custom counter

GMT+8, 2016-12-11 08:37

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

快速回复 返回顶部 返回列表