19个岗位, 85位工程师, 我学到了什么?

首先得说, 这篇文章里不谈华为. 我建数据库的时候, 华为已经面试完了, 对他们的记忆不是特别准确. 再说, 和华为的面试经历在各种意义上都够奇葩, 甚至可以单独写一篇吐槽文. 当年Ernest找工作要回国前, 我问他有什么建议, 他沉思了好一会儿, 然后跟我说了句, “别碰华为”.

当时我觉得也没啥大不了的, 就没听他的建议. 但现在看来, 如果硬要把华为也算上, 说我面试了15家公司, 那么整篇文章也就只能有一句话:”别碰华为”.

其次, 写一篇关于找工作的文章比我想象的难多了. 很多我想说的, 都已经被陈一枝的那个如何在地狱难度下找工作?说到了. 而且, 太多的面试经验和找工总结都在小红书、一亩三分地和微信公众号上流传, 如果我写个类似的东西, 只会是在浪费我的时间和读者的时间. 我想写点不一样的东西.

所以这篇文章可能包括两种内容:一是对你所见过的事情, 我换个角度说一遍, 二是你没见过的事情, 但我可能完全理解错了.

就像自助餐一样, 各位自取.

投递

这里先不触及怎么写好一份简历. 因为一来我也没有个定数, 二来我想把这部分经验留到姊妹篇里说. 我招聘学生的时候倒是看了不少简历, 一些好的坏的可以到时候再说.

转化率

简单来说就是在一个系统流程里, 计算每个步骤的产率由此来决定哪个步骤需要优化. 如果说把找工作简化成一个”简历投递” -> “电话面试” -> “Virtual Onsite (VO)“三步流程的话, 计算每个流程的通过率很有帮助. 没有Online Assignment(OA), 是因为今年只收到几个初创的OA而且非常领域相关.

以我为例, 我的大概投了300份以上的简历, 但是最终产生面试的只有19个岗位, 转化率大概6%. (说约数是因为我200以后就没数下去…) 五个岗位挂在电面, 14个转化成了VO, 73%的转化率极高. 拿到六个offer, 接近半数的转化率也还可观.

问题就很明显了, 简历. 后续来看大部分面试官对我的简历比较满意. 那就是简历写的还行, 但投递通道效率太低, 有时候简历可能根本没被看到就被拒了.

比如我的简历被Applied Intuition被拒了, 我寻思岗位是New Grad Ph.D.我虽然论文很菜但作为SDE整天写C++最差也得给个面试什么的. 问了问内部的朋友, 也不知道怎么的简历就被拒了, HR看了一眼又捞起来, 一路面到最后, 虽然没给offer. (仍然感谢这位朋友!)

最初200份简历投出去以后我初步计算了转化率 (那时候的数据大概只有1%), 遂立刻转变了思路开始求人内推. 内推效果会有, 确实比海投高点, 但不是我想象中那么高. Google和Meta的申请也是被HR捞上来的: 申请的岗位都没中, 有无内推都无所谓, 过段时间HR发邮件问我要不要看看这个岗位, 我说行.

人脉

从找完工作的后验视角来看, 人脉确实很重要, 但不是我想象的那种重要.

我以为的人脉是找以前的同学, 各位当年刷刷全A的大佬们内推会有效. 但我的尝试感觉用处不大, 一来他们在大公司里有多少话语权不好衡量; 其次, 更重要的一点, 人人都有内推等于人人都没内推, 只是让我这种海投的更难了而已.

更有效的人脉是去认识和我做同一个领域的人. 开会或者往开源社区写代码的时候就应该建立一些私交. 有可能的话让他们告诉我哪里有岗位开放.

等我面试完加了各位面试官的联系方式才发现, 一些面试官去年底就在领英奔走呼号说他们招人可以直接发简历给他们, 直接跳过低转化率的投递. 还有面试完了查了下领英才发开会的时候就坐在隔壁的: 我在Meta的一个同事22年开会就坐我旁边, 我们的talk前后挨着…

如果我早些时候把这些人脉建立起来, 恐怕今年找工作会容易很多.

