显示标签为“facebook”的博文。显示所有博文
显示标签为“facebook”的博文。显示所有博文

2022年2月16日星期三

Facebook 工程师文化独特之处

我在 Facebook 工作了 7 年,结合 Facebook 之前和之后的其它公司的经验,我觉得 Facebook 的文化有些独特的地方值得分享一下。尽管我说了「独特」,这不代表其它公司绝对不会这样做,有些公司有相似的文化,有时候相似的文化用力程度不一样得到的结果也不一样。

工程师对产品结果负责任

我见过很多互联网公司只看工程师产出的技术成果,实际产品结果或商业结果在考评中占的比例很大。Facebook 从高级工程师开始,考评主要看对产品结果的产出,而且有时候非常数据驱动。

考评只看技术的公司,或者是 Facebook 没到高级工程师的级别,只要把技术做极致了就行,产品得不到提醒,公司的商业没有变得更成功,工程师都不用负责任,锅可以甩给产品经理。一款新产品一个新功能做出来,代码可靠从不崩溃,性能优化做足从来不卡顿,界面跟设计师出的图完美吻合,等等等等,工程师就算是优秀的工程师了。如果团队的目标是提升用户留存率,这个技术上完美的新功能发布后留存率不仅仅没有上升还下降了,工程师不需要负责任,考评受罚的只有产品经理。

这种模式的问题是工程师和产品经理目标不一致,更容易产生利益冲突。工程师说「我就是要做这个技术上这么复杂的项目,否则晋升委员会觉得我技术不够不让我晋升」,产品经理说「这个项目消耗你很多时间还不太可能提升产品留存率,同样的时间你可以做好几个有可能提升留存率的功能了。」在极端情况下,这会让双方对立。我在百度时就见过一个例子,只是把工程师换成设计师:设计师说这样设计好,产品经理说那样设计好,双方都只是在利用主观判断说服对方,最后产品经理说「如果做你的设计,KPI 掉了你负责任;如果做我的设计,KPI 掉了我负责任。你想要对 KPI 负责任吗?」设计师立即闭嘴。

考评主要看产品结果的公司,把技术做到极致没用,产品完成指定目标才有用。如果团队的目标还是提升用户留存率,留存率提升了,达到预订目标了,工程师和产品经理(以及其它角色)都能考评过关,远超过预订目标的话还能获得奖励;留存率没有提升,或者是提升不够,工程师和产品经理的考评都会受罚。

工程师不能甩锅给产品经理,两者的目标高度重合。工程师知道,「产品经理指错路」不是借口,产品达不到预订的目标就要受罚。因此 Facebook 的工程师往往非常了解自己在做的产品的指标和数据,他们会花时间去看分析产品数据、阅读用户调研报告,而不是等待产品经理搞明白要做什么了再分配任务。如果工程师坚信产品经理指错路,那就必须自己找到正确的方向然后把结果做出来。没有结果就要受罚,可能是不及格的绩效,可能被炒掉,Facebook 不接受任何解释只看结果。

这种模式可以驱动一个产品团队坐下来好好合作,想方设法利用每一个成员的能力,因为只有这样才能达成目标。如果工程师觉得自己擅长做技术且只喜欢做技术,在这种环境下迟早被炒。所有人都在一条船上,要死一起死。「喜欢做什么」有时候就要给「什么必须要做成」让步,因为做不成船就沉了,大家一起死。

这种模式在自顶而下划分任务的公司不可能成功,只有鼓励自底而上解决问题的公司才能成功。自顶而下的公司,就如同只有船长有权向下发布命令,而且很多时候不需要解释命令的意图,所有船员都觉得自己只要执行命令就好,不需要关注其它人在做什么,不需要理解整艘船是如何运作的。如果船快要撞上冰山了,没有船员会觉得自己有能力和责任阻止船真的撞上去,因为只有船长知道船是怎么运作的,其它人只能无奈的等船沉没。

Facebook 的各级经理都鼓励下属自行定义「什么叫做成功」,如果经理觉得成功定义得合理,就放手让下属自己想办法把事情做成,不需要告诉下属「做什么才能成功」、「如何做才能成功」。如果产品团队主动提出「留存率增长 10% 叫做成功」,只要经理觉得这是对公司合理的贡献,产品团队自己想办法把留存里提升 10%。这样做才能要求产品经理和工程师一起对产品结果负责任,因为「当初是谁定义成功就是留存率增长 10% 的?」

