軟體職缺準備心得
背景
台大機械畢業 最高學歷碩士
現職半導體設備外商軟體開發
YOE 9
Preface
這篇文章假設基礎為平常空閒時間不多,但是有辦法抽出時間練習的人
可不可以不要刷Leet code
可以,只要你有辦法專精在某個領域,比如linux kernel mail loop內大家都認識你
如果只是一般人,想進比較大的公司刷題只是基本,你也可以找不考刷題的
就我所知Canonical好像不考Leetcode,不過在opensource領域的經驗會被考慮
How to start
面試不是為了單純高薪資,而是找到適合的公司與適合你的職涯發展
所以規畫你的職涯發展,最終目標是讓你的能力與會公司的發展方向匹配
可以先看暢銷書原子習慣,想想以下問題
- 自己想成為什麼人
- 這種人每天做甚麼? 能在open source有貢獻或逛stackoverflow回答問題?
- 選擇一個最小目標,足夠小到讓即使在你狀況最壞的情況下也能達成
- 如果昨天沒做到也沒關係,今天要做到,不要明天再做
以我自己舉例
- 想在技術上專精,要是能專精C++在最佳化領域上更好
- 每日: Leetcode撰寫時以效能為目標,了解那些技巧可以幫助你提高運算效率
- ”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]
[There are no zero cost abstractions]
How to write resume
建議看這篇文章,是免費的,它其他的面試建議也不錯
https://www.techinterviewhandbook.org/resume/
重點:不管你用google doc/word,不要用 表格 不然ATS parsing容易出問題
在2020求職的時候用的resume有表格,拿到的面試少很多(我就廢..)
不過今年大缺人也是一個因素
絕對要經營自己的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
推薦幾個:
- Algorithm + Data Structure = Programming (ADSP)
兩個Nvidia工作的 C++ commitee成員主持
以C++ algorithm為主軸的podcast,有時候夾雜一點APL,一回30~40min
Apple, audible, spotify都有,每周都有更新 - Programming Throwdown
介紹各種程式語言或framework,如果你想要多了解一些語言概觀可以挑這個聽 - 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
- 一定要準備問面試官的問題
- 不要問網路上查得到的問題,除非這只是follow up的引導問題
- 問的問題方向不一定,Technical / Business看你想法
- 新創的話多問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上回答或發問是一個很好的工程師訓練方式
有空逛一逛也可以學到不少新知識
- 訓練怎麼有結構地問一個問題,如何找到ref 證明自己不是問蠢問題
- SO跟rubber duck一樣,問完之前自己會找到答案
- 如何探討爛問題,或從爛問題的XY problem中找到真正的問題,避免自己問..
- 有架構地的回答問題,鍛鍊自己的文件撰寫技巧
- 習慣性直接在online compiler上寫proof of concept exmpale
- 下一次你就會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
Coursera – Algorithms, Part 2
[Udacity – Intro to Algorithms]
(https://www.udacity.com/course/intro-to-algorithms–cs215)
MIT Open courseware – Introduction to Algorithms
其他準備心得
[How I got into Google by Prajakta Tathavadkar]
[How I got into Google by Gourav Mittal]
[Average to Googler in 4 weeks:Study Plan by Milan Naseri]
[My Preparation Journey for Google Interviews by Shantanu Kshire]
What’s it like to work at Google?
Prepare for your Google Interview: Coding
Prepping for Your Google Interview: Leadership
[How to: Work at Google – Example Coding/Engineering Interview]
How to: Prepare for a Google Engineering Interview
其他網站
HackerRank
Topcoder
Codeforces
Leetcode
InterviewBit
Kattis
[X] GeekOfGeeks 如果看這個網站,所有 的資訊最好都跟其他可信網站交叉驗證
這個網站的資訊非常地不精確
瀏覽 4,333 次