關於變強這檔事(九)

Felix Chern
9 min readFeb 5, 2019

--

沒想到從第八集到第九集,居然花了兩年多才有辦法繼續寫。說來話長,這段時間中多數的時間我覺得自己在職場的成長是停滯的。儘管還是有花相當多時間自學,但這兩年中時常覺得自己花的力氣似乎都落了空。直到2018年中才出現相當戲劇化的轉機,讓我轉入Google RMI (Research of Machine Inteligence)。這段故事相當曲折,讓我娓娓道來這兩年多的時間是怎麼一回事吧。(文常慎入)

兩年半前我以沒有美國CS學歷的身份加入了Google,職稱是SETI (Software Engineer for Tools and Infrastructure),人資跟我說這跟一般的軟體工程師沒什麼差別,我不疑有他就直接加入了。當時心想這是我職業的新的高峰,並且寫了一系列的「關於變強這檔事」。開始新工作的時候,雖然對於工作性質比較像高級測試工程師而覺得有點疑竇,但當時我對自己能力相當有自信,總是有能讓我發揮系統開發長才的地方,只要抓到機會就能嶄露頭角,忍一下沒有關係。

沒想到這一忍,居然就花了兩年半。

這段期間我相當低潮。即使如此,能想到的事,該做的事,我都盡可能的去做。每半年的內部review我都是拿(strongly) exceed expectation,也升了等。我在google內部找了讀paper的同學會,因為我目標是想要轉調研究相關的部門。自加入Google前,我已經漸漸地將自學領域從技術性領域(如特定的framework)轉向研究領域(進階演算法),自學之餘開始有一些新的演算法的想法,於是開始實作並且寫自己的paper。我沒料到的是,想在學術的領域無學歷發跡,比從技術領域無學歷發跡困難相當多倍。

先簡介一下我的研究主題,這與我自學進階資訊科學時的一個領域相關,其名為Cache Oblivious Data Structures。直翻作「無視快取的資料結構」,但更適切的翻譯也許應該叫「自動快取資料結構」。它的特性在於無視硬體特定的快取大小,卻能達到接近最優化快取的效能。在現代CPU多層多種大小的快取架構下,它的理論宣稱其能自動優化在所有層的快取的存儲效率。傳統上電腦科學做偏理論的不太重視實作上的效能,而做實作或硬體優化的則不太重視理論分析。這個學門卻是橫跨了相當理論的演算法分析(需要相當多的進階數學工具),以及相當低階的硬體效能理解。可惜的是,這個領域的論文多數偏重理論,顯有真正的程式實作。我這兩年的課題,就是挑戰如何將這般理論做出實際高效能的程式。若想對Cache Oblivious Data Structures做進一步的了解,可以看以下的入門影片:

Memory hierarchies and cache oblivious data structures

我自Cache Oblivious Data Structure延伸出來的研究主題,是傳統的資料庫join能否達到Cache oblivious。目前的研究成果彙整成了一篇(還沒寫完)的paper,連結在此。其實結果相當出色,因為單核心我能做得比傳統快10倍,而多核心比Intel Thread Building Blocks parallel sort快15倍。不僅如此,演算法的分析出色地預測了它的效能,因此達成我心目中理想的目標:「理論與實作結合」。

後半段時間我都在努力想辦法朝不同團隊兜售演算法,但成效不如預想。我分析可能的失敗因素如下:

  • 大多數(事實上是所有我已知的)團隊在尋找的人才是能實作他們已規劃好題目的人才,不是自己帶題目進去的。
  • 成熟技術(如資料庫)如果要引進新演算法,多是從內部的高階工程師起頭,不會從外部引進。
  • 未成熟技術,如機器學習、人工智慧等對新演算法比較開放,但它們尋找的人才多數偏學術領域,沒有足夠的學歷進不了圈子。
  • Google內部轉調看的績效是你在Google內部的貢獻,外部的研究似乎是一丁點都不算數的…。然而雖然我有升等,但SETI寫的程式的強度和量實在是遠遜於一般的工程師,即使有心想寫更多程式,但能寫的題目實在是有限。
  • Google研究團隊的paper reading group是各領域自己辦的,閱讀主題也是偏向各領域內部為主。我缺乏接觸這些專業讀書會的管道,而我所參加的更一般性的讀書會人數相當少,到後來變成人數小於三人的慘烈讀書會…

當時情緒相當沮喪。我所能想到的破口就只有把paper發出去,然後以此證明沒有學歷我也有同等研究的實力,並用此接觸研發相關的團隊。不料,結合理論和實作的論文寫起來比預料中的更花時間,沒有指導教授的情況下只能自己摸索;拿去問理論的人他們會說看不太懂其中實作的部分,拿去問實作的人會說看不懂裡面的理論。我都很擔憂拿去發paper會不會review的人也都看不太懂…

所幸,在2018年中終於有突破了,似乎兩年的運氣都集中在2018後半年!最先要感謝的是我室友。我室友也在Google工作,而且比較常接觸核心的議題,經由他的介紹,我參加了Google performance summit。在其中一個Workshop我遇到了Google RMI (Research in Machine Intelligence) 來的人,他們是做高效能機器學習實作的團隊,而且我所做的研究主題,跟他們新開發的程式有些相關!談了幾分鐘,就開始談起有沒有意願轉調到他們團隊,並且跟團隊當中的Tech lead認識等等。聊天的時候,由於我有能拿出來呈現自己實力的材料(那篇寫到一半的paper以及其效能資料),而那些演算法分析及寫高效能程式的能力,剛好就是這團隊所尋求的目標。儘管這團隊是在紐約(我原本在矽谷),但我當天就決定好我要轉調到紐約去加入這團隊。