基础架构被视为内部产品

有一些公司会强行在内部推广自己的基础架构。基础架构要进行不向下兼容的升级时,所有内部用户必须派人负责升级。据我所知 Google 就是这样做的,例如说 Google 的某个基础架构服务要从 1.0 升级到 2.0,但它们的 API 是互补兼容的,那用到这个服务的所有团队都必须安排工程师负责更新自己的代码,改为调用 2.0 的 API,否则 1.0 一旦下线这个团队就无法使用这个服务。

Facebook 正好是相反的,基础架构在一定程度是也被看作是产品,只是用户是内部用户而已。那作为产品,当然自己要想办法找到自己的用户,自己要想办法把用户留住,自己想办法扩大用户基数,等等等等。一个新的基础架构出来,没有名气,没有成功案例,必须自己想办法推广和招揽用户。潜在的客户可能说,「你这东西看起来不错,但我不是很确定用了是不是真的对完成我的目标有帮助,我也没空学习和使用你的东西」。遇到这种情况,Facebook 的基础架构团队就跟外面的 SaaS 服务提供商一样,要想办法讨好用户,例如说「没关系,我们团队派专人来帮助你们学习和使用我们的东西,觉得好用的话你们接着自己维护,不好用的话也不浪费你们资源」。

当初 React、React Native 等技术出来时也经历同样的过程,在没有名气之前作者就要想办法推广、说服别人来用自己的东西。外面只看到它们发布时的光环,没看到早期推广的各种困难。2016 年我曾经负责调研 React Native 是否适合用户增长部门使用,因为用户增长主要靠做实验,实验周期受客户端升级周期限制,React Native OTA 升级可以突破客户端升级周期限制。在我做完调研后,我给了大大的一个「NO」,因为 Facebook 主要的用户增长来源自 Android 而当时 React Native 的 Android 版性能(加载速度和内存消耗)实在是不行,和内部其它服务的整合也满地是坑。

基础架构不仅仅新品需要推广,升级也需要推广。「你们出个 2.0 跟 1.0 不兼容?我们一个高级工程师需要花三个月时间改写我们的代码才能兼容 2.0?那我们不升级了。你们准备准备暂停 1.0 的服务?没关系,我们自己出机器,我们自己跑一个 1.0 的实例,反正公司内所有组可以访问所有代码。你们准备把 1.0 代码改得面目全非?我们现在立即 fork 你们的代码!之后我们自行维护一个 1.0 的 fork。」

不向下兼容的基础架构升级往往还是要想方设法讨好已有用户。「你们可以继续用我们的 1.0 服务,但 2.0 性能更好哦。你们组的目标不是转化率吗?你们之前也做过实验,证明了转化率和性能高度相关,提升性能就能提升转化率。我们来算一下,提升这么多性能就能提升这么多的转化率,这绝对值得你们一个高级工程师花三个月来做啦。」工程师既要做销售又要做客服,实在不容易。

既然基础架构被视为内部产品,那产品有的压力基础架构也有。新的基础架构如果在一定时间内无法获得充足的用户,那就很可能被要求终止。已经垄断内部市场的基础架构也不能松懈,如果服务不稳定,内部用户不开心,他们会用脚投票。这些用户团队可能会自己做一个仅适用于他们的服务来取代你的基础架构,也可能有其它人做一个跟你竞争的基础架构然后趁机挖你的用户。

救火比防火更容易获得回报

Facebook 的文化有优点也有缺点。因为公司非常数据驱动,考评倾向于用数据说话,没有数据等于没有干活,完全不看你有没有苦劳,这导致防御性措施很难吸引人去做,因为成功阻止了坏事发生时你没办法收集数据说你成功阻止了多少件坏事、它们可能有多坏。

喜欢写测试的工程师进入 Facebook 往往会因为多写测试而受到惩罚。「你能证明这些测试实际带来的好处吗?你能量化这些好处吗?不能的话你还不如去做新功能,至少新功能能帮助提升产品指标。」不能量化的事情在 Facebook 是很难吸引人去做的。很多工程师技术非常好,但用数据讲故事的能力不行,这种事情就没办法做。

