本文为“我在谷歌弄啥咧”系列第十五篇。
大概两年前吧,我从谷歌跳槽了。当时我的职务是技术领导经理,在公司干了十七年。
要说我对这个决定信心百倍,那肯定是吹牛 B。老实说,我并不确定自己离开谷歌后还能不能玩得转。
要知道,谷歌是出了名的基建狂魔暨轮子发明重度爱好者。从编程语言到张量处理器 (TPU),从文件系统到操作系统,从云机器管理软件到数据中心,谷歌差不多由零开始构建了它用到的一切。所以,全部新员工(Nooglers)都必须经过密集培训才能上岗,因为谷歌用的技术和其他公司实在是太不一样了。
我在谷歌时听说,外面的程序员对我歌的基础设施羡慕嫉妒恨。我还听说很多前谷歌员工(Xooglers)一把鼻涕一把泪要找老东家,因为他们实在是太怀念在歌时日常使用的编程工具了。
想想看,我职业生涯的绝大部分时间都在这个特立独行的机构度过,到了没有谷歌内部工具的世界里还有哪个资本家愿意压榨我?我多年的歌式经验会不会在新环境下变成一坨肥料?我是否已经成了被养家的鸟,想要飞呀飞却飞呀飞不高嗷嗷?
细思恐极。
可喜可贺的是,两年后我还能写下这篇文章证明我还活着。
敲黑板:我发现我在我歌学到的技能大部分在新工作中一样好使。其中特别有用的有两条:
  1. 要是有件事大多数人都说做不成,不要听大多数人的,该出手时就出手哇,风风火火闯九州哇。
  2. 凡事从第一性原理出发,从本质上解决问题。
我来解释一哈。
谷歌不是一家常规公司。它的两位创始人一个大胆贼一个贼大胆,做事不讲分寸,以至于有时显得太天真。其实,嘿多谷歌员工也一毛一样的。这种撑死胆大的心态对谷歌的无数创新至关重要。作为早期的谷歌员工,我被鼓励跳出常规思维,无视常规智慧。如果一件事值得做但之前没人做成过,那就 Just Do It,而不是列举出一千个伤心的理由。
举个例子:我是 Google Mock 这个 C++ Mocking 框架的主要作者。Mocking 是一种软件开发技术,用于测试不同部件之间是如何交互的。一开始我没有做 Google Mock,而是捯饬了一个叫 gUnit 的 C++ 测试框架。gUnit 后来在开源时被改名为 Google Test,原因是 gUnit 的名字已经被几个唱 hip-hop 的黑人小哥用了。在推销 gUnit 时,我听用户抱怨在 C++ 里做 mocking 太难鸟。
当时主流编程界的共识是这个问题是无解的:鉴于 C++ 有静态类型检查而且缺乏反射机制(reflection),即便我们强行构建了一堆工具支持 C++ mocking,但解决方案也会过于笨拙,实际上没人会用。
这就是我被告知的情况。
然鹅!哥不是怕事的人。既然客户有需求,我倒是要看一看它到底难在哪里。我的经理马克对此亦有贡献。他没有说:“嘿,如果你在X个月内不能解决这个问题,就快点止损吧,这样你还能有些剩余价值。”
在这一点上,我站马克而不是马斯克。
你可能已经猜到了:我为这个“不可能”的问题提出了一个实用的解决方案(我甚至会说是一个优雅的方案)。它解决了一个在整个 C++ 程序员社区长期存在的难题。老实讲,我为这个成就感到非常自豪,以至于在内部发表小文章时署名“Zhanyong G. Mock Wan”。
这次经历相当令我满意,直接导致了我轻伤不下火线的性格,在转岗做经理后还是乐不思蜀地狂堆代码。
设计 Google Mock 时,我不是先搞出一个勉强可以工作的东西,然后修补它直到它变得“足够好”,而是像写博士论文一样处理这个问题。
我在用理论指导设计。
我希望我的框架有严格的语义。也就是说,看到一段使用我的框架的代码时,所有程序员都应该能够通过一套简单的规则理解它要做什么。没有这些规则,程序的意义将因人而异,一旦它比玩具示例更复杂,它的逻辑很快就会变得混乱和可疑。
这不是件容易的事,严格的语需要额外的努力才能达成,大多数地方都不这么开发软件,因为,偷懒谁不会呢?然而我知道,要创造出让我自豪的东西,我必须从用户真正需要的东西(不是他们想要的——用户通常并不清楚他们想要什么)出发,设计出一种能让他们直观表达意图的方法。
所以,我研究了程序员们在测试软件交互时真正关心的问题,用清晰的英语写下他们的需求,设计了一个嵌入在 C++ 中的 DSL(特定领域语言)来表达这些需求,并确保这个 DSL 读起来像英语,而且语义严格。我为这个 DSL 设计了形式化的语义,并证明了这些构造是健全的。最后,我找到了一种方法,用当时并不广为人知的 C++ 模板和宏编程技巧实现了这个 DSL。
我从第一性原理出发解决了它。我相信,要是不这么干我也会像前人一样死在沙滩上。
加入 Pinterest 后,尽管文化、技术、工程流程和工具都和谷歌都有不同,尽管我必须学习大量不熟悉的东西,我还是发现:只要我专注于用最直接和有效的方法去解决棘手问题,我就能迅速为公司带来价值。在如何解决问题这一点上,我不给自己设限,同事们也很重视我带来的新想法。这并不是说我总是自己从头开始构建一切。然而,如果我必须这么做,我也不怕。
幸运的是,公司给了我充分的信任和自由来解决问题,就像我在谷歌早期的日子一样。
今天,如果有人问我“你在谷歌学到的哪些技能在谷歌之外最有用?”,我会告诉他:
  1. 不要害怕挑战不可能的任务,
  2. 从本质出发,用第一性原理解决问题。
这些“元”技能,不像具体的技术、编程语言、工具那么狭隘,无论你走到哪里,它们都非常有用。
你怎么看这个问题?请在评论区告诉我。:-)
~~~~~~~~~~~~~~~~~~~~
猜你会喜欢前几篇《我在谷歌弄啥咧》:
~~~~~~~~~~
欢迎关注我的公众号:
本公众号不开赞赏不放广告。如果喜欢这篇文章,欢迎评论、转发、点“在看”。谢谢大家🙏
继续阅读
阅读原文