近期準備轉職聯發科SE深受版上前輩們幫助,因此決定也來回饋一下。
我的背景是112非CS碩但碩論是做AI應用方面的研究,大學在114有修完CS將近雙主修的學程。
由於是第一份純軟的工作,看職缺並沒有特別有想法,已經決定不是要走AI相關的話,就找演算法或是系統開發。加上是在職期間邊工作邊進行面試的準備,因此想將準備範圍盡可能地縮小,在第一波投遞履歷時,我只先找了必備條件上列出會C/C++/python擇一、有RTOS相關經驗加分的職缺。
準備的過程我在這邊分為三大部分:1. 各個語言的語法與其資料結構 2. LeetCode刷題 3. OS與計算機結構複習
第一部分:各語言的語法與其資料結構
在職缺要求上由於比較多是C與C++擇一即可,因此我在準備上花較多時間複習C++,在這邊可以推薦大家我認為複習C++資料結構以及演算法非常受用的網站:http://alrightchiu.github.io/SecondRound/mu-lu-yan-suan-fa-yu-zi-liao-jie-gou.html。基本上我是看完之後會自己再寫幾遍來加強印象,上網做功課時有發現有些題目出現機率特別高,例如:Linked list, sort algorithm,因此我又有針對這兩塊特別多複習,資料結構的複習大概準備了2–3週的時間。
第二部分:LeetCode刷題
LeetCode這邊的刷題應該是面試所有Software engineer都需要做的準備,由於決定要轉職時我個人已經接近1.5年沒有寫程式了,並且準備面試的時間有限,因此我是將難度Easy的題目照面試被考的頻率由高往下準備,在面試前大約寫了60題左右。
第三部分:OS與計算機結構複習
爬文做功課時,幾乎所有前輩們都有提到這兩個科目是必考,在這邊非常推薦清大的OCW,OS的部分我是看了周志遠教授、計結為黃婷婷教授,而在我看計結時由於幾乎忘得一乾二凈···因此我又多複習了王俊堯教授的數位邏輯設計。以上三門課都可以在Youtube找到影片,也可以在清大的OCW網站上下載課程講義。
我在準備時由於懶得去印紙本講義,因此買了一本小筆記本,邊上課邊做筆記,在面試前的一兩天直接用自己的筆記來複習,覺得效果非常好。由於每一堂課都是一整學期的課程,因此這三門課的複習我大概花了1個月半的時間。
接下來要分享的是實際面試時有被問到的問題,這邊我就不拆成不同職缺考什麼,基本上科目都是上面講得幾個大方向:
資料結構與演算法方面,由於面試官幾乎都會很貼心地問你哪個語言最熟,他就會讓你用最熟悉的語言去寫,而我選擇了C++,有被考的題目為:
1.反轉Linked list, 包含其資料結構的宣告(Node中的value, next pointer等等)
2.說明演算法中的BFS/DFS的差異
3.說明C++中的overriding, overloading
4.給一個char stream, 反轉之後進行回傳(用\0來判斷stream的長度)
5.Swap的寫法(一般call by reference後用temp, 另一種可以用bit中的X-OR)
而在OS以及計結方面有被考的就很廣了:
- 說明Heap跟Stack的差異, 若在Local function中宣告變數的話會存在哪裡
- 什麼是Race condition
- Synchronization 的保護機制有哪些
- Deadlock發生的必要條件
- 記憶體架構
- Caching的機制
- CPU scheduling
- Pipeline的概念(為何要用Pipeline, 有哪幾個stage)
- Interrupt的概念(何時會發生,發生時CPU跟OS會有什麼行為)
主要我記得的是這些,只要有複習完這幾個科目的話答案都滿清楚的,整個面試過程中不會考到太刁難,基本上都是有觀念就可以了,也祝福各位面試順利。