面试

承认我不知道

我以前面试会尝试构造一个我什么都懂的幻象. 后来发现这一套并不明智. 面试官问两句就知道你几斤几两了. 带着一个”我什么都会”的光环其实是debuff, 被问到了不会的让人觉得这是滥竽充数.

我这次总结出来的经验就是得大胆承认自己不知道. 管理住面试官的期望, 也给接下来信口开河提前铺垫. (aka, 我下面要开始乱说了)

下一步就是把技术问题当成一个工程问题去解决. 与其在我不会的东西里坐牢, 不如用我会的东西来解决一个新的问题. 展示我的思考过程顺便试图把话题拉回我会的东西里来.

当然代价就是面试期间会不断的重新发明轮子. 说了半天的解决方案, 最后面试官来一句, 你说的就是XXX. 不过我倒不觉得这是个什么问题, 重新发明轮子不是一个好的工程做法, 但是一种不错的思维锻炼.

印象最深的是和一个面试官重新发明了Singleton(单例)的设计模式. 他问我说按照C++标准静态类型是没有固定的初始化顺序的, 但是如果有一个静态量非得在所有其他人之前初始化要怎么做?

如果直接回他Singleton估计就完了, 但我当时并不知道这玩意儿. 我们俩扯了快一刻钟, 具体需求是什么, 怎么构建这玩意儿, 会遇到什么问题. 我到最后一步缺一个步骤不确定要怎么做, 还是面试官告诉我的: 函数内的静态变量会在函数调用前被初始化, 又学到了C++的特性呢. 考虑到我后来过了这个面试, 我觉得这不是一个很差劲的反馈. (当然还要反思下 Design Principle 这本书在我书架上从本科放到博士毕业还是没看, Singleton方法明明就在里面)

不用准备

聊完了上面的点以后我得出的准备面试原则就是不准备. 用一枝的比方, 人就是一个初创公司, 专业技能那是开发/产品的事情; 但面试的时候你是个销售, 搞搞清楚自己的产品优势就可以了, 别想着一晚上开发个新的功能出来.

我总结出来的流程就是, 面试前:

  • 顺一遍所有的数据结构编译器操作系统体系结构所有基本功,
  • 看下JD, 确保熟悉这个岗位大致是干什么的,
  • JD里熟悉的东西再顺一遍. 不熟悉的东西找两个视频快速入个门, 倒不是为了一晚上学会, 学不会的; 凸显一个主动性, 回头真面到了就是”了解过但没用过”.

这套流程总结出来都是防止之前出现过的一些啼笑皆非的问题:

  • 拓扑排序/二分/DP写崩了. 二分那个面试官还是15年ACM-ICPC World Final的第八名, 当着他的面改了三次才写对, 属于是业余选手在职业选手前班门弄斧还砸到了自己的脚. 借用萝卜的奇妙比喻我是鸡… 嘴里的鸡饲料; 而他是农场主.
  • 管Nod.ai叫OpenAI, 我问CEO你是怎么从十年前开始创建OpenAI然后一步步走到今天的, 人也挺有意思的说”我倒希望我是OpenAI的CEO”, 别骂了, 三室一厅在扣了. 管Efficient AI叫Effective AI也是我干的.
  • 和Apple面试的时候才知道这个岗位在SD; 投行问期望薪资说了个湾区水平, 回头一看人家JD里面最低工资比湾区高, 上限是湾区快两倍. (为什么投行这么来钱啊救命)
  • 面WebKit不知道浏览器架构长什么样, 就靠着以前看的一篇博客的影响硬编

你会做什么改变?

面试以后一般会有一些时间留给我问些问题, 哪怕超时了大部分面试官也会比较nice的顺延. 刚开始和Apple面试的时候经常会问技术性的问题. 但可惜我面的是Apple, 一个被日常吐槽神神秘秘的公司, 员工普遍不方便讲自己在干些什么, 有什么瓶颈之类的问题. 这类讨论也经常流于表面.

