Node.js創造者,Ryan Dahl專訪
Ryan Dahl是谷歌大腦的軟體工程師,並且是Node.js的創造者。目前,他正在致力於深度學習研究項目,他研究方向的是圖像變換,包括彩色化和超解析度。他參與了多個開源項目包括HTTP解析器和libuv。
Pramod: 告訴我們你在接觸技術之前的經歷吧?
Ryan: 我在聖地亞哥長大,我媽媽在我六歲的時候買了一台蘋果2C,所以我很早就有機會接觸電腦了,順便說一下我36歲了,當互聯網出來的時候,我已經長大了。我在聖地亞哥的社區學院讀大學,然後去了加州大學聖地亞哥分校,我在那裡學習了數學。然後,我去了羅切斯特大學的數學研究生院。在那裡,我研究了代數拓撲學,它是一種非常抽象的學科,我發現它很漂亮,但幾年後我厭倦了它,因為它不太適用於現實生活。這是一個博士項目,一旦我意識到我不想做一輩子的數學家,我就退出項目,買了一張去南美洲的單程票。我在那裡呆了一年,處於飢餓的學生模式中,我和Eric找到了一份工作, 使用Ruby on Rails為一個滑雪板公司做網站, 這就是我的編程生涯的起點。
Pramod: 放棄博士學位,到南美洲旅行,做網站開發,這都是一種經歷。
Ryan: 研究生院的經歷,讓我擅長處理非常抽象的問題,但網站開發工作是一個非常具體的過程,但我真的想把它變成一個美麗的數學理論,就像我在研究生院經歷的那樣。我想這讓我開始思考,我真的很喜歡Ruby的發展,你可以使用Ruby更清楚地表達你的想法。我認為Rails推廣了MVC的結構,它給出了這個新的結構,可能不是完全新的,這兩件事結合在一起,對我來說真的很有趣。
Pramod: 構建Web應用程序非常有趣,Ruby是個完美的工具,接下來你繼續在德國做一名自由網站開發者。你所從事的項目之一是Node,你在德國時接下來的六到八個月里會一直為之努力嗎?
Ruby: 在南美洲之後,我和我的女朋友搬到了德國,因為她是德國人,不得不回大學。我開始去Ruby會議,在那裡人們談論這個MVC的新範例。有一個人叫Chris Neukirchen,他開發了一個叫做Rack的項目,它是Web伺服器的簡化抽象,它真的把Web伺服器變成了一個單一的函數介面,在那裡你得到一個請求,然後返回一個響應。結合我正在為Engineyard項目開發的Nginx模塊的表現,我開始思考了。在Nginx上一切都是非同步的,所以當你為它建立一個模塊時,你必須非常小心以避免阻塞。結合Chris Neukirchen的Rack和Nginx Web伺服器非阻塞IO結構,使我開始思考如何將這兩件事情結合起來。
Pramod: 現在你有一點關於Nginx和Rack想法,你是如何說服自己進行「好吧,我將花我接下來的6個月構建框架,使伺服器端可以運行JavaScript,這可能會大大提高性能」這個想法的。
Ryan: 這兩件簡化Web伺服器的介面,就是Rack和Nginx的非同步。然後Chrome在2008年12月發布了,還有就是V8 JavaScript解釋器,我不應該說解釋器,應該是實時編譯運行。所以當V8引擎出來時,我開始用它,它看起來非常有趣、乾淨、快速,突然我想到:哦!JavaScript實際上是單線程的,每個人都在做非阻塞。但就像在Web瀏覽器中,人們在做Ajax請求時已經在做非阻塞請求。我認為JavaScript加非同步IO加上一些HTTP伺服器的東西實際上是一件非常酷的事情,我對這個想法非常興奮,以至於我在接下來的四年里一直在不停地為之工作。
Pramod: JavaScript和非同步I/O真的很好。我相信開發人員正等待看到一個框架。只是好奇,在這段時間裡,有沒有導師或者和任何人商量過?還是只是你自己?
Ryan: 基本上就是我。我有一些編程朋友,他們給了我建議,我的意思是,它的第一個位置真的只有我。但後來,我搬到洛杉磯加入Joyent工作,和很好的編程人員在一起工作,在這之後很多人的想法構成了如今的Node。
Pramod: 給我我們講述一下Node開發的經過吧,自從你在2009點創建Node以來,已經過去很長時間了。
Ryan: 至少對我自己來說,在我的生活中,沒有比為自己堅信的目標而努力更偉大的時刻了,我有時間坐下來好好地工作。我認為Node是一個等著產生的想法,如果我沒有這個想法,別人也會有。但碰巧的是,我相對失業,有一些空閑時間,可以連續工作幾個月,這就是我可以創造它的一些必要條件吧。
Pramod: 你做得很好。Node是建立在「純粹的非同步」編程模型的思想,這個想法是如何產生的?
Ryan: 我覺得這是一個非常有趣的問題。到目前為止,我已經有好幾年了沒有在Node上工作過,比如2012、2013年。Node是一個大項目,當它第一次出現的時候,我四處走了一圈,做了一系列的談話,試圖讓人們相信也許我們正在做I/O錯誤,如果我們以一種非阻塞的方式完成所有事情,那麼我們就可以解決很多編程上的困難。比如:也許我們可以完全忘記進程,只使用線程抽象和序列化通信。在單個線程中,我們可以完全非同步地處理許多請求。當時我堅信這一想法,但在過去的幾年裡,我認為這可能不是編程的最終全部想法。當Go語言出現後,我認為Go已經出現好長時間了,我第一次聽說Go是2012左右,他們有一個很好的運行方式,有獨有的綠色進程並且非常容易使用的抽象,我開始認為是「阻塞I/O」,因為它都是在Go和操作系統之間的介面的綠色線程。我認為它實際上是非阻塞I/O,但是他們向用戶提供的介面是阻塞的,我認為這是一個更好的編程模型,如果它阻塞的話,你可以在很多action下仔細想想你在做什麼。你知道,如果你有一系列的actions,可以這樣理解:做A時,等待一個響應,也許拋出異常,做B時,等待響應,拋出異常。但在Node中,這是比較困難的,因為你必須跳轉到另一個函數調用中。
Pramod: 我喜歡Go的編程模型。用Goroutines是如此簡單和有趣。事實上,我們正在使用它來構建分散式應用程序。
Ryan: 對於某一類應用程序來說,假如你正在構建一個伺服器,Go將是首選項。如果在你不需要多線程時,我認為Node的非阻塞模式真的很好,很多回調函數的問題,通過async/await得到了解決。我認為Node不是構建大型web伺服器的最佳選擇,我肯定會用Go。老實說,這基本上就是我離開Node的原因。人們意識到:哦,事實上,這不是最好的伺服器端系統。我覺得Node真的發光點是用在客戶端。例如:一些小伺服器或小開發伺服器的實時流量服務,Node是正確選擇。但是如果構建一個大規模分散式DNS伺服器,我不會選擇Node的。
Pramod: 你一點也不偏袒Node,2009年你在柏林JSCONF介紹Node時,你對突然獲得的成功和吸引力感到驚訝嗎?
Ryan: 我基本上連續四年感到驚訝。因為它發展得很快,人們非常喜歡它。
Pramod: 在你加入joyant全職開發Node時,那段經歷怎麼樣?開發人員喜歡它,而你就是它的中心。
Ryan: 當然,這是我生命中一次重要的經歷,我覺得在這一切的中心,例如會議和諸如此類的東西。有一次我去了日本,人們要求和我合影,我覺得有點奇怪。每當我在網上發表評論時,我就會得到很多評論。我想大約在那個時候,我發現我必須非常謹慎地選擇自己的言辭並注意自己的表現,因為人們似乎在認真傾聽,這是很奇怪的。我不喜歡這樣,我的意思是,我是一個程序員,我想寫代碼,分享我的意見,而不是太仔細地考慮它是不是合適。
Pramod: 其實有許多伺服器端JavaScript項目,Node不是唯一的一個,你認為Node的成功是什麼原因?
Ryan: 有幾個人想讓伺服器端運行javascript,我甚至不能再列舉它們了,我完全忘了它們是什麼。但是他們都做阻塞I/O,這真的不合拍JavaScript的特點。因為沒有多進程,如果你正在做阻塞I/O,你實際上不能處理請求,你一次只做一件,那是永遠不會成功的。而我喜歡讓HTTP伺服器工作得很好。所以,我有一個demo,一個HTTP伺服器,然後是一個原始TCP伺服器,我讓這些東西工作得很好,讓人們可以坐下來,建立一個網站,而不會經歷太多的麻煩。坦白地說,構建一個Web伺服器不是容易的事情,我想很多這樣的系統留給社區去構建,但是沒有人做。我認為有一點很重要,那就是當你發布一個軟體框架,或者任何種類的軟體時,你需要你有一個demo,可以讓人們立即使用。這是Node所做的事情之一,人們下載後可以立刻使用的Web伺服器。
Pramod: 如果人們可以很容易的下載、安裝和使用它將會產生很大的差異。而且,人們了解JavaScript,他們可以很快就開始編碼。
Ryan: 我們理所當然地認為在語言之間切換是多麼容易,即使你知道另一種語言,某種程度上說,這也是相當困難的。有很多人非常熟悉JavaScript,而且這些工具能夠在其他環境中使用,突然你能做得比你以前多得多,這大大激發了開發者們的興趣。
Pramod: 在2012年,Node已經有一個巨大的開發者基礎,你為什麼離開,把韁繩交給Joyent的Isaac Schlueter呢?
Ryan: 我已經在Node上工作了四年,並且已經達到了我想要的地步。我從不希望Node是一個非常龐大的API。我希望它是一種小型的、緊湊的、核心的,然後人們可以在上面構建模塊。還有一些關鍵的事情,我想支持關鍵的特性,有許多擴展模塊是在早期添加的,所有的網路庫HTTP、UDP、TCP,我們可以訪問所有的文件系統。然後有一大塊工作,這可能是五個人一年的工作,把它正確的移植到windows上。我們希望使用Windows抽象來進行非同步IO,就需要重寫核心庫,這樣做的結果是libuv庫產生了。但在某些時候,所有這些都完成了,我們已經在Windows上發布了,這就是我想創造的,我很高興我有機會繼續貫徹下去。當然,在我餘下的生活中,有無數的缺陷需要修復,有足夠多的人參與,因此我不需要這樣做,我想去做其他事情。再加上Go出現的事實,我並沒有看到Node是伺服器的最終解決方案。還有一點是不想成為關注的焦點,即使是我的博客。
Pramod: 在你和Node的精彩旅程之後,你決定做什麼?
Ryan: 在Node之後,我離開Joyent並退出Node項目後,我搬到了紐約,並花了一些時間去完成自己的項目。所以,我有很多項目。在當時,Instagram已經出來了,這是新的,它似乎很簡單,每個人都在說:哇,那很簡單,我可以做出來。我不禁想到了同樣的事情。所以,我有一個社交網路,一個C++構建系統項目,我還有一個HTML構建系統項目,以一個聰明的方式打包你的JavaScript和HTML。我有一堆的項目,在我的印象里沒有一個成功的。雖然我認為它們其中一些目前仍在次要位置,像我的社交網路項目,我會在某個時候回來。我做了一會兒,然後我開始閱讀卷積網路以及圖像分類是如何解決的,這讓我對機器學習非常感興趣。
Pramod: 你也是谷歌大腦駐留計劃的一部分。 這樣的經歷怎麼樣?
Ryan: 使得,我剛剛在山景城度過了一年。回過頭來,TensorFlow已經在兩年前發布了。與此同時,他們宣布了谷歌大腦駐留計劃,並邀請了20個人來到谷歌機器學習研究實驗室。這些人並不一定是真正學習機器學習的人,而是在數學和程序設計方面有一些背景,並且對機器學習感興趣的人,他們喜歡這些新想法。因為機器學習正在快速變化,而且還有大量的工作已經完成,但現在社區在神經網路中已經有所縮小,成為機器學習中最有用的演算法,也許只是引入了一堆的人,只是嘗試這個新的ML框架(TensorFlow),但是這將產生一些有趣的想法。我花了一年的時間,基本上編寫了模型,並寫了關於這些模型的論文。我主要從事圖像轉換問題,如果你有一些輸入圖像,你想預測一些輸出圖像。我發現這個問題真的很有趣,例如著色的問題,您可以將黑白照片作為輸入,您可以嘗試將照片的顏色預測為輸出。關於這個問題的很酷的是有無限的訓練數據,您可以拍攝任何彩色照片並使其飽和,然後這是你的輸入圖像了。機器學習的一個問題是你需要大量的數據,並且通過這些任務,這不是大問題。近來在生成模型方面已經有做了很多工作,也就是輸出圖像的模型。特別是生成性對抗網路和像素卷積網路,證明了它有能力學習自然圖像的多樣性,就像真正了解什麼是真實圖像,什麼不是真實圖像,什麼看起來像一個真實的形象。我的想法是把這個最近的工作應用在生成模型中,並採取這個無限的訓練數據,看看是否可以做一些圖像轉換問題。我做了一些超解析度的工作,將一個低解析度的圖像,提高解析度,這也是圖像轉換問題。現在我已經完成了兩個關於彩色化的項目。
Pramod: 我已經讀到了TensorFlow已經成為許多機器學習問題的一個很好的平台。圖像分類,轉換,我真的不太明白,但我相信它很有趣。你還在繼續你的工作嗎?
Ryan: 是的,所以我現在仍然在谷歌,作為一個軟體工程師,處理同樣的問題,研究生成模型,並試圖幫助研究人員建立下一代系統,下一代模型。
Pramod: 它與JavaScript、Web或Web開發工作有很大的不同。
Ryan: 是的,我開始學的數學,所以我有相當不錯的數學功底。我認為人們喜歡讓別人進入某些領域,我真的不想那樣做。我不想成為一個JavaScript開發者,我也不想成為一個機器學習開發者。人們探索某些東西是很有趣的,令人興奮的是建立一些以前從未做過的新事物,它可能在某種程度上造福人類。
Pramod: 是的,很高興知道機器學習需要良好的數學背景。在最近的一篇關於樂觀虛無主義的博客中,你說我們終有一天會模仿大腦,建立一個像人類一樣理解和思考的機器。我們實現這一目標有多遠?
Ryan: 關於這種預言我必須小心一點。人工智慧離人類智力還差得遠。我的意思是,我們使用的機器學習系統非常簡單,基本上根本不起作用。我有一篇博客,其中列舉了開發這些模型所遇到的所有困難。我認為那些不在這個領域工作的人有這樣的想法:你可以接受這個模型並通過它運算一些數據,它就可以工作了。但事實並非如此,這些東西都是非常挑剔的並且不是很好理解,即使是最溫和的結果也需要很多很多個月的精心調整和實驗。最近確實出現了一些有希望的技術,也就是說卷積網路似乎起作用了,而且傳播似乎起作用了。事實上,這些東西是建立在一個模型的基礎上的,這種神經網路模型不是真正的大腦,但是它是由大腦激發出來的,是非常誘人的。我們也有GPU,我們展示了如何在這些GPU上進行訓練,並在一定程度上分配GPU上的訓練。我認為這種建立更大,更智能的系統的基礎正在發生。而個人而言,我是一個無神論者,一些化學物質和神經元構成了我的大腦,這些神經元相互作用。我認為我的意識,我們所有的意識都被編碼,神經元之間的相互作用。我不明白為什麼我們有一天能夠在這個領域有足夠的研究和工作,卻不能夠效仿這種行為,這真的是太遠了,很難預測會有多長時間。
Pramod: 你想在未來20年看到什麼科技?
Ryan: 我對機器學習及其帶來的可能性感到非常興奮。我甚至認為,在我們接觸到真正的人工智慧之前,這種技術就有很多應用層面,基本上任何系統從這項技術中都會受益。就拿現在不可計數的工業過程來說,例如:回收中心可用計算機視覺分類回收,而不是像現在這樣。我們將越來越多地看到這些系統被應用到不同的過程中,我認為這將極大地影響科技,而且全人類都將大大受益。
點擊展開全文
※澄清對AMP的十個誤解
※Sass和SCSS之間的不同之處是什麼?
※七夕不撒狗糧的程序員情感故事
※陸奇最新演講:如何成為一個優秀的工程師
TAG:京程一燈 |