前言
距离上次写年终总结,已经过去了 3 年,我的技术博客也有很久没有更新,并不是说懒得写或者对技术没有了热情,而是这 3 年一直忙于出国留学。最近有了阶段性的进展,就腾出了一些时间,记录一下这些年发生的事情。
海外生活的利弊
因为各种各样的原因,我决定在美国湾区长期生活。我罗列了一些在国外生活的优缺点,帮助大家更好了解利弊。
免责声明:仅个人观点,不具有代表性
优点:
- 教育:国外的教育质量普遍比较好,周围都是名校毕业的学生
- 职业:职业生涯和薪酬有很好的保障,不太需要担心中年危机
- WLB:很多公司朝 10 晚 6,上班只干活,同事老板一般不关心下班后的事,有很多空余时间
- 镀金:海龟往往会贴上"国际化"和"社会精英"的标签
- 其他:在遇到不可抗力时,有更多的选择机会。我始终相信"选择大于努力"
缺点:
- 不安全:路上流浪汉很多,有人会突然朝你打招呼或者骂你
- 娱乐少:生活比较无聊。湾区三俗:hiking、滑雪、狼人杀 :)
- 不方便:湾区几乎所有地方都需要开车,没有车寸步难行
- 花销高:租房和吃饭花销普遍是上海的 3 倍,每年生活成本低则 20 万人民币,高则无上限
- 语言:一般情况下,你需要通过托福和雅思等语言考试,才能与周围人"正常"交流
英语考试
我是通过读研究生的方式,走留学签去的美国,因此第一步是英语考试。
申请美国研究生需要通过 2 种考试:
- 托福:语言考试,分为阅读、听力、口语、写作四部分
- GRE:美国研究生考试,分为阅读推理、数学推理、分析文写作
当时我的英语水平停留在 4 级刚及格,可以说基础非常糟糕,同时我还是非脱产,只能利用各种碎片时间备考,最后我还需要赶上 24 年秋的申请窗口期,因此时间非常紧张。
我花了 2 年时间,白天上班,晚上看书,通勤路上听听力,有事没事拿出单词本背一会,周末的 2 天用来做完整的模考卷以及复盘,几乎没有一天休息。
最后,在考托福前,我把单词量从刚开始 3000 到 12000,并刷了 70 多套模考卷,每套模考 + 复盘共 8 小时。
考 GRE 时,同样也是背单词 + 模考 + 复盘,但难度更高,因为题目涉及数学、推理、论点分析,但我仍然坚持了下来。
最终考到托福 95 分,GRE 312 分。成绩不算特别好,但也够申请了,主要是我一共考了 6 次托福,2 次 GRE,每次 2~4 小时,再加上后续还要腾出时间写申请信和投递学校,实在是有些分身乏术。
研究生申请
通过语言和研究生考试后,下一步就是学校申请。
由于本科没有好好学习,导致绩点非常低,而国外的研究生又特别看重本科绩点,即使语言考试过线也会因为绩点过低而直接拒绝。导致整个申请过程极其艰难,甚至做好了没学上的准备。
投递了十几个学校,最终还是收到了一封 offer,当时简直不敢相信自己的眼睛。
这也可能是我一生中最开心的时刻之一,它证明了过去所有努力都是值得的。
工作
拿到学校 offer 后,便开始着手工作的交接。
我很喜欢国内的工作,因为负责的是前端基建,整体不是很忙,很多需求都是自下而上,没有倒排期也没有加班的情况。同时我也很感谢我的 leader,他无论技术还是团队合作能力都很强,工作期间我从他那里学到了很多对内对外的合作方式。
在职期间,我独立负责了一个公司重要产品的从 0 到 1 落地,做了但不仅限于:
- 写需求文档
- 画设计图(Figma)
- 前端(React、Vite SSR)
- 后端(Nest.js、Prisma.js、MySQL、Redis)
- 运维(DevOps、CI/CD、Docker、Kubernetes、Shell)
- 云服务(LB、CDN、存储)
- 数据分析(Kibana、BI 平台)
在 B 站的 3 年,我学到了很多,最后离职的时候还是有些不舍,祝愿 leader 和同事们都能实现自己的人生价值。
出国
和国内的亲朋好友一一告别后,我第一次走出了国门。
我从国内出发到美国,中转日本,在日本首都东京玩了半天。对东京的整体感觉就是特别干净,地铁上不同族裔的人很多,大家非常有礼貌,即使自己不小心擦到别人,他们也会不停的道歉。物价和上海差不多,相比于美国不是很贵,之后应该会常来。
从东京飞了 9 个小时,终于到达了目的地-圣何塞。
圣何塞的机场非常小,从落地到清关到走出大门,只花了 30 分钟。
出机场后看到却是和东京完全不同的景色,周围都是一望无际的田野,看不到任何高楼大厦,都是平平的矮楼和光秃秃的山丘。但是到了傍晚,却看到了在城市看不到的夕阳景色,脑海中浮现出 California Hotel
这首歌。
就是这么一个人口 100 万不到的小城市,密布了顶尖互联网公司。这里是硅谷的中心地区,附近就有 Paypal 和 TikTok 的湾区总部。
开车 20 分钟内,也能看到 Google、Meta、Apple 的总部。
因此这里的打工氛围很浓,经常在中餐馆吃饭的时候听到旁边在聊 package,或者 PR 进度。
留学生活
在办理好各种电话卡、网络、驾照等生活必备品后,便开启了第一学期的学习。
美国学校的课程比较贴合工业界,这一点相比国内的教育体系,好了不止一个层次。
本学期 Java 课的期末作业:用 Java Swing + OpenAI SDK 写一个 ChatGPT。
求职课上,老师请了一个在特斯拉工作的本校校友,分享找工的经验。
学校每周 2 节课,每节课 3 小时。由于有多年工作经验,因此每周只花 1~2 小时就能完成作业,算下来一周的 work load 只有 8 小时,其他全部都是自由时间。
学校一年有 2 次假,分别为暑假、寒假。由于圣诞节是美国的新年,因此寒假从 12 月初就开始了放假,一直到 1 月中旬才开始上课。
没课的时候,我会报名学校的免费 tutor 服务,提升英语水平,或者和助教、学校老师进行 mock interview,为后续找工作做准备,又或者待在家里刷 LeetCode,准备面试材料,解题没思路的时候就去公寓楼下遛弯、健身,顺便思考下后续的计划,因此整体生活还是比较充实。
找工作
听到很多人吐槽国内找工环境恶劣,其实美国的工作市场也极其困难,甚至比国内还要糟糕,投简历一般是以"百"为单位,大家都是几百份几百份的投递,最后可能也都颗粒无收。
网上随便找的 datapoint,投了近 1000 份,963 个拒绝信,13 的面试机会,1 个 offer,成功率 0.1%。
一方面因为我们作为外国人,必须找能够支持外国人工作签证(sponsor)的工作。由于 sponsor 会对公司有额外支出,因此只有头部的互联网企业愿意支持,例如 Google、Apple、Meta,导致整体选择非常少。
另一方面是候选人非常多,和你一起竞争的大多来自世界 Top100 的名校(CMU、Stanford、UCLA),他们无论是智商、思路、英语沟通能力,都是位于世界 1% 的顶尖学生,很多学生会提前一年或两年准备未来毕业后的面试。
相比于国内 free style 的面试方式,美国的面试主要分为 3 部分:
- Coding
- 行为面试(Behavioral Questions)
- 系统设计(System Design)
Coding
Coding 轮大部分情况是 LeetCode 原题,大厂可能会出一些变种题。相比于国内只有少数大厂考算法,美国几乎所有公司都考算法,而且难度普遍比较高,一般情况下 40 分钟需要解决 2 道 medium 难度的算法题或者一道 hard 难度的算法题。
前端有时也会考 JavaScript,比如实现一个 Promise、防抖节流等,相比于算法,这种 Coding 对于国内程序员普遍不难。
在 Coding 的过程中,还需要遵守标准的解题流程,确认问题 → 边缘条件 → 口述解法 → Coding → 测试。面试过程中会重点关注候选人的交流能力,因此 Coding 时,需要边解释思路边写代码,对英语也有一定要求。
由于国内前端不怎么考算法,我的算法基础非常差,因此我提前一年开始准备,目前刷了 200 多道题。
即使如此,周围很多同学刷了 500、600 题,甚至也有刷 1000 题、2000 题的。
我刷的不多是因为美国的前端岗 Coding 轮难度相对后端岗比较简单,同时岗位越资深,算法题越简单,因此算法并不是我准备的重点。我的重点主要放在下面 2 个轮次。
行为面试
行为面试轮不涉及 Coding,纯聊天。面试官会问几个开放问题,比如:
- 最有挑战的项目
- 如何处理和领导的冲突
- 一个失败的项目
对于同一个问题,初级工程师和资深工程师的回答完全不同。例如"最有挑战的项目",初级工程师会说认真完成领导分配的任务,而资深一点的工程师会说主动发现业务痛点并解决的故事,其中包括如何问领导协调资源、不同团队合作、技术复杂度、量化收益、对其他团队的影响等等。
和国内聊项目比较类似,但故事需要说的通俗易懂,因为面试官可能没有技术背景,而是通过故事中是否有一些信号(ownership、empathy、think big),来评估你是否是一个合格的 partner,同时还会进行追问来确保故事的真实性。
行为面试轮的难点在于,如何在 40 分钟内,连续用英语说 3~4 个故事,并且回答面试官的追问。对故事结构和英语口语的要求非常高。
系统设计
系统设计轮会需要在 40 分钟内实现一个系统的原型,题型一般是团队的主营业务。
比如 Google 面试可能会问实现一个 Google 搜索页(Autocomplete)或者 Google Doc,Meta 可能会问实现一个 Instagram(Feed 流)。
前 20 分钟画线框图,说明每个组件的功能、数据流向、存储、与后端通讯方式。
后 20 分钟聊系统优化,有点像国内的八股,比如:
- 网络优化:HTTP2、图片、CDN
- 性能优化:SSR、虚拟滚动
- 用户体验:骨架屏、无线滚动
- 国际化:RTL
- 无障碍:ARIA、快捷键、语义化 HTML
初级和资深工程师的区别在于对技术选型的取舍(trade-off)和理解,比如什么时候用关系型数据库,什么时候用非关系型数据库,REST or GraphQL,轮训 or Websocket or SSE 等等,此外,还需要根据不同题型来判断哪些需要重点解释,哪些可以一笔带过。
对于从国内八股环境下卷出来的程序员,系统设计轮其实并不难,唯一的难点还是在于在 40 分钟内用英语说明白,详略得当。
但无论是国内还是国外的面试,努力和收获都是成正比的。花时间认真准备,就一定能获得理想的 offer。
自我思考
随着工作年限的增加,我愈发感觉 Coding 的时间越来越少,很大一部分时间都用来写文档、画图、分配任务,以及和不同团队开会推进方案。我在社交媒体上也看到过一篇 post。
大致意思是:越资深的工程师,Coding 的占比会越来越少,他们会更关注 PPT、系统设计、会议议程,写文档比 Coding 重要 100 倍。
结合之前的工作经验,我自己的一些思考:
- 随着工作年限的增加,软技能的占比会越来越高,包括但不仅限于领导力,跨团队合作能力,影响力
- 方向很重要(选择 > 努力)。选对方向,然后成为领域专家
- 技术仍然是做出专业决策的基石,但技术实现没有那么重要(代码规范、技术选型、最佳实践),放权给团队成员
亚麻的 16 条 leadership principles 总结了在工作中,工程师需要掌握的技能,同样也是行为面试的考点:
- Customer Obsession
- Ownership
- Invent and Simplify
- Are Right, A Lot
- Learn and Be Curious
- Hire and Develop the Best
- Insist on the Highest Standards
- Think Big
- Bias for Action
- Frugality
- Earn Trust
- Dive Deep
- Have Backbone; Disagree and Commit
- Deliver Result
- Strive to Be Earth's Best Employer
- Success and Scale Bring Broad Responsibility
深刻理解他们背后的含义,可以让你成为一名独当一面的工程师(leader)。
总结
人生第一个转折点,把我转向了程序员这条道路,我认为是一生中做过最正确的决定。
现在,我站在了人生又一个转折点,新的地点、新的身份、新的起点。但我能肯定,10 年后的我一定会感谢现在的自己。毕业 6 年,重新成为学生,我还在追梦的路上。
最后分享一首Courage to Change
,也是我在曾经备考路上一直听的歌。
读到这里的你,是否有勇气去改变现状呢?