松本行弘:程式碼的未來

segmentfault發表於2014-12-15

  松本行弘,Ruby語言發明者,亦是亞洲首屈一指的程式語言發明者。現兼任網路應用通訊研究所(NaCl)研究員、樂天技術研究所研究員、Heroku首席架構師等。暱稱“Matz”。討厭東京,喜歡溫泉。圖靈社群就《程式碼的未來》,以及中國讀者所關心的一些話題,採訪了Ruby語言設計者松本行弘先生。

  周:松本先生今年出版了新書《程式碼的未來》,這本書的中文版正在由我進行翻譯,預計明年會在中國出版。您的上一本書《松本行弘的程式世界》在中國受到了讀者的好評,這次的新書和前作相比有哪些不同,又有哪些看點呢?

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有望被應用的領域,主要有三個。

  1. 科學計算(Scientific computing),也就是大學科研中所要用到的計算。在這個領域,Python、R、matlab等語言用得非常多。我希望Ruby也能夠進入這一領域,為此我們正在開發一個叫做SciRuby的專案,希望藉此推動Ruby在大學科研計算領域的應用。
  2. 高效能運算(High performance computing)。這個和科學計算有點接近,是運用超級計算機來進行計算的領域。和C++比起來Ruby確實要慢很多,所以大家都覺得Ruby不可能被用於高效能運算領域。東京大學一個研究生做了一個研究專案,將Ruby寫的程式碼編譯成C語言程式碼,然後再編譯成二進位制程式,這個過程中需要用到型別推導等技術,最好的情況下,速度能夠達到C語言(指用C語言人工編寫的同等程式)的90%。這個專案目前只發表了論文,還沒有公開原始碼,我希望明年這個專案的成果能夠全部公開。
  3. 嵌入式(Embedded)開發。所謂嵌入式就是指在微型裝置,例如手機、醫療器械、機器人,在這些環境下,現在的Ruby其實並不是很適合,記憶體開銷很大,API也不合適,因此才需要開發適合嵌入式開發的,記憶體開銷比較小的,並且具備面向嵌入式開發API的Ruby引擎,這也就是mruby。

以這三個領域為首,我希望Ruby能夠在Web開發以外的領域有更多的發展。

  周:Twitter主要是用Rails開發的,最近我看了一則新聞,說美國大選的時候Twitter遇到了前所未有的大訪問量,Twitter稱為了應付訪問量的上升,正在從Ruby轉移到其他語言,您對這個問題怎麼看呢?

Matz:這裡面原因很多吧。首先,Twitter剛開始開發的時候,沒人知道Twitter會獲得今天的成功,當時很多人覺得,這種只能寫140個字的部落格有什麼意思呢?但Twitter卻出人意料地獲得了巨大的成功。在這個過程中,Twitter增加了很多新功能,在它快速發展的過程中,Ruby的貢獻是相當大的。因為一個新功能從構思出來到付諸實現,可以用很短的時間就能夠完成。Twitter剛開始開發的時候不可能考慮到會有現在這樣大的訪問量,也就是遇到了設計上的瓶頸了,因為一般的網站也不可能會有每秒上萬的訪問量,因此可以說現在的Twitter發展到當初在設計上的極限了。

為了解決這個問題,Twitter需要開發一個全新的架構,以應付現在越來越大的訪問量。不過,即便要重寫架構,我覺得沿用Ruby也是可以做到的吧?(笑)話說,一個網站在遇到設計極限的時候,有很多解決方法,比如重寫架構、換其他語言等等,其中重寫架構我覺得是最重要的,而實際上Twitter也正是做了這方面的工作。但在這個過程中,他們的工程師想要挑戰一些新的東西,那麼從程式語言上來說,就提出要改用Scala,因為Scala是編譯型語言,效能也不錯,正好適合編寫新的架構,我覺得這樣也不錯。

在我看來,在網站所提供的服務還沒有完全成型的時候,最重要的是能夠對需求的變化做出快速的反應,這個時候就需要Ruby這樣靈活性比較高的語言;而在網站獲得成功之後,遇到了設計瓶頸,用一種新的語言,比如Scala,來編寫一個新的架構,以節約一定的資源,我認為這也是很好的一個結果。Twitter轉向Scala還只是在其核心部分,而在Web前端和一些內部工具上還有很多地方在用Ruby。其實,上個月我還去拜訪了一下Twitter,跟他們的工程師進行了一些交流,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:在《程式世界》中我也提到了,我覺得程式設計的未來應該會以開源的形式發展下去,未來的創新性軟體或者程式語言,可能都會以開源的形式出現。作為開源軟體來說,別人做出來我可以免費使用,這一點大家都很開心。在經歷了這個階段之後,如果能夠更進一步,將自己做的軟體開源,使其對全世界產生影響,如果能做到這一步的話,你可能就會成為一名一流的軟體工程師。中國的軟體工程師,就我接觸的這些人來看,大家都非常認真和努力地學習技術,我希望這些人之中,能夠有更多的人邁出這一步,從而成為可以影響世界的一流程式設計師。

相關文章