三月 19, 2012
» 我為什麼要念博士

最近好像很流行討論要不要念碩士, 像是xdite的我不會念碩士和彭明輝的不甘不願地念碩士。在美國則是看到Matt Welsh寫了Do you need a PhD?討論該不該念博士。

我在MIT博士班已經念三年半了,預期今年六月要畢業,剛好可以在30歲前畫下一個值得紀念的里程碑。在畢業之前就順便利用這篇文章總結一下我的感想,也可以讓未來更多迷惘的人看清未來的各種選擇。

簡單的說,如果讓我重來一次,我還是會念碩士班還有博士班。我知道很多人在選擇要不要念研究所時,是看對未來的就業有沒有幫助,甚至是沒有選擇的空間而被家長強迫升學。我從國中起就很清楚知道自己想做什麼,但我並不是會做長遠規劃的人,而是走一步算一步,因為我覺得世界變得太快,提前規劃五年十年後的職業道路並沒有太大意義。所以我雖然很早就知道自己喜歡寫程式和研究新東西,但我一直到大四才決定要念碩士班,到了碩士班才決定要念博士班。

念書一向不是我的興趣,高中沒認真上過幾堂課,然後靠著程式比賽混進台大。在台大時我也都不去上課,整個四年我唯一全勤的課是大三的compiler,因為這是唯一一堂讓我覺得去課堂裡聽課比自己念還要有效率的課。但雖然沒去上課,我可是很認真寫作業的,尤其是程式作業我都會做把所有可以做的bonus全做完,有空的話還會自己多加一些有趣的功能。也因此到了大四時,我的成績還能勉強進入推甄台大研究所的門檻,等於可以免試直升碩士班。但除了學校生活外,我從大一時就在學校外的網路公司兼差寫程式和做顧問,同時也在系上的工作站實驗室幫忙管理一堆伺服器和Linux主機,到大四還同時在另一個startup公司打工兼差,所以生活其實還蠻多采多姿的。在當時(2005年)這種情況下,其實不太難決定要不要念碩班,因為 1) 我還不想當兵 2) 我當時這些打工的收入其實比一般大學畢業生起薪還高不少,而且我花在這些工作的時間很少,每個禮拜還有很多時間可以自由運用 3) 我找到了一個好老師,給我很大的空間可以在碩士班做任何我想做的題目。於是我就這樣繼續待在台大念了兩年的碩士班。

在碩士班時,我最大的收穫是打開了眼界,透過世界頂尖的論文知道了這領域中最先進的研究和問題是什麼,也慢慢了解MIT、Stanford、Harvard那些世界頂尖的大學都在做什麼研究。我雖然喜歡寫程式,但也不喜歡老是一直寫簡單的留言板或是blog這種書本上的萬年範例程式,只有一直做新東西才能激起我的熱血。慢慢的我也發現念博士班可能是最適合我的路,可是同時我也有幾個掙扎的地方 1) 要念博士班就要去國外念最好的學校才有意思,那就得先花一年當兵,而不能找個公司做四年國防役而不當兵 2) 博士班平均要念六年,同樣的時間如果我在台灣工作,損失的機會成本是台幣一千萬以上加上六年的年資 3) 出國唸書要離開熟悉的地方,熟悉的朋友、家人,要用很破的英文在獨自國外生活 4) 博士畢業實際上會減少就業機會的選擇,尤其是在台灣,真正需要博士的企業非常少。

我在台大認識很多人都有出國唸書甚至在國外工作的夢想,所以對他們來說這些障礙都不是問題。但對我來說,出國唸書最大的誘因只是有機會在世界頂端的學校做自己喜歡的研究,和全世界最厲害的人一起工作,至於是不是要在國外工作則是想都沒想過。

想清楚這點後,我立定一個目標,我只申請我最想去的兩家學校,如果上了而且有獎學金我就去念,不然就算了。

最後的結果是我幸運的申請上了MIT CSAIL,指導教授也能給我獎學金,所以我現在才會在這寫這篇文章。

回過頭來看,現在很慶幸我有決定要嘗試一下申請MIT,即使當時看起來成功的機會渺茫。而這幾年念博士班帶給我的收獲,也遠大於當初的想像,在美國可以得到的各種機會更是在台灣一輩子也碰不到的。

雖然一開始看起來在經濟上會損失很大的機會成本,但實際上美國各種科學和工程科系的博士班都有獎學金(RA、TA、或fellowship),以MIT這種私立學校來說,一個教授每收一個人就要幫他付一年總共七萬美金的學費和生活費,當初我即使在竹科爆肝做不是很喜歡的工作,一年的收入也不會比七萬美金多多少。當然,以帳面上的收入來說,博士班念完是存不了多少錢的,因為七萬美金一半是要拿去繳學費,剩下的生活費也大半要繳房租和吃飯過生活。在台灣工作六年可能可以買個房子,但在美國念完博士班只會得到一個博士學位和少少的存款。