或者说有幸我第一个面的是Apple, 我开始重新思考怎么利用这些五分钟. 于我而言我最希望看到”面试官眼中的公司”, 我希望知道抛开冠冕堂皇的介绍以后, 他们的实际体验是什么样的. 那么”改变”作为今年的主题, 自然而然的成了我的必问题.

这个问题的完整描述是这样的:

如果在公司里有一件事是你可以改变的, 上至组织架构行政管理, 下至产品技术团队人力; 但只能改变一件事, 这件事会是什么?

我至少在考察以下几个点:

这个人看到的问题的视野. 士兵只能从准星里看到一个敌人, 班长能看到整个战壕, 但将军能看清整个战线. 当一个员工告诉我他在公司里最想改变的内容的时候, 这个答案可以帮我判断出一个员工在公司里的位置, 或者是他自以为的自己在公司里的位置.

这个效应是非常明显的, 在一些管理比较扁平或者初创的公司, 员工的视角往往更高. Nod.ai的CEO, 被AMD收购以后现在是总监, 和我说他希望统一AMD的编译器生态. Applied Intuition的一位员工希望公司不再被动应对市场, 黑芝麻的一位员工希望管理层多用英语来加快全球化进度.

而结构化的大厂员工的视角就比较…大厂:

  • 管理层决策过慢. (Sony, 日系公司老毛病了)
  • 合规/法务太耗时间. (MicroSoft, 地表最强法务作茧自缚了属于是)
  • 点名批评Teams不好用. (AMD, 据说苏妈是知道这事儿的, 但是积重难返)
  • 团队之间保密程度太高了互相不知道对方在做什么. (当然是Apple, 超过一半的面试官有类似的抱怨我甚至都不感到意外) WebKit那边听来一个故事说有个团队fork了WebKit在上面做开发, 但是没人知道这个团队是干嘛的, 等VisionPro发布了这个团队才把PR发过来, 一看是给VisionPro做的定制代码.
  • 快速增长引入了非技术性的领导层, 他们的非技术背景带来一些管理混乱, 也使得团队和团队之间沟通逐渐变得困难. (Nvidia)
  • 越来越多市场导向而不是工程导向的项目. (Nvidia/Google, 我猜这都算是比较冠冕堂皇的说法了, 实际情况可能就是为了快速上线开始糊屎)
  • 销售别承诺一些不现实的交付日期给工程部上压力. (Synopsis, 心疼各位工程师)

我听完各位员工的答案以后多少有点觉得真实又好笑, 这个世界也许真的是草台班子, 大厂也不例外. 写这个文章的时候发现一枝又把我想说的话说了! (草台班子是如何运行的?只不过这个视频没上B站, YT上看完以后觉得毫不意外)

这个问题还能考察这个人的思维方式是进步的还是保守的. 注意我的措辞是”改变/Change”: 改变是为了做的更好, 还是为了弥补问题, 这是完全由作答者自己定的; 而他的回答可以让我窥探到他的思维过程. 很多人会假定改变是为了修正某个问题; 但Nod.ai的CEO就把回答的重心放在了”这么做能给我们未来带来什么好处”上, 这是非常加分的.

“抓大放小”的能力: 题目限定是”一件事”. 任何一个充分大的组织都有数不清的问题和发展方向, 但如果只能选一个, 这个选择本身就值得玩味. 为什么要做出改变的是A而不是看起来更要紧的B? 这个决策是基于什么做的?

这个人的思考是否完整. 一个经常问的后续问题: 是否有对应的方案来落实这些改变. 我想看到的是当一个人和你说我们有这个事情要做改变的时候, 他是真的仔细想过, 还只是顺嘴一提; 是一个严肃的解决方案, 还是吹水吐槽. 骂一句劈柴哥傻逼容易; 说清楚Google要怎么停止裁员, 稳住股价和盈利的同时在这场大模型的竞争中重新挣回优势就要困难多了.

