[心得] Google TW SWE 面试心得(下)

楼主: wheels   2021-07-10 15:59:31
※ [本文转录自 Soft_Job 看板 #1WwLD9Kl ]
(文长警告)
上一篇提到 2019 年底联系上 HR 开始全职刷题六个月,
到了 2020 年中面试完收到拒绝信,灰心了好一阵子。
但也没办法,还是只能乖乖回去公司上班。
这次回公司上班其实也获得一个不错的契机,
因为加入了有两个印度人在内的 scrum team,
所以每天都得使用英文讨论进度,英文听说能力大幅提升,
发现自己竟然可以听懂印度腔英文时真的有点惊喜 lol
在工作闲暇之余,自己一直保持着一天写个一两题的习惯,
大概到 2020 9月开始,Leetcode 开始出现 30 days challenge,
用意是希望你能够每天完成它指定的题目,完成会有奖励。
也是从这个契机开始,找一些朋友组了一个解题读书会。
这个读书会其实后来对我的表达训练帮助非常大,
我们的跑法是这样:
1. 先看当天题目难度设定时间:
easy 10 分钟,medium 20 分钟, hard 30 分钟
开始计时之后才开始看题目。
2. 只能按 submit,不准按 run code。
3. 在时间内 AC 的人留言自己作法的时/空复杂度,跟 WA 次数。
4. 时间到直接停手,没 AC 的人轮流说自己的想法,
再换有 AC 的人照着复杂度跟 WA 次数排序,较差的人开始分享自己的 code,
要彻头彻尾的说出自己的策略,code 每一行的用途,跟有没有机会再改善。
5. 最后来看解答跟讨论区,讨论区主要看 lee215 跟 StefanPochmann 两位神仙,
不过这两位大神的 code 有时候会太过简化,
不建议面试时把 code 写的跟他们一样,
但他们的逻辑跟作法非常值得让人学习,而且语言特性用得淋漓尽致。
另外也推 DBabichev 和 awice,他们的 code 说明会比较详尽,
看起来会比较容易消化,满建议有看到这些人的文章都可以打开看看。
我们一开始原本只打算把这个 30 days challenge 写完就好,
结果 Leetcode 官方后来直接把这个变成 monthly challenge event,
一直到现在都还有,所以读书会就一直跑到现在都还在跑 XD
也差不多这个时间点开始,每周准时参加 Leetcode weekly contest。
之后也有参加 Codeforces, KickStart, CodeJam,
之中 CF 的定位比较偏向竞技用途,觉得对于学习观念的成效有限,渐渐就没再参加。
变成每周 LC weekly/bi-weekly,每月 KS,报名 2021 CodeJam,这样的模式。
但其实 KS 跟 CodeJam 题目有点太阅读测验,但毕竟是 Google 办的就加减参加。
参加 contest 主要用途是为了训练抗压性跟时间掌握能力,
让你临场感受在有限的时间内完成给你的 coding 任务,
也是一个量化自己成长幅度的方式。
LC contest 要在一个半小时内写完 1e2m1h,
一开始我通常只能写完 1e1m,会在写第二个 medium 题目超时。
而到面试前,已经几乎可以 easy 从看题目到 AC 稳定在 5 分钟内完成。
1e2m 几乎稳定可以在 40 分钟内完成,剩下的 hard 就随缘慢慢写。
时间到之后我会把自己的解法 po 在讨论区上,
顺便可以写下自己的策略跟估计时/空复杂度。
这一步真的满重要的,有时候你以为写了一个很厉害的解法,
结果 most votes 的解法硬是比你强一个等级(通常都是 lee215 的解 lol)
而且有时候看到自己的解法是 most votes 第一名时真的会很有成就感。
大概过这著这样的平日上班开读书会,假日打比赛的生活一段时间后,
就决定 2021 年初开始再来请一次六个月的育婴留停好好准备。
有人可能会问是哪家公司这么好可以一直请,
其实法规规定一个新生儿在三岁前,总计可以请两年的留停,
但只有前六个月有劳保局补助,剩下的就真的是吃老本在撑了。
(如果真的想知道是哪间公司,是一间曾经差点买下 Google 的老牌网络公司 XD)
其实这次请留停前也有跟主管和大老板说清楚,这次留停应该是不会再复职了。
以一个破釜沈舟的心态来抓住未来可能的机会。
这次因为已经累积超过 600 题,而且上次面试发现自己有些观念掌握的不太好,
所以改以主题式复习方式,把所有写过的题目分类,
用一个 Notion page 笔记下来,把自己的解法都整理贴上去,
同一个主题的内容与解题手段都弄通弄熟后,才往下一个主题前进。
这边要再强调一次,千万不要执著于累积的题数,
刷题只是为了帮助你掌握观念,掌握观念与解题手段才应该是真正的目标。
很推荐 Leetcode 的 learning cards: https://leetcode.com/explore/learn/
如果是从头准备起可以从这边下手,
搭配 Cracking The Coding Interview 应该可以掌握七成的内容。
剩下三成内容可能就要靠自己归纳统整出来,像是 DSU 跟 BIT 就要靠自己去了解。
另外关于 system design,其实我没有额外分配太多时间在上面,
一个原因是因为网络上搜集到的消息是 system design 主要是拿来分辨 L4/L5 的指标,
L5 以上(含 L5)是一定会问,但如果是面 L4 以下(含L4),
比较会问到的是 OO design 或是 system design related 的问题。
而且我也有问了几个挑战成功 L4 的朋友,
有些是完全没被考到 sd,有些是 sd 答很差但最后还是 qualified。
所以我最后有点赌的只从这里面挑一些内容配饭加减看:
- https://github.com/checkcheckzz/system-design-interview
- https://github.com/donnemartin/system-design-primer
- https://www.interviewbit.com/courses/system-design/
就这样一直准备到大约 2021 二月左右,收到了“Hello from Google”为标题的来信,
约了简单的 chat 后就直接说可以再帮我安排 phone interview,
这次投的缺是 General Software Engineer,
心里想着这应该是近期我自己设定的最后一次机会了。
(其实我有问过 HR,现在似乎?没有三振条款,
但会希望你每次的 feedback 都比上一次更强,不然可能会拉长 cd 时间)
于是很保守的约了五月再开始整个流程,也给自己更多的时间消化吸收整理的内容。
然后大约在四月中左右,开始请朋友帮忙 mock interview,
个人认为 mock interview 绝对是邻近面试前最需要做的一件事。
我的做法是把朋友真的当主考官,跟他约时间开 google meet 跟 doc,
开始后不嘻嘻哈哈,真的让自己亲临现场。
他会从 Leetcoce 中随机选 Google tagged 1e1m 共两题,
然后请他把 constraints 跟一些他认为我应该要问他的题目叙述拿掉,
在“最多只给一个必要的 test case”的情况下把题目贴在 gdoc 上给我,
然后我该做的事情就是:
1. 询问可能的 constraints 与某些 edge cases
2. 列出至少三种不同类型的 test cases
3. 先“说”出自己直觉的暴力解,再想想看可以从哪个观念解,think aloud
4. 确定得到可以写 code 的讯号后开始动手写
5. 尽量对自己每一个打下的字符都充分考虑,不修修改改
6. 边 code 边说这样写的用意
7. dry run 自己列的 test cases
8. 给他明确的“已完成”讯号
9. 以上尽量掌握在 easy 10 分钟和 medium 20 分钟的限制内
这其实也是真正面试时最重要的流程,大量 mock interview 可以让自己越做越好。
我跟我朋友那时间每天都会进行一场这样的 mock,
超级感谢他,也有说好以后他有需要我也会陪着他这样做 QQ
于是终于到了 phone interview 的那天,是中文对谈的场次。
遇到一个很棒的面试官,跟他沟通都很轻松,真的像是在跟同事一起写 code 一样。
一开始先来一题 easy,是某个知名算法的子题,
直接列 test cases 后口述做法后立刻写完 code,
他还问我说是不是常在打比赛 XD
第二题是一题 medium 偏 hard,听完题目后列了 test cases,
口述了心中想到的方法后,直接被告知那我们来解第三题好了,他相信我写得出来 XD
第三题是一题 hard,一样列 test cases 后给直观解,
然后再进一步思考要怎么做更好,这题我想了比较久一点,
幸好最后有想到之前在某个 hard 的题目中有用过的手法,顺利解开。
然后时间也差不多,闲聊了一下就这样愉快的结束。
这一场我自己给的评价是 positive,
果然几天后就收到进入 onsite 的通知。
这次的 onsite 安排了四场 ds/algo 跟一场 G&L,
没有 sd 的场次,因为 HR 说我去年有表示想换,所以今年就换了。
一样分成两天,一天三场 ds/algo,另一天一场 ds/algo 和一场 G&L。
onsite 第一场是全英文对谈,
这场一样以一个 easy 暖身开场,
一样秒解后,面试官还问: "Are you sure about your solution?"
很紧张地再 dry run 两次都没问题,
结果他笑着说: "Just want to check you have enough confidence with your code."
然后表示这确实是最佳解,也没有可以再最佳化的地方了,做得好。
然后就进到下一题 lol
第二题他一开始有说这会是一个题组,有点难把这个题目归类难度,
是个比较偏向 open-ended question 的问题。
大致上就是写个他要求的东西,他会再问些进一步的问题,
你再思考改善方式这样。
这个题组其实不太像是传统的 ds/algo 问题,
个人是把它归类为 L4 以下可能会面对到的 sd related 问题吧。
时间差不多时也就稍微闲聊一下,他还说如果我有机会进去遇到他可以跟他说声嗨 XD
也是满愉快的结束这一场,个人自我评价是 positive。
onsite 第二场也是全英文对谈,是个扑克脸面试官,
一样的 easy warm up 秒解,追问了一个 medium 等级的 follow-up
一样的照流程写完 code 后,再被问了一个不同的 medium 题目,
这个 medium 我给了两种方向的解法,分别会对 time/space 有 trade off,
没有写 code 就结束这回合,因为是扑克脸所以也感觉不出 feedback,
但是因为最后一题在思考解法时中间有点差错,是被引导纠正回来的,
所以自己给的评价是 neutral。
onsite 第三场是中文对谈,是个口气稍微严厉点的面试官,
只被问了一题,原本以为一样是 warm up,结果提出解法后的正确性证明直接卡关,
被面试官直接说:“没法证明正确性之前建议不要这么做。”
只好退回来以直观想法重新开始。
后来实在想不到直观想法以外的解法,卡了一阵子面试官就主动给 hint,
好在拿到 hint 后很快的给了一个解法,面试官再在这个解法上问了一些优化方向,
就结束了这场面试。
想说惨了完蛋,跟前面两场的手感完全不一样,自己给了评价是 negative。
事后去网络上找有没有类似这题的题目,结果原来 Leetcode 有一模一样的题目,
难度等级是标为 hard。
onsite 第四场也是中文对谈,是个笑笑扑克脸的面试官,
笑笑扑克脸的意思就是他从头到尾都是笑脸,但是会笑得让你有点紧张。
这次一开始就一样是 easy warm up 秒解,被面试官问说是不是有在当助教 XD
然后他说原本他打算再问两题,看这样我直接回答第二题就好。
结果这题我一下子就看出是什么类型的题目,但子结构一直抓不准卡超久。
一开始他说没关系别紧张时间还很多,试了一阵子后我还怀疑我自己是不是走错方向。
于是他就给了 hint 说方向是对的,要我继续,
好在他给完 hint 后没多就终于抓到关键点提出解法,
写下 code 花了点时间处理 edge case,整个完成时超时大概五分钟。
满感谢这位面试官愿意多给我这五分钟,让我最后能写完完整的 code。
这场自我评价 neutral。
接着最后一场是 G&L,这场对 Google 来说好像是一个门槛值,
feedback 只会有 pass/no pass,似乎不会拿来打分数,
所以我大概用 STAR pattern,参考这里:https://zhuanlan.zhihu.com/p/40915843
归纳了几个方向的回答就上场了。
这一场题目大概分为“你以前的经验”与“假设性问题”,
只要照着 STAR pattern 应该都算满好回答的。
至此终于完成所有 onsite interviews,
隔了一个礼拜 HR 周三告知会送 HC,然后很罩的帮我塞进周五的 HC session,
当天下午就知道过 HC 了,当下真的抱着老婆小孩一起欢呼 QQ
接着就是 team match,跟谈薪水,team match 之前我有在板上发问,
一些前辈给的建议满好的我就不再多说了。
薪水其实我没什么谈,只能说有些 Youtuber 真的满厉害的 XD
现在就是等著收到正式 offer letter 到来的那天。
回首过去的两年半真的是一场奇妙旅程,
请了两次六个月的育婴留停在前公司应该也是前无古人吧!
好在最后的结果是不错的,才能以一个幸存者的角度分享这些事蹟,
希望我的例子也能给一些还没上岸的板友加油打气,
big G 失败好几次真的是正常的,尤其在努力了之后却没有好结果的当下真的会很沮丧,
但只要持之以恒,总有一天可以看到那出口的光芒 :)
最后想再分享的是,
面试前我自己有许愿,如果上了之后要来分享我写过题目的所有解答,
目前正在慢慢施工中,再请期待~
最后的最后,虽然文中一直强调刷题的题数不是重点,
但还是任性地想晒一下最后完成的题数,证明我的努力。
https://imgur.com/a/foiHUlO
Cheers!
作者: sanguinesand (大根君)   2021-07-10 16:15:00
推!!
作者: lazuritechen (Chen)   2021-07-10 16:57:00
讲那么多这里的人看不懂啦 钱有GG三宝轮班多吗哈
作者: jackeighteen (拍感动人心的照片)   2021-07-10 17:23:00
能感受到你的喜悦,感谢分享!
作者: Lindeman5566 (德曼56)   2021-07-10 19:36:00
感谢分享
作者: patrick2dot0 (第一中锋)   2021-07-10 20:28:00
感谢分享
作者: wweewweewwee (1p )   2021-07-10 22:05:00
恭喜!
作者: gogogogo3333 (gogogogo33333)   2021-07-10 23:00:00
role model
作者: mathbookh2o2   2021-07-11 01:40:00
上面的 lc八次前100 超神的耶这样也会失败喔QQ
作者: Lucifer10896 (我要养猫)   2021-07-11 09:24:00
作者: joekaojoekao (bingroom)   2021-07-11 10:30:00
恭喜!感觉这篇也会吓退不少人XD
作者: juijuijuijui (瑞瑞)   2021-07-11 16:07:00
好内卷的竞争@@
作者: movingroovin (嘿!)   2021-07-12 09:57:00
佩服 推推

Links booklink

Contact Us: admin [ a t ] ucptt.com