FB hr电面onsite全面挂经,批评坑爹面试官

准备了近三个月的FB最终还是挂了,可以说是准备的相当充分,可惜被加面的面试官坑了。呵呵,我能有什么办法

HR面试:
聊了下实习经历,经常用HiveQL和Python,HR很喜欢。
同样的SQL简答题:

  1. default ordering: ASC
  2. count distinct
  3. left join
  4. 啥题忘了

电面:
华裔面试官很靠谱,考的spam原题。后来我才知道是原题,table都一模一样,这还面个毛?不过现场写出来了,写完SQL问怎么建一个model识别spam post,就一个很简单的binary classifier

  • 要考虑文字本身的信息,可用sentiment classifier找推销/诱导语气很强的,output作为feature。当然可以用RNN,但没时间扯RNN,就没提到。
  • 考虑post metadata:发表时间,是否反复重复,有没有带有链接outbound link,特别是去不安全网站的
  • class inbalance问题:false positive比false negative严重,把正常用户的帖子删了,后果比漏掉一个spam要严重。解决方法:1. 直接修改cost function 2. 用bayes rule预测cost数学期望最低的class。(别用upsampling, downsampling就行)
  • 怎么衡量是否work:我没说AB testing,最直接的显然是看reported spam是不是变少了,然后看predicted spams和人工识别出的spam的交集。这个算法不可能完全自动化,只要不是100%铁定的spam就一定要有content reviewer把关的。衡量这个model的价值应该从对content reviewer减负的角度出发.

店面
第一轮quantitative analysis
newsfeed广告原题,两种投放方式:(1) 4%概率把一个post替换成广告; (2) 每25个post里随机选一个替换成广告。问在100个newsfeed post里:
a. expected number of ads: 都是4,我愣了一下,感觉这题可能有诈(没看面经不知道是原题),其实没有。
b. variance of number of ads: (1) 就是Beoulli random var, variance np(1-p), p=0.04。 (2) 是个deterministic algo,variance = 0
c. probability of seeing more than 8 ads in 100 posts, (1) 就是个summation取补给;(2) 概率为0
d. expected number of ads collision, 就是连续两个post都是ads。等于是有了个新的Bernoulli process,概率p=0.04^2. (1) 有99个地方可以有collision,期望是99p。(2) 只有三个地方可以collision,期望是3p。
e. 哪种方法对用户体验好,显然(2)好,衡量标准是连续两个ads让人很不爽,要尽量避免。这题的实质是stratified sampling的变式,控制collision variance。
回家以后仔细想了下,发现没考虑collision是否independent,写了个模拟发现自己没算错,相邻两个点是否出现collision是同时决定的,所以independent。模拟代码见我github

概率题全秒了。然后考AB testing。给了三个confidence interval要做分析,我一激动把confidence interval公式写错了,眼看不对直接手画sampling distribution做分析。考confidence interval的意义是什么,注意别说得像个bayesian就行(可参考我的medium文章详细解析)。问interval很宽是为什么,因为standard error高,为啥高?user segment对treatment的反应不一样,两极分化呗。会有什么outlier:bot user, inactive screentime。怎么处理:truncate tails, 或者用Winsorized mean.


第二轮applied data
考的是instagram restaurant recommendation原题,一开场就坑爹了。远程面试,摄像头是固定电视上的,位置很低,而且拍不到白板。我只能把整个电视给移了,然后跪地上写白板!shadow在一旁舒服坐着,我在地上跪了30分钟,基本没法写字,也没键盘打字。建议遇到这种情况可以直接抗议换房间!(我找HR抗议争取到了加面,结果加面更坑)

总之发挥的很一般。先做feature engineering,分demographic和behavioral两类,demographic包括人种,地域。behavioral包括点赞记录,阅读记录等,还有和朋友的互动。朋友的记录也可以作为参考,特别是close friend,因为出去吃饭一般是和朋友一起吃的,不是只考虑自己。后来没时间聊AB testing了,草草收场。


第三轮SQL
考的很简单,就一个表,甚至不用join。表是记录advertiser每天付的钱,然后有一列表示advertiser是否是banned了。
第一问:昨天百分之多少的正常advertiser是活跃的(有付钱)。我用的mysql, 可以直接sum。面试官说没问题。其他sql server必须要求case statement。
SELECT
ROUND(SUM(spend > 0 AND status != “banned”) / SUM(status != “banned”), 2) AS active_pct . From 1point 3acres bbs
FROM table
WHERE date = DATE_SUB(CURDATE(), INTERVAL 1 DAY);

