網路的發展如何改變了程式語言的進化方向?

Facebook 的工程師 Louis Brandy 和他的同事們在過去兩年裡重新打造了垃圾訊息清除系統,這個系統可以從全球最大的社群媒體中移除掉惡意的、有攻擊性的或是其他不受歡迎的訊息。這可不是一個小工程——全球有超過15 億用戶在 Facebook 上發布訊息——為了搞定這個問題,路易斯和團隊做出了一個不尋常的選擇:他們使用了一種被稱為 Haskell 的程式語言。
評論
評論

原文來自 Wired,虎嗅編譯。

計算機程式語言未來的發展是怎樣的?這是一個充滿爭議的永恆話題。

Facebook 的工程師 Louis Brandy 和他的同事們在過去兩年裡重新打造了垃圾訊息清除系統,這個系統可以從全球最大的社群媒體中移除掉惡意的、有攻擊性的或是其他不受歡迎的訊息。這可不是一個小工程——全球有超過 15 億用戶在 Facebook 上發布訊息——為了搞定這個問題, Louis 和團隊做出了一個不尋常的選擇:他們使用了一種被稱為 Haskell 的程式語言。

Haskell

90 年代初,由學術人員組成的某個委員會發明了 Haskell,將其作為一種語言設計上的試驗,許多年之後, Haskell 仍舊處在主流程式語言之外的狀態。在網際網路最大的軟體程式碼平台之一 GitHub 上面, Haskell 排名在最受歡迎編程語言的第 23 位。即便如此, Facebook 仍舊選擇這種語言用來設計其龐大複雜的反垃圾訊息系統。筆者在 Facebook 位於加州 Menlo Park 的總部採訪了 Louis ,試圖理解這個技術選擇從整體來看對於程式語言的發展意味著什麼。

可能這個問題看上去很幼稚,但是針對一種程式語言某些優點優於另一種語言的直接討論,都不可避免地會讓人感覺有那麼一點點尖刻,尤其是還會涉及到一個更廣泛的軟體開發者社區。工程師決定使用某個程式語言基於一系列的技術原因,但是同樣也有個人因素在內——兩種原因又互相聯

繫。如果筆者的採訪對象過於稱讚 Haskell ——或是過分批評——那麼有許多人會叫喊這不公平。他們很可能無論如何都會這麼做。

Louis 是這麼說的,他認為 Haskell 非常適合處理 Facebook 上的垃圾訊息,因為這種語言在同時處理許多不同的任務時,非常高效——而且能夠讓工程師可以隨時對這些計算任務進行編寫。 Facebook 這個社群網路實在是太龐大了,垃圾訊息的發送者變幻方法的速度很快, Facebook 的反垃圾引擎需要一邊設計完善,一邊能夠正常運作,而且要快。「延遲是最關鍵的,我們希望能夠馬上阻止垃圾訊息的攻擊,」他說道,「我們希望在最短的時間裡做更多的檢查, Haskell 在這一點上很有幫助。」

前瞻

如果我們認為 Facebook 、 Google 和 Amazon 的發展方向代表了整個網路行業的話——也就是說,隨著網際網路的不斷發展,許多其他線上服務也將會遇到這幾家公司現在遇到的問題—— Facebook 的 Haskell 無疑為整個程式開發領域指出了一個方向。這並不意味著 Haskell 在未來幾年會大量普及,因為 Haskell 和傳統程式語言相比差異太大,經常有工程師用起來有問題;毫無疑問,這一點將會阻礙廣泛普及。但是 Facebook 的工作標誌著,其他程式語言將會向 Haskell 的大方向上靠攏。

一些新的程式語言已經在這樣做了。 Google Go 和 Mozilla 的 Rust 能夠讓開發者設計大規模並行程式碼,迅速搭建項目。一些編碼項目也在為其他語言設計類似 Haskell 的軟體庫,比如「反應式」(reactive) 的程式項目 RxJava。

對於一些工程師來說,像 Go 和 Rust 這樣的程式語言並不像 Haskell 那麼高效,但是它們更容易學習。而且 Go 和 Rust 至少也在貫徹 Haskell 社區過去 25 年來始終堅持的理念。「Haskell 推進了許多程式語言的發展,」資深工程師 Mathias Biilmann 這樣認為,「我想未來也會繼續如此。」

純函數式 (purely functional)

