2013年7月7日 星期日

Favonia(CMU CS 攻讀Ph.D)

  • 訪問對象:Favonia,目前(2013/01)在卡內基美隆大學(CMU)就讀 CS 領域 Ph.D
  • 訪問時間:2012/11/24
  • 訪問者:蔡釗仁(b00902031)、游書泓(b00902107)

CSIE

如果重新讀一次大學,你覺得你會做什麼改變嗎?例如修的課程。

我覺得我已經做出當下想到最好的決定。雖然還有很多東西想修,但時間真的不夠。

覺得系上還可以教哪些課?

如果你問我覺得資訊系還可以教什麼,除了技術方面,我認為還可以讓學生更意識到社會。譬如我們目前沒有科技跟社會的關係之類的課。我覺得我們可以有個淺的介紹課程
此外,我們也可以講一些專利、著作權法、商標法相關的事情。一位歌手總要了解一些著作權法的事情,不然像以前有位歌手不能演唱自己的歌,因為他把整個版權都賣掉了!
程式跟文章、歌曲一樣是著作。許多人以後的工作是真的在寫程式,也就是在創作的人,和歌手、作家是一樣。如果資訊系的主要目標在於培養程式設計師,那麼就應該讓學生對著作權、專利等有基本認識,不然連自己違法都不知道。例如當你拿錢幫人寫程式時,整個程式的版權通常屬於付你錢的人,之後幫另一個人工作時,很可能不能複製之前寫的程式碼。

請問你當時怎麼學習資訊理論(如演算法)?跟著系上必修課,再去學深入的嗎?

我不是跟著上課然後再去額外學更深入的,而是自己有興趣就去看,像是 Introduction to Algorithms 那本書,我早就幾乎翻完了。還有像自動機課本[1],我上課時只有教一半而已,但我自己把剩下的看完。
我個人覺得不需要拘泥於修課,想學就學。如果只是想學基礎的話,可以挑一本叫 "Introduction to..." 的書把它讀完就好。如果你覺得這樣太花時間,可以去看網路上的開放課程。網路上還有好多資源,像是上課講義,會比直接看論文好懂。

我們系有離散數學,數學系也有離散相關的課程。他們的教法可能比較數學,跟資訊沒有直接相關。那修他們的課有什麼幫助嗎?

這些課不一定對寫程式有很直接的幫助,但可以提供思考訓練,讓你間接有斬獲。關於數學系離散數學那部份,雖然我們資訊系也有離散數學,但那是很多堂數學課(如圖論、代數)的跛腳綜合版。如果你有興趣的話,還是可以去上。

那你覺得國內外大學部的訓練有哪些差別?如對資訊的訓練各有什麼長短嗎?

我覺得我很難回答這個問題,因為我必須把整個文化的差異也考慮進來。也許我可以說說文化上有哪些我知道的差異。我讀的學校(卡內基美隆)學生要繳非常、非常多的學費才能唸大學,不夠的話只能借錢以後還款。我猜測學生上課不一定比較認真(除非他們了解跟就業有何關係),但要求比較高。另外各地方高中狀況很不一樣,不太能像台灣假設有個「基礎知識」。
訪問:整個社會對大學、讀書、研究整體的想法就不同?
對,我覺得兩邊根本是不同制度,只是剛好有相同的名字。

請問你當時為何選資訊系?

我選資訊系是因為我覺得資訊系比較好玩。對我而言,學習知識、弄些程式讓它們動起來,本身就是很有趣的事情。我曾好奇為什麼那麼多人想念電機系,但翻過他們的課本以後,就確定我對資訊系還是比較有興趣。

對學弟妹規劃人生有什麼建議嗎?

