他一怒之下刪除11行程式碼 互聯網遭殃

他一怒之下刪除11行程式碼 互聯網遭殃
Photo Credit: Ian Lishman / Juice Images / Corbis / 達志影像

我們想讓你知道的是

刪除短短11行程式碼,竟然會令Facebook、Reddit、Netflix及Spotify等大型網站出現錯誤?早前互聯網的一次意外,揭露了不少網站的弱點。

現時每個網站都是一個龐大架構,技術人員建站時不可能獨力寫出全部程式碼,通常會使用其他人寫好的套件,而這些套件又很可能用到另一些人的套件。不少程式員都會在網絡上開放源碼,讓世界各地的程式員能夠使用其成果,互相協助。

一層又一層的程式碼,令不少開發人員容易忽略其網站依賴一些不由他們控制的套件,一旦這些套件發生問題,可能會造成骨牌效應,使網站出錯。近日一名程式員就因為刪去11行程式碼,使數以千計的開發人員、管理人員從記錄中發現錯誤訊息。

共享小工具

這場網絡小意外的成因之一,是JavaScript模組庫npm。npm讓使用程式語言JavaScript的開發人員,能夠輕鬆分享他們所寫的程式碼,並再日後重用。這些程式碼多數只為解決特定問題,像一些方便的小工具般,當有人「發明」了後所有人都能直接使用,通常稱為包(package)或模組(module)。

因此npm既是模組管理系統,也是一個模組庫,負責管理模組庫的是npm公司,創辦人之一是npm的創造者Isaac Z. Schlueter。npm公司容許任何人以開放源碼方式,把他們的模組上載至npm的公開庫中,讓其他人自由使用。

名字的爭拗

造成是次意外的主角、來自加州奧克蘭的程式員Azer Koçulu,原本非常擁抱及支持npm,不但在npm上發佈了273個模組,更會大力宣揚npm。他早前開始設計一件小工具,並把這項計劃以“kik”之名註冊到npm。然而開發流動通訊軟件Kik Messenger的公司Kik Interactive卻認為,Koçulu佔用了該公司的名字。

3月11日,Kik公司聘請的專利代理人Bob Stratton傳電郵給Koçulu,指該公司將會發佈一個重要的軟件包,名字同樣叫做“Kik”,希望他能夠把其計劃易名,以免用戶混淆兩者。Koçulu迅速回絕︰「抱歉,我正建立的開源計劃使用這個名字。」

Stratton表示他們無意冒犯,但那是個註冊商標。然後態度漸趨強硬,語帶威脅地指如果Koçulu堅持使用該名字,他們的律師會以上門、取下其帳戶等手段來保護其商標。最後Stratton希望雙方能夠妥協,不用律師來解決問題。

Koçulu回覆︰「哈哈,你確實冒犯了我。所以,(略去),別再回覆。」但Stratton再一次懇求Koçulu改名,因此他開出3萬美元的條件。

撤出npm

這個時候,Kik及Stratton向npm的支援團隊求助。Schlueter嘗試以溝通解決爭拗不果,最終npm認為一個有足夠知識的用家輸入「npm install kik」時,會預期安裝的東西跟Kik(通訊軟件)有關,因此根據其政策決定把模組的名字給予Kik公司。

Koçulu不接受這個決定。他對Schleuter說︰「我認識你多年,不曾想像你會站在企業專利律師的一方,來威脅開放源碼計劃的貢獻者。」失望的Koçulu更要求npm刪除其帳戶,以及他上載的所有模組︰「我不願再成為npm的一份子,如果你不刪除的話,讓我知道如何刪除,我應該有權刪除自己在npm的所有東西。」

Koçulu在網誌上解釋,事件令他意識到npm屬於私人領域,在這領域中企業比人民更有權力。但他參與開放源碼的計劃是因為他相信「權力歸於人民」,故決定刪除模組。Schleuter給了他一個指令,可以一次過把他在npm的所有東西刪除。他輸入指令,把在npm上註冊的273個模組悉數刪除——雖然有部份仍可在GitHub上找到。

重要的11行

在刪除模組之前,Koçulu未有警告其他使用者——特別是那些用上其模組的開發人員。在那273個模組當中,有一個稱為left-pad,只有11行程式碼︰

module.exports = leftpad;
function leftpad (str, len, ch) {
 str = String(str);
 var i = -1;
 if (!ch && ch !== 0) ch = ' ';
 len = len - str.length;
 while (++i < len) {
  str = ch + str;
 }
 return str;
}

這個模組的工作非常簡單︰把一個字串的開頭補上字符,使其長度符合要求。假如程式員希望所有字串都是5個字元,不夠長的話都用0補上,使用left-pad就能把「369」變成「00369」。

如此簡單的left-pad很受歡迎——根據npm統計數據,在過去一個月有超過200萬次下載。很多開發人員也許未曾聽過left-pad,但在不經意的情況下用到這個模組——可能是他們使用的模組用到left-pad,可能是他們使用的模組所使用的模組……如此類推。

一子錯,滿盤皆落索

當left-pad在3月23日上午5時30分(香港、台灣時間)於npm模組庫上消失後,npm技術團隊觀察到每分鐘有數以百計的故障訊息。其中一個受影響的大型軟件包是JavaScript編譯器Babel︰Babel用上一個稱為“line-numbers”的模組,而line-numbers使用到left-pad。Facebook、Netflix、Reddit及Spotify等都使用Babel來優化其程式碼,因此也受到left-pad的消失所影響。

不足10分鐘內,程式員Cameron Westland嘗試解決問題,他發佈了功能相同的模組,並命名為“left-pad”——因為Koçulu已刪除他的模組,Westland可使用相同名字,而且Koçulu原本的程式碼以開源方式發佈,任何人均可自由使用。