Biilmann 在舊金山一家新創公司工作,為網站設計軟體。有一次,他在設計一個能夠讓用戶打開網站時自動調整圖像大小的工具,發現 Haskell 是最理想的程式語言,很大程度上是因為在並發運行程式的時候效率非常高。在一個網路站點為如此多用戶完成如此多不同任務的世界, Haskell 的這個特性非常有價值。「你會收到特別多的圖像縮放請求,」Biilmann 介紹說,「必需要能夠處理許多並行連結才行。」

Haskell 之所以能做到這一點,是因為它是一種「純函數式程序語言」。從本質上來講,開發者基於一系列函數功能設計程式,每一個函數都能夠獨立於其他來運行。也就是說,你能夠用任何需要的方式執行計算,而不需要依照運行程序。

這樣做會改進速度,也能幫助開發者想清楚他們在幹什麼。「大部分程式語言是,你要寫:' 首先,

做這個。之後,再做那個,'」他解釋說,「一旦你用上百個線程同時來做這件事的時候,人類就很難弄清楚到底在發生什麼,程式執行的先後順序又是什麼。」

 

隨時編碼

這些基本的語言特性正是 Haskell 吸引 Facebook 的地方,後者需要一種程式語言來幫助工程師編寫「規則」,判斷網站上的垃圾信息。判斷垃圾信息需要從來自 Facebook 龐大計算中心中的大量機器提取數據, Haskell 提供了一種快速達成的方式。「在 Haskell 裡,同時運行兩個函數是很安全的,你知道不會有任何副作用。可對於大部分程式語言來說就不行了,」路易斯說,「Haskell 能夠讓你將看起來依序排列的代碼提出,同時運行他們。」

不僅如此, Facebook 的工程師還可以在不必擔心代碼將如何運行的情況下去編寫「規則」。「我們希望從並發的狀態中抽像出來,」Haskell 大師 Simon Marlow 介紹說,「儘管並行處理對於效率很重要,我們卻不希望寫反垃圾系統的工程師去擔心這一點。Haskell 很擅長抽象化。」

Instagram 也使用 Facebook 的系統處理垃圾訊息,該公司的工程師介紹,在遭受垃圾訊息攻擊的時候會隨時編寫規則,「如果我們使用的是純函數式的程式語言,完全沒有副作用,那麼就能更快做出行動。」

對於更大範圍的程式世界來說,這一點也很重要。現代網路服務一定要快速進化,不僅是為了服務不斷擴大、變化的用戶群,而且要保持競爭狀態。

「不是壞事」

現狀是: Biilmann 已經不再用 Haskell 了。 Haskell 並非完全實用。使用該編程語言的人不夠多,而且很難改變這一點。「Haskell 就像一個來自未來的程序語言,但這是一個永遠不會到來的未來,」Biilmann 說道,「它解決了所有聲稱要解決的問題。但是它太過與眾不同,不可能成為通用語言。」

如今,在設計需要並發性能的服務時, Biilmann 更傾向於使用 Go 或者 Rust。他說這兩種語言不如 Haskell 強大,但是發展方向是對的。而且對於主流工程師來說更適合。「如果今天我要重寫圖像縮放器的話,很可能會用 Go,」他這樣說,「Go 解決了 80% 的問題,而且基本上沒有學習曲線。」

在 Facebook , Louis 承認 Haskell 的並行計算風格並不適用於所有任務,而且對於一些工程師來說,學起來很困難。但是他很有信心,未來幾年這項技術會變得更加重要。「這種技術肯定有潛力,」他說,「每家公司基本上都在寫類似的程式。你必須這麼做。你會看到許多程式語言出現,感覺和它一樣,在底層機制上。」

「那麼 Haskell 呢?從長遠來看,它是否能發展成一個更普遍的程式語言呢?工程師族群又是否能更大程度地接受它呢?「我不知道,」Louis 這樣說,「不過我不認為那是件壞事。」

歡迎加入"Inside" Line 官方帳號,關注最新創業、科技、網路、工作訊息

好友人數

精選熱門好工作

遊戲美術 Game Artist

Orangenose Studio 易銘有限公司
臺北市.台灣

獎勵 NT$20,000

PopDaily APP開發工程師 –【工程部】

數果網路股份有限公司
臺北市.台灣

獎勵 NT$20,000

資深商品開發人員(Sr. Product Development)_台北、上海

科毅研究開發股份有限公司
新北市.台灣

獎勵 NT$20,000

評論