懂得用数据讲故事的话,好像测试这种不能直接量化的东西,可以找参考数据间接量化。「我们分析了去年的每一次事故并且确定其中 n 次是可以被测试防范的,考虑到今年我们团队多了 50% 的人,如果有测试的话我们今年可以防范了 1.5n 次事故。」如果经理认同这种推理的话,你就可以安心写测试了。(如果真的有人明年回来分析今年的事故的话,你最好能证明其中没有一次事故能被测试防范。」)

这种间接量化还是必须等坏事发生过了才能使用,如果你在坏事尚未发生之前就成功阻止了这一类坏事的发生,你没办法证明你工作的价值。这就导致了一个很不好的现象,我往往用以下的比喻来解释:

假想你是一个小镇的消防队队长,你四处去检查镇上有没有违反消防规范的地方,有你就叫负责人整改。这个小镇上所有人都狠你,见到你来检查消防就叫你滚,因为你给大家制造麻烦而没人觉得这些麻烦带来了任何好处。小镇的商户联合起来说每年这百分之几的成本都是你造成的,没有你的话就能有更高的利润。

在消防队队长这个职位上,你只能默默地等待火灾发生。一个房子烧着了你还不要着急去救,救了大家就会说「火灾的损失也很有限嘛,不知道花那么高的代价去防火」。你利用这个时间着手准备灭一场大火。等房子烧了一片了,小镇居民在路上奔跑呼喊了,你就去救火吧。(当然这一切的前提都是你真的有能力救火。)之后你要颁布什么新的消防规范,所有居民都会主动配合。

这就是为什么 Facebook 内部那么多问题处于起火状态,因为不起火就没有救火英雄。

2018年4月22日星期日

如何把 Blogger 文章导入到 Facebook Instant Article

Facebook Instant Article in Pages Manager

如果你跟我一样还在用 Blogger 这么远古的工具来写博客,同时又想追赶一下 Facebook Instant Article 的潮流,那你可以跟着我这篇文章做一遍来把 Blogger 的文章导入到 Instant Article。

启用 Instant Article

假设你跟我一样已经有一个在用的 Blogger 博客了,你不需要在 Blogger 上做什么改动,直接开始注册 Instant Article 就可以了。打开 Facebook Instant Article 的入口页面,然后点击注册。Facebook 会问你要为哪个 Page 启用 Instant Article,你选一个就是了。我用 Cat Chen Posts 这个页面来导出我所有的 Blogger 文章,所以我就选择了这个 Page。如果你还没有 Page 的话,可以先创建一个,因为没有 Page 是不能创建 Instant Article 的。但只要在 Page 上把一篇文章转化为 Instant Article 了,之后在个人帐号分享这篇文章的链接也会显示为 Instant Article。

关联域名

接下来你需要跟随 Facebook Instant Article 的配置工具来一步一步完成配置。首先,你要把自己的 BlogSpot 网站关联到你的 Page 下面来。Facebook 会让你把这样一行加到你的 BlogSpot 模板上:

<meta property="fb:pages" content="{page-id}" />

每一个具体 Page 的 {page-id} 都不一样,你复制粘贴 Facebook 配置工具上显示的那一行就可以了。把这一行复制下来后,你可以去 Blogger 里配置 Theme,选择修改 HTML,然后把这一行贴到 <head>...</head> 里面。之后把你 BlogSpot 的域名填到 Facebook 配置工具里去,Facebook 就会抓取你 BlogSpot 的首页并且进行验证。(如果你之前在 Google Webmasters 之类的服务做过类似的域名认证操作,这一步应该很容易。)

导入 RSS

接下来要把 Blogger 的 RSS 导入到 Facebook。如果你的 RSS 没有搞过什么花样,这是非常简单的事情。但如果你像我一样在 RSS 上做过各种优化,那这一步可以很复杂。

FeedBurner

如果你像我一样启用了 FeedBurner,你会发现 FeedBurner 导出的 RSS 可能是 Facebook 不愿意接受的格式,因为 FeedBurner 的优化加了太多东西进去。(但如果不加任何优化的话,Facebook 是可以接受的。)你可以使用 BlogSpot 自带的 feed,但既然你用了 FeedBurner 你很可能跟我一样让 BlogSpot 把自带的 feed 重定向到 FeedBurner,这时候如何才能获取到 BlogSpot 自带的 feed 呢?关键在于 querystring。以我自己的 feed 为例:

http://chinese.catchen.me/feeds/posts/default?alt=rss&redirect=false

