前面有我拿到offer的心得文,可自己A我的文章
# 背景
台大机械毕业 最高学历硕士
现职半导体设备外商软件开发
YOE 9
# Preface
这篇文章假设基础为平常空闲时间不多,但是有办法抽出时间练习的人
# 可不可以不要刷Leet code
可以,只要你有办法专精在某个领域,比如linux kernel mail loop内大家都认识你
如果只是一般人,想进比较大的公司刷题只是基本,你也可以找不考刷题的
就我所知Canonical好像不考Leetcode,不过在opensource领域的经验会被考虑
# How to start
面试不是为了单纯高薪资,而是找到适合的公司与适合你的职涯发展
所以规画你的职涯发展,最终目标是让你的能力与会公司的发展方向匹配
可以先看畅销书原子习惯,想想以下问题
1. 自己想成为什么人
2. 这种人每天做什么? 能在open source有贡献或逛stackoverflow回答问题?
3. 选择一个最小目标,足够小到让即使在你状况最坏的情况下也能达成
4. 如果昨天没做到也没关系,今天要做到,不要*明天再做*
以我自己举例
1. 想在技术上专精,要是能专精C++在最佳化领域上更好
2. 每日: Leetcode撰写时以效能为目标,了解那些技巧可以帮助你提高运算效率
3. ”no raw loop” - Sean Parent. (这只是个人信仰,不是必要)
尽量用STL解决问题,可以参考 https://www.fluentcpp.com/getthemap/
效能上如何避免cache miss, 什么时候vector会比map快...etc
## Optimization
最佳化最重要的是profile,学太多最佳化方法但是到处都用不是好事
最佳化是拿弹性去交换来的,所以只需要用在bottleneck,非必要不使用
对这个题目有兴趣的可以找找Chandler Carruth的演讲(大部分都是Cppcon)
[Going Nowhere Faster] https://www.youtube.com/watch?v=2EWejmkKlxs
[There are no zero cost abstractions] https://youtu.be/rHIkrotSwcc
# How to write resume
建议看这篇文章,是免费的,它其他的面试建议也不错
https://www.techinterviewhandbook.org/resume/
重点:不管你用google doc/word,不要用 *表格* 不然ATS parsing容易出问题
在2020求职的时候用的resume有表格,拿到的面试少很多(我就废..)
不过今年大缺人也是一个因素
# Linkedin
绝对要经营自己的linkedin, 至少大致上要跟CV相同或更详细
Google HR是从Linkedin上找到我的,其实我不确定自己投会不会有人理XD
可以找一些网站帮你review profile 像是https://resumeworded.com/score
他可以帮你评分,很多细节要花钱解锁,即使光看免费的部分也可学到不少
比如我现在才知道Linkedin headline其实可以放202 chars…
可以把很多技能相关的直接放上去,搜寻可见度会高很多
像是Software developer | C++, GTest, GMock, Multithreading …etc
# Cracking the Coding Interview
非常建议买中文版的看过前面的部分
中文书名: 提升程式设计师的面试力
英文看很快你也可以买英文的,他的翻译还算可理解
他会告诉你面试时应该要关注的重点,以及解题的技巧与方向
# Leetcoding
## Grind 75
我发现ptt没什么人提到 Grind 75,我觉得他比blind 75更有用
一共有有169题 https://www.techinterviewhandbook.org/grind75
就是Blind 75的作者制作的建议的列表,给定每周想花的时间,照顺序练习很方便
他给的顺序大约是一个主题的特定方向2~3题,然后切换主题
适合原本就有基础的人抓回感觉,或是没太多时间刷的情况下抓对基础方向
自己是设定14hr/week来写,后来有空就把所有medium都写一写
hard看看挑几题来写,最后写了差不多160题,然后每天写个leetcode daily抓手感
我都是用C++,目标还是以C++为主所以没考虑用其他语言写
如果你日常不是写C++,建议以自己熟悉的语言写
如果你平常用的语言写起来不方便(对,我就是说C++) 那我一率推荐Python
像是用C/C++的人,其实建议刷题还是用python最快,因为实作最方便
因为时间不太多,题目看完觉得自己想的不是optimal就看hint
十分钟想不到optimal就看讨论/解答,八成的情况还是跪在Lee’s code前面
目标是未来的题目可以抓对方向
有些题型写过一两次就会有感觉,像是permutation在很多情况下可以用上
如果有Google HR给的大补帖,也建议看过一遍(appendix有附)
# Mock interview
自己没做,只有在写leetcode的时候用英文自言自语,果然练习不足在Google这吃鳖
如果要找mock interview,建议先找专业的把方向叫正好再来找免费的
在Cracking the coding interview一书内其实已经涵盖87%的要点
因为我拿到Google Feedback了,顺便把一些要点列在这
- 询问边界条件与澄清问题
- 列出多种实作并讨论其trade off (加分,但是如果强者都加分那就是must)
- 讨论Time complexity & Space complexity
- 题目一定要做完 (trivial impl可以问面试官可否跳过,要尽快掌握哪边是重要实作)
- 遇到Bug可以不靠提示自己找到
个人理解: 不靠提示是指: 面试官说_有问题_你就能自己找到答案
这是我个人最弱项
- 确保题目内的所有资讯你都有用到 (这个很重要,我面试时有漏掉一点)
- 实作不要处理得太复杂,才有机会写完 (这个应该需要大量练习或是天分XD)
# System Design
Google L4/L5 Loop才会面
我没练习...Design Pattern只记得自己常用的,上次想讲SOLID连这个字都忘记XD
最常推荐的资源就是Grokking the System Design
Leetcode现在有System Design特价中$60,有买整年会员更便宜只要$30
没买不确定内容有什么,不过影片是印度腔,最差的情况还可以当印度腔听力练习
# 英文
现在就在外商,不过面对的人英文不是母语,两边烂英文互聊其实还是有帮助
很现实的是,要面外商,至少要敢说,如果别人听不懂,就练到别人听得懂
语言没有硬指标,但是没有达到基础门槛就是没办法过
这边没办法给太多建议,我自己是会开车的时候听podcast
推荐几个:
1. Algorithm + Data Structure = Programming (ADSP)
两个Nvidia工作的 C++ commitee成员主持
以C++ algorithm为主轴的podcast,有时候夹杂一点APL,一回30~40min
Apple, audible, spotify都有,每周都有更新
2. Programming Throwdown
介绍各种程式语言或framework,如果你想要多了解一些语言概观可以挑这个听
3. Stackoverflow podcast
主题满多的,都以Tech 为主,也是30~40min
# Coding Interview
Interview 不是考Leetcode,而是如何跟面试官讨论设计跟实作(个人意见)
当成写production code,coding style跟naming convention仍要有
实作前写些comments记录要做什么,不然写到一半忘记edge cases就会被扣分
就算实作不是optimal(比方写起来比较花时间),但如果你能说出optimal也会加分
个人习惯是假设这个需求未来会变,suboptimal solution但弹性大也是一个做法
# BQ Interview
即使短期没有面试,每季/年做performance review总要跟老板说你做得多好
不然怎么能拿到好绩效? 这种故事就适合做为BQ情境准备
把这些情境记录下来,在写BQ的时候才不会痛苦,除非记性真的超好那没话说
Amazon Leadership Principle基本上算是BQ基础,建议做投影片把情境都列出来
这样去面其他公司的时候也可以拿出来讲,至少不会一紧张就忘记自己做过什么
# Other interview side notes
1. 一定要准备问面试官的问题
2. 不要问网络上查得到的问题,除非这只是follow up的引导问题
3. 问的问题方向不一定,Technical / Business看你想法
4. 新创的话多问business model,判断这家新创有没有机会久活
# Competing Offer
我也不会...看了几篇觉得还算满有帮助的
https://haseebq.com/how-not-to-bomb-your-offer-negotiation/
https://www.nicksingh.com/posts/the-secret-art-of-salary-negotiation
https://www.fastcompany.com/90749904/how-to-negotiate-your-salary-for-any-job
个人的总结是诚实跟对方说你目前还没面完,预计多久要下决定
比较好的公司都愿意等,至于那种明天叫人来上班的...没去过但听说都很雷
# Improve yourself
即使面试成功也不要灰心,你已经拿到过门票,多准备下次再来就好
问问看每家面试结果的feedback,了解自己的问题然后调整每日目标
# Contribute to open source
## 关注你有兴趣的题目
像是对Linux有兴趣就看Jserv的系统软件课程讨论区,我FB几乎只逛这XD
把逛社群媒体的时间花在逛技术讨论区,其实进步会很快
## 找到你有兴趣的project
这边涉猎较少...过去一年内目前也只贡献了两三次PR,至少也比没有好
即使只是文件的改善,都有机会从review中学到很多
## Ptt 版友 Hsins的分享
十月的时候会有 Hacktoberfest 鼓励大众参与开源,十月期间
会有一些 GitHub 的开源专案,由专案维护人员将一些 issue
标上分类,有些还会标上新手友好的难易度,活动期间达成一
定的贡献,会有奖品像是衣服和贴纸,想要参与开源可以参考
## First open source contribution
这篇是文章 https://bit.ly/3IGk3yk
### Issues of opensource projects
https://www.codetriage.com/
https://www.coss.community/
https://goodfirstissue.dev/
## Stackoverflow (SO)
最快可以贡献在opensource的方法其实是上stackoverflow回答问题
在stackoverflow上回答或发问是一个很好的工程师训练方式
有空逛一逛也可以学到不少新知识
1. 训练怎么有结构地问一个问题,如何找到ref 证明自己不是问蠢问题
2. SO跟rubber duck一样,问完之前自己会找到答案
3. 如何探讨烂问题,或从烂问题的XY problem中找到真正的问题,避免自己问..
4. 有架构地的回答问题,锻炼自己的文件撰写技巧
5. 习惯性直接在online compiler上写proof of concept exmpale
6. 下一次你就会google到自己的答案,就不会忘记
Tip: 在SO上面问C++ 问题,直接贴godbolt的连结可以加快别人回你的速度
这一次在面试的时候也有feedback提到SO/github上的贡献
自己做的事情会被看见,毕竟用open source的大公司很多,有点能见度也不错
# 挑选面试公司
level.fyi + 比薪水 + 能不能问到认识的人
台湾这些资料还是比较少,就看大家能不能一起贡献
# 带小孩怎么抽出时间
每个人的客观环境不一样,没有办法提供直接建议
比较能共通的: 想办法抽出个人的时间拿去念书,比如逛IG的时间改成看算法
但是不要把自己逼太紧,每天仍然需要放松一下,建议参考原子习惯之类的书
如果你每天都没有自己的时间,那先思考可以放弃什么来挤出时间自我精进
# 总结
尽量设计一个每日目标让自己能努力下去,不要太极端因为会很难坚持
松散没关系,有进度就有进步,不要流于形式就好
祝大家都能找到自己喜欢的工作
# Appendix
Google recruiter提供的大补帖
https://gist.github.com/stanzheng/9631465
其实都是公开资讯,但是还是很有参考价值
## Reading meterial
- Introduction to Algorithms (最新的应该是4th)
- Google Style Guides (看你用哪个语言)
- [Coursera - Algorithms, Part
1](https://www.coursera.org/learn/algorithms-part1)
- [Coursera - Algorithms, Part
2](https://www.coursera.org/learn/algorithms-part2)
- [Udacity - Intro to Algorithms]
(