Bowery為什麼從Node.js轉向 Go

infoq發表於2015-02-06

  隨著業務的發展、效能的挑戰、需求的變更以及技術的更新,一個應用從某一個技術棧轉向另一個技術棧是很正常和合理的,如淘寶從PHP轉向Java、Twitter從Ruby轉向Java/ScalaLinkin從Ruby轉向Node.jsGroupon從Ruby轉向Node.jsDropbox從Python轉向Go等。Go語言從一面世就受到了很多開發者的關注,它能夠提高開發人員的程式設計效率,它的並行機制使得開發者能夠非常容易地編寫多核和網路應用,開發人員利用它的型別系統能夠很容易地構建出富有靈活性和擴充套件性的模組化程式。現在,越來越多的專案基於Go語言實現,如著名的開源容器Docker、PaaS 平臺Deis、Google的雲端計算平臺Kubernetes以及國內的七牛雲端儲存產品等。Bowery是一個基於雲技術的開發平臺,其在2014年進行了一次從Node.js到Go的轉換,且這次技術棧的變更加快了開發和部署的速度。近日,Bowery對這次技術棧轉換進行了總結,並歸納出了他們認為Go優於Node.js的一些原因。現對這些原因進行一個全面整理以供讀者參考和學習,具體內容如下:

  1. 強大的跨平臺程式設計能力
    Go具有很強的跨平臺性,基於Go的程式能夠在不同系統(Linux、Windows、OSX等)中編譯,所以在開發過程中,藉助Go能夠輕鬆實現跨平臺編譯,而開發者只需設定不同的環境變數,這樣就大大提高了開發效率。
  2. 快速部署
    Go屬於編譯語言且具有跨平臺性,從而使得Go開發的分散式應用能夠執行在不同的平臺上。在Go平臺中,從測試環境到正式環境的切換無需額外的系統依賴,從而能夠實現快速的部署。
  3. 併發原語的支援
    Node.js沒有提供較多的併發原語,僅有I/O程式或計時器執行在併發模式,所以Node.js在併發處理方面處於劣勢,且很難構建出快速響應的跨程式通訊系統。而Go提供了語言級別的併發特性goroutine、基於通道(channel)的通訊機制和更底層的併發處理基元,如mutexeswait groups等,Go顯得更加適合於構建高併發的應用。
  4. 標準化的整合測試框架
    用於Node.js的測試框架有很多,有些適用於前端測試,有些適用於後端測試,但多是第三方的測試框架,如JasmineMochaJSUnitPhantomJS等。而Go提供了內建的完整測試包,如果開發者想編寫一個新的測試套件,只需把_test.go檔案新增到相同的包裡即可。有關Go測試的更多相關資訊,請讀者點選這裡檢視,此外,Go還提供了使用httptest包進行測試的文件
  5. 標準庫
    如果使用Node.js開發一個應用,開發者不得不引入額外的依賴擴充套件庫,從而增加了應用的部署時間和不穩定性。然而Go提供了標準庫,標準庫的好處是無需包含其他擴充套件庫即可實現一個應用的開發,從而節省應用的開發、部署的時間,並且還能夠增強應用的健壯性。
  6. 強大的開發者工作流工具
    除了使用NPM和指令碼控制外,Node.js沒有提供真正、標準的工作流工具。而Go所提供的工作區佈局能夠幫助開發者建立標準化的工作流、規範應用的開發。儘管使用標準的工作區佈局會損失開發的靈活性,卻獲得了一個結構化、有條理的工作區,該工作區包括三個根目錄:src用於放置原始碼包,pkg用於放置編譯包,bin用於放置的是執行檔案。把原始碼和依賴檔案集中放到一個單一的工作空間是一個最佳的實踐,這樣使的團隊成員都有一個標準的文件結構。此外,gofmt也是一個非常使用的工具,它能以相同格式對程式碼進行格式化。

  以上這些原因是Bowery根據自己的實際經歷而得出,另外,還有其他公司/團隊覺得Go值得喜歡的一些原因,如MongoDB的專案管理團隊喜歡Go的智慧、統一的開發體驗,音樂分享服務Soundcloud團隊喜歡Go嚴格的程式碼格式規則以及單一方式實現功能的理念。總之這些特徵能夠節省針對程式碼規範和格式審查所花費的時間,從而使得開發者能夠集中精力來解決關鍵的問題以提高工作效率。

  最後作者為Go語言開發者提出了幾點建議,如經常訪問官方部落格官方學習文件、訪問Bill Kennedy的Go程式設計部落格等。

  此外,關於Go和Node.js的選擇,Node.js社群最活躍和高產的成員之一TJ Fontaine在個人部落格中公佈了自己放棄Node.js而轉向Go的原因,主要是因為Go更適合高併發和分散式應用開發;最高產的Node.js開發者之一Duncan Smith在個人部落格中列舉出了自己為什麼不從Node.js轉向Go的原因,有興趣的讀者可以前去閱讀。

相關文章