加上 ?alt=rss 会强制输出符合 Facebook 期望的 RSS 格式。加上 ?redirect=false 或禁用 FeedBurner 重定向。两者都用上,就能让 Facebook 得到一个它能够解析和接受的 RSS。

合并多个 RSS

我用有多个 Blogger,因此我有多个 RSS 但 Facebook 只接受一个,这怎么办呢?这个问题可以用 RSS Mix 解决。把多个 RSS 的地址输入进去,它会生成一个 RSS,然后把这个合并后的 RSS 给 Facebook 就可以了。

提交审核

搞掂 RSS 后,就可以把 RSS 地址交给 Facebook 了。直接填进去 Production RSS Feed 是没问题的,将来要测试新版本的 RSS 可以用 Development RSS Feed。如果 RSS 里面已经有至少 10 篇文章,那就可以提交审核了,否则还需要写满 10 篇文章才能提交审核。

我把博客提交审核时没有遇到任何问题,但因为审核这个事情因人而异所以很难说你会不会遇到什么问题。如果遇到问题的话可以根据 Facebook 的提示进行修改。审核一旦通过了,你就可以把 Production RSS Feed 里面的内容发布为 Instant Article 了。

发布 Instant Article

尽管 Facebook 从 RSS 中读取了文章,但并不会自动把 Instant Article 发出去。你需要去 Production Articles 里面查看 RSS 导入了的文章,然后把你想要发布的发布出去,不发布的话它们会当作草稿一直存着。

在发布之前,你可能会看到某些文章标题旁边有个感叹号,那意味着 Facebook 在解析这篇文章时遇到了问题,不解决这些问题这篇文章就无法被发布出去。这时候你需要做的事情就是编辑文章 HTML,然后把问题都解决掉。具体哪些问题会出现,要看你在 Blogger 中使用的 HTML 有多复杂。尽管 Facebook 使用的 Instant Article 格式也是 HTML,但其实只是一个 HTML 子集,如果你使用的 HTML 超出了这个子集 Facebook 就会尝试进行调整,如果调整后还是有问题你就会看到那个感叹号。

我最常遇到的问题是图片嵌入在段落内。Facebook Instant Article 规定图片必须放在 <figure>...</figure> 里面,如果你在写作时只是用了 <img />,那 Facebook 就会尝试智能地在外面包一层 <figure>...</figure>。但如果你原本的 <img /> 是嵌套在 <p>...</p> 里面的话,那 Facebook 处理后就会变成了 <p><figure><img /></figure></p>。由于 Instant Article 中的 <p>...</p><figure>...</figure> 是互斥的,只能是平级关系,不能互相嵌套,所以 Facebook 就会报错。(错误信息还很奇怪,Facebook 会告诉你元素内没有文本,但其实意思是 <p>...</p> 内不能嵌套 <figure>...</figure>。)解决的办法很简单,把外面那层 <p>...</p> 去掉就可以了。

除了上述问题外,你还可能遇到其他跟 Instant Article HTML 子集不兼容的问题。Facebook 提供的错误信息不一定容易理解,但自行搜索一下总能找到答案。只要把问题都解决了,文章就能够当作 Instant Article 发布了。

测试 Instant Article 效果

最简单的测试方式是用 Facebook Pages Manager (iOS | Android)。在里面打开自己的 Page,如果看到文章下面有个 Instant Article 的闪电符号那意味着文章成功发布为 Instant Article 了。点击进去就能看到文章以 Instant Article 渲染的样子,如果跟自己想要的样子不一样可以回去继续修改 HTML。这篇文章开头的截图就是来自 Facebook Pages Manager,里面显示的是我之前一篇文章的 Instant Article 版本。

2014年3月10日星期一

Facebook 发布「流程」

时不时就会在面试过程中碰到有候选人问 Facebook 是否采用 Scrum 之类的敏捷方法,偶尔也会有中国的朋友问及 Facebook 上线流程。我通常会简单说几句,然后说「如果你真感兴趣的话,去搜索 Chuck Rossi 在 Velocity 2012 San Fancisco 演讲的视频」。无论从 Scrum 的角度来看,还是大多数中国公司的上线流程来看,Facebook 的发布流程都显得很不一样,但其实又非常合理,看完那个视频你就明白了。尽管里面提到的内部工具都没有在 Facebook 的 GitHub 上开源,但那些截图已经足够清晰说明其功能和用途了。