这个人”坦诚清晰”的程度. 坦诚清晰是个字节里面用的话了, 但我实际工作的感觉是能清清楚楚明明白白的给你把一个问题讲明白是个挺重要的技能. 如果出于某种原因不愿意或者没有能力把这个问题说清楚, 那是非常扣分的. 如果面试官愿意比较深入的掰扯这个问题, 至少我能知道这个人对我的印象不错.

练好体能, 维稳心态

最多的一天七场面试, 一个VO和两个电面约在一起. 那一天我能明显感觉到自己的神智在逐渐不清醒, 对一些挑战性的问题也开始发出略有攻击性回答. 这就不是能力问题, 要是把这些面试全部拆到两三天的话我能做的很好. 但是VO的性质就是要一天面完四五场, 逃不开的. 练好怎么稳定住心态, 别让一件事影响另一件事, 算是职场必备技能了.

Behavioral Question (BQ)有类似体验. Google/Meta有明确的BQ轮, 整场面试都在吹水讲故事. AMD/MS/Apple则是随面试官的性子, 有时候技术面聊到一半突然开始BQ.

BQ不像是在问你的个人经历或者领导力, 而是在考察这个人的精神状况. 经常被问到的”你怎么处理工作中和领导的冲突”, 或者说一个”难搞的同事”, 都是在问你现在人际关系爆炸了, 你怎么办.

笑死, 我可是博士, 爆炸是我的日常. Google面试BQ的面试官自己也是个博士, 所以点名说这些问题就用你和你导师举例.

我: 那可就非常有趣了.

我总结出来比较加分的几个BQ的点:

  • 凡是先问the why question (again, 博士日常), 有时候提出的方案根本不能解决根本问题
  • 对事不对人, 我就是个无情的做事机器, 你对了就是你对了, no hard feelings
  • 决策用数据说话, 没有数据就搞实验, cost-benefit analysis没事儿常做
  • 站在用户/公司/领导的立场看问题, 然后取所有人的交集
  • 主打一个谁都不爱. 被爹久了就潜意识里把领导当爹, 这一套才华为大概行, 搞技术的话在北美未必.

Coding

Coding单独写, 因为我的经历和我以往的认知特别不一样. 也许是因为编译器岗位的特殊性, 也许是C++的特殊性. 抛开技术面, 我一共写了32个代码, 都保存了.

LeetCode (LC) 无效论

我划分为LC的抑或是原题, 抑或是撸一个数据结构, 问来问去无非是把题写了,算个复杂度. 大约一半coding都是LC, 而这LC又有一小半来自Meta和Google.

这一点真的点名批评这两家公司, 面试就摁刷题. 我当然理解标准化面试流程对大公司来说很重要. 但是这个过程真的整的很无聊, 也没啥筛选性, 多刷刷题谁都能过. 而且我面试了五六轮才team meatching, 搞得我到最后要签字了都没见过自己同事, 我怎么知道我喜不喜欢和他们沟通/合作呢.

说回LC, 出现最多的是模拟(7道), 需求很明确, 就摁写, 把人话翻译成代码. 还有一些数据结构/算法类的, 这个部分也没啥好说的, 基本功. 在我的面试里图论(3道), 树(2道), 链表(3道)出现的比较多, 因为LLVM的底层数据结构就这玩意儿.

以上都是刷LC可以有帮助的部分. 这些基本功我觉得属于是我半夜把你叫醒下床就能写出来才算合格的玩意儿. 真实经历, 和Google面试睡过了下床直接做题.

动态规划(DP)属于是看造化的题. 想得出来就秒, 想不出来我就陪一个Nvidia的面试官坐了40分钟牢. 我非要分治因为我觉得DP要三维太费空间, 他就不停打断我; 面完一想发现一维就够了人家是在帮我我还在嫌他烦… 除非是那种打比赛的长年累月刷题, 否则临时多刷20道DP未必对面试有帮助, 有这功夫不如找个开源社区写写代码.

以下是刷LC完全无用的部分. 也是让我感到最困难的: 设计/优化/语言/Debug类的题. 这些题都是不写点大型项目不会攒到的经验.

设计类的, 首先他不会告诉你全部需求, 写着写着给你加货. 其次他(大概率)不知道数据范围, 要不要优化自己想. 最后他不会给你任何指示怎么写, 要不要加抽象自己想.