那話說回來,這個博士學位到底值不值得?如果在四年前還在台灣時的我來看,我會說我不確定,但在MIT待四年後,我會說「200%值得」。

首先最大的「福利」是在完全自由的環境下(包括經濟上的自由,選題目和選合作夥伴的自由),和全世界最聰明的一群人一起研究各種既有趣也有挑戰性的問題。這種機會非常難得,如果大學或碩士畢業就去工作,一定會在題目和合作夥伴上受限;如果自己創業,就會在經濟和合作夥伴上受限;於是念博士班成為唯一可以同時得到三方面自由的最佳選項。至於對於能力的增進方面,最大的收穫是英文變好了,可以輕鬆跟來自世界各地的人溝通,讀寫英文論文也是跟吃飯一樣簡單。另外就是「做研究」的能力,雖然我覺得我本來就是一個靠自己學習和研究新知的人,但博士班的訓練是把這件事變得系統化,讓我可以幫更多人學會這樣的能力。做研究的能力還有一個更重要的面向,是判斷什麼題目才是有研究價值的,而什麼是沒有的。如果沒有這項能力,不管未來做什麼事都很容易瞎忙,例如說花很多時間做一些簡單瑣碎的小事、研究一個一百年前早就有人完全想透的問題、或是卡在一個早已被證明不可能有解的問題上。

至於念博士這幾年的年資和可能減少的工作機會,現在看來實在一點都不重要。因為一旦畢業後,打開的門是「全世界」頂尖企業和研究機構的機會。資訊科學的博士在美國出路非常廣,我都還沒畢業就一天到晚收到各式各樣獵人頭的信,除了矽谷那些大大小小的軟體和網路公司外,華爾街的hedge fund都是直接開出矽谷兩到三倍的價碼在搶人。如果對這些沒興趣的人,也很容易到大學或是大公司的研究機構中繼續做研究,或是直接加入學校附近上百家的startup中當個CTO或tech lead。

這些機會如果我當初待在台灣,就一輩子也見不到甚至聽不到。(我在台灣時甚至沒聽過hedge fund這個詞,也沒聽過有哪個念資訊的會去這種公司。但實際上美國最厲害的幾個hedge fund全都是用數學、物理、資訊的博士用非常科學的方法在賺錢的。有興趣的人可以看看前MIT教授James Simons開的文藝復興科技(Renaissance Technologies)。)

世界很廣大,相較之下台灣真的是一個小小島。如同Sega的《我為什麼離開 Google》說的一樣,台灣沒有軟體產業,甚至在其他產業中也很少有軟體專業能發揮所長的舞台。我希望台灣能夠更好,但同時我也覺得每個人的眼光應該放遠放大,看向世界和未來十年二十年,而不是聚焦在台灣、中國和未來的兩三年而已。

Disclaimer: 這篇文章不是要鼓勵每個人都念博士,我知道很多人對於學術研究沒有興趣和熱情(其實我也不太有,我只是喜歡打造新東西而已)。但是,眼界、研究和實作能力的培養則是每個人都能自己做的,這些才是真正影響一輩子的事情。


十月 29, 2011
» 影響力

這個月資訊界有很多了不起的人去世,很多人爭相討論到底誰才真正改變了世界,誰的影響力才大。Steve Jobs的死訊讓千萬人悼念,但發明C語言和UNIX的Dennis Ritchie和AI之父John McCarthy的消息就沒有受到如此廣大的注目。剛好最近很常和人聊到相關的話題,所以想寫篇文章讓自己反芻一些想法,也順便交換一些意見。

四年前,當我在申請博士班時,我還不確定我想做什麼以及我能做什麼。我知道自己個熱愛技術、喜歡親手打造工具來解決問題的工程師。我喜歡憑一己之力解決問題的成就感,喜歡挑戰新鮮的事物,討厭做重複無趣的事情。當時我有兩條路可以選,出國念博士班,或是留在臺灣做軟體工程師。我幾乎沒什麼猶豫就選了出國,畢竟可以做自己真正想做的事,雖然收入會比去工作少,但只要夠生活其實也不是那麼重要。

到了美國後,做了幾年研究,朝了夢想靠近了一點,但對於很多事的想法都有些轉變。

