Ryan Dahl 現在是 Google Brain 的一個軟體工程師。他是 Node.js 之父,Node.js 是一個基於 Chrome V8 JavaScript 引擎的 JS 執行環境。現在他從事深度學習研究專案,工作重點是彩色化和超解析度等影象轉換工作。他曾經貢獻過幾個開源專案,包括 HTTP Parse、libuv。
2017 年 8 月 31 日 Ryan Dahl 做客於英文播客 mappingthejourney,分享了他的個人經歷,開發 Node.js 的過程,對 Node.js 的理解,他在 Google (Brain) 的工作現狀,對學習 ML 的看法等。
—————-
Pramod: 大家好,歡迎來到 mapping the journey。當我們聽到 Node.js 時就會想到 Ryan Dahl。他向我們展示了我們的I/O工作完全錯誤,並教會了我們如何使用純非同步程式設計模型來構建軟體。我們今天的嘉賓就是 Ryan Dahl ,一個黑客、出色的程式設計師、也是 Node 之父。我們非常榮幸能夠邀請到他,歡迎 Ryan。
Ryan: Hello!很高興到這兒來。
Pramod: Ryan 我們知道您是Node之父,能跟我們聊聊做技術之前的經歷嗎?
Ryan: 當然,我在聖地亞哥 (San Diego) 長大,在我 6 歲的時候,我媽媽買了一臺 Apple 2C ,所以我想我屬於比較早接觸電腦的人。順便說一句,我今年 36 歲。因此,我是伴隨著網際網路長大的。我去了聖地亞哥的社群大學,然後在加州大學聖地亞哥分校攻讀數學,畢業後在羅切斯特大學研究生院攻讀數學博士。
在那裡我學習了代數拓撲學,那是一門非常抽象的課程,我當時非常討厭這門課程,因為我感覺它與現實生活離得太遠了,但是很多年後我發現這門課程非常棒。博士期間,我突然發現自己不想當個數學家,於是放棄了這個計劃。然後我買了一張去南美的單程票並在那裡呆了一年,在那裡我開啟了飢餓學習模式,並且找到一份和一個名叫 Eric 的傢伙共同開發一些網站的工作。這就是我程式設計生涯的開始,使用 Ruby on Rails 為滑雪板公司開發網站。
Pramod:很好!放棄博士學位、到南美旅行併成為一名 Web 開發者。
Ryan:是的,在羅切斯特大學,我習慣於處理非常抽象的問題,然而在網站工作是一個非常具體的過程。但是我嘗試著將這個過程變成一套很棒的數學理論,就像我在研究生院接觸到的那樣。我認為這讓我想到了…我認為,我喜歡 Ruby 是因為它極大的改變了網站開發,我認為,在使用 Ruby 時,你可以很好的表達自己的想法。那在當時非常有趣。而且我認為Rails 給人留下了深刻的印象。它提出了新的結構(也可能這不是新的),但是我認為 Rails 推廣了模型檢視控制器(MVC)結構。我對把這兩件事情結合在一起非常感興趣。
Pramod: 是的,建立網站非常有意思。Ruby 是非常棒的工具。接下來,你到德國成了一名 Web 開發的自由職業者,其中的一個專案就是 Node ,而且我認為你在接下來的六到八個月一直在做這項工作。
Ryan:是的,離開南美之後我跟我的女朋友搬到了德國,因為她是德國人,而且她必須重返校園。在那裡我開始參加 Ruby 會議,人們在那裡討論模型檢視控制器(MVC)的新案例。如果我發音正確,其中一個傢伙叫 Chris Neukirchen,他開發了一個 Rack 的專案對 Web 伺服器進行簡單抽象。一個 Web 伺服器變成了一個函式介面,你可以從那裡獲得一個請求,然後返回一個響應。
結合我為 Engineyard 的 Nginx 模組做的一些工作,讓我想到如何…讓我後退一步。在 Nginx 中,一切都是非同步的。因此,當你為它新建一個模組時必須非常小心來保證它是非阻塞的。是的,我想 Chris Neukirchen 的 rack 和 Nginx 使用非阻塞 IO 架構 web 伺服器的方法,讓我開始思考如何能將這兩件事情結合在一起。
Pramod: 現在,你有了結合 Rack 和 Nginx 的想法。你是如何說服自己用未來 6 個月的時間開發可以在伺服器端執行 Javascript 的框架,這能大大提高效能嗎?
Ryan: 一邊是 Rack 的簡單 web伺服器介面,一邊是 Nginx 的非同步部分,我一直在想這兩個部分。然後2008年Chrome 釋出,並且同時釋出了 V8 JavaScript 直譯器。它應該不算是直譯器,它是一個很棒的執行環境。 V8 釋出後,我開始對它進行分析,它看起來迷人而且乾淨,而且很快,突然之間我想到:JavaScript 是單執行緒的,已經實現了非阻塞。
這有點兒諷刺,但在 web 瀏覽器中人們使用 AJAX 請求和事件時已經實現了非阻塞請求。哦,哇!我認為 JavaScript 結合非同步 IO,再結合一些 HTTP伺服器事件,將會變成一件非常酷的事情。我對這個想法感到非常興奮,在接下來的四年裡一直在做這項工作。
Pramod: 是的,JavaScript 與非同步I/O 配合的很好。我相信開發人員都在等待看到一個實現這項功能的框架,我好奇的是,在那段時間裡,你有導師或者能夠相互討論的人嗎?還是隻有你一個人。
Ryan:只有我自己,我有一些提供建議的程式設計師朋友,我的意思是,第一步絕對是我在自己的房間裡完成的。但後來,我搬到了舊金山,在 Joyent 工作,在那裡我遇到很多非常棒的程式設計專家。是的,在那之後許多人給我指導並且為 Node 貢獻點子。
Pramod:很好,與我們分享一下開發 Node 的心路歷程吧,我知道 Node 從 2009 年開始的,開發經歷了很長時間。
Ryan:我覺得至少對於我自己而言,在我的生活中,沒有比喜歡並且有堅信的想法更好的事情了。並且我有時間坐下來開發 Node 。我認為 Node 是一個等待發生但是還沒做到的想法,別人或許能夠做到。但是突然間我相對失業並且有空閒時間,可以不停的工作幾個月,而這正是開發初步產品所需要的。這很棒而且很有趣。
Pramod:非常好,這太奇妙了。你確實做的非常棒。Node 建立在“純非同步”程式設計模型的基礎上,你是怎麼為 Node 想到這個點子的?
Ryan:是的,我認為那是一個非常有趣的問題。現在已經過去好幾年了。從 2012 年或 2013 年開始我沒有再進行 Node 開發了。從這點來看,Node 是一個大專案。因此,是的,當初實現 Node 之後,我到處遊說人們使用 Node。或許我們處理 I/O 的方式有錯,或許我們以非阻塞的方式做所有事情將會解決程式設計過程中遇到的很多問題,比如我們可以完全忘記執行緒,只使用過程抽象和序列化通訊。但是在一個過程中,完全非同步方式可以處理很多很多的請求。那時我堅信這個觀點,但是幾年之後,我認為這可能不是程式設計的最終和全部想法。特別是當 Go 出現的時候。
我認為 Go 很早之前就出現了,但我大約在 2012 年第一次聽說 Go 。他們有一個非常好的執行環境,具有合適的綠色執行緒和易於使用的抽象。我認為阻塞 I/O(引號中的阻塞I/O),由於Go和作業系統的介面都是綠色執行緒,我認為那完全是非阻塞 I/O 。
但是,他們給使用者的介面是阻塞的,我認為這是一個更好的程式設計模型。如果阻塞,我們可以更加輕鬆的考慮大多數情況需要做的工作。你知道,如果有非常多的後續動作,這樣做是很好的:做 A,等待一個響應或者一個錯誤;做 B,等待一個響應,出錯。在 Node 中,這更加困難,因為必須跳轉到另一個函式呼叫中。
Pramod: 是的,我喜歡 Go 的程式設計模型。使用 goroutines 如此簡單有趣,事實上,我們用它來建立分散式應用。
Ryan: 是的,我認為..對於特定型別的應用,比如說,我們要建一個伺服器,我很難想象除了使用 Go 還能使用什麼。意思是說,我認為 Node 的非阻塞程式設計對於沒有執行緒的 JavaScript 非常好用。我認為很多需要跳轉到多個非同步函式來實現的回撥問題,現在已經通過 JavaScript 非同步特性-非同步關鍵字緩解了。
因此,在更新版本的 JavaScript 中,這更容易實現。這就是說,我認為 Node 不是構建大型伺服器網站的最佳系統。我會用 Go 構建大型伺服器網站,說實話,那是我離開 Node 的原因。我意識到:這不是有史以來最好的服務端系統。
是的,我認為 Node 在客戶端大放異彩,可以實現網站開發周邊的一些指令碼,比如打包客戶端 JS 指令碼的 Browserify。你可以實現所有客戶端 JS 的服務端處理。然後可以做小型伺服器……或許很小的開發伺服器,或許是處理實時事務的一些真實伺服器。Node 或許有用,或者說它可以是正確選擇。但是如果要建立一個大規模的中心 DNS 伺服器,我不會選擇 Node。
Pramod:這對全世界所有的開發者來說應該是一個很好的選擇。 為應用選擇合適的工具非常重要。 你完全沒有偏向 Node。 在 2009年柏林的 JsConf 上你介紹了 Node.js。 你會對突然獲得的成功和擁簇感到驚訝嗎?
Ryan:是的,我的意思是,我基本上連續四年都處於驚喜之中。因為它發展的非常快,大家非常喜歡它。
Pramod:然後你加入 Joyant、全職開發 Node 並去了 SF ,對嗎?體驗如何?開發人員喜愛它,而你是這一切的核心。
Ryan:這絕對是我一生中,感覺自己處於會議和其他事情中心的體驗。有一次去日本,人們要求我與他們合影,我意識到…我不知道,我很討厭這種感覺。而且每當我線上上回覆某件事情時,也將收到 100 條答覆。
因此,我感覺自己需要非常小心的選擇用語以及表達自己的想法,因為好像大家都在傾聽,這種感覺很奇怪。而且我不喜歡這種感覺。我的意思是,我是一個程式設計師,我願意寫程式碼,有時也會在沒有仔細考慮的情況下發表個人觀點。所以,我覺得我不是一個…是的,我不太喜歡這種感覺。
Pramod: 推出 Node 時你只有 29 ?30 歲?但是 Node 卻有如此大的影響力。
Ryan:是的,我的意思是,我絕對是個開發新手。
Pramod:好的,Ryan。原來會同時湧現很多伺服器端 JavaScript 專案。Node 並不是唯一一個。你認為Node 的成功源於什麼?
Ryan:是的,有一些人嘗試開發伺服器端的 JavaScript 。我現在甚至不能說出他們的名字,而且我忘記了他們是誰。
事情是這樣的,他們都使用阻塞I/O ,因為沒有執行緒,這與 JavaScript 結構一點兒關係都沒有。使用阻塞I/O 理論上無法處理請求。比如,一次處理一個,這永遠都沒用。基於這個原因,還有我喜歡做這件事,讓我能夠坐下來並且開發執行良好的 HTTP 伺服器。我有一個 demo 可以…我有一個 HTTP伺服器(一個原始 TCP伺服器)。並且我使這些伺服器執行良好,這樣大家可以坐下來不用花費多大力氣就可以建一個網站。
說實話,建立 web 伺服器不是最簡單的事情,我想這些系統中很多是留給社群做的,所以沒有人做。因為沒有什麼可以使用的系統。我認為釋出一個軟體框架(或者任何軟體)時,有一個 demo 可以讓使用者坐下來立即使用非常重要。這就是 Node 所做的事情之一。人們可以下載並直接使用 web 伺服器。
Pramod: 是的,好的 demo、容易下載、安裝和使用,這些會產生很大區別。而且,大家瞭解 JavaScript ,他們可以在任何時刻開始寫程式碼。我開始使用 node 時感覺非常簡單,因為我瞭解 JavaScript。
Ryan:是的,我感覺我們理所當然地認為在語言之間切換非常容易。 我的意思是,即使你知道另外一種語言,但要做到這一點也會非常困難。 而且很多人對 Javascript 非常熟悉。 為他們提供能夠在其他情況下使用的工具,可以激勵人們。 你突然之間發現可以比以前做得更多。
Pramod:是的,在 2012 年 node 已經有了龐大的開發基礎。那麼為什麼你要把它交給 Joyent 的 Isaac Schueter?
Ryan:有許多原因。我最主要的原因在於,那時我已經開發 Node 四年了。我已經實現了自己的願望,我從來不希望 Node 成為一個龐大的 API 。我希望它是個小巧緊湊的核心,人們可以用它構建模組。
還有一些重要的事情,我希望能夠支援關鍵特性。因此很早就新增了擴充套件模組,我們實現了所有的網路庫,HTTP、UDP、TCP,我們可以訪問所有的檔案系統。
然後,一大塊內容(差不多時五個人一年的工作)需要放到 Windows 中並且執行良好。而且我們希望使用 Windows 抽象( IO完成埠)來實現非同步IO 。所以,這需要重寫核心庫,最後做出的是 libuv 庫。
是的,但是在某些時候,所有這些都做完了,我們已經發布 Windows 版本了,而且你知道,它也執行良好。我的意思是,這是我本來打算實現的,我很高興能夠有機會實現。當然,之後會有無數的錯誤需要修正,但是……你看,有足夠多的人蔘與進來。我沒有必要去做這件事情,而且我希望其做些其他事情。再加上 Go 的釋出,我認為 Node 不能夠成為伺服器的終極解決方案。而且,我發表部落格文章時不希望成為關注的中心。
Pramod:很好,是的,有些人不喜歡出名。當你開始開發 Node 的時候,你肯定有一些目標,現在的 Node.js 實現這些目標了嗎?
Ryan:我的意思..成千上萬的人使用 Node (如果不是數百萬人),我認為這肯定超出了我對它的期望,是的,這很酷。
Pramod: Rayan當你完成 Node 的奇妙之旅後,你決定做些什麼呢?
Ryan:Node 之後,我搬到…我離開 Joyent 並且停止參與 Node 專案後,我搬到了紐約。花了一些時間在一些專案上。我有許多專案,你知道那時 Instagram 已經發布了,但是它很新而且看起來很簡單,每個人都在說:哇,它是如此簡單,我也可以開發這樣的專案。我也這樣想。因此,我有了一個社交網路專案;我有一個 C++ 編譯系統專案,還有另一個 HTML 編譯系統專案,與 Browserify 類似,它以一種更聰明方式打包 JavaScript 和 HTML。
是的,我做了一大堆專案,但是沒有一個專案讓我心動。我認為可以推遲其中一些專案,比如我的社交網路專案,我可以在某些時候回頭處理。是的,我開發了一段時間。然後我開始閱讀關於……我開始瞭解卷積網路和如何解決影象分類,這讓我對機器學習很感興趣,
Pramod:你還是 Google Brain 見習專案的成員,給我們講講體驗吧?
Ryan: 是的,我只在山景城呆了一年。 因此,晚了一步,TensorFlow 兩年前釋出了。
與此同時,他們宣佈了這個 Google Brain 見習專案,他們邀請 20 個人參與 Google Brain ,Google Brain 是 Google 的一個機器學習研究實驗室。 人們……我認為這個實驗室的觀點是並不一定要學過機器學習,如果你有一定的數學和程式設計背景,並且對機器學習感興趣,那麼請來這裡並實現這些新想法。 因為機器學習變化很快,而且這裡已經做了大量的工作。
但是現在社群已經把機器學習的範圍縮小到最有用的神經網路演算法了,它可能只需要一些人實現神經網路,而這個新的 ML 框架就是TensorFlow,這將激發一些有趣的想法。 我在那裡花了一年的時間,基本上是編寫模型和模型檔案。 我主要從事影象轉換問題的研究。 所以,你知道,如果你有一些輸入影象,你想預測一些輸出影象。 我覺得這個問題很有趣,讓我舉一些例子。
著色的問題。你可以使用黑白照片作為輸入,嘗試預測輸出照片的顏色。這個問題最酷的地方在於有無限的訓練資料。你可以拍攝任何彩色照片並去飽和,然後它就成了輸入照片,對吧?
機器學習的一個問題是需要大量資料,然而對於這類任務,資料將不再是一個問題。而且,最近出現了大量生成模型的工作(輸出影象的模型),特別是出現了對抗性網路和畫素 CNN,這些模型已經展示了學習自然影象多樣性的能力,就像真正理解真實影象是什麼、什麼不是真實影象、什麼看起來像真實形象。
我的想法是在生成模型中使用這些最新模型,並採取無限的訓練資料,看看能否解決一些影象轉換問題。 所以,我做了一些超解析度的工作,也就是提高低解析度圖片的解析度。 這也是一個影象轉換的問題。 現在我已經完成了兩個著色的專案。
Pramod:很好的解釋,Ryan。是的,我認為 TensorFlow 是處理許多機器學習問題的好平臺。我不太瞭解影象分類、轉換,但我相信這一定很有趣。你還在繼續做 ML 的工作嗎?
Ryan:是的,我現在還在 Google(作為一個軟體工程師)從事這種型別的工作,研究生成模型,並嘗試幫助研發人員建立下一代的生成系統,下一代的生成模型。
Pramod:生成模型與你之前從事的 node 或 web開發工作使用的 JavaScript 差別是如此之大。
Ryan:是的,我想也是。但是我是數學專業,所以我想我有相當不錯的數學基礎。是的,我認為人們喜歡把別人固定到特定領域,我不想這樣做。我不想成為一個 JavaScript 專家,我不想成為一個機器學習專家,我認為探索可能性非常有趣。令人興奮的是,做以前沒做過,並且能夠以某種方式令人受益的事情。
Pramod:很好,是的,機器學習需要好的數學基礎。在你最近一篇關於樂觀虛無主義的部落格中,你說我們有朝一日能夠模仿大腦、開發一個像人類一樣理解和思考的機器,我們離實現這個目標還有多遠?
Ryan:是的,我要對這種說法更謹慎一些…我的意思是,這是我的個人觀點。我們開發的東西遠不及人類的智慧。我的意思是,我們使用的機器學習系統非常簡單,根本不會工作。實際上,我有一篇關於我的見習的文章,我在那篇文章中列舉了開發這些模型的所有困難。我認為不從事這類工作的人們可能會有這樣的想法,你可以採用這類模型然後輸入一些資料,它就能工作了。但事實並非如此,這些模型非常挑剔,而且還沒有被很好的理解,要花費很多個月的時間進行精心調整和試驗,才能得到相似的結果。
所以,我們離它很遠,但是我認為基礎……最近有一些有希望的技術得到了改進,卷積網路似乎起作用了,而且 propagation 似乎也正在起作用。事實上,這些東西都建立在模型基礎上的,這個神經網路模型不像大腦一樣工作,但是以大腦的某種方式激發,這是非常誘人的。我們也有 GPU,我們展示瞭如何在這些方面訓練它和如何通過 GPU 進行分散式訓練。所以,我認為出現了建立更大、更智慧的系統的基礎。而且,我個人認為,我是一個無神論者,我相信我們的大腦中除了化學物質和神經元之外再沒有別的東西了。而且我認為我的意識,我們所有的意識都以某種方式都被編碼到這些神經元之間的相互作用中。所以,我不明白我們為什麼不能通過足夠的研究和工作來模仿這種行為。當然,現在還遠遠沒達到能夠預測需要多久能夠實現的程度。
Pramod:很棒,你已經看到了這一切,Ryan 你認為未來 20 年技術將在哪些領域發展?
Ryan:我對機器學習和它帶來的可能性感到非常興奮。我認為即使在我們實現真正的人工智慧之前,這種技術也非常有用。我的意思是,你使用的任何系統都將從這項技術中受益匪淺,比如佩戴智慧眼鏡將會幫助你。有無數的工業過程可以利用這項技術。比如使用計算機視覺的進行分揀回收的回收中心。我的意思是,將有很多很多系統可以從簡單的機器學習系統中受益。而且我們會不斷看到這些系統適用於不同的流程。所以,我認為這將對科技行業產生重大的影響,對人類都將產生很大的影響。
Pramod:是的,機器學習令人興奮。我在山景城看到自動駕駛汽車時非常興奮。有一天我會坐到後面並把控制完全交給汽車。Ryan,謝謝你帶給我們如此出色的 Node 框架,謝謝你參加這次節目。祝你好運,和你聊天的感覺非常棒。
Ryan:是的,很棒,感謝你邀請我。很高興能夠和大家分享這些。
Pramod:謝謝你。這就是所有內容了,聽眾們。我真的非常喜歡與 Ryan 聊天,他謙虛而且受人尊敬。他早些年在科技領域取得了如此大的成就,這是一個非常鼓舞人心的故事。再見,我們兩週以後會踏上另外一個有趣的旅程,Shukriya。
打賞支援我翻譯更多好文章,謝謝!
打賞譯者
打賞支援我翻譯更多好文章,謝謝!
任選一種支付方式