NodeJS会是昙花一现吗?

Kris_zcl 发布于 2014/11/12 22:00
阅读 6K+
收藏 4
在用了一年以后,我感觉node.js有一点不对劲。它很有意思,但是我觉得我应该用另外一个视角去审视它。


网络编程真的可以更容易吗?


node.js无疑有一些设计非常好的地方。前段时间我写了一个性能非常高的Syslog Collector系统,它可以每秒处理25万个日志,可以同时处理数千个TCP并发连接。它还支持UDP,HTTP和SSL.它是C++写的,使用了 Boost.Asio  架构。它几乎从来不会崩溃。 很少会内存泄露。但是它花了我5个月的时间去编辑(然后重写),测试还有布署。所以,你要知道,写相似的node程序真的不会让你加快开发进度。

需要一个HTTP服务器?require(导入) http  模块,如果你想要一台socket服务器的话,还需要net模块。node是一个事件驱动的框架。相对于为每个链接创始一个线程模型相比有极大的性能优势,node.js取得了 twisted无法能取得的成功。 (注* twisted 基于python的异步驱动框架)


node.js的问题是什么?


JavaScript


让我们先说JavaScript - 我喜欢用它的闭包,但是这个语言太扯蛋了。甚至是JavaScriptr的铁杆粉丝都知道它有多可笑。JavaScript the Good Parts (JavaScript好的方面) 真的是一本很簿的书,对比一下你会觉得很有趣。



你会发现下面的代码根本不会报错:

undefined=42

然后你输入这个看看?

> [] + []
''

为什么1个空数组加上另外一个空数组会等于空字符串?

然后这个呢?

> [] + [] * 5
'0'

解释JavaScript为什么会这样其实挺困难的。就像为 无数个猴子设计的语言。 所以在线编程是非常重要,你得经常打印一下看看到底会输出什么。

调试


我看到的大多数node.js程序员都在用一种非常原始的方式在调试,并不断地对他们用的工具表示失望。跟踪回调里不该招聘的异常,在类似Mocha和Chai的测试框架中,经常会像恶梦一样。时间不断地花在寻找为什么会出错上面。console.log也许是开发者最常使用的调试工具。

回调地狱


大多数程序员,只要在node上面写了36个小时的代码,就会发现callback hell。有些 文章 介绍了一些避免的方法。具有讽刺意味的是,这是node的异步和事件驱动所天生的。它带来了很多性能上的优势,但导致了这种难看和不可靠代码的产生。

但是我们有 Promises。 是的,我同意。不过如果不是用Bluebird这样的模块,我估计大多数node程序员马上就会放弃。我非常喜欢用Promise模式,它写出的代码非常优美。Promise的链式写法是非常好的实践。但是它让你放弃了彻底修复回调地狱的想法。我严重怀疑这一点会破坏NodeJS在生产环境应用的可能性。

我只会占用一个核,但只能用一个核。

node.js总是运行在一个进程里。这让他进行跨函数和跨模块的调用更加的简单。但这并不意味着是没有代价的,你必须确保你在做出更改的时侯进程不被打断。但是当你使用多核CPU时,你就无法发挥出其它处理器的性能。你就开始骂娘了。当然node里面有集群 Cluster  模块,但是它还处在实验阶段,而且用它你还得重写你程序的逻辑。你最初的设计可能很少考虑到需要分布式处理的情况。

那么该怎么办?


写高性能的网络和分布式程序是当代程序员应有的基本素质。框架应该降低内容的切换——像node一样,允许我们创建高性能的服务器。但是还有比node.js更好的框架。

Go 是一个很好的侯选对象。它基于一个健壮的库,为网络编程而设计。而且编写服务器像node一样容易。 Goroutines 允许程序员不必担心回调式的书写方式,让程序员以更自然的,线性的思维去思考。而且Goroutines真的非常轻量级而且内容切换比操作系统的线程间切换更轻量,这种系统级的线程操作正是node.js想要避免的。

Go可以最大可能地发挥多核的优势。这是它的基因。我写了很多Go的代码,而且它的体验要比node要好很多。

不要把我的话当回事


我的node和JavaScript经验并不像C/C++或Python那样丰富。但是我的直觉告诉我node.js只是我们朝着向更好的网络编程迈进的一步。它已经解决很多问题了,但是应该还有更好的方法。


注* 相关阅读,其它反方文章



原文地址: philipotoole.com

译文地址: OurJS


加载中
0
iyangyuan
iyangyuan

文中的代码示例没什么可奇怪的。

[] + []
这个很好理解,调用默认的toString方法,相当于[].toString() + [].toString(),结果当然是空字符串。

[] + [] * 5
这个原理大致相同,[].toString()+Number([].toString())*5 = "" + 0*5 = "0"


这些只是不规范的写法,任何一种语言,都可以写的不规范,非要计较这些不就是钻牛角尖了吗?

土鳖的弟弟
土鳖的弟弟
确实~,楼主有误导之嫌
kidbei
kidbei
有道理
0
洞悉
洞悉
菜鸟 你不要误导别人好不?
0
自由之信
自由之信

写这个文章的人,一定不知道第六版的JS,以及Angular最近对第六版的JS添加的两种语言特征,语言是演进的,不能停留在一个点上看问题啊~

0
jet23
jet23
害我差点放弃
h
hdu_huang
你应该早点放弃的
0
h
hdu_huang

tj和node之父也放弃node了,除了阿里使用node渲染前端,没有大规模应用

h
hdu_huang
boss上连node的职位都没有了
0
曾建凯
曾建凯

少年,私有属性用#你怎么看?真的用node写点服务再来BB,我一个写了快20年JS的人我会乱说?要说callback hell,我都趟过无数次地狱了,不是好好的活着,对这类代码如何优化更有心得。今天有async/await了,其实也就是那么回事而已,Java,C#,难倒真的会更优雅?go可能是这方面觉醒最早而已。可是goroutine和管道,也不见得真的能事情处理的很好,哪怕曾经我一度觉得go很好,很有C style。可是写了半年的C#,我还是不得不说,golang也只是那群C粉的坚持而已。大师都一个一个先后而去了,醒醒吧,这个世界不会再有经典传世,只会更加的分裂,碎片化,你方唱罢我登台,kotlin也吹得很猛,语法的确很迷人,可是那编译速度真是日了google了。写了快20年程序了,难倒还会为了一点语法特性而心动吗?嗯,kotlin我是真的动心过。可是JNI不给力啊,你看人家C#多好,是的,也许年轻时觉得这货很蠢,可是不知道怎么今天越用越舒服呢,真贱。

好吧,如果做一件事,用某个语言,难度更低,资源更多,迭代效率显然更快,何必还去执念那些浮云呢?可能都天使投资,ABC轮融资,创业板上市了,你还在沉迷你的语言之争吗?所以说,还是 too young。

0
javaxiaoz
javaxiaoz

语言之争都是闲的蛋疼的人才参与

返回顶部
顶部