举个例子, Google给我的一道题, 求文件系统某个子文件夹的总大小. 给你设计好了一个树, 访问所有叶子节点, 没很复杂. 写完了转手来一个要对所有文件夹都做Cache提高访问速度; 还要一个Cache存自己的父节点是谁; 再写完了说文件系统要支持加入文件 同时维护好两个Cache. 就这个题你一次性把话说完从头开始设计不会很难, 但是一次说半句就很看前期设计有没有充分考虑后期扩展, 前期没写好后期维护很容易火葬场.

(扯个题外话, Google的Coding确实是最难的, 即使是撸个数据结构都不会直说, 而是要包装成一个应用场景, 等你掰扯掰扯最后发现: 哦! 撸个LRU是吧)

优化类的还稍微好些, 给你一段代码人肉优化到最快. 本来是做编译器的背景, 其实算是对编译器的技术面.

语言/Debug的比较地狱, 但很可能是cpp专属. 重写个标准库的unique_ptr, 还要实现线程安全的那种; 来写个helper class实现和lambda expression一样的功能. 虽然后者就只是重载个运算符, 但扪心自问一下, 哪一年写LC用过unique_ptr和lambda expression?

这一点Apple一个面试官最过分, 贴了个WebKit的代码, 两百多行没有上下文, 头文件都看不到, 让我裸眼debug.

纪律性大于功能性

这句话是基于我面到的题目和我收到的反馈. 这两个词都是我构造出来的. 我解释下我想表达什么:

对于一段写完的代码, 功能性是问它能否通过所有测试, 实现一个基本功能; 这一点基本功到了都没问题.

纪律性则是说这段代码能更轻易的应对非法输入和更容易维护. 非法输入就是很多面经里说的corner case. 是刷LC往往不会考虑很多, 因为输入范围往往是定义好的, 照着写就行. 而且在LC里有测试样例, 即使第一次没考虑到WA了第二次补上就行, 导致我刷LC多了反而会忘了这些玩意儿.

你当然可以写完了, 写点测试, 然后再把遗漏的case补上. 但如果能在面试里能一次性把这些洞从一开始就填上而不需要面试官提醒的话, 以我的经验算是一个大的加分项.

维护性一要考虑后期可能出现的改变并作出相应的设计. 具体到面试就是写代码之前就预判面试官的下一个问题但不过度设计. 二考虑有没有做出努力让代码变得易读, 我给LLVM写代码觉得这是稀疏平常, 从反馈来看似乎不是很多人会这么做.

我有时候也会忽视 using namespace std;, 然后写更长的类名. 重写unique_ptr的时候就遇到个挺搞笑的事: 由于我用了using namespace custom;, custom::unique_ptrstd::unique_ptr 重名了.

我debug了半分钟, 然后随口吐槽了一句:“谁把 using namespace std; 放这儿了.” 面试官听了之后就像被偷窃被抓现行一样:“不是我干的, 额… 嗯嗯, 是编辑器默认的.” 我心想, chill dude, 才是面试官.​

说正经的, 这是工程里的一个坏习惯, 但是常刷LC为了追求手速会常干的事情. #include <bits/stdc++.h>这玩意儿打比赛可以, 做工程看见了有一个算一个统统枪毙.

再举几个例子, 我喜欢typedef和抽象出新的类. 喜欢在代码里塞assert, const, constexpr这类东西, 哪怕这会让代码变得更长, 让coding变得压力更大. 喜欢先写注释再写代码, 甚至有些复杂的情况就直接扔个TODO在那我和面试官都知道有这么回事, 先把代码跑通再说. 但是让面试官知道你注意了些玩意儿很重要.

这些东西本身对编译后的代码影响不大, 读的人却可轻易上手. 我和Google那个让我写文件系统Cache的面试官后来就开开心心的在聊assert. 他表示这是很好的习惯, 我说反正是”almost free”, 他说倒也不是完全free但他们内部怎么怎么样.

