松本行弘:代碼的未來
松本行弘(Yukihiro Matsumoto),Ruby語言發明者,亦是亞洲首屈一指的編程語言發明者。現兼任網絡應用通信研究所(NaCl)研究員、樂天技術研究所研究員、Heroku首席架構師等。昵稱“Matz”。討厭東京,喜歡溫泉。圖靈社區就《代碼的未來》,以及中國讀者所關心的一些話題,采訪了Ruby語言設計者松本行弘(以下簡稱Matz)先生。(采訪者:《代碼的未來》譯者周自恒)
周:松本先生今年出版了新書《代碼的未來》,這本書的中文版正在由我進行翻譯,預計明年會在中國出版。您的上一本書《松本行弘的程序世界》在中國受到了讀者的好評,這次的新書和前作相比有哪些不同,又有哪些看點呢?
Matz:《松本行弘的程序世界》一共涉及了14個話題,每個話題都是淺嘗輒止,內容比較廣泛但不是很深入,而 這次的新書則是設定了一個大的主題——即對未來即將到來新技術的思考,因此內容比《程序世界》所涉及的范圍要窄一些。此外,這本書還在時間尺度上進行了探 討,例如從計算機出現以來,到現在為止經歷了怎樣的變化,并由此來思考未來可能會發生的變化,也就是對過去和未來兩方面都進行了思考。計算機的世界變化非 常快,而這本書的目的在于探討其未來變化的方向。
周:說起計算機的發展,您在書中還提到了關于摩爾定律的一些話題呢。
Matz:摩爾定律是描述計算機將如何發生變化的一個定律,書中所探討的不僅包括計算機本身的變化,還包括計算機為周圍的環境所帶來的變化。
周:關于編程語言進化的方向,保羅·格雷厄姆在一篇名叫“一百年后的編程語言”的文章(參見圖靈圖書《黑客與畫家》P156)中,主張“擁有最簡潔最小核心的編程語言”將是未來發展的趨勢。對于這一觀點,您在書中表示“不同意”,這是為什么呢?您對編程語言發展方向的看法又是怎樣的呢?
Matz:保羅是一個很喜歡Lisp的人,而Lisp所具備的特性正好符合他所說的“一百年后的編程語言”的樣 子,因此保羅認為一百年后的編程語言就應該變成Lisp這個樣子。但實際上,Lisp這個語言的歷史已經有50多年了,說實話,Lisp現在并沒有成為一 種有很多人在用的主流語言。我覺得這也許是因為Lisp對于大多數程序員來說不具備那么大的魅力,也就是說,作為一種“擁有最小核心”的語言,或者從某種 意義上說是一種很“美麗”的語言,和程序員們所期望的語言之間,存在著一定的差距。如果一兩年的時間里,Lisp的魅力沒有被大家所接受,那還可以理解, 但已經過了50年還沒有被廣泛接受的話,是不是它在本質上就不太符合大家的期望呢?“對人類來說好用的語言”和“擁有最小核心的語言”之間的這個差距可能 是很大的,我覺得可能將來100年也沒辦法消除。至于未來的編程語言應該是怎樣的,我覺得應該是兼具接近Lisp的運行模型,以及人類容易理解的語法這兩 方面特征,這么一看Ruby是不是更接近這樣一種語言呢?
周:松本先生被稱為Ruby之父,我們知道在編程語言的設計過程中,可能要做出很多選擇,例如動態還是靜態、基于原型還是基于類等等。在Ruby的特性中,您認為當初最難做的選擇是什么?
Matz:在設計Ruby之前,我在上大學的時候還設計過另外一種語言,而那種語言是完全靜態的,和 Eiffel語言非常相似。而我原本也是特別喜歡靜態語言的,不過上大學時設計的那種語言是以學術研究為目的的,多年之后,當我想設計一種編程語言作為自 己的工具來用的時候,我就覺得還是動態語言實際用起來比較好用。抱著這樣的想法,我設計了Ruby,現在看來這個設計還是正確的。那么當初對于Ruby應 該是靜態還是動態這個問題,也許算不上是最難的吧,但至少是我在設計中做出的“最大”的一個判斷。而在此之后,因為是動態語言,那就借鑒一下 Smalltalk和Lisp吧,Perl有一些功能也不錯,于是如此這般吸收了這樣一些語言的特性,也就顯得比較自然而然了。Ruby的特點在于 Mixin模塊,而這個特點在Ruby誕生當時還算是非常罕見的,因為我不喜歡多繼承,總覺得應該有一個更簡單的方式,所以就設計了Mixin模塊。
周:那么現在回過頭來看,Ruby當中有哪些地方會讓您覺得“如果當初設計成這樣就好了”呢?
Matz:最開始的時候我的目標只是想實現Perl所具備的功能,因此從Perl借鑒了很多,比如說用美元符號 ($)來修飾變量名之類的,現在看來覺得學得有點過了,搞得和Perl太像了。當然,除此之外還有其他一些小地方,但最主要的我覺得就是這個了,也就是跟 Perl太像了這一點。剛開始的時候,還沒有形成Ruby的語法習慣和文化,因此很多東西都是從Perl“抄”過來的,現在看來好像一股腦拿過來的東西太 多了,里面其實有一些是不需要的。而經過一段時間之后,Ruby自己的文化已經形成,Rails出現之后又形成了Rails的文化,而到了這個時候再看的 話,可能就會覺得這些Perl的部分好像沒啥必要呢。
周:大家都認為“Ruby有現在的人氣基本上都是由于Ruby on Rails的貢獻”,您在書中也認同這個觀點,那么您認為Ruby on Rails獲得巨大成功的原因是什么呢?
Matz:首先是得益于Web的快速發展,幾乎所有的軟件開發平臺都在瞄準Web這個領域。以往在用CS(客戶 端-服務器)架構來開發的系統,現在都可以在Web上實現了。在Web上能夠開發的應用變多了,這是一個主要的背景。另外,Ruby的優勢在于進行軟件開 發非常容易,也就是開發效率比較高。這兩點結合起來,我認為就是Ruby on Rails成功的主要原因。
此外,Ruby還有一些比其他語言強大的特性,例如元編程(Metaprogramming)、通過猴子補丁(Monkey patch)所帶來的可擴展性等等,通過這些特性,甚至可以對基礎的類進行增強。DHH正是運用了Ruby的這些強大之處,開發出了Rails。而對于沒 有接觸過Ruby的人,比如只用過Java這種比較“死板”的語言的人來說,會覺得“唉?居然還可以做到這樣嗎?”,我覺得這也是Rails成功的原因之 一。
周:據說DHH曾經是準備用PHP來開發這樣一個框架的,但后來卻轉向了Ruby?
Matz:對,因為PHP在元編程方面有很多限制吧。Rails推出之后,又出現了很多(在PHP上實現的)模 仿Rails的開發框架,比如Symfony、CakePHP等等,但是Ruby所擁有的強大特性PHP卻并非完全具備,即便不考慮它們各自的背景,只是 單純去對比這些開發框架的話,我還是覺得Rails更強大一些,我覺得DHH選擇Ruby也正是看重了這一點。順便,我其實是見過DHH的,在丹麥,那時 候他還沒開始學習Ruby,說不定那次見面也是對他產生影響的一個原因吧。
周:中國讀者很關心的一個話題是,Ruby目前最廣泛應用的領域就是Web開發,那么在Web開發這個領域之外,Ruby的發展方向又是什么呢?
Matz:的確,Ruby在Web開發領域被用得很多,例如Rails、Sinatra等開發框架。但編程的世界并非只有Web而已,我也一直希望Ruby能夠從Web中走出去。在不久的將來,我認為Ruby有望被應用的領域,主要有三個。
- 科學計算(Scientific computing),也就是大學科研中所要用到的計算。在這個領域,Python、R、matlab等語言用得非常多。我希望Ruby也能夠進入這一領 域,為此我們正在開發一個叫做SciRuby的項目,希望借此推動Ruby在大學科研計算領域的應用。
- 高性能計算(High performance computing)。這個和科學計算有點接近,是運用超級計算機來進行計算的領域。和C++比起來Ruby確實要慢很多,所以大家都覺得Ruby不可能 被用于高性能計算領域。東京大學一個研究生做了一個研究項目,將Ruby寫的代碼編譯成C語言代碼,然后再編譯成二進制程序,這個過程中需要用到類型推導 等技術,最好的情況下,速度能夠達到C語言(指用C語言人工編寫的同等程序)的90%。這個項目目前只發表了論文,還沒有公開源代碼,我希望明年這個項目 的成果能夠全部公開。
- 嵌入式(Embedded)開發。所謂嵌入式就是指在微型設備,例如手機、醫療器械、機器人,在這些環境下,現在的Ruby其實并不是很適合,內 存開銷很大,API也不合適,因此才需要開發適合嵌入式開發的,內存開銷比較小的,并且具備面向嵌入式開發API的Ruby引擎,這也就是mruby。
以這三個領域為首,我希望Ruby能夠在Web開發以外的領域有更多的發展。
周:推ter主要是用Rails開發的,最近我看了一則新聞,說美國大選的時候推ter遇到了前所未有的大訪問量,推ter稱為了應付訪問量的上升,正在從Ruby轉移到其他語言,您對這個問題怎么看呢?
Matz:這里面原因很多吧。首先,推ter剛開始開發的時候,沒人知道推ter會獲得今天的成 功,當時很多人覺得,這種只能寫140個字的博客有什么意思呢?但推ter卻出人意料地獲得了巨大的成功。在這個過程中,推ter增加了很多 新功能,在它快速發展的過程中,Ruby的貢獻是相當大的。因為一個新功能從構思出來到付諸實現,可以用很短的時間就能夠完成。推ter剛開始開發 的時候不可能考慮到會有現在這樣大的訪問量,也就是遇到了設計上的瓶頸了,因為一般的網站也不可能會有每秒上萬的訪問量,因此可以說現在的推ter 發展到當初在設計上的極限了。
為了解決這個問題,推ter需要開發一個全新的架構,以應付現在越來越大的訪問量。不過,即便要重寫架構,我覺得沿用Ruby也是可以做到的 吧?(笑)話說,一個網站在遇到設計極限的時候,有很多解決方法,比如重寫架構、換其他語言等等,其中重寫架構我覺得是最重要的,而實際上推ter 也正是做了這方面的工作。但在這個過程中,他們的工程師想要挑戰一些新的東西,那么從編程語言上來說,就提出要改用Scala,因為Scala是編譯型語 言,性能也不錯,正好適合編寫新的架構,我覺得這樣也不錯。
在我看來,在網站所提供的服務還沒有完全成型的時候,最重要的是能夠對需求的變化做出快速的反應,這個時候就需要Ruby這樣靈活性比較高的語言; 而在網站獲得成功之后,遇到了設計瓶頸,用一種新的語言,比如Scala,來編寫一個新的架構,以節約一定的資源,我認為這也是很好的一個結果。 推ter轉向Scala還只是在其核心部分,而在Web前端和一些內部工具上還有很多地方在用Ruby。其實,上個月我還去拜訪了一下 推ter,跟他們的工程師進行了一些交流,Ruby還是用得很多的哦(笑)。
周:近年來隨著智能手機、平板電腦等移動設備的普及,移動平臺開發也變得非常熱門。從編程語言來看,Android上是用Java,而iOS上則是用Objective-C來進行開發的,那么作為腳本語言,不僅限于Ruby,您認為在移動開發上面會有怎樣的發揮呢?
Matz:目前,提到移動開發,在Android上用Java,在iOS上用Objective-C似乎是板上 釘釘的事情,不過這也產生了一定的隔閡,比如某個App是為iOS開發的,如果要移植到Android的話,就得全部用Java重寫才行。現在也逐步產生 了一種新的嘗試,例如PhoneGap、Titanium等框架,通過用JavaScript、Lua等腳本語言,編寫出來的App就可以實現在iOS和 Android的跨平臺移植。作為Ruby來說,也有一種叫Rhodes的框架,通過它就可以用Ruby編寫出在iOS、Android以及 Blackberry上通用的App。
以前移動設備和PC相比性能差距太大,如果App不能全速運行的話,就根本沒法用了。但現在移動設備的性能已經得到了大幅度的提升,通過在通用框架 的基礎上,采用腳本語言來進行開發的方式,性能也逐漸變得可以接受,我想今后通過這種方式,用JavaScript、Lua、Ruby等腳本語言來提升移 動開發效率的做法,應該會越來越流行吧。對了,剛才我們說到mruby,其實用mruby來編寫iOS和Android應用的項目也已經開始了呢,希望不 久的將來這樣的App能越來越多吧。
周:剛才您提到了mruby,而明天您的演講題目是Ruby 2.0,可以就mruby和Ruby 2.0的一些亮點,做一下簡單的介紹嗎?
Matz:剛才我們也提到了,mruby是為了在微型設備上運行而設計的一種Ruby,它并非擁有Ruby的所 有功能,相應地,能夠在微型設備上工作才是它的長處。因此,在以往無法使用Ruby的一些設備上面,例如自動售貨機、控制器、機器人等等,今后也可以用 Ruby來進行開發了。說不定幾年之后,在電視機、汽車等地方也能夠見到Ruby開發的軟件。
Ruby 2.0則包含了兩個信息。第一,Ruby從開始開發算起,明年將迎來20周年了。而作為對20周年的紀念,是2.0這個名字所包含的最大的一個信息。如果 但從變化來看,從1.8到1.9已經是一個非常大的變化,很多人表示說很不適應,而從1.9到2.0的變化,并不像版本號的變化看起來那么大。實際上,我 的目標是保證在1.9上能運行的所有程序,在2.0上面也都能運行,不會因為引擎版本升級導致原來的程序就不能用了。
Ruby 2.0確實也增加了一些新的功能。比如說,現在的Ruby中,可以通過猴子補丁,對某個類中的方法進行添加和替換,但這樣一來,所有的用戶都會受到影響, 可能有人覺得還是原來那樣的好,不想跟著改,或者說這樣的改動和我現在的開發會發生矛盾、沖突等等。為了解決這個問題,Ruby 2.0中可以限定猴子補丁的作用范圍,這樣就可以在團隊開發、庫開發中,避免一些改動對開發范圍之外的其他人造成不必要的麻煩。以往Ruby可能都是用在 小規模的項目中,而當項目逐漸擴大,開始由多個團隊合作的時候,這樣的機制就顯得非常重要了。除此之外,Ruby 2.0中還有一些其他的新功能,也是針對團隊開發的需求來設計的。
周:目前世界范圍內廣泛使用的語言大部分都是來自歐美的,作為例外大概只有來自巴西的Lua和來自日本的Ruby,您在書中也說這種情況讓人感覺“很寂寞”,那么造成這種情況的原因是什么呢?要改變這種局面,我們應該做出怎樣的努力呢?
Matz:關于Lua呢,其實如果你要說它是歐美的也可以,巴西是屬于“拉丁美洲”嘛(笑)。要說亞洲或者東亞 這邊的話,那就只有Ruby了,真的是蠻寂寞的一件事。從世界范圍來看,(對于編程語言來說)歐洲和美國的影響力應該是最強的,而亞洲雖然有眾多的人口, 但卻沒有能夠出現很多的編程語言,確實挺寂寞的。
如果說對將來的期待,別的國家我不太清楚,至少在日本,其實是有很多人在開發各種各樣的編程語言,但除了Ruby以外,其他的語言在日本以外幾乎就 沒人知道了。如果對編程語言感興趣的人越來越多,所創造出來的編程語言也越來越多的話,這其中應該就會有那么一兩個能夠取得成功吧。在日本還存在一個問題 就是語言障礙,日本人除了母語以外,精通外語的人不多,有趣的是,居然有用日語來編寫程序的編程語言呢。(周:說到這個,其實中國也有用漢語寫程序的編程語言呢。)中國也有嗎?果然。不過這些語言雖然有趣,卻只能給日本人用,也就無法走向世界了。
說句題外話,我曾經收到過一個美國人發給我的一封郵件,他說你是個日本人,但Ruby看上去卻跟英語沒什么區別,因為Ruby程序都是用英語寫的嘛,難道沒有用日語寫程序的編程語言嗎?為什么沒有呢?我只好回答說:有啊,只不過你不知道而已,即便知道你也沒辦法用嘛。
現在在日本對編程語言感興趣的人不斷增加,大概我總是在網上還有書里說編程語言多么有趣,多少也是受了我的這些言論的影響吧,現在有不少人在挑戰設 計新的編程語言。在這些新的編程語言中,如果能有千分之一的語言能夠最終獲得成功,我認為就是很好的結果了。我不知道中國、韓國,以及其他一些亞洲國家 中,有多少人想要挑戰這一領域,不過如果大家以我的這本書為契機,能夠改變“編程語言是別人給我們的,我們只能被動接受”這種看法,繼而抱有“自己創造一 種編程語言也不錯嘛”這樣想法的人能夠越來越多的話,這其中一定會有人獲得成功。
說到開源,無論是日本,還是中國、韓國,在世界范圍內發表的項目還很少,這也算是一個可以去努力的切入點。這里面可能有很多原因,比如英語很難學,(周:比如GitHub也很難用?)哈哈,GitHub在中國能用嗎?(周:能用能用……)唔,還好還好。不過,這個(嗶——)的影響還是很大的,有很多資料不太容易獲得吧。(周:是啊,比如Go語言的官網就上不去呢。) 啊!Go的官網上不去嗎!果然是因為它是Google的吧(笑)。總之,需要面對的難題還是很多的。另外,在日本也是如此,程序員把大多數時間都用在了工 作(掙錢)上,要進行開源項目之類的活動就比較困難了。10年前,開源這個概念在日本也沒人接受,而現在大家都逐漸明白了開源的主要性,開源項目也就逐漸 增多了,我想未來幾年中,在中國應該也會產生類似的變化吧,我很期待。
而且,在剛開始做的時候,沒人知道到底做什么會成功。我在設計Ruby的時候,也不可能想著Ruby很不錯以后一定會在全世界廣泛使用。因此,一種 編程語言生逢其時可能更重要一些,但這種事情,你不去嘗試一下是不會知道結果的。在中國,也一定會有一些編程語言或者軟件因為生逢其時,從而走向世界并獲 得成功。
周:在書里講到Dart的時候,您說過對于編程語言來說,生態環境是很重要的。那么要建立這樣的生態環境,需要一些怎樣的努力呢?
Matz:從用戶的角度來看,用這種編程語言,對我有什么益處,這一點很重要。在Rails出現之前,使用 Ruby的人,包括我自己在內,大多數都是覺得Ruby寫程序很輕松,這可能是選擇Ruby的主要目的。當然,Rails出現之后,因為“我要做個網 站,Rails最快”這樣的理由而使用Ruby的人變多了。因此,如果你設計一種新的語言,如果能夠準確地傳遞給用戶使用這個語言所能帶來的好處,我想這 樣的語言成功的可能性會更大一些。
周:非常感謝,在采訪的最后,請您談談對中國程序員的寄語吧。
Matz:在《程序世界》中我也提到了,我覺得編程的未來應該會以開源的形式發展下去,未來的創新性軟件或者編 程語言,可能都會以開源的形式出現。作為開源軟件來說,別人做出來我可以免費使用,這一點大家都很開心。在經歷了這個階段之后,如果能夠更進一步,將自己 做的軟件開源,使其對全世界產生影響,如果能做到這一步的話,你可能就會成為一名一流的軟件工程師。中國的軟件工程師,就我接觸的這些人來看,大家都非常 認真和努力地學習技術,我希望這些人之中,能夠有更多的人邁出這一步,從而成為可以影響世界的一流程序員。
原文: http://segmentfault.com/blog/turing_interview/1190000002414437 作者: 周自恒