Node.js 紀錄片心得
2024年4月1日
Node.js 的紀錄片正式公開了
在前幾天 Honeypot 製作的 Node.js 紀錄片正式公開了。一如 Honeypot 過去做的各類技術紀錄片,這個紀錄片也是非常精彩,這邊分享一些從中看到特別有感的地方。
Node.js 創作者 Ryan Dahl
Node.js 的創作者是 Ryan Dahl,他原本在紐約的羅徹斯特大學讀數學博士班,專攻代數拓樸學。在讀博班的過程中,雖然他覺得自己研究的領域很美,但是可應用性很低,他的指導教授會說「說不定某天,某個理論物理學家,會用到這個研究的成果」。於是想要做更有應用性成果的 Ryan 決定從博班休學,跑去南美洲旅遊,然後一邊接案寫網站賺生活費。
在南美旅行時,Ryan 交了一個女友,他當時的女友要回德國的科隆完成碩士學位,於是 Ryan 決定搬去科隆跟女友一起生活。因為在科隆的生活費很便宜,那時 Ryan 有一段時間可以自由探索想做的事情,不用過於擔心經濟問題。
Ryan 說,很慶幸在二十出頭歲時有那段時光,可以自由自在地思考程式相關的問題 (看到這段想到程式語言 Ruby 的創作者松本行弘,也曾說過類似的話。他說當年在開發 Ruby 時,工作上特別閒;當過於忙碌時,很難去創造新東西)。
實現非同步 I/O (async I/O)
當時偶爾接案寫網站的 Ryan,常覺得網站速度,慢導致網站使用體驗不好。在那時的時代背景下,I/O 操作都是同步操作,換句話說在一個操作完成前,會擋住其他操作進行。
於是 Ryan 就想,有沒有可能變成非同步 I/O (async I/O),這樣即使有一個很耗時的複雜運算,也不會擋住其他運算,讓整體速度變快? 當時的時代背景剛好 Google Chrome 推出了全新的 JavaScript 引擎 V8;雖然 V8 是被設計來用在 Chrome 瀏覽器上,但 Ryan 在想 V8 也完全可以用在伺服器端,來實現非同步 I/O (假如有準備過 JavaScript 面試的人,讀到這大概會想到經典面試題 Event Loop,沒錯,Node.js 就是透過 Event Loop 來實現這個想法的)。
第一版 Node.js
有這想法後,Ryan 開始實作,並在科隆完成了第一版的 Node.js。事實上,Ryan 會選擇 JavaScript 來實作他的非同步 I/O 想法,不是因為他獨愛 JavaScript,而是時代脈絡下,JavaScript 是最適合的,這主要有幾個原因,包含
- JavaScript 有廣大的社群,因為基本上世界絕大多數的前端都是 JavaScript 寫的
- 當時許多 JavaScript 引擎正相繼推出,其中包含上面提到 Google 的 V8
- 當時 JavaScript 還沒有太多歷史包袱,Ryan 在嘗試 JavaScript 前也試過用 Python、Lua 等不同語言來實現,但因為其他語言已有的模式,會讓導入一個新的模式相對困難
Isaac Schlueter
其實那時候想把 JavaScript 帶到伺服器端的不只有 Ryan Dahl,Isaac Schlueter 正是其中的一位,當年在 Yahoo 工作時,他覺得前端用 JavaScript 寫,後端用 PHP 寫,要常常轉換思考方式很煩;同時他認為,JavaScript 是程式語言,為什麼不能也在伺服器端寫 JavaScript 呢?
那時 Isaac 試過不同的方式,也試過 Node.js 的最初版本,但覺得沒看頭;只是隔了段時間後,有朋友再次推坑 Isaac 試試 Node.js。再次試了後 Issac 覺得 Node.js 就是他心中的理想解決方案,於是也投入貢獻 (對於新技術,真的推薦定時要回去試用,可能本來覺得不好用的,隔一陣子後會被優化地很好)。
如果你覺得 Isaac Schlueter 這名字很眼熟,你沒看錯,他就是後來開發出 npm 的人 (npm 是 node package manager 簡稱,是用來做 node 的套件依賴管理),現在全世界每個月有超過百億個套件,是透過 npm 來下載。
Node.js 與 Joyent
Node.js 是個開源的專案,換句話說即使有很多人用,Ryan Dahl 也沒有從中賺到錢。然而,要能讓一個開源專案走的長遠,需要有人長期持續的投入,需要有一個永續的商業模式。而當時有間叫 Joyent 的雲端服務公司,決定贊助 Ryan 來開發 Node.js,讓 Node.js 能被持續維護與更新。
在 Node.js. 越長越大後,Joyent 向 Ryan 提議買下 Node.js 的商標與管理權,藉此來透過 Node.js 宣傳自己的服務。這舉動讓 Node.js 的社群提出許多質疑;然而因為 Node.js 是 MIT 授權條款,所以雖然商標被 Joyen 。買下,但軟體本身是開源的,這點讓社群暫時被安撫下來。
在 Joyent 買下 Node.js 後,Node.js 迎來一個新的里程碑,那就是支援 Windows 作業系統。與多數的開源軟體一樣,因為 Windows 作業系統與 Linux 不同,所以要做到兼容 Windows,通常要額外心力。與此同時,如果能支援 Windows 系統,意味著能接觸到廣大的 Windows 使用者;而 Node.js 支援 Windows 也帶來另一波極大量的使用人數增長。
隨著 Node.js 支援 Windows,以及版本逐漸穩定後,有點燃燒殆盡的 Ryan 決定把 Node.js 交棒給 Issac。後來因為 Issac 要全心做 npm,所以 Joyent 找來自家員工 TJ Fontaine 當 Node.js 的負責人,在交棒到 TJ 手上後,Node.js 迎來一個大危機。
Node.js 的危機
當時因為社群許多貢獻者,與 Joyent 對於 Node.js 的發展路徑有不同想法,社群中開始醞釀一個 fork 的版本,而最終 io.js 這個 fork 的版本被推出,原本 Node.js 的貢獻者,轉向去貢獻 io.js。
當時的衝突來自於,Joyent 從公司的角度認為 Node.js 是他們的資產,所以對於 Node.js 有管理權是有理有據的;然而從貢獻者的角度,他們想要的是為社群貢獻,而不是為 Joyent 這間公司做免費的工。
成立基金會
最後雙方的和解,有賴於當時協調者的智慧,讓 Joyent 意識到 Joyent 希望透過 Node.js 壯大,必不然需要對 Node.js 有掌控,讓開源社群的力量協助推進,一樣能達到 Joyent 期望的目標。於是後來 Node.js 成立基金會,讓基金會的治理架構來負責 Node.js 的推進;而這也是社群貢獻者期望的方向,所以後來把原本的 io.js 合併回 Node.js,讓 Node.js 。持續被開發到今天。
看到這段想到近期 Redis 的事件,有非常相似的情境。同樣是最初的創作者,因為對於項目本身投入到燃燒殆盡,於是把商標賣給營利企業,而後營利企業跟開源社群有衝突。遺憾的是 Redis 沒能跟社群有良好一致的方向;從這點來看,很慶幸當初 Joyent 願意放手讓 Node.js 成立基金會,也讓後續社群能持續共現在這個開源專案中。
回顧整個 Node.js 的紀錄片,可以看到 Node.js 的成功,真的需要一整個社群的力量。雖然最開始 Ryan Dahl 起頭很重要,但後續 Node.js 能發展到今天幾乎全世界的網站都有其身影,社群中其他貢獻者也不可或缺。