纪律性做的好能把代码一遍写过, 有几个面试我是写完了面试官无follow up可问, 然后开始闲聊或者加题.

能跑的代码谁都会写; 但不糊屎让同事的生活更轻松能获得好感.

准确性和手速

这玩意儿是高中大学打比赛的时候强调的东西. 当年流传于我们之间的都市传说: 某大佬用Windows XP的自带的编辑器写代码, 写完不用编译直接提交, 一次测试通过; 完了还写的比我们快. 六年级就可以把我们血虐的赵亮和上文的World Final可能属于这个分类. 当然以前比赛没有VSCode也没有代码补全, 练准确性和手速是正儿八经的一门科目.

但面试常用的一些工具也是没有这些玩意儿的. 刨开最后五分钟我的提问时间, 面试只有40分钟. 有的公司得做两题, 并且不是打比赛那种闷头写: 得给面试官解释思路, 随时沟通, 注意代码的纪律性. 结果就是速度会比打比赛慢很多. 尤其是遇到比较折磨的面试官跟不上你的思路可能节奏都要被打断.

基于此, 能快速的一次性把代码写对, 算是加分项.

我16年写过CodeForces, 但是CF太难了容易智力被爆. 去年夏天练过LC的周赛, LC的题目简单些. 从1000名到几万名都是只能做三道题, 排名的关键就是写的多快和提交了几次.

但我不建议多练, 沉迷速度会让面试的时候看起来像只会刷题的呆子. 而且周赛真很让人沮丧, 写来写去都是三四千名, 有时候心态不稳多提交两次还要掉更多. 搞到最后写的手疼还没啥长进.

写在最后

找工作约等于约会

看问题的视角有时能极大的该改变处理问题的方式. 比如时域中复杂的卷积在频域就只是乘法; 多元一次方程组不过是线性代数里对矩阵求逆.

最简单直接的做法是用市场经济的模型去理解找工作这个流程. 我们在兜售人力资源, 而企业在收购人力资源. 都是出来卖的

做生意的就别把自己想的太高贵, 自我物化下, 有多少事情是我能做的, 有多少事情是大部分人能做的. 不要被”别人能做我不能做的东西”搞乱心态; 从”大部分人都不能做的”内容找到并扩大”只有我能做”的优势; 别加入”所有人都能做”的内卷.

用黑话讲就是搞差异化竞争.

这个模型有一个小小的悖论. 就是你会发现依据这个模型, 性交易是一个非常自洽, 非常优质的工作. 这下真出来卖了

缺陷在于, 兜售人力资源并不是一锤子买卖. 我得花我自己的时间精力和带宽投入到入这个公司在里面, 每年超过1600个小时和我的+0(同事), +1(领导)甚至+2(领导的领导)打交道. 在这些时间里, 我开心嘛? 我享受这个过程嘛?

所以我提出一个模型: 找工作约等于约会. 这样把双方放在平等的地位上, 在基本条件满足的情况下讨论的是双方合不合适, 无论你愿意怎么解释”合适”.

我面试的公司里有一家纽约的投行. 申请只是因为领英有Easy Apply, 按几个按钮就申请完了, 和dating app右滑一样廉价且不走心.

和HR聊和+1聊都挺好的. 但我进行了一个自省, 发现我大概率不愿意去纽约做我完全不感兴趣的行业. 幸好后来他们把我拒了, 不然我得在要钱还是要快乐这种近乎哲学的问题里纠结很久.

要选一个有钱但不喜欢的对象嘛?

另一个例子是Applied Intuition, 到了VO本来一切都聊的挺开心. 中途聊到我很喜欢开源运动, 希望以后有机会给社区写写代码. 本来热闹的氛围立刻冷了, 开放办公室的喧嚣都遮不住我们这的尴尬; 还是某个工程师强行圆场说我们也会给我们的工具链打打补丁.

是不合适呗, 就像喜欢户外的和死宅谈恋爱, 可以但没必要互相折磨. 那个时刻我就已经把这家公司拒绝了一半, 我估计几个面试官也是这么想的. 后来面试怎么样其实都不太重要, 我想做的和他们想要的都不一样就很难有下文; 最后也确实没收到offer.