先來說說一些關於影響力(impact)的想法。在學術界做研究,最直接的產物是論文(paper)。研究人員都希望自己的論文可以在自己的領域裡掀起一些漣漪,把自己的想法擴散出去,甚至流芳百世。但有個問題是,一個研究的影響力不是短時間內看得出來的,一個好的想法可能會埋在數十年前的論文中,直到某個人不小心看到了才衍生出諾貝爾獎等級的產物。所以做研究的人通常不太會計較論文寫出來後到底有沒有用,因為根本就沒辦法知道。一兩年內沒被人引用不代表十年後就不會有,同樣的,即使一時引起了廣泛的討論,可能過兩年就又沉寂下來被人遺忘。

這就是在學術界的難處,很多發明和想法的價值不是馬上看得到的,甚至最後演變成產品後大家也不會知道最原始想法的來源是誰。簡單的說,學術界缺乏一個有效率的機制來快速強化有價值的想法和研究,而只能讓這些論文自然的發展和淘汰。如果剛好有人發現某個論文的價值,就會把它實作成產品再推到市面上給一般消費者使用。但如果沒有的話,這些論文就等於是白寫了,也不會對學術界以外的人造成什麼影響。

我喜歡做自己喜歡的研究,但我也想要自己做的東西是有實用價值的,而不是紙上談兵的理論。所以在研究工作之餘,我也花了很多時間把我的研究成果(像是sikuli)打造成真正能用的軟體並公布出來,讓大家馬上就能享受到成果,而不是等若干年後有個很閒的人碰巧發現這想法才把它實作出來。之前有個朋友問我要怎麼在做研究和instant impact(立即的影響力)中做選擇,我的答案很簡單:「這兩件事並不是互相衝突的,是可以同時完成的」。

話雖如此,如果談到影響力的大小,那我的答案可能又會有點不一樣。讓我從另一個體悟說起。

這幾年來還有個很大的體悟是:「個人的力量是很渺小的,社會中每一種角色都很重要」。雖然看起來是小學生都知道的廢話,但工程師個性的人就是喜歡凡事自己動手做。馬桶壞了自己修,燈泡不亮自己換,就連公寓附的微波爐壞了我都想先幫他們debug一下確定問題根源後再找人來換。凡事自己做是很有成就感,但如果真的想擴大影響力時,就會有點力不從心。

舉例來說,Steve Jobs和Steve Wozniak當初打造蘋果一號和蘋果二號時,如果缺少了任何一個人,這件事都不會成功。很多技術本位的人覺得工程師才是真正做事情的人,如果不是工程師(Woz)打造產品,那商人(Jobs)要賣什麼?但反過來想,如果不是Jobs幫Woz把他的蘋果一號推銷出去,Woz也不能拿這個收入來繼續研發蘋果二號,而蘋果一號也就只會是他閒暇時候的個人玩具而已。這兩個人的角色不同,但卻是完全的互補對方的短處,而蘋果這家公司也就是建立在這樣的基礎上才能持續不斷把產品轉化成價值(也就是金錢),再拿回來繼續研發更好的產品。這個稱為「商業行為」的正向循環是人類社會中非常強而有力的發明,可以不斷自我成長,同時又讓更多人受惠。

看完Apple的例子後,讓我們來看不採用這個稱為(邪惡)商業行為的正向循環時會發生什麼事。以我自己的sikuli為例,我在去年初釋出第一個版本後,這一年多來有九個版本更新,其中三次是重大的更新,總共被下載了二十多萬次(在官方網站上,至於其他各地的mirror我就不知道有多少了)。看起來是不錯的數字吧?我當初釋出並open source的目的就是希望讓更多人使用,也希望有些開發者能進來幫助我開發、翻譯、寫文件之類的,好讓這個東西獲得一定的動能自我發展下去。

但過了一年多後,我發現事情沒有想像中的那麼簡單。一個不營利的open source專案是非常難自我成長的,因為缺乏直接的誘因($$$),我沒辦法雇別人來加入開發,只能祈求剛好有人對這東西「有興趣」,並且有足夠的「能力」、「時間」、「毅力」看懂我原本的code,並加入「符合專案方向」的修改。以上的條件要全部都能滿足,才會有人發個email給我說「嘿 我想送一個patch….」。此外,因為這專案開始只有兩個開發者,沒有其他專長的人,所以我們有很多事都沒辦法做。例如說,我們沒辦法一一回答用戶的問題,因為實在太多五花八門的問題了(客戶關係管理失敗);沒有人去推銷或廣告sikuli的存在(一切都靠口耳相傳);沒有足夠人力填寫和維護文件;沒有人幫我們在各種環境做測試(只好直接拿用戶當白老鼠);沒有專業設計師設計使用介面、網站、logo(一切都是我自己東拼西湊的);沒有人做市場調查,研究什麼功能才是最重要的(所有先做的功能都是我自以為重要的)….有太多事都是我們想做但無能為力的。雖然後來有個熱心的粉絲常駐在我們的論壇上回答絕大多數的問題,甚至還幫我們寫了大多數的文件,但開發力量還是一直很薄弱,有很多我們想做的東西一直都沒時間沒人力去做。看看這個commit log就可以了解了(前兩個是核心開發者,後面都是用戶):

