[本期主題] Node.js 紀錄片心得
上週分享了 Node.js 的網站改版,在前幾天 Honeypot 製作的 Node.js 紀錄片正式公開了。一如 Honeypot 過去做的各類技術紀錄片,這個紀錄片也是非常精彩 (連結)。這期雙週報分享一些從中看到特別有感的地方。
Node.js 的創作者是 Ryan Dahl,他原本在紐約的羅徹斯特大學讀數學博士班,專攻代數拓樸學。在讀博班的過程中,雖然他覺得自己研究的領域很美,但是可應用性很低,他的指導教授會說「說不定某天,某個理論物理學家,會用到這個研究的成果」。於是想要做更有應用性成果的 Ryan 決定從博班休學,跑去南美洲旅遊,然後一邊接案寫網站賺生活費。
在南美旅行時,Ryan 交了一個女友,他當時的女友要回德國的科隆完成碩士學位,於是 Ryan 決定搬去科隆跟女友一起生活。因為在科隆的生活費很便宜,那時 Ryan 有一段時間可以自由探索想做的事情,不用過於擔心經濟問題。
Ryan 說,很慶幸在二十出頭歲時有那段時光,可以自由自在地思考程式相關的問題 (看到這段想到程式語言 Ruby 的創作者松本行弘,也曾說過類似的話。他說當年在開發 Ruby 時,工作上特別閒;當過於忙碌時,很難去創造新東西)。
當時偶爾接案寫網站的 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 來實現這個想法的)。
有這想法後,Ryan 開始實作,並在科隆完成了第一版的 Node.js。事實上,Ryan 會選擇 JavaScript 來實作他的非同步 I/O 想法,不是因為他獨愛 JavaScript,而是時代脈絡下,JavaScript 是最適合的,這主要有幾個原因,包含
JavaScript 有廣大的社群,因為基本上世界絕大多數的前端都是 JavaScript 寫的
當時許多 JavaScript 引擎正相繼推出,其中包含上面提到 Google 的 V8
當時 JavaScript 還沒有太多歷史包袱,Ryan 在嘗試 JavaScript 前也試過用 Python、Lua 等不同語言來實現,但因為其他語言已有的模式,會讓導入一個新的模式相對困難
其實那時候想把 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 是個開源的專案,換句話說即使有很多人用,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 迎來一個大危機。
當時因為社群許多貢獻者,與 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 能發展到今天幾乎全世界的網站都有其身影,社群中其他貢獻者也不可或缺。
[ExplainThis 更新]
在往下讀本期推薦之前,想與大家分享 ExplainThis 最近的更新。過去我們經常收到讀者詢問,能不能在網站中有最新文章、所有文章的專區。最近我們總算有空檔,在週末實作出這個頁面 (連結)。歡迎大家時不時來逛 ExplainThis 的網站,看看我們新增的文章~
另外,與雙週報的新讀者分享 ExplainThis 籌劃的 E+ 成長計畫。最近我們舉辦了程式手寫題打卡小群的 office hours,有參與的讀者在社群分享過程中收穫,非常推薦大家一讀 (連結),也有讀者因此開始進一步思考,開發時使用到的套件底層都是透過什麼方式實作 (連結)。
E+ 成長計畫的詳細介紹,可以在這個連結看到 https://www.explainthis.io/zh-hant/e-plus
[本期推薦]
本期談到了 Node.js ,就不能不說 Node.js 最近網站大改版,新的網站設計有煥然一新的感覺 (連結)。Node.js 也在官方部落格分享了改版的心路歷程,推薦一讀 (連結)
Node.js 的創作者 Ryan Dahl 幾年前開始開發的新 JavaScript 執行環境 Deno 有一個搭配的框架 Fresh,最近正在醞釀 2.0 版本,有興趣的人可以看他們最近提到將要升級的內容 (連結)
除了 Deno 與 Bun,最近社群有一定討論度的 JavaScript 執行環境是 winterJS,號稱有更好的效能 (連結)
Redis 近期公告調整了授權相關條款,白話來說 Redis 從此不再是純開源,這讓開源社群感到被背叛,進而引起廣泛討論 (連結)
中間件 (middleware) 是在做全端開發時,很常會用到的元件之一,這篇《Stuck in the Middle with You: An intro to Middleware》,很簡要的介紹了中間件,如果還不熟的人,可以一讀 (連結)
想要入門資料庫的讀者,有兩堂最推薦的免費資料庫入門課程,分別是哈佛大學的電腦科學入門課程的 SQL 專課,以及 CMU 的免費線上課程 Intro to Database Systems (連結)
近期開源社群討論度極高的一個專案,是由 Obsidian 開源的 JSON Canvas,這是一個設計非常巧妙的資料結構,讓你可以輕鬆完成巢狀的 canvas,不論是想開發筆記軟體,或者是心智圖相關的軟體,這個資料結構都能派上用場 (連結)
在開源社群很活躍的 antfu 寫了一篇維持 mental health 的文章。感覺不只是做開源,一般軟體工程師的職涯也有相似的問題。大家在衝刺的同時,要有良好的配速與休息,這樣才能用健康的方式走的長久 (連結)
Gmail 迎來 20 週年紀念,先前我們有總結 Gmail 創作者 Paul Buchheit 提出的 6 個思維模式,非常推薦大家可以再讀一次 (連結)
Vercel 的產品副總 Leet Robinson 先前擔任 Vercel 的 DevRel 總監,最近他寫了一篇《On Developer Marketing》對於寫技術類內容的人,很推薦一讀 (連結)
不小心上報了 🫣