前天去的领英sunnyvale office onsite,为了面试请了两天假。面完后连夜飞回美东接着上班,因为基本上在飞机上就没睡,昨天一天上班都处于懵逼状态。。。今天终于恢复过来了,趁着周五上班比较清闲,来写写面经,攒攒人品~
onsite前一天HR把每一轮的具体时间,内容,以及面试官的linkedin Profile链接发给了我。我数了一下,算上中午带着吃饭的lunch大使,一共11位面试官。除了其中某一轮有位华人MM,剩下的全是老美。onsite从早晨9点45开始,一直到下午4点15结束,加上吃饭一共七轮。之前看地里的领英前端面经,貌似只有在职跳槽的前端candidate要面七轮,new grad好像只要五轮。。。
9:45-10:00, HR带着参观下办公室,然后带到一个小会议室,桌子上摆着老三样,一张写着candidate名字的欢迎卡片,一张LinkedIn connection map, 显示你LinkedIn账号的所有联系人,还有一些零食和水。然后见了一下之前联系我的Recruiter,寒暄了几句,之后面试正式开始。
10:00-11:00, 两位面试官,让写一个类似tooltip的widget,当用户把鼠标放在LinkedIn页面上某个联系人的名字上时,会出现一个类似tooltip的预览框,里面有该用户的头像,姓名,degree以及title。要求先用HTML以及CSS mock up下大致的layout,然后用AJAX得到所需要显示的用户信息。
11:00-11:45,两位面试官。题目是写一个function实现计算器里的undo以及redo功能。其实就是考数据结构里的stack。最后的拓展题感觉在问system design,问我如果这种undo以及redo操作是用在占据很大存储空间以及用户量很大的data上该怎么办,我说那就给每个数据加上index,undo以及redo只用在index上,最后再用index去取数据。。。
11:45-12:45,吃饭。可能是我之前对LinkedIn的食堂期待过高,结果事实却让我有点失望。。。饭完全没有想象中的那么好吃。。。不过带我吃饭的小哥说食堂每周都换菜单的,估计我正好轮到了不太好吃的那一周。。。
12:45-13:30。还是两位面试官。出了两道题。第一道是之前地里面经里出现过的,Insert links for each of the members into the content div. The link would be like:
<a href="profile.jsp?id=<memeber.id>"><member.name></a>
考点就是DOM Manipulation,怎么向DOM Tree里添加新的节点。Follow up是如果有很多member的链接需要一个一个添加到DOM里,会造成reflow影响页面性能,如何解决。第二题是写一个memoization function,思路就是利用hashTable存之前计算出的结果。
13:30-14:15,product and culture fit。这轮主要就是扯淡。。。问到好多UI以及设计方面的问题,比如谈谈你对client side rendering以及server side rendering的理解,说一个你最喜欢的应用并列举下优缺点,LinkedIn还有哪些需要改进的地方等等等等。。。
14:15-15:15,一位面试官。我本来以为这轮是考system design的,之前猎头也特意跟我说过会有一轮system design,所以我之前花了挺多时间刷system design的,结果这一轮还是考JS。。。问题就是之前领英前端面经里一直出现的leetcode 273,把数字转换成英文,要考虑小数。我本来以为这题是最有把握的,因为之前做过。。。可没想到最后代码居然没写对,有挺多bug的,这可能就叫做大意失荆州吧。。。这一轮估计是跪了。
15:15-16:15,这一轮和manager接着扯淡,全程聊天穿插一些behavior question。最后由manager送客,onsite结束。
总体来说,LinkedIn家的面试体验是很棒的,流程清晰明了,绝对算是一次难得的经历了。至于最后有没有offer那就只能听天命了。。。
两个工程师面,其中一个是senior UI engineer
一上来面了一些js基础,像callback 还有promise的区别,什么是prototype,javascript event bubble怎么work,之后开始码代码
第一题是给你个array,array里每一个object,有 skill 和 name,让你生成一个新的array,每一个 element 都代表一个skill,跟 skill 一起的还有user,user是一个 array of user name,这道题基本就是group user by scale
第二题是给你一堆代码问call 某个 method 会输出什么结果,其实就是考js里的prototype inheritance。
第三题是给你一个array, array里面的每一个object,都有一个id 和name,让你用browser API生成一个 list of <a>
, 然后要求是accessible。 Follow up是要求track link的点击,回答的时候讲了一下event delegation,和怎么样保证页面跳转的时候能够成功的把数据送到后台。
刚面了linkedin 前端 onsite, 虽然面的不好,还是来写写面经,攒攒人品吧。
onsite从早晨10点开始,一直到下午4点15结束,加上吃饭一共七轮
10:00-11:00, 两位面试官,让写一个 infinite scroll handler.
给了一个 <ul id="posts"></ul>
每次到了页面底部就用ajax load更多的内容。用throttle优化。
11:00-12:00,一位面试官。题目是给了个地图,上面有很多点, 每个点是个object, x, y 坐标都给了, 比如{x: 5, y: 5}
已知 包含所有点的 array, 某一个点,和半径d, 写一个function 返回到这个点的距离小于或等于d 的所有点。
怎么优化。我当时答得是把整个地图分成小的区域,每一小块2d的正方形。然后找这个点所在的方块和周围的几个方块。这样就不用遍历地图里所有的点了。
12:00-1:00,吃饭. LinkedIn的食堂的饭还是很好吃的。
1:00-2:00。还是两位面试官。 系统设计。linkedin新加的功能, 页面的右下角可以发messenger.
对于messenger这个feature, 先列一下有哪些功能要实现。然后对每个功能讲讲怎么实现。
2:00-2:45,这一轮和manager聊,学习经历和工作经历,全程聊天穿插一些behavior question。你想给LinkedIn增加哪些新功能。
2:45-3:30。product and cultule fit。 说一个你最喜欢的应用, 为什么喜欢,还有哪些需要改进的地方。你想给LinkedIn增加哪些新功能(这一轮又问到了)。
3:30 - 4:15。 写个function 来 parse query string. 先让你写个带query string的url.
http://example.com/over/there?name=ferret&id=1 parse完后生成一个object {name: “ferret”, id: “1”}
followup 1: http://example.com/over/there?name=ferret&name=tom&id=1 parse完后生成一个object {name: [", id: “1”}
followup 2: 如果url是encode,要先decode
面的不好,攒攒人品。希望可以帮到大家。
补充内容 (2017-3-28 12:26):
follow up 1 生成的object 没有写全。应该是 {name: [“ferret”, “tom”], id: “1”}