1065 Tsung-Hsiang Chang (其中有19個是用戶送來的patch)
94 Tom Yeh
61 RaiMan
34 Karl-Michael Schneider
9 anatoly techtonik
1 Arnaud Gelas

殘酷的事實:雖然用戶不少,但所有的commit裡面只有11%是由核心開發者以外的人貢獻的(包括了code和documentation)。(更殘酷的是我一個人就佔了超過八成的commit,要是我停下來的話整個專案就等於是死了)

一個人的力量真的很渺小,我知道有很多事能做來讓這個軟體變得簡單、更完美、讓更多人能使用,但一個像這樣的open source專案缺乏誘因吸引更多不同專長的人加入,靠一兩個人閒暇的時間和力量是沒辦法長久經營下去的。這時候我就覺得非常需要一個像Steve Jobs一樣的人來幫忙,因為商業化可以很有效率的讓這個軟體持續成長,並直接讓更多人受惠。工程師雖然是做出產品的人,但如果沒有商人來把產品賣出去,換成資金進來繼續研發,現代社會就不會有這麼多種精緻、可靠、高品質的產品可以用,很多高科技原型就永遠都只會是工程師的玩具而已。

體會到這點後,突然也可以了解世界上很多職業存在的理由和價值。例如佔領華爾街的人說,華爾街只是把錢從一手拿進來,再從另一隻手轉出去,憑什麼可以從中獲得巨大的利益?回答這種問題的時候,其實只要想想:如果沒有這些人存在,世界會變什麼樣?一個簡短的答案可能是:沒有華爾街,大家的錢就會放在家裡,放再久也不會有利息(甚至還有可能發霉或被蟲吃掉),因為沒人把大家的錢拿去再投資;需要錢的人(例如想創業的人),也不容易借到錢或找到人投資,因為大家只能跟認識的親朋好友湊錢;假設有一兩個人願意借錢,運氣好可能不用利息,但同樣的運氣不好可能會被收高額利息而不自知(因為沒有流通的市場,所以也不會有一個大家公認的合理利率)。從這個角度一想,促進經濟有效率的流通(也就是把錢從一手拿進來,再從另一手轉出去)的確是非常重要,即使他們沒有實際生產出什麼東西,但也對社會帶來很大的價值貢獻。同樣的道理,工程師老瞧不起銷售人員憑一張嘴就可以拿高額獎金,但仔細想想,要是沒有人銷售產品,公司就沒有收入讓工程師製造更好的產品了。如果用經濟學來解釋,每個角色的價值都是市場決定的,如果銷售很簡單又好賺,那工程師就會自產自銷而不是交給別人來做了。

以前我總覺得商人是邪惡的化身,但當自己想開始把影響力擴大時,就會發現每一種角色都是不可或缺的。經營公司也不見得是要以賺錢為目的,而可以是為了研發更好的產品而建立的一個生態系統。而社會中每一種角色都有其重要性,每一種人的貢獻和影響力也很難比較,與其爭論這些事,倒不如做好自己認為最重要的事來改變這個世界。


三月 2, 2011
» 做研究與寫論文

最近有幾篇頗有爭議的文章「陳鍾誠給李家同的一封公開信」 「陳鍾誠給李家同的第二封公開信」,針對李家同批判他是現在學術界獨尊論文的始作俑者,並指出應該要有其他的研究產物或評鑑方法(像是寫一個作業系統、做一個CPU之類的)。雖然李家同常常講出令人啼笑皆非的話,但就這兩篇文章而言我還真覺得李家同挺無辜的,連學術界獨尊論文的事也怪到他頭上實在有點牛頭不對馬嘴。

雖然我博士班還沒畢業,但我也寫過幾篇論文,也做過有上萬人使用的系統,我非常了解擅長實作不擅長寫論文在學術界的苦悶和無奈。但隨著我在MIT的時間越來越長,也對這個現象慢慢有了不同的看法。

