Snapchat面经—明星Startup系列

Snapchat是一个真正的美式start-up:beach house, cool idea, LA, controversial cofounder, massive user base, etc. 但老实说,几乎所有人第一次听说Snapchat这个阅后即焚的idea都觉得毫无意义。小编还曾听创赛的一位评委老师聊过,他说当初看到Snapchat这个项目的印象,就是三个字“不靠谱”。可start up的世界就是如此的不同:Snapchat火了。虽然咱们的Wechat神器在华人圈通杀一切IM软件,但是在美国人的圈子里,尤其是大学生以下(under college)的圈子里,"Snapchat is used all the time" (quoted from an intern mentored by小编).

Screen

前戏不多讲,小编本着好奇的初心,网申了Snapchat的SDE职位。申请过程没有任何特殊之处,印象中要求做一道optional online test,果断pass,工作事忙,就不在optional step费心思啦(当然心仪此公司的童鞋可以做下,目测难度Leetcode中等)。第二天收到电面邀请,很有意思的是,他们会发一个google calendar,来显示available slots,看起来略屌丝但是works great!

电面通过google hangout进行,由于工作事忙,小编心情忐忑的蹲在公司的小会议室里,看着屏幕中缓缓出现的印度面庞,不禁心中发毛。好在对面的印度兄弟给力,聊天虽然有口音,但是态度绝对nice(说印度sde都是坏蛋的请绕道)。俩人聊了十多分钟的project experience之后,开始做题:题目就是如果设计一个“大”数,让其可以表示无限大的值,并实现“大”数的加法。应该算是常考题,用string表示大数,本质上就是实现valid string number加法,速度写过。

Baozi Tip

  1. 项目聊的好是有加分的。面试官很明显对小编的工作经历感兴趣,尤其讨论到项目的细节,data flow, scale, failure case, 夸张点说,就是聊出了火花,聊出了共鸣...这一定是会有加分的。但聊天时间不宜过长,否则影响做题时间(做题是跑不了的)。
  2. 电面题目难度属于Leetcode中低难度,但是尽量写出no bug/clean code.

Onsite

两天后收到onsite邀请,顺利搞定去LA游玩机票。再次扯两句LA,吃的玩的真心不错!相对于创业圣地San Jose, LA的IT产业并不算发达,但考虑到start up城市化的倾向(硅谷朋友莫喷),很多start up在财大气粗之后,倾向于去大城市开办公室,以SF最为明显。同样,大城市LA也吸引了很多中小型的start up,有兴趣的朋友真心可以考虑。

话不多说,回到onsite经历。Snapchat's onsite starts with lunch time. 到达传说中venice beach旁的一座小喽,按门铃入,然后迎来一位夜店保安面相的黑哥们热情问候。小编对Snapchat的第一感觉是办公地很潮,大落地窗,棱角分明,后面全是年轻的coder们,散漫的对着屏幕噼里啪啦。之后与员工吃饭:饭菜水平稀松平常,聊完了趁着有点时间去海边散步,看着小老美们愉快的滑板冲浪,街上杂耍叫卖的人群,不由得感慨下LA美好的生活气氛。

消遣一会,回到办公室。第一个面试官略傲气的进来(后来知道是senior ex-googler),客套几句之后,问小编如何改进Snapchat这个产品。殊不知小编早有准备:在面试之前,小编特意和朋友们一起下载了Snapchat使用,结果发现添加好友的功能设计的非常蹩脚,和Wechat"hold together"的易用性差距明显。于是就把这个想法讲出来,面试官一下就共鸣了,气氛融洽了很多。然后开始做题:第一个题目是把一颗二叉树按前序遍历顺序存入一个线性数据结构中。题目不难,重要的是搞清需求,比如存储用的线性数据结构的选择到底是用数组还是链表等,另外遍历顺序尽量抽象出来,考虑到需求可能在将来会改变遍历顺序(比如换成中序、后序),怎样设计代码层次减少改动部分。第二题是在不使用Math类的基础上实现开平方的算法。这个是Leetcode的原题,二分法的思想步步逼近,注意double类型的比较是精度比较,因此不能使用==。做完后面试官还比较高兴,吹捧了一下Snapchat之后飘然离去。

第二个面试官进来,很nice的亚裔面试官,聊了很多他之前自己做的start up公司,其实就是一个教编程的网站。但是经不住朋友劝才放弃自己的事业,加入Snapchat,到这后发现是"a total blast",很有意思。做题方面也是常考题,包子有另外一篇博客专门讨论这道题目

第三个面试官进来,又是一个很nice的亚裔面试官。貌似Snapchat里面很多Stanford CS asian graduates, 也算是一个比较有意思的现象。这一轮是面系统设计,题目是如何设计google doc这类实时保持同步的online editing tool,要求面试者设计的细节越多越好。系统设计的问题其实是很考较工作经验以及对分布式系统设计的理解,以及模糊需求下良好沟通的能力。对于这类问题,以下几点需要点出:

  1. Client-Server架构。Client(在此指用户浏览器)自然是必须的,Server端在这个设计问题中也是需要的,因为即使所有Client都下线之后,Server端依然应该有数据备份。
  2. Consistency. 这是本问题的关键:如何在多用户输入的情况下保持data consistency,这是依靠Server端synchronize change list来实现的(同理,any conflict is handled here)。
  3. Scalability. 当用户量大量增长的时候,如何scale设计架构来满足需求。

到第四个面试官进来的时候,小编已经疲态尽显。好在面试官是个喜欢聊天的人,又是一顿海扯,时间不知不觉的过去了很多。做的题目是和OO设计和算法结合的一道题目,但是小编绞尽脑汁还是无法回忆起题目的描述,印象中是比较普通的算法题目,目的应该是考察面试者知识体系的全面性。解法开始有bug,自己改正后相安无事,继续聊天。不多久HR出现,打道回府。

Reflection

两天后,收到他家的Offer,其中股票的部分非常给力,值得一搏。面试总体感觉题目不难,Leetcode中等难度左右。真正的难度在于代码质量要好,出活速度要快。另外由于是四人面试,面挂一人基本上就非常危险了,因此知识体系不能存在盲点,最后就是运气啦...在后来的follow up中,VP讲了一个很有意思的关于他如何加入Snapchat的故事,看得出Snapchat是家很年轻很有意思的公司,钱途上Snapchat当前估值已超过100亿美金,对于年轻人,如果愿意冒险,也愿意适应高强度的工作,Snapchat是个很不错的选择。(包子原创,转载请注明)

博客推送