轉調的過程相當一波三折。雖然對面團隊已經決定要我進去,但還要經過Hiring Committee(算是除了我以及轉入的團隊外的第三方團體)審核來讓我從SETI轉成SWE(一般的軟體工程師)。我被HC退件了兩次,第三次才轉職成功。來來回回花了三個月才搞定,相當地折騰。其間我跟這個紐約的團隊合作了一個不小的專案,是幫他們跟內部的客戶分析某一塊特定的程式為何效能不夠好,並且改良它。多年累積的知識在此時派上用場,我運用Bredan Gregg網站上提供的優化技巧來分析編譯好的組合語言效能瓶頸在何處,以理論預測可以提升18%左右的效能,最後成功的實作出省下20% CPU的效能優化,幫一個單日2000CPU的應用省下400CPU。

給Hiring Committee送審時,第一次只要我提供履歷以及兩份推薦信,我就如HR要求的給了履歷和兩份推薦信,結果被退件。所幸團隊沒放棄我,我們把上述的專案作出來,然後送第二份件。這次有八份推薦信,以及這個應該算是相當成功的小專案,結果還是被退件!HR在逼問之下也不願說明原因,只說他們認為這專案是20% project(在google內部這是說本職以外的專案),不足以作為支持轉調的條件。而推薦信大多是合作的團隊給的,他們要求更多原本團隊的人給的歸推薦信。所以最後我提供了十三份推薦信,而且層級拉得相當高(只比區域總經理次一階),HC要求的原團隊推薦信也是補齊了。到這階段,HC才鬆口給我過。就我所知,從來沒有一份轉調需要這麼辛苦過…

老實說,能夠突破這麼辛苦的轉調,真的是仰賴了相當多的運氣以及許許多多人的眷顧。Performance Summit並不是對Google內部所有人宣傳,我運氣好才被介紹參加;我參加的其中一個場剛好有RMI做高效能優化的人,而且題目還相關;我陰德積得還不錯,有十三份推薦信背書,而且層級還拉得相當高;我與紐約合作的案子題目夠大,效能增加的也夠多,幸運的是這題目真的有突破口,並被我在短時間內實作出來。能拿到高層級的推薦信,我猜測雖然HC看不懂這專案的困難度,但層級高的人對此比較了解,所以才願意寫推薦信相挺。真的是仰賴了相當多的運氣,才成功轉調到Google RMI,加入了我一心追求的理論與實作結合的研究部門。

雖然成功的加入了Google RMI,但我心裡有一個角落是有點鬱悶的。似乎要能成功,需要仰賴的「運氣」還是相當多。不諱言我累積了足夠的努力,才能在順風時攀上機會,但似乎若沒有那「運氣的眷顧」,我也只能在谷底流連。

雖然對於能將自己拖出谷底的運氣感到感激,但我卻無法如我初入Google時一樣,意氣風發的繼續寫「關於變強這檔事」系列。只有自己切身經歷過,才知道默默努力卻看不到轉機有多麼痛苦。靠著運氣翻身的我,真有資格繼續寫熱血磅礡的文章鼓勵他人自學翻身嗎?在轉入Google RMI之前,我自愧於停滯不前,沒有資格寫自己如何成長茁壯。轉調之後,我更慚愧於只能向讀者訴說個人的努力不足夠,還要運氣及環境的支持。對於犧牲個人時間努力的人,會是多麼辛辣的話語?

工作三個月餘,才在幾天前改變了想法。當時我們大組在討論Google RMI暑假實習的事務,以及其錄取門檻。應徵實習的學生其實都相當有競爭力,不僅僅是美國頂尖大學的博士生,許多還發表了數篇頂尖期刊上機器學習或人工智慧的相關論文。儘管如此,我們的RMI實習錄取率卻是相當低,才2–3%左右。若放眼到正職,則錄取率是更加的低,很多應徵者還是從頂尖大學教職轉職的,可以想見其競爭有多激烈。由於實作小組跟研究小組性質稍微不同,出於好奇,我詢問我們小組的錄取標準為何?我的大老闆給我們團隊是這麼定位的:我們的錄取標準比其他小組更高,因為需要對底層實作有相當的掌握度,還要能夠做機器學習。…聽到的當下真的感到十分震驚,沒想到沒電腦科學學歷及論文的我,居然是突破此門檻雀屏中選的一人。

就在聽到錄取標準的那一天,我對於「靠運氣進入RMI」的心結巧妙地解開了。因為要進入這樣的團隊,需要的遠超過單純的運氣。至少,兩年前的我是沒辦法拿出讓人願意為我擔保的成績的。這兩年中,儘管苦悶,儘管沒有發文,但還是有變強了一些,拿得出讓人願意挺我進團隊的成果。這樣的我,應該能不愧於「關於變強這檔事」這系列的文章吧?

將兩年中的辛酸苦辣化為新的文章之餘,期許自己之後也能抬頭挺胸地繼續為這系列寫文章。 :)

--

--