B99陳禹碩系友
台大機械系
在大學時期,廣泛的吸收培養不同的知識技能是很重要的。當下,或許會不解為何要學這些;但是,有朝一日,也許會發現這些知識技能可以為自己帶來不小的助益。在台大修的兩門黃信富老師的工程數學即是一個例子。這兩門課是我學得最有成就感的課之一,因為我在課堂的吸收程度高、做起功課以及準備考試的效率都比其他科目高很多。雖然如此,當時的我不太了解這些抽象的矩陣運算、eigenvalues等等的東西是如何被用在現實生活的,直到幾年後為了準備機器學習相關工作的面試,我發現原來很多常用的機器學習模型的運算推導求解就是工程數學的應用!學過的東西,或多或少會在腦中留下印象。在未來,如果再次碰到類似或相同的,稍稍重溫一下,很快就可以上手了。
大學四年中,我有機會到瑞典Umeå大學交換,度過了至今仍記憶猶新的半年。(原定交換一年後來因為要準備出國讀書的事宜,減短交換長度至半年)在瑞典交換學生的半年中,我體會到高緯度的氣候與自然風光、了解人民的文化生活方式、觀察他國學生讀書做學問的方法。因為這所學校沒有機械系的課程,我選了幾門物理系開的課(如果課程學分要採納進畢業學分,所選的課程需要先被台大機械系審核)令我印象深刻的一門課是量子物理。課堂上,我竭盡全力的試圖理解老師傳授的知識,雖然每個單字我都看得懂,但是當它們串在一起變成句子時卻是非常深奧難懂。想當然爾,這堂課也是我花最多時間複習的科目。考試時,我就把我從課堂和自我研讀吸取非常有限的理解寫到答案紙上,會多少寫多少。幸好,最後還是拿到了需要畢業的學分。
在瑞典的時光,也讓我這個城市人愛上了鄉村小鎮的生活方式。Umeå學校附近有個湖叫Nydalasjön,天氣熱時,常常和朋友去湖裡游泳,在湖邊烤肉。藍莓成熟時,都野外摘藍莓並作成pie。冬天時,晚上到湖邊等待極光的出現。在鄉村小鎮裡,除了讀書之餘,我很享受大自然的美以及人與人之間的聚會互動。
█ 與在Umeå認識的同學朋友自駕去瑞典芬蘭邊界(左一)
柏克萊
在瑞典的交換,最後以一個一個多月的歐洲自助旅行畫下了句點。很想多留,但是最後一學期計劃在台大準備之後出國讀書的事宜。要申請碩士還是博士呢?讀完書之後,想在當地工作磨練,再加上不是對學術研究很有興趣。匯集了幾位老師的意見後,決定專心申請碩士班。
擔心當兵時無法使用電腦網路,我打算將所有的申請學校所需的考試、推薦信、文章以及其他文件在入伍前都準備好。新訓後被分發到馬祖,馬祖的網咖就成為我申請及查詢狀況的窗口。之後有些學校要遠距面試,我也是在網咖完成的。
放榜後,一共錄取了四家學校:UC Berkeley、KTH Royal Institute of Technology、Johns Hopkins University和Purdue University。最後,我選擇去了UC Berkeley。
在柏克萊的學位是Master of Engineering:一年的時間,要修指定的課、要做研究專案、要教論文。此外,大部分學生還有一項任務就是找工作。我是隸屬在機械系下的控制組。開學沒多久,我就受到了震撼教育:有一門的第一份作業我就寫的很吃力,然而大多數同學都輕而易舉地完成了。這門課大部分的作業都要用Matlab,可是之前在大學的時候完全沒有學過。在台大的時候,大部分的作業都是利用Casio工程計算機手寫,所以沒什麼接觸Matlab。我也沒有時間擔心或是煩惱,作業一份接著一份的來,我只能竭盡所能利用閒暇時間自己學習Matlab。
除了修課是個挑戰,我參加的研究計畫也是困難重重。當初只覺得它是與自駕車相關很酷,我就選了,絲毫沒有釐清這個專案所需的能力。我參加的研究計畫是為一台自駕車寫一個能辨別false detections的演算法。實驗室的自駕車上有三種感測器:相機,雷達和光達。我們希望利用一些sensor fusion的理論來判別哪一些感測器回傳的數據點是有瑕疵的。舉例來說,如果車的右側沒有物體,但是相機判斷有,我們希望利用雷達和光達的數據來判斷說相機的偵測是錯誤的。一開始,老師就指定幾篇sensor fusion相關的論文給我們閱讀,同時也給我們之後要用的程式碼。光是要讀懂這幾篇論文所需的基礎知識就把我弄得頭昏腦脹了。好不容易跟同學一起勉強弄懂論文的中心主旨後,了解現有的程式碼又花了我一番時間和力氣。(在這之前,我程式語言的基礎就只有大學之前修的C++,而且那時候還學得不是很紮實。)這個計畫所用的程式碼是用Python寫的,所以我用用了一些時間自學Python。
我在柏克萊這年就在這樣精實的度過了。是自我學習新知的能力救了我,好多課堂上的背景知識我都不太了解,自己花了好多時間上網閱讀慢慢的彌補起來。這一年內,我也因為參加自駕車的研究計畫學會了我畢業後賴以為生的工具——Python。
█ Big C, Berkeley 我在柏克萊時最喜歡的地方
工作
第一份工作
這裡的求職很看重實務經驗,就連學校畢業後的第一份工作也是。對於沒有任何經驗的我,自然是難上加難。有時,好不容易有了面試的機會,大多數也搞砸了。一開始想找些跟碩士班所學相關的,但是機會不多,就算有職缺,也是要找有多年經驗的工程師。處處碰壁了幾個月後,我終於找到一個在設計空調系統公司的實習生缺。約定的實習時間是三個月,但是當我漸漸理解這個公司的業務——用AutoCAD根據當地法規畫出適合業主的屋內管線設計圖——後,我發現我對這類的工作興趣缺缺。
當時,Machine Learning (ML)是矽谷最紅的字之一。我快速的研究一下,原來很多ML相關的職缺都會用到Python。我心想,也許我可以看看可不可以找到一個相關的工作。為了了解Machine Learning到底是什麼,我報名了Udacity的一個學程。我在短短的兩個禮拜,利用閒暇時間把整個學程學完。我驚訝的發現,ML根本跟我在Berkeley所學的Optimization是一體兩面,所用的數學也就是我在大學學的工程數學。
大概自學了ML一個多月,我開始申請相關的工作。不出所料,很多份履歷表都是音訊全無;但是,我不灰心繼續投。好不容易,我被一個新創公司邀請到onsite面試;然後,我在當年的勞動節之際接到了他們願意給我一個Machine Learning Engineer工作機會的電話。薪水以ML的標準並不怎麼樣,但是,我告訴自己,當作是去那邊學習。
這個公司很小,我加入時,連我在內只有4個員工。因為公司小,我不只需要負責ML的業務,還接觸到許多一些基本Software Engineer (both backend and frontend)的東西。第一年內,我又是像個海綿學習大量我不懂的但是其實對軟體工程師是很基本的東西,例如:SQL資料庫、網際網路基本的運作原理、Linux terminal的基本操作等等。很慶幸我生在有Google和Stack Overflow的年代,尤其是Stack Overflow更是我的救命丹。我有時在想,如果當時面試的時候,他們知道我這麼多東西都不懂還會請我嗎?
開始工作後的第二年,我對於自己的工作已經比較有信心了。然而,我告訴自己,我應該要再多涉略相關的知識和能力。於是,我開始收聽有關Python的podcasts(Talk Python to Me,Python Bytes等等),開始關心Python整個程式語言的動態(例如:從2.X到3.X,然後停止支援2.X等等)開始深入研究Python的底層設計原理,開始接觸當時最新的ML知識和研究成果(例如:CNN,RNN還有後來的Transformer以及Reinforcement Learning等等)
█ 畢業後回UC Berkeley的球館打球(左二)
█ 黃石公園公園看銀河
第二份工作以及Covid-19的衝擊
轉眼間就在這間公司三年了。雖然自己的知識能力有不小的提升,但是公司似乎還像隻無頭蒼蠅一般,找不出一個穩定前進的方向。於是,我起了換工作的念頭。
這回找工作算是比之前有自信不少,面試一兩個月後,決定加入另一間比較有規模的致力於打造一個用Machine Learning來提供email資安保護的新創公司。有了在上一個新創的觀察,在與新創公司面試的時候,我特別注意公司是否有一個可以被使用或提供服務的產品以及技術領導人的背景,以免又掉到了另一個有美好遠景但是昏頭亂轉遲遲無法實現的新創公司。
比起上一間公司,這間公司的主管、同事、文化和制度我都比較贊同和喜歡。第一個月裡,主管讓我以debug的方式快速了解公司的codebase和infrastructure以及如何把新的程式碼deploy到production environment。
在我對公司的codebase有所掌握後,主管分配了一個新的feature給我做。從了解use case、研究目前主流及最新的演算法到實現演算法並釋出給使用者,都由我主導。(當然,熱心的主管與同事也會與我討論和解惑)完成這個feature後,我請了一個月的假回台灣過年。
過完年後回美國,全球Covid-19疫情也日益嚴重。好多新創公司怕在這不穩定的環境下無法募到新的資金而採取保守的策略,停止招募新員工,甚至開始裁員。我們公司也不例外,而我也成了裁員名單上的一員。
█ 與Armorblox的同事出遊(右二)
第三份工作
得知被裁員的當天,也沒什麼時間怨天尤人,我立刻更新履歷表並進入求職面試的狀態。此時,因為Covid帶來的不確定性,不少人被裁員,但是各個公司開出來的缺有限,所以呈現一個僧多粥少的情形。
面試機會比我預期的還多,自己也感覺表現不錯,然而最後的結果都是公司優先錄取工作資歷比我久的人。感到有點無助,如果是面試的表現不佳,我還可以在短時間內調整,但是工作資歷不是我能在短期內累積的。面試了一個月後,壓力有點大也有點疲乏,女友建議我休息一個禮拜不要弄面試的事情,去個小旅行散心。
休息一個禮拜後,一個在半導體設備商上班的朋友說她公司並沒有停止招募,要我看看有沒有適合的缺,她可以幫我內推。我找到一個職缺是需要Python技能的,但是這個缺不是ML相關而是後端程式設計。我在第一個公司的時候也有涉略一點後端方面的技能,於是我想說就來試試,死馬當活馬醫。
歷經了三輪面試,我覺得我表現的不錯,但不確定他們會不會在意我之前是做偏向ML方面的經驗。等了一個禮拜左右,人資捎來了好消息。終於,重擔可以先放下了。
█ 與女友在Santa Cruz騎車(前方)
結語
回顧自己這幾年的歷程,保持“不斷學習,享受學習”的心態似乎是讓我關關難過關關過的方法。有時,當下或許覺得學這個沒有用(就像大二的我覺得工數不知道要用到哪、就像在第一份工作的時候不太確定學習ML以外的技能是不是浪費時間),等到哪天派上用場的時候就慶幸還好自己有學過。我們平時的時候就要挖井,不能等到口渴的時候才動工。
此外,人生總是充滿了隨機性、不確定性,所以隨時把自己準備好是很重要的。如果,事情沒有按照自己設想的情形發生,保持樂觀及隨機應變的心態是和重要的。
作者簡歷
- Bachelor of Science @ 台大機械學士 2014
- Master of Engineering @ Dept of Mechanical Engineering, UC Berkeley 2016
- Machine Learning Engineer @ Tara AI 2016 - 2019
- Machine Learning Engineer @ Armorblox 2019 - 2020
- Software Engineer @ Applied Materials 2020 - present
點閱人數