第二问:昨天有多少被封了。注意是昨天被封的,不包括昨天以前被封的。可用window function或者self join,结果一样,但self join必挂,为啥?因为self join condition里面要带方程比较日期的,浪费时间。
注意有个edge case是昨天新注册的当天就被封,这种情况lag得到的是null。
然后window function在WHERE之后生效,所以WHERE要选择两天的记录,如果只选一天,那lag就全是null了。

WITH recent AS (
SELECT id, status, LAG(status, 1) OVER (PARTITION BY id ORDER BY date) AS pre
FROM table
WHERE DATE_DIFF(CURDATE(), date) BETWEEN 1 AND 2
)
SELECT SUM(status = “banned” AND (pre != “banned” OR pre IS NULL)) AS recent_ban
FROM recent;

两题都秒了,交流的很顺畅。最后问了个qualitative的,如果让banned账户申诉重启,怎么衡量经济利益。就给回复的账户一个独立的status,比如resurrected。然后每天看resurrected账户贡献的利润所占总利润的百分比就行了,不用写sql。


第四轮product sense
印度小哥给我面的,开始怕被坑,结果这轮是发挥最好的。考的是衡量Facebook group的健康程度,不是衡量一个group,是衡量所有的group,

  • 定义metric,(weighted sum of # interaction) / (# groups)。interaction包括评论,post等。小哥指出可能有问题,我说没考虑group大小,一视同仁了。小哥说没错,怎么解决。我提议把分母改成(# members),但这样的metric很难interpret,因为估计会很接近0了,而且同一个用户加入多个group会double count。于是提议按group size分strata,大组和大组比,小组和小组比。小哥很满意。
  • AB test用Reddit的hierarchy comment,是否提高engagement。首先分析用户需求,如果@对方很频繁的话就显然有需求。然后设计实验,metric就用上一问的衡量engagement,分experiment & control groups要按cluster来分,不能按用户来分,而且cluster之间用户的friends overlap要最低,不然无法保证independent。然后问实验多久,就套公式算sample size,然后考虑novelty effect,learning effect之类的非理性行为的话至少要保证2星期的实验时间,小哥很满意,说totally valid。
  • 还问了ads之类的,衡量经济效益。我直接把balance ads matching algorithm写了出来,小哥一看没有多问。时间也差不多了就和我聊起了bootcamp,说FB生活如何幸福滋润。

加面

两周后安排加面applied data,面试官是economics phd。问的是回到两年前,FB没有15,000 content reviewer的时候,如何衡量fake news问题的严重性。我一看就乐了,一不要建模,而不要ABtest,随便聊聊都能过吧。我分两个角度衡量

  • 估计scale of problem,可通过stratified sampling看看各新闻类别中fake news的比例,没有content reviewer就只能unsupervised learning,用个pretrained RNN把新闻给整合成hidden state,然后给hidden state分成cluster,手动标识每个cluster的类别(政治新闻,娱乐新闻等)。面试官又说有conent reviewer,我就???有的话早说啊,直接stratified sampling给新闻分类取样,看有多少假新闻就行了。
  • 另一方面估计impact of problem,就是对用户的影响。最直接的就是看损失多少活跃用户,先定义什么叫活跃什么叫churn,一个月不上线就算churn了,所以我们需要一个月的记录来获取label (1: churn, 0: active),然后把一个月之前的数据提炼features,features种类分demographic, behavioral就不多说了,但这里重要的是要加上他们和fake news互动的feature,比如comment, share, like news that turned out to be fake之类的。怎么分别用户的损失是fake news导致的?先run full model,预测那些人会churn,然后把fake news feature去掉,预测哪些人会churn,两者之差就是fake news导致的用户损失。这个最好用tree ensemble model实现,课用logistic regression做baseline,面试官说logistic regression is fine,又问了我如何interpret coefficient,直接影响log odds,正数正相关,负数反向关。

一看就是面试经验不足,题目的constraint自己都理不清,一会儿说没有content reviewer一会又说有。你要是先说有content reviewer再说没有还能理解,因为constraint更难了。但你要先给我restrictive constraint再给我loose constraint我就不理解了。然后logistic regression问我what is the equation,我把logistic function给他说了一遍,感觉他压根问的就不是这个,也不知道自己问的是什么。最可笑的是model训练完后我说给整个用户群体做预测,他问我这一步怎么搞?feature都有了,同样的SQL code给所有用户跑一便,然后sklearn调用predict不就完事了么。

很无语,这面试官给人感觉没任何Data Science经验,找人就喜欢找smooth talker给他babysit从头到尾乐呵呵的就行。最后几分钟我问他有没有feedback,他给我一句"it’s very difficult to tell from interview whether someone can do his job" 我心就凉了,这明明是你的问题好吗?两天以后收到拒信。找HR问冷冻期多久也不回我了,果然一旦没了经济利益,我什么都不是。