[转载 From MITBBS] LinkedIn, Google, Facebook, Twitter 面经

9月份的面试,连续四天面了LGTF,准备面试的半年多时间来从本版受益匪浅,现在把
面经写出来回馈本版,希望大家把好的传统延续下去。

L
偏重设计,也可能与面的组是platform有关,6个面试有三个是设计,而且涉及很多细
节,比如indexdistribute hash, circule counting. 有一面是manager问项目,个
人觉得选一个自己从头到尾做过的项目,然后按我下面的6点进行准备,基本就够了。 
L
是有题库的,建议多刷版面和glassdoor

G
偏重coding,每一面都是coding开始,而且占很大比例,如果时间多的话可能有两个
coding
,也有可能接一个design问题。

T
的面试最没规律,感觉基本是面试官自己决定问什么,所以这里不怎么好做总结。

F
的面试是最标准化的,两个半coding + 一个design + 半个项目介绍 (项目介绍同上
L), F的题目重现率比较高,看版上的题目就差不多了,design问题基本在之前版
上归纳的几个类别: 设计feedmessage, search,存储,都和大数据沾边。

LFT
面试官大部分是同胞,大部分同胞是很友好,很帮忙的,在此谢过! 但在L碰到一极
品同胞,和老外一块面我,始终一副很屌的样子。在T碰到一个老中manager,一副高高
在上的态度,不断challenge我的过去的项目和跳槽动机。在LT各碰到一个烙印。G
部是白人面试官,都很友好,也是最顺利的面试,感觉G的面试官是最认真负责的,我
在写code的时候,他们也很忙碌的把我的代码和过程记录下来。


准备内容:
1. Coding: 
     Leetcode, 1.5

2.
大数据: 
     Google
的三篇论文 (GFS, Map-Reduce, Big-Table)
     Hadoop, HDFS, HBase (
等同于Google三篇论文,可二选一)
     Amazon Dynamo, Facebook Cassandra (
大数据的另一种存储方式)
     CAP theorem, Distribute Hashing, Consistent hashing, Eventual 
Consistent
3.
系统设计:
    Multi-Thread
    Message Queue, Memory Cache
    Facebook, Twitter
的一些tech talks

Coding
1.
问问题,理解题意,弄清楚输入、输出、流程,磨刀不误砍柴工
2.
多想几种解法(brutal force开始),简单例子,test case,画图 510分钟
3.
与面试官交流想法     2分钟
4. Pseudo code
在草稿纸上 , 分成子函数,模块化,将复杂问题交给子函数
5. Real code 
在答题板上          1020分钟
6. Verify,
检查错误,特殊条件,边界条件  5分钟 

OO Design
1.
需求分析,问问题,列出input, output, use cases
2.
讨论性能要求和Specification, 讨论不同方案trad-off, 方便读还是方便写, 
push
还是pull来发送更新
3.
分析流程,将用use cases转换成use scenario, 可以用(Given, When, Then)关键
词描述
    eg:
取款流程
    Give a person has a bank account with balance 100
    When the person withdraw 30
    Then the balance will be changed to 70
4.
根据use scenario设计data model
   
将上面例子中的名词抽取出来作为对象或属性,动作抽取作为方法
     class Person{
          long personId;
          List<BankAccount> accounts; 
     }
     class BankAccount{
          long accountId
          double balance;
     }
     class AccountService{
          boolean withdraw(long personId, long accountId, double amount){}
          double deposits(long personId, long accountId, double amount){}
          double getBalance(long personId, long accountId)
     }
5.
然后考虑高并发情况下,如何提升Scalability. 可以往LoadBalance, Partition/
Shading
cache等方面考虑, 讨论各种方式的优缺点

项目准备,选一个自己从头到尾做过的项目,先准备一个简单介绍,然后根据根据下面
6
点准备具体内容
1. Most challenging:  complexity legacy system, no testing, scalability
2. What you learn:   unit test, decoupling, gray deployment
3. Most interesting:  automatically test framework
4. Hardest bug:  race condition /  dead lock
5. Conflict with teammates: configuration migration
6. Failure: full dial up cause big issue // don't be too optimist // be 
careful all the time 


面试题
1. Find influencer, BF n^n, optimize to O(n)
2. sqrt(double x, double dlta)  lg(x/dlta), m+dlta??, m - dlta??
3. Design a Message store system  (in-memory storage) [seq_id, len, data] 
chunk
4. Design monitoring system, circular array, storage, aggregation 
5. Hiring manager, Project description
6. Design a key / value system, put, get, delete (copy on write)

1. Longest increasing sub-array?  O(n), better than O(n)
    Design a dropper box system.
2. Sort by type and timestamp
    Num of routers
3. (startTime, endTime, load), find max load in a certain 
4. Coding program to record event count
5. Largest summary in sub-array
    Design tiny url

1. Present project
    Copy Linked list with node point to other
2. Boogle, Trie
3. Design a feeds system, write and query
4. Find longest sub-array with sum to K 

Update: 有人问key - value的设计题,这是我的一些理解,欢迎大家讨论指

这是一个很有意思的题目,主要是考高并发下的key value存储系统,我一开始从
distibute hash
入手,讲了讲分布式存储系统,类似 Dynamo. 后来面试官让我设计单
服务器上put, get, delete, update。可以借鉴GFS,比如以64K为存储块(block),
储块大小可以和面试官讨论,如果存储的value比较大,就用大的存储块(GFS64M)
在内存中维护一个Index(Key -> Block), 每次读写操作以存储块为单位,
1. Put:
在内存中写,写满64M,写入硬盘
2. Get:
根据Index找到对应存储块,如果存储块不在内存,从硬盘中读出,按LRU更新
内存中存储块,然后块内顺序查找
3. Delete: 
直接从index上删除key,后台运行一个垃圾回收的程序,专门负责清理,
合并存储块
4. Update
Copy on Write, 先将原来的值copy出来存入新的块,update完成后
update index
,这样可以避免读写冲突的问题。原来的内容会被垃圾回收处理

No comments:

Post a Comment