2025 Summer CS 找實習心得

投遞結果

面試過程

Nvidia:我其實是投 Software System Intern,結果被 refer 給 Site Reliability Engineer Intern 的 team 🫨。可能是看到我履歷以前是搞 DevOps 的。一面跟 Hiring Manager 聊一聊網路相關的知識,TCP, DHCP, Network troubleshooting。太久沒碰真的有點生疏。後來還有問 Python 相關的問題,GIL, multiprocessing 等等。但我 Python 真不熟,只拿來寫寫 script。過幾天就收到拒絕信。

Rigetti Computing:我是在 LLVM discourse(一個問問題的論壇)看到有人在徵 MLIR/LLVM 的實習生。MLIR 真的不熟,但看到 LLVM 就還是投了。過兩週收到 Hiring Manager 的信,約了一面 30 分鐘的聊天。介紹了公司是在 Berkeley 做量子電腦。查了一下才發現廣達有買他們公司的股票,所以也入手了幾股 😎。實習的工作內容主要是利用 MLIR 編譯 Quil program,目前還在實驗性的階段。一面完之後給我選個 4 個小時的時間段來寫他們給定的回家作業。主要有過完 MLIR official tutorial 應該是沒問題。但我當天花了兩個小時在搞 CMake,最後的鏈結一直出問題 🥲。反正主管也說他會看 git commit 還有 coding style 等等,不一定要全部寫完。但寫完當下我還是覺得涼了。

Intel:我其實在 2025 年 1 月就有投 Intel 的 Software Engineer Intern。但這個機會我是在 Reddit 的 Compiler 論壇上看到有 Hiring Manager 在徵實習生,一看到貼文就手刀私訊給他我的履歷。主管跟我說這樣找人比較快😂,他也很快回覆跟我約一面。這個 team 在 Folsom 做 GPU Compiler,實習生主要幫忙支援編譯器的實作。二面是同一個 team 的兩位成員,一位資歷十年的資深編譯器工程師,問了我很多履歷上的問題,無演算法問題。例如,我貢獻 LLVM project 的 patch 細節。LLVM 運作原理, SSA, DCE, CSE。計算機結構的相關問題(SIMD)。另一位是做 Graphics 二十年的 Technical Lead。問了關於 LLVM data layout 還有 padding 的問題。面試完的隔一週就收到 HR 訊息,主管跟成員都給 Positive feedback。

準備過程

我的準備過程跟一般的刷題不ㄧ樣,僅供參考。

我來美國之前就決心要鑽研編譯器了,所以投之前會稍微看一下有沒有跟編譯器相關的職缺。但有些大公司的 Software Engineer Intern 還是有投,去年底還是 fomo 了一波。但後來發現這樣投很累,投資報酬率也很低。最後還是只專心在找編譯器相關的實習。Linkedin 跳 Software Engineer Intern 通知,不到一個小時都 100+ 人投,投了通常都是過幾週收到 Thank you letters 🫨。

2024 年 4 月我就有開始刷題,但每次刷題都是刷兩週就會想放棄,太無聊了。所以後來就認真跟朋友用 C++ 寫了一個 C Compiler。7 月的時候還花了兩週研究 LLVM API,直接讓我們的 C Compiler 可以產生 LLVM IR。也算是我開始接觸 LLVM。

2024 年 9 月,開學兩三週比較適應了。想說又要來繼續刷題、投履歷。但這次也是刷兩週就放棄了,寫 Leetcode 真的提不起勁。就轉頭找 John 做個 course project(Advanced Compilers)。因緣際會就開始對 LLVM 有些小貢獻,改改 tests、實作 InstCombine optimization。這期間也是讀了蠻多 LLVM 程式碼跟文件,一點一點累積。

我其實一開始都會在想自己提交的這些 patches 會不會太簡單。改 tests、改一小部分的程式。但 John 每次都會跟我說能讓 LLVM maintainer 接受這些 patches 不簡單,如果他是面試官看到我這些 commit history 一定會想雇用我,鼓勵我繼續提交。

2025 年 1 月,第二個學期開始。到目前為止也只有收到 Nvidia 的面試,還被拒絕 🙂‍↔️。但這期間還是繼續每天學習 LLVM 的相關知識。這學期除了修兩門課,還有繼續跟 John 做編譯器研究。說好聽是研究,但其實就是繼續貢獻 LLVM,且難度提升。

結語

再次聲明我只是分享我的看法,倖存者偏差 🥴。

回頭看去年發的研究所申請文,覺得自己的觀點是正確的。現在 AI 越來越厲害,簡單的 CRUD application、Leetcode 演算法問題,AI 大部分都可以回答的比人類還要好了。為什麼還要刷題?前陣子才有人做出一個 Leetcode 作弊神器,根本是官逼民反的最佳範例,但還是不建議作弊啦。人類到底要做什麼才能在這個就業市場生存下去?個人認為是很深的領域知識(Domain Knowledge) 以及獨特性。

過去幾個月,我也有用 ChatGPT 或是 Grok 來幫我解答一些 LLVM 的問題。AI 可以幫忙解讀程式碼、文件,但要真的請 AI 改動一些 LLVM 底層邏輯,AI 還是沒有辦法。而且很常會鬼打牆,一直重複錯的解答。這時候人類的價值就顯現出來了。從 LLVM 這個龐大的專案,一點一點拆解、分析每個 module, pass 的作用,最後改動正確的地方、並寫出有效的測試、執行模糊測試、找到錯誤的測試並試著縮小測試。這每一步都是需要有經驗跟領域知識才能做的。你可能會說,那我就把所有程式碼都餵給 AI 他就會了。但問題就是 LLVM 是個龐大的專案,每天會有幾十、上百個改動合併到 master branch。要怎麼讓 AI 一直學然後確認 AI 學到的是正確的?需要人類的介入、驗證以及經驗。

就編譯器這個領域來說,人才是很稀缺的。又因為有吃到 AI 這幾年的紅利,常會在 Linkedin 上看到大公司釋出 ML Compiler Engineer 的職缺。這些 Compiler Engineer 職缺相較於 Software Engineer 職缺,投遞的人數通常都只有十位數、甚至是個位數。一般的 Software Engineer 職缺幾乎所有都是超過一百個人投(沒買 Linkedin Premium 只能看到超過一百個人 😂)。ML Compiler Engineer 雖然前面加了一個 Machine Learning,但其實說穿了他的職位大部分都還是專注在傳統編譯器的技術。所以只要掌握住基礎的 Computer Architecture, Operating Systems, Compilers(系統程式三本柱)知識,其實還是可以從現在的 CS 紅海中殺出一片天的。

總歸一句,找到自己喜歡做的領域,然後一直深入的去研究。強到有一天你可以教 AI,你就不可取代了。最後感謝女友、家人、朋友的支持!🤘