工具固然是重要的一方面,但我觉得更重要的是文化。我知道很多中国公司的上线流程都涉及各种签字,例如我在百度的时候上线就需要 RD、FE、QA、OP 等众多角色签字,有时候还需要对应经理甚至总监签字。相对这种上线流程来说,Facebook 的发布流程简单得很反流程,这也是我为标题中的「流程」二字加上引号的原因。考虑到我之后会专门写一篇文章讨论文化,所以在这里就不深入展开了。

至于工具,最重要的就是通过引入自动化来解答一些简单但涉及大量手工操作的问题。例如视频当中提到的,「一个 PHP 异常是由哪个 commit 引入的?」在没有工具的情况下,这只能手工 git bisect 来查找。万一这个异常不是稳定复现的话,那基本上就没办法定位到 commit 了。Facebook 的工具能自动把异常堆栈跟踪里面每一帧和 git blame 关联起来,再用异常发生频率的历史图谱跟 commit 合并时间做对比,很容易就能得到答案。

最后,如果你看完这个视频觉得还不满足的话,可以去看看 Jay Parikh 在 Velocity 2012 Santa ClaraGirish Patangay 在 Velocity 2012 London 的视频。

2012年11月3日星期六

面试体验:Facebook 篇

GoogleMicrosoftYahoo 都是去年的事情了,接下来说说今年的吧。其实我在豌豆荚非常爽,跟身边的设计师和工程师合作都很愉快,所以唯一能够诱惑我去面试的就只有 Facebook 了。最初接受 Facebook 面试邀请的原因并不是追求它的 offer,而是我就想了解一下 Facebook 是怎么面试的,有什么是值得豌豆荚招聘借鉴的。

过去在百度做面试官,只是面试而已,公司招不招得到人我没什么感觉。我觉得公司招不到人就招不到人咯,我们没必要扩张得那么快啊,先专注于做好手头上的项目再说嘛。豌豆荚其实不是着急要招前端工程师,我们还是坚持只招一流人才,只不过长期发不出 offer 还是让人感觉招聘有问题——我们浪费了大量的资源在面试上,发不出 offer 意味着回报率低,因此我们总要想办法研究如何提高回报率。

回到正题上来,我选择参加 Facebook 的面试,就是想看看他们是如何选拔人才的,他们所使用的题目是如何设计考点的,是不是设计得比我们的要好。因此,在收到 Facebook HR 的邮件后,我回信说愿意聊一下,然后跟他约了一个时间进行电话沟通。因为 Facebook 总部在美国西岸,所以之后的电话沟通和电话面试都约在了早上 8:00。尽管这导致他们要晚一个小时下班(按朝九晚五算的话),不过 HR 也很通情达理地接受了。(我猜大多数工程师都不会采用朝九晚五的正常作息时间吧。)

HR 在电话里先简单介绍了一下 Facebook 现在的情况,然后说明这是 Menlo Park 总部的职位,让我确认如果顺利应聘的话我会愿意到美国去。接着 HR 问了我两个很基础的 CSS 问题:display block 和 inline 有什么区别?position 有哪些取值?我觉得 HR 能够问这样的问题对于工程师来说是很爽的事情,因为纯粹的小白就被过滤掉了,也不需要浪费工程师的时间来面试。(我在之前的文章中说到过,在中国大多数面试前端工程师职位的候选人无法回答这两个如此基础的问题,不知道在美国是否也如此。)随后 HR 问我还有没有什么不明白的,或者关于 Facebook 想要了解的,我说没有了。HR 的最后一个问题是「你为什么选择 Facebook?」我当时心里想的是,「是你主动联系我的,我没想过这个问题哦」。于是我跟他说,「我暂时没有答案。我现在在豌豆荚工作很开心,不过我也乐意多地了解 Facebook。」

电话沟通后,HR 给我发了两道 puzzle,选做其中一道就可以了。两道题目都是前端相关的,其中一道需要设计一个简单的算法,另一道则需要支持移动设备触击交互。这种解 puzzle 的面试方法我不是第一次遇到了,4 年前申请 Google 的 Web Developer 职位时也遇到过类似的 exercise,只不过题目只有一道,没有选择的余地而已。相比起 4 年前 Google 的 exercise 而言,这两道 puzzle 的考点更加 update。(4 年前的 exercise 还需要考你如何做圆角和背景渐变,现在都是用 CSS 3 搞掂的了。)

