申請CS program的好文網路上很多,但是裡面大多是列點式的陳述背景,所以想分享一下我從小白慢慢累積經歷的過程,希望想轉CS的人不要看到其他人滿滿的經歷就覺得遙不可及。
💡 縮寫對照表
CS: Computer Science 電腦科學/資工
DS: Data Science 資料科學
ML: Machine Learning 機器學習
SWE: Software Engineering 軟體工程
前提概要
整個轉CS的過程如下圖。這篇著重在申請到研究所前的經歷,涵蓋了Econ + DS + ML;ML到SWE是工作之後的故事,有機會再開另一篇分享。
大學讀台大經濟,研究所讀University of Toronto (UofT) MSc in Applied Computing (MScAC),是資工系開的就業型碩士。在經濟系的時候,其實對個體經濟、公司策略很有興趣,但發現自己在統計上好像更有優勢,又剛好遇上資料科學的熱潮,於是大四時開始轉行之路。
與其說轉CS,那時更偏向資工方向的資料科學 (Computational Data Science),也就是專注在DS三個元素Statistics、Business、Computer Science中的CS能力,因此除了程式基本功外,我的經驗偏向機器學習、資料工程/分析。
怎麼踏入CS的世界?
我是透過修課、實習、研究專案的方式,相輔相成。
修課
介紹三個我修過比較重要的課:
1. 程式設計(四上)
我修孔令傑老師的商管程式設計,是一門專門給商管學生的程式課,用的是Python。非常推這堂課的原因是Python相對電資學院用的C/C++更容易上手,建立信心。另外老師會用跟商業問題包裝上課和作業的題目,比方一個送貨員在某些條件下如何發送包裹,讓我覺得學完這個真的可以去解決一些現實問題,而不是單純的學一個程式語言。最後,一定要大推小傑老師的教學能力,「會」和「教人」是兩回事,老師講解非常簡潔易懂,而且上課是用影片的方式,可以針對不懂的地方多看幾次。
上課影片可以在YouTube找到,但千萬不要只看影片沒動手啊。
2. 資料結構與演算法 (四下)
為什麼別人的程式碼跑得比我的快、資源用的少,就是靠這門課了。這個修的好,刷LeetCode沒煩惱!
我修張志星老師的課,用C++,那學期除了正式登錄的助教,老師也讓奧林匹亞上來的選手當小老師,所以每週的助教時間非常多,有問題都能找到時間去問,對身為小白的我幫助非常大!這門課也是老師都有錄影,上課前先看,上課的時候老師會針對重點部分再講解。每節課最後都有小考,不過都會事先提示會考什麼,只是要同學隨時跟上進度而已。是一門非常重要且困難的課,但過了就可以算真的踏入CS領域了。
四下前的那個寒假,有看小傑老師的程式設計學C++,雖然看得很趕也沒寫作業,所學有限,但是對銜接資結演算法還是有一定的幫助。
3. 機器學習(四下)
這很明顯已經往特定領域了,如果想往其他方向走,就修那個領域的課吧。
我修李宏毅老師的機器學習。那個時候台大機器學習的課程主要有兩門,一個李宏毅老師的(偏實作)、一個是林軒田老師的(偏理論)。關於這門課的評價網路上很多可以查,簡而言之就是每兩週一個作業,每週一個deadline(同個作業第一週會先有個simple baseline,第二週要達到更高的baseline),非常操!但基本上把機器學習到深度學習重要的東西都學了,從作業中也得到了不同模型的實作經驗。
實習
轉專業怎麼找實習?如果不能一次到位,那就一步一步來吧。
第一份數據相關的實習是在一間零售數據分析的新創。當時我對數據分析有興趣,但因為沒有能力和經驗,只能先到那裡當business developer (BD)。在當BD的兩個月中,我常常跑去數據組看他們在做什麼、用什麼工具,也在午飯時間和他們聊聊走上這條路的心路歷程,回家後自己學R語言(對,當時還用R!)。BD的工作需要提供客戶數據報告,有一次因為人手不足爭取到跑分析、圖表的機會,暑假過後我跟老闆提出想要轉數據組的想法,就這樣獲得了第一份數據相關實習。凡事起頭難,特別感謝這個機會!
後來又去了一間主打用圖論做AI的新創,總部在紐約,CEO是台灣人回來台灣開分部,是系主任介紹我過去的。當時台灣分部的定位還不明確,做的東西比較雜,也因次有了擔任不同角色的經驗。比較印象深刻的是第一個專案要建機器學習平台,當時的我對軟體開發一竅不通,文檔看的似懂非懂,真的要謝謝另一個實習生罩我。(也是那時候我告訴自己不適合當軟體工程師,要繼續往資料科學走,當然現在打臉自己了XD)。另一個是銀行反洗錢的專案,主要是跟PM談需求,把問題分類成四大維度、蒐集特徵,並總合成一個預測指標。
最後一個是蝦皮的Business Intelligence組。這個機會是我跟一個學長聯繫得到的,很幸運他們當時剛好準備找一個新的實習生,因為還沒公開招人沒什麼競爭對手,加上那時已經修了機器學習有一些經驗,就順利錄取了。在那裡做了一個CNN配對商品照片的專案,是我第一次把機器學習應用在業界,同時也寫了一些爬蟲程式。
小結:
- 新創是一個很好的入門點,雖然有時候組織比較亂、方向沒那麼明確,不過正是因為這樣有更多嘗試不同東西的空間。
- 厚臉皮一點,我三段實習都是用內轉、介紹的方法得到機會。多去跟老師、學長姐聊聊,很多時候大家都會願意幫忙。
研究/專案
當時正逢經濟系推動資料科學與社會研究跨域專長,去了經濟系主導的台大行為與資料科學中心(前經濟統計中心)當研究助理,做臉書假新聞的分析。這個經驗讓我碰到TB級的資料,和Google雲端服務服務 (BigQuery, Cloud Storage, etc.)、Linux Server (讓我習慣沒有GUI的世界);分析方面就是以常見的計量方法Difference-in-difference出發,其中一個比較大的困難是對於假新聞exposure的定義和用戶political ideology的計算。
除了學校的研究,我也參加了志工計畫「資料英雄 Data for Social Good (D4SG)」,一個大約四個月的專案,和雙北的家庭暴力暨性侵害防治中心合作,建立兒少暴力風險預警管理模型。志工專案對於技能和經驗的要求都比較低,只要願意花時間做中學,是一個增加實務經驗很好的管道。同時它不像黑客松,時間短、大多只能停在初始階段,這樣中長期的專案可以帶來比較完整的經驗提升。
以上就是我在碩士前的轉行過程。再強調一次,我申請的prgoram偏向資工方向的資料科學,像是CMU MISM、GaTech Analytics - Computational Track;如果想申請北美前50學校的純CS program,這樣的經驗很難 (尤其現在競爭激烈可能前100都難?歡迎糾正)。UofT MScAC算是個意外,它是個被ML籠罩+比較接受多元背景的項目,加上我之前在UofT交換成績很好可能也有一點加分效果。
如果要申請研究所的話,我會推薦【修課>實習>專案】。
- 修課:拿我申請最偏向CS的MScAC來看,申請要求如下:
我自己作業系統和資料庫都沒修,所以也不是沒有就一定就申不上,但是人家都列出來了,其他人有、你沒有就很吃虧。我當時有被特別加一個技術面試問作業系統和資料庫的問題,因為過去的實習/研究有稍微接觸,所以還能答得上來。
- 實習:就業導向的program在意的就是他們的畢業生能不能找到好工作,成為他們招生的榜單,因此實務經驗就很重要。如果可以的話,當然大公司的牌子還是比較誘人,算是給admission committee一個證明自己的方式,就努力做到最好吧。
- 研究/專案:上面兩個之外,能再有一些研究經驗還是不錯的,畢竟要去的還是一個學術機構,但就業型項目就不用太追求發論文了。
雞湯時間
現在回頭看這些日子好像也就那樣,但當下確實沒少走在崩潰邊緣,分享幾個小故事當雞湯吧。
想學就努力學,不要管那些閒言閒語
上資結演算法(DSA)的時候,老師會開Slido讓大家留言提問,有一次有人在上面寫說叫外系的同學不要以為隨便修個程式設計就可以來上DSA,不要來浪費資源。這則留言還被推到上面讓老師看到了,老師霸氣的說只要同學願意好好上課、交作業,就不用擔心被當,沒有什麼浪費資源的。
在適當的風險管理中,給自己更多挑戰
當時修完資管系的商管程式設計,本來打算繼續修資管的資料結構。後來在一個期末聚會上遇到老師,跟老師聊了一下我的狀況後,建議我直接去資工系修課,才開啟了後來的種種。雖然辛苦但是確實是做得到。如果對自己的能力不是很有把握,可以多和老師、學長姐聊聊、聽聽不同意見,很多時候自己比想像中的強大!
別等準備好,機會來了就抓住
記得第二個實習前,老師帶我去和台灣分部的幾個負責人聊聊,出來後老師問我覺得怎麼樣,我說我完全不會他們想要做的東西;老師不知哪來的自信叫我反正去就對了,後來在邊摸邊學下還是把東西做出來了。別等自己完全準備好,不會就學囉。
建立好的Support Network
這個時期如果身邊的人願意給小小的鼓勵和體諒,就會讓自己覺得可以再衝一波,所以身邊有個好的support network很重要。有一次正逢期中在研究室跟老師開會,老師看我狀態不太好問我期中準備得怎麼樣,我只能無奈的笑笑,老師說今天就到這裡吧,先回去把期中弄好, 當時滿滿的感動。當然這樣的老師可遇不可求,但身邊朋友圈還是可以調整一下。
最後
轉CS確實需要付出代價,可能是身理和心理的健康,可能是其他角色沒做好的罪惡感,還有必然的放棄玩樂、閉門練功。但是別忘了當程式跑完拿到Accepted的時候,那種成就感還是非常開心的!
一個學長說過:「這條路其實沒那麼擁擠,因為堅持下去的人不多。」是真的 :-)