如果要給學弟妹做建議的話,我覺得有件事一定要講,那就是想想你的興趣和人生目標在哪裡。台灣的制度和環境並不鼓勵大家做這件事情,所以才要特別做。很多我遇到的人,他們花了中學六年的時間準備考試,卻不知道自己是為了什麼而考試,最後匆匆用分數排名了事。就像花很多時間在準備 GRE 和托福,卻連要申請(國外)哪間學校都不知道一樣。還有雖然台大可以轉系,可是卻要求成績要好——如果選錯了系、沒有興趣,為什麼還要成績好才能轉過去?台灣的制度和氣氛各方面都在妨礙你走自己想走的路。
可以的話,我希望大家能想想自己的志向,甚至從高中就開始做一點點,畢竟總有一天你要面對「我再來要做什麼」這個問題。就算大學去不想,碩士畢業呢?男生當完兵呢?有些人也許覺得這社會好像有幫他安排好一條路,只要順著那條路努力就好,但這恐怕是一種幻覺。在不改變制度的前提下,我希望大家能自己多想一點,然後做出真正適合自己的決定。
我在資訊系碰到很多真的很聰明的人,但是他對寫程式沒有愛,唸資訊系對他來說是件很痛苦的事情。我覺得他們來唸資訊系其實滿可惜的。我個人把這錯誤歸咎於我們奇怪的制度和環境,但同時也希望在環境還沒改變的情況下,大家能多少警覺到這問題,有需要的話儘快補救。

讀 Ph.D 相關

Q:請問你是什麼時候決定要出國唸 Ph.D 呢?

大概高中就決定了。

Q:這麼早決定?那是唸完碩士才出去嗎?

直接出去,這樣比較省時間。另一方面,因為我想要走的方向(純理論)台大資訊師資比較少,所以還是出國唸比較好。

Q:會不會有申請、銜接上的問題?

好像沒有什麼問題耶。第一年我沒申請上,但第二年再申請一次就上了。銜接部份也沒有什麼障礙,因為他們那邊本來就很多人直接從大學部跳上去。就像之前說的,美國有著完全不同文化和制度,只是剛好名字一樣,難以比較。

Q:申請 Ph.D 的時候,可能會看哪些東西呢?

我沒有當過審查委員,所以我只能提供我的猜測。撇除基本的東西,我覺得很重要的第一個是推薦信。剩下我不確定,不過讀書計劃(Statement of Purpose)應該也很重要吧。
訪問:會看專題做了什麼嗎?聽說成績之外,專題做出什麼結果、有哪些想法比較重要?
基本功很重要。人家一看就知道你的研究程度到哪,很難用什麼訣竅勉強裝出高程度。對這個領域有多少看法,很容易在讀書計劃就曝露出來;教授隨手寫的專案計劃、大學畢業生寫的讀書計劃和博士畢業時寫的東西層次完全不同。

Q:當初選學校的時候,有哪些考量?

最重要的當然是那個學校本身好不好,師資如何。像是有哪些老師、在做什麼領域、CS 跟其他學科的合作、其他學科強不強等等。雖然會考量錢的問題,不過剛好我申請的學校都會提供獎學金,所以也還好;反正夠用就好。

Q:(電腦科學中)要走純理論、學術的話,有建議能多學什麼嗎?[2]

先澄清走學術不一定就是走理論,雖然可能學術本身就比較理論了。如果是純理論的話,除了大家比較清楚的代數和圖論等等外,我還推薦範疇論(category theory)。數學系應該有不少課可以修。

程式語言理論(目前 Favonia 研究的領域)

為什麼從演算法轉向程式語言理論呢?

我在博士班第一學期時,選了一堂關於程式語言理論的課,發現「程式語言理論」這塊領域。當然,這只是契機,最後決定轉換領域還有很多原因。我可以說說最後一根稻草:
最近某研究方向出現一些以實數運算為基礎的演算法,在現實中的實作全都用浮點數來逼近。如果我們的目的只是要近似倒也還好;可是其中某些演算法需要真正的實數運算。
誠然理論中可以假設有能計算實數的機器,然後探討會發生什麼事情。這依然是有趣的理論,例如我們可以討論在這種機器下還有哪些事情是不可判定的。
然而該研究方向是有真實應用的,所以我無法忽視理論跟實作之間巨大的宏溝。而且我覺得這是演算法研究者的責任,例如我們需要證明這些操作都可以用浮點數逼近。可惜我主觀覺得演算法領域(相對於程式語言理論領域)好像沒有太多人在乎這件事,所以就決定換領域了。雖然程式語言理論中少部份研究也有類似的問題,但我覺得災情比較小。

請問程式語言理論在做什麼?