我花了一周的时间完成了一个 puzzle,搞掂了算法设计和界面实现,连 unit test 也都写了,然后提交给 HR。HR 在 review 的结果出来后,把我介绍给另一位 HR,说她会帮我安排接下来的面试。第一轮面试感觉有点像 Google 的,主要由 3 道题目构成。题目的考点设计得很好,基础知识能被覆盖到,常用技法也需要用到,但又绝对不需要某一方面很高深的知识。(设计得不好的题目往往是依赖于面试官很熟悉的一个难点,如果你不知道这个难点,或者你的理解跟面试官不一样,你就完蛋了。)

第一轮面试的最终通话时间为 90 分钟,我猜这意味着我做得不够好,因为如果以 Google 的标准来衡量的话,45 分钟解 3 道题才算及格。经过后面几轮面试我才发现,原来 Facebook 面试一般是要求 60 分钟解 2 道题。第一轮的面试官之所以给我加了 1 道题,估计是因为第 2 道题我做得不好,所以他相当于换了一道题给我做。面试结束,面试官又问了之前 HR 问过的问题,「你为什么选择 Facebook?」我还是那样子回答。

面试一个星期后,HR 邮件跟我说,我通过了上一轮面试,接着要安排下一轮面试。第二轮面试感觉跟第一轮差不多,包括长度和难度。只不过这次就是 60 分钟 2 道题,估计是因为我 2 道题都解出来了吧。面试结束时面试官又问那个问题了,我决定反过来问他是否喜欢 Facebook 的工作。他说 Facebook 的工作很好,周围的人都很聪明,能够从他们身上学到东西,同时公司提供一天三餐,福利好到觉得自己被宠坏了。我其实不是很在乎福利的部分(豌豆荚又不是没有一日三餐),我更在乎的是人是否聪明,合作的过程中他们是否总能教会你一些你过去不知道的事情(这是我现在在豌豆荚拥有但离开就可能失去的部分)。随后我跟他说,我在乎的是能否跟聪明人一起工作,听他这样说感觉 Facebook 不错。

又过了一个星期,HR 邮件跟我说,需要安排我到美国面试。我一开始对这件事也不特别在意,觉得那你就慢慢安排吧,有人报销机票让我到湾区旅行就是好事情。在随后的电话沟通里面 HR 跟我说,因为今年的 H–1B 签证配额已经花出去一半了,如果按照这个速度估算的话可能到 5 月底签证配额就会花完,所以希望我尽快到美国面试。(如果签证配额花完了,有没有 offer 都没意义了。明年 4 月才能申请明年的配额,申请成功也要等明年 10 月签证才生效,就算公司很想要你,也只能先安排你在海外办公室工作一年。)于是我就连忙办签证 5 月下旬飞往美国参加面试,因此也就有了我之前那篇《三藩市湾区一周游》。

4 轮面试安排在一天内完成,Facebook 委托旅行社安排好往返机票和两晚住宿,随后我就出发了。因为害怕迟到,又因为美国郊区的公交又是一小时一班的,所以面试当天我早早就起床了,结果发现酒店门口是长期有出租车的,打车到 Facebook 后等了一个多小时才到原本约定的面试时间。HR 在见到我后先把我带到 micro-kitchen 让我拿吃的喝的,并且问我那么早来是不是没有吃早餐。我说确实没有,然后她就让我拿一些食品做早餐。(其实我应该在酒店叫早餐的,因为 Facebook 允许每天报销最多 $75 的餐饮开支。)随后她把我带到用作面试的会议室,给时间我解决早餐,并且跟我简单说明了当天的安排:早上 2 轮面试,结束后她会来带我去 Facebook 餐厅吃饭,然后下午还有 2 轮面试。

总体上来说,4 轮面试的形式还是一样的,每轮都是 60 分钟解 2 道题目。所有题目都是前端相关的,HTML + CSS + JS 都会考到,不过不涉及 HTTP。最后一轮的面试官有点特别,他先问了一个很古怪的 CSS 问题,然后又跟我讨论了一个跟前端不相关的编程问题。之所以说他那个 CSS 问题古怪,是因为在现实中大家都不会那样写 CSS,但他写出来了问你会显示成怎样,不是非常熟悉 CSS 标准细节的人又很难完全答对(我也有答错了的地方)。至于第二道题,他说他是突发性想出来的,他自己也不知道最优解是什么,就是想跟我讨论一下能够如何优化,我就跟他讨论了几种可能的优化方式。所有他又说如果把常数 k 改为可以变成任意大的 n 怎么办?我就说 n 的问题能够分解为 n/2 的问题,因此能够通过二分法来优化。