話說我很愛寫程式,遠勝於寫論文。我可以不眠不休的寫程式,但沒辦法這樣寫論文。如果我當初碩士畢業後直接去工作,就可以在任何我想去的公司愉快的全職寫程式,但到頭來我還是來念博士班了,為什麼?很簡單,我需要有個環境能讓我不計後果的做各種嘗試和試驗。我喜歡寫程式,尤其是沒人做過的程式(一直重複寫留言板和twitter client可不好玩)。做沒人做過的事雖然好玩,結果可能會出乎意料的好,但也有可能會大大的失敗 – 而這就是研究。在公司裡做工程師寫程式就不太能做這樣子的事情,因為公司要考量風險,可能會大成功的東西也意味著可能會大失敗,而大部分的公司沒辦法禁得起這種失敗,所以只好跟著別人的屁股走。

MIT是個很酷的地方,歷史上有很多有名的系統都是在這裡誕生的,像是Ethernet、Emacs、GCC、LISP(語言和第一個compiler)…。如果說要在學術界動手做真正的系統,那MIT一定是世界上數一數二的地方。那麼在這個地方,博士班學生要如何畢業,教授要如何升等呢?

很不幸的,答案是:寫論文。

在資訊科學這領域,美國學校不像台灣獨尊SCI論文,事實上美國人大多不知道SCI是什麼東西,但不是這樣就代表美國不寫論文。在這邊搞電腦、資訊研究的,一樣要寫論文,而且只投到各子領域的一兩個頂尖會議去。(一個大家都知道的潛規則是,三篇頂尖會議的長論文=博士畢業)

台灣有台灣的遊戲規則,美國也有自己的遊戲規則,但即使是MIT的系統hacker們,也擺脫不了寫論文的命運。(例如說,Richard Stallman其實有寫Emacs的論文,做PostgreSQL的Stonebraker也有一大票的POSTGRES論文

我以前覺得寫論文很痛苦,也懷疑有多少人會去看這些紙張(論文英文就叫paper,所以名符其實就是一堆紙),對我來說直接把程式寫出來讓人用似乎更能直接造福人們。我到現在其實還是這麼覺得,所以我花了很多時間把SIKULI open source,建立起一個community,並持續更新千百個跟研究完全無關的功能,目的就是讓所有人能更直接的享用到這個研究的成果。(而很不幸的是,做這些事情跟我能不能畢業沒什麼關係,但還好我老闆還是支持我的。)

但同時,我也覺得論文的存在有其必要性。我認為做研究可以產出多樣化的「產品」,這產品可以是程式碼,可以是影片,或其他任何形式的媒介。而追朔到其核心,研究的產出最重要的是「想法」,也就是 “idea”,而論文只是最簡單又最容易被其他人接受的傳播媒介而已。

為什麼說論文有其必要性,就是因為論文是傳播想法最有效的媒介。論文的架構設計得讓人可以很容易抓到重點,也可以很容易的深入核心想法。如果寫過論文的都知道,論文的架構是死的,一定都有abstract、introduction、related work、conclusion等等,這種架構讓人能各取所需,要深讀或略讀都很容易。但如果說研究的產出是一個軟體系統,我們該從何了解這個系統的「想法」在哪呢?為了要讓一個系統達到「可用」的程度,整個系統裡面至少90%以上的程式碼都是純粹的工程產物,跟核心概念一點關係都沒有。而程式碼又是很難讀的東西,如果別人要了解這個研究的創新在哪,讀程式碼一定是不得已的最後手段。

我絕對贊成做研究的人也得懂如何實作。很多好的idea其實老早在數十年前的論文就出現過了,但一直到現在都看不到,常常只是因為沒人去把它實作出來而已。做研究最難的事就是找到新的idea,如果只是學人家實作一個作業系統或是CPU,那也不過是照本宣科,沒什麼「研究」的價值和貢獻。像MIT這種強調”Mind & Hand”(手腦並用)的地方,很多教授都有很強的實作能力,但他們一手寫程式,另一隻手還是寫論文,因為他們知道這樣才能得到務實的經驗,而同時也能把這些貢獻和想法用最有效的方法傳播出去。

如果你問我,「我在學術界,但我擅長寫程式,不擅長寫論文,該怎麼辦?」

我覺得答案很簡單:如果你有很多創新的點子,那就開始練習寫作和英文,因為不管在什麼領域,如果你沒辦法好好的把想法傳達給別人,那也是孤掌難鳴;如果你沒有什麼點子,只是喜歡寫程式,那更簡單了,趕快quit去做工程師專心享受寫程式的時光吧。

延伸閱讀:
我看李家同的是與非。此文的觀點跟我很接近,所以他講過的很多東西我就不再重複了。

附帶一提,最近在facebook上成立了粉絲頁,歡迎大家加入多多交流!


A Feedjack powered Planet
A Django site.