譯者 | 朱先忠
策劃 | 伊桑
Node.js可能是業界最流行的后端技術。Twitter、LinkedIn、Uber等知名國際企業都選擇使用Node.js作為他們的主要服務器端技術,或者將其與其他語言相結合。Node.js擁有很多相關的優勢,比如它有一個巨大的社區,還有一個偉大的生態系統,特別是在前端和后端都能夠使用相同的開發語言等等。
由于C#和.NET是我的主要編程語言;所以,我想通過本文的探討來試圖弄清楚是否我在使用的是一種被低估的技術,以及它的市場趨勢是否看好。其實,ASP.NET(.NET服務器框架)本身就很流行。自從.NET運行時成為開源和跨平臺平臺以來,它一直在改進,并越來越受歡迎,但目前看來,Node.js的地位依舊領先。
那么,為什么我依舊建議初創公司最好考慮選擇.NET而不是Node呢?以下是我的7個理由。
1、.NET具有更好的性能
性能問題是Node.js技術的最大軟肋。我倒不是說Node.js的速度慢得令人難以忍受;但是,當你開發的系統需要后端支持計算功能或者具備高吞吐量的請求時,那么Node.js并不是一個好的選擇方案。主要原因在于:它的運行時是單線程的,這對于當下允許并行執行許多操作的多核處理器來說,絕對是一個巨大的浪費。techpower最近的基準測試
結果顯示:Node.js遠遠落后于ASP.NET Core。
誠然,.NET也并不是最快的技術。如果僅僅強調“速度最快”的話,答案很可能要歸屬于極簡主義的Rust語言或C++實現。但在主流Web框架中(不包括Just或may_minihttp這類小眾項目),.NET算是最快的框架之一。主要理由主要存在于三個方面的性能測試優勢:單查詢基準測試、多查詢基準測試和Cookie基準測試。
2、Node.js需要混合和相匹配的語言來實現性能補償
當深入了解選擇Node.js的公司的技術堆棧時,你會發現,他們的微服務架構技術方案中幾乎總是存在其他語言和運行時(如Go、Rust、Java和Python)的組合使用。Node.js和JavaScript非常適合只向數據庫、隊列或其他服務發送查詢的高級REST服務器。然而,當您需要進行一些計算工作時,比如運行算法或使用文件系統時,這樣的技術選型并不好。
相反,C#和.NET運行時速度快,功能多。在大多數使用場景中,您不需要使用像Rust或C++這樣的本地語言來獲得額外的性能優勢。這意味著,您可以節省向項目的技術堆棧添加額外語言的開銷。因此,實際開發中,最好還是努力避免使用另一種新的語言,因為這樣的話你將需要更多的專家和更多的基礎設施,從而導致開發團隊變得不那么“多才多藝”。
3、C#是一種令人驚嘆的語言
很難說哪種語言更好,因為每個人都有自己的偏好和偏見。但是,我認為C#是目前業界最強大、最高效、最流行的語言之一,理由如下:
它是一種高級的C風格面向對象語言。對于大多數開發人員來說,它將是熟悉的,并且富有成效的。
盡管它是一種高級語言,但在性能優化需要時,它允許對敏感代碼進行低級控制。如果您愿意,您可以使用指針和直接訪問內存訪問。
它具有豐富的函數語言功能,如LINQ和擴展方法。
它是類型安全的,比TypeScript要安全得多;但在需要時,它還具有JavaScript等動態功能。
它有大量的技術文檔和龐大的社區支持;盡管沒有JavaScript開發領域那么大,但仍然非常大。
業界成功使用C#開發項目的幾個案例是Bing搜索引擎、StackOverflow和Unity(最流行的游戲引擎),它們都允許您使用C#作為編程語言。
4、最好用的工具
我認為C#提供了世界上最好用的工具,包括最好的IDE、最好的調試經驗和最好的評測器等等。
JavaScript或TypeScript并不具備C#的強類型特性;因此,高級代碼導航和重構是不可能的。在許多情況下,知道誰實現了你的接口或誰引用了你的類的函數是不可行的。經常的情形是,Node.js必須依賴于基本的文本搜索;而在C#集成開發環境中,您可以通過快捷鍵導航到相應的用法和實現源碼。強大的重構功能也是如此,比如實現接口、添加參數以及提取函數或類。如果您已經使用Visual Studio或Rider很長時間了,那么您可能會在遷移到Visual Studio代碼時體驗到真正的生產力損失。
就調試問題而言,Chrome開發工具調試器或VSCode調試器與Visual Studio的經驗并不相近。但是,在調試Node.js程序時,我就成為一個相當普通的用戶。
5、更容易的內置開發循環
在Node.js中,您可以使用Babel、Webpack、ESLint等工具以任何方式構建開發環境管道。您可以使用不同的JavaScript版本,將所有內容打包到單個文件或多個切片中,縮小它們,等等。這是一個可高度定制的過程。管道的每個部分都有許多不同的工具。例如,Webpack可以被Rollup或Parcel替換,ESLint可以被更改為prettier工具,等等。存在數百萬種不同的方法來構建JavaScript項目,每個公司似乎都有自己獨特的設置,而且需要大量開發和維護的設置。盡管我不得不承認,如今存在很多現代方法,比如Vite,可以讓一個豐富的開發環境快速啟動并運行。
.NET中的情況正好相反。在構建設置中沒有太多技術選擇,因為您將始終使用微軟公司的MSBuild、.NET SDK和Visual Studio。當然,您可以進行一些定制,但這與JavaScript項目完全不同。要做的唯一“選擇”是使用哪個.NET版本,哪個版本總是最新的,以及要構建的項目類型:ASP.NET Web API或ASP.NET MVC,這應該是一個明顯的選擇,具體則取決于您希望如何開發前端。
因此,可以考慮Node.js的靈活性,這是它的一種優勢,也是合理的。但是,你也可以將其視為一種負擔。在.NET開發中,除了在非常大的項目或特殊的情況下,開發環境需要做的事情并不多。Visual Studio和MSBuild可以正常工作,它們可以處理大型企業應用程序和服務器,而不會出現太多問題。
6、穩定的生態系統
正如剛才提到的,Node.js和JavaScript有一個非常豐富的生態系統,這包括開發工具、庫、文檔等。不管是好是壞,這個生態系統大多是開源的,由社區開發。在許多情況下,公司所依賴的庫是由一個小團隊甚至一個人開發的。如果這個人決定停止項目工作,公司就損失大了。當然,其他人可以接手這項工作,或者你可以自己動手,添加你需要的任何缺失的部分;但是,這對于一家快速創建第一個產品的初創公司來說是一個很大的麻煩。當然,這并不是小型開源項目的唯一問題。當他們引入錯誤或安全漏洞時會發生什么?如果他們的愛好項目對你的創業公司造成了損害,維護人員并不完全負責,是嗎?
我并不是說大公司的產品中沒有錯誤。據我所知,他們的產品中可能會有更多。但你可以投訴,開罰單,甚至起訴微軟。你可以肯定,一個項目將在很長一段時間內繼續得到支持,如果它停止得到支持,你會提前幾年收到通知。就穩定性和可靠性而言,我打賭Microsoft.NET運行時及其所有工具都比大多數Node.js開源庫測試得更好!這可能會降低產品版本發布的速度,但卻會帶來更穩定的產品。
話雖如此,仍存在許多維護良好的開源庫,它們有許多貢獻者,并得到了大公司的大力支持。
7、合規性、隱私和安全性
這一論點主要基于常識,而不是基于我的經驗或專業知識。如果我做了一些錯誤的假設,請讓我提前道歉。
在開始創業時,您可能認為法規遵從性問題并不重要或特別有趣。我想創始人會專注于制作產品、招聘、籌集資金和選擇公司的標志。但是,這僅是產品最重要的方面之一。在某些行業,如醫療保健、軍事和政府部門,至關重要的是,你的應用程序必須是安全的,能夠保護個人信息,并符合HIPAA和ISO 27001等標準。
再讓我們回到對技術的選擇話題:
如果您選擇了Node.js或者是ASP.NET,那么合規性/隱私性/安全性是否重要?
在這兩種技術上運行的應用程序是否符合標準,是否安全,是否受隱私保護?
但當你選擇Node.js時,還可以選擇使用開源庫和生態系統。某些開源庫存在安全或隱私漏洞的可能性更大。而且,這些項目很有可能不遵守微軟為自己制定的瘋狂標準。即使你正在采取最好的措施來保護你的應用程序,例如進行滲透測試等等,你也無法與微軟的聲譽競爭。如果一個G端客戶知道你全部都在使用微軟的技術堆棧,他們就更有可能信任你的應用。
8、小結
至此,我希望我至少說服了你認可我上述提出的部分觀點。不過,很多論據都是帶有主觀性的,比如誰有更好的工具,或者哪種編程語言更好。其實,我會第一個承認Node.js比ASP.NET更好一些。對此你有什么看法呢?歡迎在文后留下你的評論。
原文鏈接:https://shimo.im/docs/pmkxQn7ejPuZ1EAN/read
譯者介紹
朱先忠,51CTO社區編輯,51CTO專家博客、講師,濰坊一所高校計算機教師,自由編程界老兵一枚。