通常情况下,如果由于面试而进入一家公司的话,HR 所做的只是把你从 A 地带到 B 地,保证你顺利完成面试。如果是朋友带你参观公司则会很不一样,他会带你去看有特色的东西,并且告诉你这个好玩那个有意思。Facebook 的 HR 给人的感觉更像是后者,她向我介绍 Facebook 墙上的涂鸦,带我去天桥上看 Hacker Square 全貌,并且告诉我每次 hackathon 开始时大家就会聚集到 Hacker Square 上来。除了 HR 以外,也有一些面试官会提及他们喜欢的 Facebook 特色。这让我觉得 Facebook 里面还是有不少员工挺喜欢这家公司的。

面试结束后,HR 跟我聊了一下,告诉我如果有 offer 的话接下来会需要什么。根据之前 Google 面试的经验,我猜 Facebook 会不会也要我提交一大堆的材料,HR 说只要提交申请签证所需的学位证就可以了。之后 HR 让前台帮我叫出租车,在等待的过程中前台还很好人地问我是否需要拿喝的,需要的话可以在大堂冰柜里面拿。

随后的周末是美国的亡兵纪念日,周六到周一连续放假三天,我则利用这个长周末去参加湾区的各种好友聚会。周一中午 HR 打电话来说要发 offer 了,待细节确定后下午再打电话给我告诉我具体的数字有多少。我当时就在想,难道 Facebook 的面试官和 HR 周末都工作?这个效率很高呀。只要面试官稍微拖一下,周五的面试就必须等到下周才能有结果。而且确定 offer 细节估计也要经过几个人审批吧,节假日发 offer 就意味着大家都要在节假日处理工作了。

总体上来说,Facebook 面试过程中对候选人的关怀做得很好,效率也不错。让我「大开眼界」的是面试题,原来真正好的面试题并不在于它有多难,而在于它有多简单,简单到熟悉这个领域的人一下子就明白到你在说什么以及想问什么。能够进入 Facebook 的人应该都觉得面试不难,至少跟中国的面试对比起来如此,那是因为 Facebook 把觉得面试有点难的人都过滤掉了,而中国那些很难的面试反而没什么区分度。

《面试体验》系列文章到此就结束了。接下来有时间的话或许我会写写跟应聘美国职位有关的事情,例如 H–1B 的周期和配额是怎么样的,选择什么时间面试对你比较有利,拿到 offer 之后该如何为新的生活做准备等等。我知道对于很多在中国读书或工作的人来说,直接应聘美国职位看起来门槛很高,那是因为你身边很少人这样做所以你不了解而已。只要你愿意花时间去了解清楚,你会发现这件事其实没有你想象中那么难。如果你对这个话题感兴趣的话,可以订阅我的博客,或者留言提问。


2012年8月18日星期六

孩子王?有孩子气才能为王?

以最快的速度看完了 Facebook 第 51 号员工的回忆录《The Boy Kings》。尽管是关于 Facebook 成长的故事,说的却不是跟技术或者投资相关的事情,这是因为作者 Katherine Losse 并不是一名工程师,而是一位英文硕士。她最初加入 Facebook 时是一位客服,后来负责过 Facebook 的国际化工作,最后成为 Mark Zuckerberg 的代笔写手,估计是离 Mark Zuckerberg 最近的非高管了。这种经历使得作者陈述故事的角度如此的与众不同,让读者也必须跟着反思「难道高科技公司就必须做得如此孩子气才能成功?」

作者最初加入 Facebook 时,就感觉到了工程师与非工程师地位悬殊。Zuck 的衷心欢迎是留给工程师的,客服根本不在 Zuck 的视线范围内。作者最要好的两位朋友分别是黑客 Thrax 和工程师 Sam,然而在作者任职客服期间,她的薪水和她的好友相距甚远,以至于每当工程师们自发组织出去享乐的时候,她总要想一想是否值得为了参加活动而节衣缩食几个月。

