Google SWE Intern (Core Development) Summer 2020 心得
9/4 是我實習的最後一天,回想 6/15 開始實習的那天,12 週就這麼過去了,覺得時間過得好快。Remote internship 跟以前網路上看過的心得完全不同,我遇到 project 也很不一樣,所以趁著給勞動節連假把心得打完,希望看到這篇文章的人之後可以當一個厲害的 intern!
Preface
說也奇怪,大三時為了修課自學了 TensorFlow Python API,當時就覺得寫這種 library 好酷,真想有朝一日可以貢獻自己的心力,但從沒想過要怎麼做到,甚至後來交換時做的 research project 跟畢業後在中研院的工作都是 Machine Learning 相關的東西 (當兵時想通了就放棄這條路)。
沒想到 3 年多後的今天,我已經不再碰 Machine Learning 本身,而是到了 Google 當 Software Engineering Intern 並且在 TensorFlow 上貢獻了自己的 code,只能說這是我這輩子從來沒想過的事,因為我的計劃都是很粗淺的,目標也只放在未來一年左右,回想起來真的是一個很特別的過程。
What was your project about?
Project goal 是透過純 C++ (不依賴任何 Vector instructions) 來加速 TensorFlow Lite Micro (TFLM) 的 kernels (operators) 在 microcontroller 上面的 inference 速度 (測試 target 是一個 soft-CPU on FPGA,沒有支援任何的 SIMD instructions)。
TensorFlow Lite Micro (TFLM)?
我相信很多人沒聽過 TFLM、跟 TensorFlow Lite (TF Lite) 又有什麼差別?簡單來說 TF Lite 是主要設計給 Mobile Device (e.g. smartphone, Google Home Mini, etc.),而 TFLM 是主要給 Microcontroller 或是 IoT Device (e.g. Arduino, soft-CPU on FPGA, etc)。
TF Lite 的 target 是硬體資源比較夠的 device,通常記憶體都是數 GB,而 CPU 的 clock speed 都可以到 GHz 等級,而 TFLM target 的 device 通常只有 KB 量級的記憶體,clock speed 可能也都只有數 MHz,在上面跑 TensorFlow 是一件很 tricky 的事,目前用 TFLM 的 community 相對 TF Lite 來說小很多,所以常常做到一半遇到的問題都是沒人解決過的,StackOverflow 上也找不到答案,即便找到了,可能因為解法是 platform dependent 的所以自己也不能照著做,整體來說是一個很 challenging 的 project。
我甚至是做到實習過了一半,我的 host 才跟我坦承他其實不期望我做出任何東西,只要我把所有試過的方法都記錄下來、讓他們之後可以 reproduce、 recognize 需要的 work 再由之後的人繼續做,他就很滿意了。
What’s the outcome of your project?
雖然是做 open source project,而且大部分的 work 都 merged 到 TensorFlow repository 裡面了,但並不是所有東西都可以拿出來講,加上每個人遇到的 project 都不一樣,這邊就不細談了。
主要的 outcome:
- 在現有的 kernel 上加速了兩個 kernel 在 CPU 上的 performance
- 重新設計一個 kernel 讓它更適合在 CPU 上做 inference
- 寫了兩個 tools 給 TensorFlow Lite / Micro 用
上圖是有被 merged 的 PRs,有興趣的話可以點 caption 裡面的連結看,有兩個 PRs 跟 TensorFlow team 討論後決定不 merge,全部的 PR 可以點這裡。
Background
不平常的一年
我想大家都會同意 2020 年是很艱難的一年 (即便現在才 9 月初),由於疫情的關係,許多公司紛紛從年初開始陸續砍 headcount,甚至取消 intern offer,連 Google 也不例外,慶幸的是 Google 在 3.4 月只收回了還沒有簽合約的 intern offer,已經簽完的人不受影響。我很幸運地在 2 月中就已經 match 上一個在 Pittsburgh 的 team 也把合約都簽完了 (詳細請見 Summer 2020 SDE intern 找工心得)。
到 4.5 月時,美國的疫情絲毫沒有趨緩的現象,許多公司開始改成 virtual / remote intern,我在幾個 intern 群組也陸續看到有人被換成 open source project,有些人是維持原本的 team 只是 project 內容有點改變了,有些人則是被換到不同 Product Area,甚至有些人說拿到的 project 跟自己的 background 完全不 align,在群組裡面崩潰。
5 月第一週,我收到了 HR 寄給我的信,內容如下,簡單來說就是原本的 project 沒辦法讓我們 WFH 做,所以要把我換到一個 open source project ,意味著我要重新再進入 pool 等人來撈我,不同於最開始的 team match,這次的 match 不用另外面試,只要 host 有興趣就會直接 match 上。
大概等了兩週吧,HR 跟我說有 host 對我有興趣,所以我的新 project 已經 settle down 了,同時也 cc 了我的 host,我就先寄信大概寒暄一下,順便查一下他的 LinkedIn。一查不得了,他是 Google NYC 某個 Infrastructure team 的 Tech Lead,我還是第一次聽過這麼高職等的人會願意帶 intern,又或者,其實他只是掛名,實際上是交給 team 裡面其他 engineer 來帶我吧?
後來才知道,我做的 project 是我 host 的 side project (i.e. 我沒有 co-worker,也沒有 team 跟我一起做,Google 是允許員工花 20% 的工作時間來做自己喜歡的 project,可以是任何東西),他的工作跟我的 project 一點關係都沒有,他也根本不知道怎麼做,而我的 co-host 做的是偏硬體的 optimization,所以基本上我是一個人做整個 project,除了最後是有跟 TFLM 的 team 合作把 code merge 進去。
上工前
本來預計回來的機票是 5 月中,但因為疫情的關係華航 5 月的班機幾乎都被取消,最後經過幾般波折,總算在 5/31 搭華航直飛到 LAX 再開回 San Diego,實際到宿舍的時候都隔天凌晨 1.2 點了。
自從公司宣布改成 virtual internship 之後,就沒有要求我們搬到 Office 所在的城市,我就乾脆待在加州 WFH 了,不過由於 host 在東岸,我們會有 3 hr 的時差,甚至想過在加州過東岸時間比較方便 (後來沒有 XD 都 8:30 起來)。
上工前一週,我的 intern host 寄了一封信給我,說是大致上的 project 內容,我一打開信臉都綠了,裡面附上的 project 是跟一個叫做 SymbiFlow 有關的東西 (見下圖),這怎麼看怎麼不妙啊…
我大學同學們應該都知道,FPGA,或者說 Verilog 跟電路,是我這輩子最不想再碰的東西,不是因為它不好,單純只是我不喜歡做硬體,修修課當身體健康是還好 (大學甚至把數位跟類比電路的大學部課都修完了…),但工作嘛,我真的沒辦法。
我還記得我收到這封信到上工前心情都很差,原來真的會 match 到跟自己 background 不 align 的東西 (我的 resume 上沒有列任何一項 FPGA 或是 Verilog 相關經驗),上工前一天很絕望到甚至考慮不上工了。
接下來終於要進入正題了
Internship Timeline
我的 timeline 大概長這樣
- Week 1 - 2: On-boarding, setup laptop, get familiar with toolchain
- Week 3 - 4: Get the ball rolling
- Week 5 - 6: Little breakthrough; midterm review
- Week 7 - 10: Experiment & make changes & contribute to TensorFlow
- Week 11 - 12: Work with TensorFlow Lite Micro team on PRs (Presented on week 12)
一個 Google intern 在實習期間,會有幾個重要的時間點
- Midpoint Evaluation
- Project presentation
- Final Evaluation
Midpoint Evaluation
如同字面上的意思,當實習過了一半的時候,會有一個期中評量,host 會在這個時間點對 intern 這段時間的表現作出一個評價並且給予 feedback,而這不單單只是 host 給予評價,host 會反過來問 intern 覺得有哪裡可以改進讓 internship 更好,可見 feedback 在 Google 文化中是相當重要的一環。
即便期中評量的結果不會被列入最後轉正職的 package 裡面,整個流程跟所需要填寫的資料其實跟期末評量差不多,也就是說期中評量對一個 Google intern 來說也是一件很重要的事,差別在於期中評量只會 stay between you and your host,而期末評量卻是會被 Hiring Committee 在審資料時看到。
值得一提的是,在 host 跟 intern 都填寫完期中評量後,intern 是可以看到 host 評價以及細節。期中評量後的隔一週,雙方要有一個約一小時的 meeting,討論期中評量的內容:認可 intern 做得好的地方、以及 intern 可以改進的地方。
Project Presentation
沒什麼好講的,就是報告 project 了。我聽過很多人是 15 ~ 30 min,但我不知道為什麼被安排了 45 min… 害我講到後來喉嚨超乾。
Final Evaluation
期末評量的重要性就不用多說了,應該是所有公司都會有的一個流程,用意是讓 intern 知道自己在實習期間的表現如何、是否值得公司給你一個 return offer 讓你畢業後回來工作等等。
期末評量的格式跟期中評量基本上是差不多的。唯一不同的是,intern 是沒辦法看到 host 給的 Final Evaluation (通常 host 會在 internship 結束後 2 周內給),只能在最後一週口頭跟 host 要一個 feedback。
有別於其他公司,一個 Google intern 的 Final Evaluation 並不能完全決定該 intern 是否能拿到 return offer。 Google 的轉正 (conversion) 需要約 4 個 (有人說 5 個) Googlers 的 review,而這裡的 review 可以是以下 2 種
- Intern host / co-host evaluation + (optional) internal reference
- Interview results
據我所知在其他公司,review 是由 host + mentor + coworker 給的,但在 Google,mentor 既不會參與 intern 的project,也不會幫忙 review code,或甚至 mentor 跟自己的 job ladder 是不一樣的 (e.g. business, management, etc.),mentor 只是一個可以讓 intern 聊聊實習遇到的事、平時一起喝個咖啡聊天、幫助 intern 融入公司的一個人。
一般而言,一個 intern 會同時有 host 跟 co-host / co-worker,他們兩個人會給出 2 個 reviews,而剩下的 2 個就會從一輪 back-to-back technical interview 中得到,也就是所謂的 conversion interview。有另一種狀況是,如果一個人當了 2 次或以上的 Google Intern,那麼那個人就會有來自 2 次實習的 host + co-host 的 review 總共 4 個,這種情況下聽說會直接送 Hiring Committee 審核轉正資格。
不論是哪種 case,如果 4 個 reviews 還不能讓 HC 作出決定,HC 會給該 intern 一次加面,再來就會做出 final decision了。
有趣的是,我的 host 在我 presentation 後,問我有沒有認識其他 Googler 對我的 work 很熟悉、有密切合作過的,因為他想要幫我多找一個 internal reference 來 support 我的 conversion package,而 reference 只需要打勾就好,不用像 host 一樣需要寫報告,所以只要能找到一個人願意幫我就行。
而就這麼剛好,我在最後兩週密切地跟 TensorFlow Lite Micro 的一個 engineer 合作,要在我離開前把 code review 完後決定去留,加上這兩週他都一直跟我說我的 documentation 跟 PR message 很清楚也完整,他幾乎不用多花時間理解,所以我覺得他會願意幫我背書。我就跟我的 host 解釋為什麼我想找他以及為什麼我有信心他會願意給我一個好的評價,所以我猜我應該會多一個 internal reference 的評價,至於這個評價在 conversion 中佔有多少比重就不得而知了。
Intern 101 - Learn how to be a good intern
坦白說,我的 Midpoint Evaluation 蠻爛的,總共 5 個向度 (2 個 technical 3個 soft-skills),而我 3 個 soft-skills 全部都拿了 Need Improvement,當下看了我 host 寫的理由其實蠻難過的,看到評價到 feedback meeting 隔了整整一天,那天大概就是我整段實習裡最痛苦的 24 小時吧。
隔天在 feedback meeting 上我仔細聽了他講的每一個他覺得我要加強的地方,他同時也告訴我他覺得我該怎麼做比較好。幸運地是,大部分的事情都是缺乏足夠的溝通,我就跟他解釋了一下事實跟他的理解其實有點差距,算是把話講開,畢竟沒有人有過跟一個完全不認識的人一起工作的經驗。最後我也跟他說我很需要這樣具體的 feedback 讓我知道哪裡該改進,於是從隔天開始我就照著他給的建議改進自己的表達及溝通。
而在第 7 週的 weekly feedback,他說 You actually take those feedbacks! You should be proud of myself! 最後也給了我一些他覺得還可以再加強的 soft-skills。在接下來的 2週,他對我的 soft-skills 評價逐漸變好。
到了第 9 週 weekly feedback,他說他覺得我從 Midpoint Evaluation 後,都有照著他的 feedback 改進自己、project 進度已經超過他的預期,他很滿意。後來還提起他去年的 intern (當時即將在我的第 10 週回他的 team 做正職),說我現在的表現不論是 project 或是 soft-skills 都已經跟那個人差不多了,最後叫我 keep it up,當天晚上我就在 LinkedIn 上看到他發文。
What do intern hosts expect from an intern?
- Technical skills (coding, data structure, and algorithms)
- Independent research (e.g. carrying out a new project/feature, ramp-up time, learning new skills, unblock yourself)
- Communication skills (e.g. make sure you’re on the same page, clearly explain your idea and design, working with other teams, etc.)
- Responses to feedbacks (e.g. do you take feedbacks? how do you respond to them? etc.)
Technical skills
這部分就是字面上的意思,一般來說,除非 project 跟自己的 background 完全不 align 外,這部分應該都不會有問題 (畢竟都面過面試了),通常他們心裡有底,只是看你可以在這個 project 中成長多少或是表現出多好的自己。
Independent research
公司收 intern 其實是一筆很大的投資,除了要花錢付薪水,帶 intern 的正職也會因為要帶 intern 先接受一些 training、實習期間還要花時間跟心力帶人,前後加起來是一筆很大的金錢跟人力開銷。真正的目的還是想透過 internship 來發掘那些有潛力的學生,並且在他們畢業後直接找回來工作。
所以 intern host 很注重的一點就是獨立,除了在 technical skill 上能夠自學並且快速達到跟 team members 相當的水準、遇到新問題時如何自己想辦法解決 (unblock yourself) 而不是在群組直接問怎麼做,這樣能確保之後這個 intern 在畢業後回來可以獨立自主 carry out 一個 project 而不是別人說一步做一步的人。
這個項目還有另外一個部分,很多時候 project 拿到手沒辦法第一眼就知道哪些地方需要花心力去解決或是設計,這個能力的另一個部分就是如何發現新問題或是可以改進的地方、自己投入心力嘗試去解決、最後給出一個完整的報告說明這個問題能否解決,為什麼要這樣解決或是為什麼這個問題沒辦法被解決等等。
Communication skills
一般來說,人與人之間的溝通是 (1) 聽懂對方說什麼 (2) 思考後回應對方。但在美國的職場上,溝通對我這種非英語母語人士來說是個類似翻譯的過程,我通常都是 (1) 聽懂英文 (2) 轉成中文理解 (3) 用中文思考 (4) 用英文回應對方,我暫時還沒辦法完全用英文思考 (寫 code 跟一部分生活上可能可以),只要其中一個環節出錯了,就會造成自己跟他人之間溝通上的障礙。
我 host 跟我說其實這並不是件壞事,他說只要我在溝通上做到 3-way handshake,換而言之就是在回應對方的時候,先講出自己對對方的話的理解、跟對方確認自己沒理解錯後,再提出自己的想法, e.g.
Host: You can improve [something] with [some algorithm].
Intern: Gotcha, so I’ll improve it with [some algorithm] by turning it to [some form]. [talk about some details in mind]
這樣只要我在理解對方想法時錯了,對方就會發現你沒聽懂,會打斷你並且嘗試用更簡單的說法來表達他的意思。如果我的理解是對的,那麼我就會把我的想法用比較 high level 的方式解釋一下,這時只要哪邊對方覺得怪怪的,他們就會指出哪裡可能不可行、需要更多 details 或是如果對方覺得很好就會表示贊同。這樣的方法可以確保雙方都 on the same page,即便像我這樣的非英語母語人也能在職場上跟別人建立良好的溝通。
Responses to feedbacks
一個人能不能進步,除了從錯誤中學習,還有一個很重要的途徑是透過他人對自己的 feedback,而 feedback 可以是來自上司、同事、或甚至是下屬。
而 intern 在公司中扮演一個很特別的角色,intern 一方面是來學習的,另一方面又有著跟正職類似的 responsibility,加上通常 intern 只待 10–14週,扣掉前後一週要 onboard 跟 ramp-up,最後一週又要 handover 跟 presentation,時間壓力上其實比 new graduate 大很多很多 (通常公司會 expect full-time 有 3–6 個月的 ramp-up)。
這時候如何在短時間快速融入公司文化跟 team 就是一個很大的挑戰,加上我是 remote intern。當初我的 host 說他這輩子從來沒帶過一個素昧平生的人當 intern 一起工作過。如果在辦公室的話整天幾乎都會見到,溝通上也比較不會有障礙,但 WFH 不行,所以 feedback 幾乎變成是唯一的溝通方式 (除了 1:1 跟 standup,這些大部分都是討論進度而已)。
所以除了 receive feedback,intern 的 response 也變得格外重要,如果不願意接受 feedback 或是接受後並沒有改進,這些只會造成更多自己跟 host 間的溝通障礙,最後也會因為溝通不良得不到好的 review,更重要的是,自己也沒辦法從這段 internship 中學到可以帶走的東西。
Takeaways from the internship
Technical skills
- Write clean and readable code
- Small, understandable, and reasonable commits/PRs
Soft-skills
- Communication
- Re-scope the project if necessary: Learn when to say no to your boss
- Taking feedbacks regularly
Summary
老實說,我剛被換到 open source project 跟前 1/3 的實習期間,我是不太喜歡這次的 intern 經驗,畢竟做的東西跟我自身能力不太符合,一開始甚至以為我要寫 Verilog 了。
但我還是硬撐下來,後來發現其實要達成我們的目標,可以有很多種方式,而寫純 C++ 來加速就是一個對我來說比較可以達成的途徑,我稍微研究一下後跟我的 host 在 daily 1 on 1 的時候提出我完整的想法,跟他說我想要 rescope 我們的 project ,然後我初步的結果是這樣,他就很滿意讓我繼續做,才有我今天的成果。
在跟我 host 最後的 feedback meeting,他給我打了好幾劑強心針、說會全力 support 我的 conversion時,當下真的很感動,回想期中評量的那幾天,好像也沒那麼難過了。他問了我這段 internship 有沒有哪裡我不喜歡的,我想了想,就跟他說
I thought all interns will be working on a well-defined project, so all I have to do is to follow the design and implement it, it would be purely an assessment on my technical skills.
That being said, I was not comfortable at coming up a direction for the project at first, but as I spent more time and effort on it and discussed with you, I kinda figured out my own way to approach our goal and revised it along the way. Now, I can proudly tell everyone that I’m confident enough to carry out a project on my own. I’m very satisfied with my growth during the internship!
他笑了笑,跟我說
Those uncomfortable feelings are meant to be like that, I want to know how capable you are and your potential as an independent SWE in the future.
後面的強心針就不打出來了。聽完之後很開心,除了學 technical skills 外,我覺得我成長最多的真的就是 how to be an engineer。
All in all,我很喜歡也很滿意這次的 internship 經驗,我真心推薦有機會的話真的要到大公司實習看看!
打了四天的文章,我終於要來準備 conversion interview 了!