面试面试官

我之前参加了一个模拟面试. 首先感谢这位Dvais的校友花了一个小时陪我模拟面试. 当时他给的一些反馈是我不太理解的, 他让我不要写太艰深的代码, 不要写面试官理解不了的代码. 但我自以为写代码不太抽象的.

但我面试了足够多以后发现, 面试官也确实是有一个分布的. 高质量面试官可以迅速理解你的意图, 不需要过多解释你的”奇技淫巧”; 低质量的面试官几乎就得像我和学生上课一样解释我在干什么.

那用上文谈恋爱的心态去考虑, 我是不是愿意和低质量面试官做同事? 不.

我不再像面经里建议的那样事无巨细的给面试官掰扯所有细节. 我也在面试我的面试官, 凡事只给大思路他们能不能自己搞明白, 不能的话再多说一点. 另一个考察的是面试官的提问水平, 如果我给出一个比较抽象的, 需要细化的描述, 他们能不能在里面立刻抓到最重要的点.

这个操作在不同公司的体验上也非常不一样. 大公司的体验比较舒服, 用Google员工的话说”大家都是聪明人”, 很多设计/算法上的细节不需要说太多就你知我知. 几个初创/中厂的面试官就不太行, 明显感觉他们跟不上我写代码的思路, 需要我慢下来给他们解释我在干嘛.

自我怀疑是最大的敌人

去年十月的每日焦虑. 当时实习的团队没有HC, 担心找不到工作就要去读博后了甚至要回国了. 从之后还不错的结果来看, 当时的焦虑非常好笑. 无论市场有多糟糕, 机会总是有的, 而自我怀疑反而是问题的根源.

很不幸, 作为一个典型大陆小孩, 从小受到的就是打击教育, 自我批评一下已经刻进了DNA. 三五不时就要想想自己是不是哪里做的不对, 自己是不是能力不够, 要不都觉得自己飘了.

去年底有场面试我觉得我做的很糟糕, 又还是在还没拿到第一个offer的阶段, 一整晚都搁那自我谴责. 第二天就收到通知那场面试过了心态才平稳下来. 这就很浪费带宽, 我本可以把前一天晚上的精力用去干点别的.

除了内耗啥用没有.

现在日常提醒自己稳住心态不要自我怀疑. 离那些整天贬低或者提醒你要自我怀疑的人远些.

Timing is a bitch

既然都说到约会了, 那就不得不把HIMYM里Robin结婚前对Ted说的话搬出来:

If you have chemistry you only need one other thing: timing.
But timing is a bitch

包括但不限于Sony, Synopsis和Apple的Neural Engine团队VO完了选了其他候选人的理由都包含一条三月没法入职, 他们招聘真的很急. 他们是我面试的最早的一批公司, 一月中旬之前就面完了. 但我六月之前都没法毕业, 这就像你终于找到了你的命中注定但是人家已经结婚了. 当然在这个语境里还是Ted更惨一点.

议价能力最高的时候是你手上有所有offer的时候. 但这种时机也很难把握. 我二三月份陆续出的offer前后不衔接, 上一个已经过期了下一个才来, 完全没法互相竞价.

虽然一些经验说要巧妙的安排面试尽可能让所有公司一起出结果. 但我的经验是然并卵, HR晚回个邮件就能轻易的拖一周, 然后在offer阶段放大成一个月的时间差.

为什么是Meta

决赛圈的六位玩家是AMD, MicroSoft, Meta, Apple, Google和一家初创.

我很想等Google, 但是他们出结果太慢了, 催了HR也没用, HR还在印度有时差. 作为我小时候就想加入的梦想公司, 虽然最近有点熊, 但至少想听听他们有什么有趣的人, 组和项目.

Again, timing is a bitch.

AMD虽然是老东家, 没有Day1的绿卡政策也搞得我很难加入. 差不多的理由把初创拒掉了, 这二位也提前出局. 我需要快速获得一个自由人的身份.