程式語言的的設計、實作和分析。這裡我想提供一個這領域才有的觀點:若我們證明了一種程式語言具有某個性質,那代表任何寫得出來的程式都要符合那種性質。我們說 C 不安全,是指 C 可以寫出很糟糕的程式,不代表 C 寫不出安全的程式;如果很謹慎小心的話,當然可以用 C 寫出很安全的程式,但那不是重點。按照這個標準,你會發現很多廣泛流行的程式語言之中某功能,常常都沒辦法保證所有的寫法都會符合設計的初衷。而我們追求的,是程式設計師想故意犯錯都很困難的安全語言。
比如說在 Java 中,你可以寫一個 interface,再用不同的 class 繼承它。設計初衷是任何符合這個 interface 的等價實作都能替換,以此達到抽象化。但如果用上面講的標準來分析,Java 這方面是失敗的,它還是讓程式設計師有機會犯錯。
就假設你的 interface 是一個 Queue 好了[3]。若你有兩個滿足 Queue interface 的等價實作,理論上不應該能區辨他們;底下儲存資料的方式可能天差地遠,但是無論如何,外在的操作不應該能發現任何不同。但是透過 Java 的向下轉型可以輕鬆區辨兩個實作。也就是若 a 和 b 都是繼承 Queue,我可以在拿到未知實作時試著把它向下轉型成 a,從結果分辨出 a 和 b 兩個不同的實作了。這就破壞了我們剛才說的性質。所以如果你希望剛才 Java 滿足抽象化定理,就不能有諸如此類的設計。這就是我們設計和分析程式語言的方法。

請問程式語言理論對去業界工作有幫助嗎?

如果你是指以研究理論為工作的話,業界可能有幾個機構吧,例如微軟有機構在做這方面的研究。但即使不是作理論研究,而是去當程式設計師,也是有用的。這些理論可以提供思考上的訓練,讓你從更高層次來了解程式語言。也許哪天你需要自己設計一套小語言來做事,那理論可以幫助你避開常見的錯誤,如同知道一些基本演算法可以避開效率太差的寫法一樣。此外,當別人在討論哪個程式語言比較好時,你也比較能從更高的角度了解他們在吵什麼。

有什麼有趣的語言推薦嗎?

最新最有趣的語言大概會出現在新發表的學術論文裡,不過可能都還不夠成熟,有時候連能用的編譯器實作都沒有,所以我很難推薦。如果要有個容易找到、穩定、有人維護的編譯器,我想只能退而求其次,推薦 Haskell、Standard ML 或 OCaml。Haskell 和 ML 一族有一些不一樣,不過我這裡先不深究。我相信很多人會推薦 LISP,不過我覺得這幾個語言有一些 LISP 中沒有的有趣概念。並不是說 LISP 不好;若你沒碰過 LISP 或 Scheme,當然可以學。但若你想只學一種程式語言然後學到最多有趣的新觀念,且要有成熟的編譯器,那我會推薦這三個。
訪問:我本來認為寫程式這件事,例如用 C 語言寫,就是心中有臺實際、具體的機器,且對於每一行程式怎麼轉成機器指令都能清楚的描繪出來。原本認為寫程式就是這樣,不過好像差很多。
老實說,我覺得如果沒有先學 C,搞不好學習過程會順利一些(笑)。先講個提外話,其實機器指令早已不是那麼「清楚」,現在 CPU 根本不會一行一行執行下去,太沒效率了;至少都有 pipeline,然後也不會按照順序執行。
我覺得資訊科學中一個很重要的概念是「抽象化」。在 C 中寫程式比較難體會寫程式(如果用剛才那三個語言)能抽象化到什麼地步。像剛才 Java 的例子,雖然語言設計上有點瑕疵,但至少我們可以表示一個 Queue 的介面。剛才我推薦的幾個語言的表達能力又更強。在 C 裡面比較難表達這些想法。當然大家都是 Turing complete,都可以模擬其他程式語言,然而程式語言不只是能寫出來,還包括能怎麼寫。
註:
  1. 自動機與形式語言,大三上必修;課本用 Introduction to the Theory of Computation
  2. 這邊指的限於 theoretical computer science 中關心「computing science」本身的部份,像是 theory of computation、automata theory、programming language theory、algorithm、program semantics and verification 之類。
  3. 可以從一端放東西進去,另一端拿東西出來,First-in-first-out 的資料結構。