有一次 Thrax 和 Sam 去参加 Defcon(世界上最大的黑客大会),把作者也叫上了。因为 Thrax 是明星黑客,是这次行程的主角,所以他能报销各种开支。Thrax 入住酒店后的第一个想法是要在拉斯维加斯最贵的餐厅预定晚餐。Thrax 的第二个想法是,为晚餐买一身与之匹配的新衣服。作者说,「我们去 Marc Jacobs 看看吧」,Thrax 的第一反应是「那是谁?」作者忍住没笑出来,解释说「他的东西比较 cool,有点点 mod,你会喜欢的」,然后心想「估计他也不懂『mod』是什么意思」。在随后晚餐上,Thrax 穿着作者花了两个小时为他挑选的 Lacoste 衬衫,开了一瓶 $175 的红酒,三个人当中就只有他还不到合法喝酒的年龄。

Thrax 是明星黑客,同时也是个小孩子。跟大多数黑客一样,Thrax 是清晨睡觉下午起床的,于是在 Thrax 睡觉时作者就跟 Sam 找了个泳池晒太阳(他们总是耻笑其它不怎么出门的工程师「脸色苍白」)。等 Thrax 要作者帮他挑选衣服时,他就提出说「既然你们晒太阳时丢下我,这次买衣服能否反过来把 Sam 丢下?」尽管 Thrax 如同小孩子一样,希望有一段时间能够获得别人 100% 的注意力,但作者和 Sam 决定无视他这个请求。

作者对 Thrax 的看法,很多时候也是她对黑客文化的看法。一群黑客就如同一群孩子,收入不低却不懂世俗,而且还时不时耍孩子气。然而正是这样一群人,创造了 Facebook 这样的王国,于是有了标题中的「boy kings」,而 Zuck 当然就是「king of the kings」啦。

后来由于客服职位的发展空间有限,作者想要离开 Facebook。正好在这个时候 Facebook 发布了自己的开发平台,平台的市场推广需要人手,于是作者就加入了这个新组建的团队。Thrax 在知道这件事后跟作者说,「所以你现在能搬到工程师所在的楼层来咯?真无耻。」「你才无耻。」「反正没有人喜欢你,所以……」互相挑衅显然也是作者眼中孩子气的一部分。在平台市场推广短暂停留后,作者又被邀请去做 Facebook 的国际化工作。作为英文硕士,她喜欢语言和旅行,自然她选择了接受新的工作。

作者的新头衔是「国际化产品经理」,这意味着她终于成为工程部门的一员,也有了对产品的话事权。这时候作者才亲身体验到了工程师的生活方式:你可以工作到很晚,有时候也必须工作到很晚,因为这就是黑客特立独行的特质。你无需听命于权威,可以连夜编写突破性的天才产品(或者是在 Facebook 上挑衅别人)。同时作者也见识到了某些工程师对机械过程的迷信:Facebook 众包给用户翻译的词条偶尔会遇到多个翻译版本难以取舍的情况,某些工程师就坚信用户投票经算法计算得出来的结果一定是正确的。这时候作者就会站在这些工程师的对立面,坚持翻译结果必须经过人手审阅。

这种技术和人性之间的竞争一直没有停止过。工程师总想要把这个世界变得更加技术化,因为这才符合他们的理想。而作者作为一名女性,同时又是英文硕士,则希望更人性化一些。

作者的下一份工作是 Zuck 的代笔写手,专门负责用 Zuck 的口吻写博客。越是接近 Zuck,作者越觉得自己在公司里是个异教徒。为了工作需要,她可以用 Zuck 的思维方法进行思考和写作,但这也使得她更在意自己独立思考的能力,最终的结果就是她发现自己的想法跟 Facebook 的理想不一致。这是一家相信通过技术能够解决所有问题并且以以此为荣的公司,但作者却认为技术和人性只是解决问题的不同手段而已,没有优劣之分。公司想要通过技术手段解决一切问题,但这不是她想要的未来。

最后,作者选择了离开 Facebook,并且移居到一个无线网络慢到可以用「与世隔绝」来形容的地方来写这本书。在这本书里面,除了可以看到 Facebook 早期的一些趣事,还能看到技术质疑者眼中的技术革命是怎么样的。利用技术革命改变世界的人自然无条件地信仰技术,然而这一切并非如此无懈可击,换一个视角还是又很多地方值得质疑的。此外,尽管黑客拥有改变世界的能力,但他们那种希望永远年轻、不负责任、不受监管、无可阻挡的文化,在外人看来也有很可笑的一面。如果你正在做技术,并且你也坚信自己做的事情是无比正确的,那么你可以看一下这本书,怀疑一下自己的世界观。