Apple要去SD, 给的钱也多, 非常适合养老. 但我总觉得我又不是有家有室的, 还没到养老的年纪, 可以再抢救一下. 做的WebKit也没有特别对口, 虽然是开源的, 但不觉得有什么大的影响力能做出来.

MS和Meta的竞争确实比较难评. MS的职级更高但工资更低 (MS老传统了). MS作为这一波AI浪潮中最有变现能力的公司, 跑去搞底层的Maia100编译器确实看起来非常稳当. 我一度都去了趟西雅图实地探访.

做决定之前和两个团队的领导都又会了一次面. MS的领导让我觉得不太坦诚, 有点混杂着爹味在教我做事的味道; 当然有项目的机密性的原因在导致哪怕他想说也有很多不能讲的.

Meta的领导非常chill, 拉拉家常完了说说手上的项目, 还让一个下属来和我沟通说他在做什么. 虽然说找工作不是来交朋友, 但我还是更欣赏chill一点的氛围. 最后考虑上湾区比西雅图还是有点气候优势和科技氛围, 遂留在Menlo Park.

Meta不是首选, 甚至不是一开始主要考虑的对象. 如果微软能给的多点, 或者Apple的Neural Engine给了Offer, 或者AMD Day1绿卡可能都没Meta什么事儿了.

但话说回来, 找工作就跟找对象一样, 没那么多如果, 错过了就是错过了. 任何一个看起来很小的点都会很大的影响最后的结果.

同时可能会有很意想不到的结果. 就像本Apple黑, 日常喷苹果生态太封闭不给用户自由度, 活了这么大没用过Apple的任何产品. 到头来领导是苹果出身做Swift优化的, 进Meta搞不好也是做iOS的优化.

你说我要是真去Apple算不算是打入敌后(?

还得是Excel…?

我在Apple的第一个面试结束以后觉得有必要开始记录面试的内容方便复盘. 我的需求大约是有一个整理内容的软件, 同时我能对这个内容插入各种诸如时间, 分类, 公司这类属性, 日后可以依据不同的属性归类和整理. 最好还能用一些简单的代码实现查询, 统计类的工作.

其实这个需求有点类似于一个数据库, 但我总不能真的拉一个SQL过来. 翻遍了市面上的各种笔记软件, 到头来发现Excel最好用. Beta版的Excel已经可以内嵌Python了, 就因为写这篇文章还特地去玩了玩.

有一种返璞归真的美.

(​有类似的推荐快戳我)

一些其他有的没的观测

为了考察各家公司的开源项目有多大影响力我去算了一个star/commit. 我寄希望于用star来反映受关注的程度, 用commit来反映需要付出的努力. 结果非常有趣.

支撑起世界运行的底层浏览器内核WebKit(0.026), 编译器框架LLVM(0.049), Linux Kernel(0.132)无人问津.

当红炸子鸡OpenAI 的 Triton 5.770, 前端React 13.372.

当然最抽象的要数JavaGuide, 一个用中文写的, 教大家怎么应付面试的总结门庭若市(27.196).

当然这个数据只是我上个月花了两个小时查出来的, 也许非常biased. 但如果更多人的注意力是在怎么过面试而不是搞技术的话, 那真非常可悲.

(说起来这好像是个不错的research idea, 看看当代程序员的注意力到底在哪)

85位面试官里只有8位女性工程师, 其中只有两位女性是manager. (叠个甲, 这里说生物女性而不考虑性取向, 就是说也没谁面试去问面试官性取向啊) Apple的女性比例最高, 而中厂/初创基本都是和尚庙.

当然我这个观测只是基于我遇到的85个人, 样本范围非常小. 即便如此, 还是可以说一句Woman in STEM任重道远.

普遍认为的第一位程序员是Ada Lovelace, 一位女性. Computer还用来表示计算员这个职业的时候, 大部分岗位都被女性承包; 她们在Fortran出现之后大量转职成了程序员, 一度成为五六十年代女性独立运动的象征.

2024年了我看看到底还有谁在说女孩子不适合学理科这种鬼话.