如何理解 Ryan Dahl 最近專訪中的言論「Node 也許不是構建大型服務的最佳選擇」?
Ryan Dahl 提到a massive server web的例子是世界級別的DNS SERVER
普通應用server(你確定比amazon paypal規模大嗎 他們都在用node) 那NODE沒問題了 當然網遊 MMORPG server我也建議你用c++寫
很多人用其它語言寫的多線程的系統未必比node單線程的在生產環境的效率高
屠龍刀在很多人手裡也只會切雞而不是屠龍的 別聽很多人瞎扯淡 js很多人都沒真懂的
嘿嘿
動態語言一時爽,重構就是火葬場!
所以我鼓勵使用TypeScript。
適不適合不去爭,我選擇的話還是會盡量避免寫業務。原文中寫的很明白了,在發明node之前,是同步+多線程,他在遇到擁有V8的單線程javascript和nginx非同步特性之後,覺得單線程非同步很酷,於是開始了四年的node生涯。然後漸漸的,他發現了go「同步」寫法,也就是同步的寫法達到非同步的性能/優點。
然後么,你們不覺得專訪裡面的其他內容,都很值得學習一個的么:前沿方向的探索,一個程序員的本心,人生的選擇。
Node.js 讓前端程序員能夠突破瀏覽器的邊界在主機系統上寫程序。靠自己完善前端工具鏈和支撐的後端生態鏈。RD 對於前端來講就是盜取天火的普羅米修斯,看起來普羅米修斯明顯更愛後端編程。
但人類有了火種後社會的繁榮就不再依賴普羅米修斯一樣。Node.js 能走多遠已經不依賴 RD 了。相比起來,蘋果工程師想往 Javascript 里加線程支持這事應該更值得注意。雖然純粹的前端程序員對這個特性很不屑,但如果 V8 也能夠採納 Node.js 適用場景無疑會被拓寬。也許???
大刀長矛的支持者們看到手槍之父說:「手槍不適合大型戰爭」,很高興,覺得這證明了手槍只是玩具,打仗還是要靠大刀長矛。其實人家後一句是:「所以我用步槍」。
近年來有node js的確風頭正盛 Ryan Dahl此言一出 ,似乎給了一些好事者開噴的機會。不論你處於什麼目的 我覺得這個回答不利於技術的發展。
先不論 Ryan 這話對不對,我覺得很多人有個邏輯誤區,就是把「大型服務」和「非大型服務」對立起來,說得好像大型服務所要求的那些語言特性和生態環境對非大型項目反而是缺陷似的。
大型項目除了體量和健壯性之外,考慮更多的其實是可維護性,畢竟參與人多了,代碼腐爛的速度就會加倍。
我不覺得一個不適合大型項目的語言(不限於node)反而會在中小型項目中有優勢,除了兩種例外情況:
1. 寫那種真正意義上不需要維護用完就丟的東西,比如 shell 腳本;2. 使用者只熟悉這種語言;
因為「項目不大」而放棄工程上的要求,在我看來就好像為了少打幾個字而用a、b、c作為變數名一樣撿芝麻丟西瓜。
沒有最好的,只有最適合的。
大型的 OS 場景,NodeOS 被 Docker 甩幾條街完全可以理解。
大型的 FaaS 應用,AWS lambda 裡面 Node.js 甩 Java 一條街也可以理解。(喵?你問 Go 在哪,我也不知道啊)
PS:本人 Go 和 Node.js 都用。
原文回答了這個問題「That said, I think Node is not the best system to build a massive server web. I would definitely use Go for that. And honestly, that』s basically the reason why I left Node. It was the realization that: oh, actually, this is not the best server side system ever.
Yeah. I think where Node has really shined is, weirdly, on the client side. So, doing kind of scripting around building websites. So, browser FI, for example. Kind of bundles up client-side Javascript. So, you can have all this server-side processing of client-side Javascript. And then, you know, maybe little servers to… maybe little development servers, and here and there, maybe some real servers serving live traffic. Node can be useful, or it can be the right choice for it. But if you』re building a massively distributed DNS server, I would not choose Node.」
岳父大人說你妻子有缺點,有什麼受不了的啊,他說的確實有道理,畢竟他曾經是最了解你妻子的人,go 在工程化方面確實是根正苗紅,node.js 依然是任重而道遠。
不過大家不覺得 node.js 進化得太快了嗎?兩年不見就大變樣,從 callback 到 co+generator 到 async+promise,各種 wrap、hook 湊合起來又變得牛逼了。
用 node.js 就要接受她會不斷進化這一事實,因為總有更好的技術方案出現,而 node.js 一直在試圖讓自已完美。想起斗破蒼穹中的情節
一本是地階功法(go),一本黃階功法(node.js),大家當然會學地階功法啊,問題是這本黃階功法會進化,有朝一日可能會進化成天階功法(一統前台端),你動心不。好在現實不像小說中的設定,我們可以同時用兩種功法。大型服務純用 node 來玩自然是很容易把自個兒玩死了。但是看什麼東西都得用辯證法來看。node 這傢伙在做 API 網關路由或者頁面直出的時候還是非常舒服的。在 node 上只要不去實現密集型運算和複雜的業務邏輯流程的話就可以考慮選擇。
另外:再次建議選擇 typescript 來寫 node 代碼吧。
node社區熱度可以,但是bug太多,原因?語言特性+積澱不足
但是node在工具市場上很火啊,js或者說腳本語言本來特點就是敏捷快速,可以快速驗證幾毛錢的點子;選擇效率往往有時候就會犧牲其它方面的比如架構性,一個誕生不到10年的技術,缺乏在大型應用上的積累,很多時候選擇node意味著單幹+全棧以及造輪子…在web項目中先找到立足的地方,再一步步來唄;不過話說大型web架構本來應該是物理可拆分的,node只干一部分就行了,前置機、中間件,接入層…
大型系統還是得用有靜態檢查的語言。
這不是一個誰都知道的答案嗎!
寫 Node 規模大了就會覺得很鬧心,就算是 TypeScript 也無法掩蓋一些語言上的缺陷,然後就想換一個語言。
不過評估了其他的語言之後發現寫 CRUD 的基礎設施很少有像 Node 這樣效率高並且質量高的。
雖然,一些冷門的需求的庫質量堪憂,比如 iCal。
所以我轉基礎設施方向了。