大家好,2 年 ROR 使用经验. 个人开发这.很喜欢 Ruby/Rails 但是最近在思考一个问题,为什么 Node 发展的这么快. 答案可能有很多. 知道最近我想写一个在 web 上运行终端模拟器 的应用才发现. RoR 没有对应的库.深层的问题有两点. 对于一个 fullStack 开发者,统一前后台语言是多么的重要. Node 这方面胜出.虽然 JS 比 Ruby 烂的多.
前后端统一语言是一个伪命题,并非那么重要,关键是看场景,脱离场景谈这个其实是扯。 前后端即使使用同一种语言,也不代表前端的人的 Mind set 跟后端开发的人一样,另外 NodeJS 带来的 callback 回调,以及为了用异步回调去解决顺序处理所衍生出的各种奇技淫巧,是我用过了最后放弃掉的主要原因,还有就是如果你想把各种 NodeJS 的后端库都拿到前端去用,即使 Browserfiy 之流也是各种坑,这些都是由整个社区发展的良莠不齐,以及前后端天生割裂的两个场景要硬生生的整合所带来的问题,很少吐槽 NodeJS,但是不吐不快。
CoffeeScript 是明日黄花,直接用 ES6 + Babel 吧。
#3 楼 @lilijreey 相同的书写方式和代码重用是销售说给市场听的,作为严肃的开发者千万不要轻易相信,如果为了追求相同的书写方式,那是舍本逐末,能通过语言和框架,结合你在具体场景中的 mind set 才是重点。
用异步去解决问题其实是无奈,从内核支持 IO 异步带来的并发性能优势我承认,但是核心问题在于大量的业务场景,以及业务逻辑代码并不是异步的,但是却要你用异步的方式 + 奇技淫巧来处理。没错必须用异步来解决,但是造成这个问题的原因是因为你别无选择。
请别扯 Erlang,完全不一样的东西好么。
还不一定是丢了西瓜捡了芝麻呢!
你只看到了 Ruby on Rails 的弱项,看 Node.js 强的地方,却没有反过来看各自的优缺点,并结合自己的业务来看那个更适合你。
关于异步,你的业务真的需要么?
想当然是最可怕的。
Node 在开发网站方面的确是落后于 Rails 的便捷,不过可以做一些功能单一的东西,这句是真的:
CoffeeScript 是明日黄花,直接用 ES6 + Babel 吧。
除了并发优势外,NodeJS 在互联网应用场景并没有优势,劣势倒是很多:
曾经因为前后端能用同一种语言,几年前给某创业者推荐尝试 NodeJS,后来该创业者踩了 1 年的坑后,回到了 Ruby。
有些东西不是看起来好就是好的,当然 NodeJS 社区的营销能力的确胜过 Ruby 社区。
我来告诉你为什么 NodeJS 发展得快: ExpressJS 跟 Sinatra/Flask 特别像,就是大家一看就懂,“嗯这个东西好,一看就会,我明天就拿它做个高并发的网站出来。“ 相反 Rails 的东西不会的人一看就会害怕,“啊这就是所谓的语法糖/魔法,果然凡人看不懂,没个一年半载怕是入不了门,我还是回去用 NodeJS 好了,高并发,也不用再学一门新语言"。
“统一前后台语言” 从一开始就是一句 NodeJS 的广告词而已,NodeJS 和前端代码(如果你真的需要所谓前端代码的话)除了 Javascript 是一样的以外没有什么可以借鉴的,ReactJS 不能放到 Server 上,ExpressJS 也不能跑在浏览器里,还不是要学两套东西。再说现在学一门语言能有多难?那些一心想着” 用现有的知识 (Javascript) 能做出来就最好了 “的人不过是不思进取的懒人。
最近客户要开一个新项目,死活不再用 Rails 了,他觉得 Rails 慢(其实是 Angular 慢,他要是把 Rails 升上去,再让我加个 Turbolinks,我能给他弄得比现在的 Angular 代码快得多)。就让我用 NodeJS 的 Express,他听说 NodeJS 快得不得了。我花了一周时间连个登录都没做好。光是把环境配置得跟 Rails 类似就花了两天时间。剩下的时间就都用来配置环境和修一些信息不明的错误。
什么都要自己搞,Express 4 追求 unopinionated,追求 minimalist,把 session,flash 之类的都从 core 里去掉了,我又得一个一个去装回来。没有 ORM,又得装个 Mongoose。assets 不打包,要不就扔网页里,要不就配置 Webpack 之类的来打包。经常默默 Crash 不给任何错误信息,只能用 comment/console.log 来调试。
过度追求精简的我觉得是一种洁癖。什么都去掉了,到了用的时候又要让人自己装回来,自找麻烦。直接把优秀的人的多年经验拿来用不比外行乱精简更好?
NodeJS 刚面世的时候我就用了一下,给我的感觉就是一片混乱,什么都要自己去挑选组装,我那时还是个新手,连 jQuery 都不会,每天都在担心昨天作出的选择是不是一个好的选择。这次重新接触 NodeJS 之后发现还是一片混乱,还是一大堆琐碎的选择。ExpressJS 已经被原作者抛弃(因为他不靠它吃饭),被另一个人接手现在成了孤单的 one-man-project,很久都不更新一次(https://github.com/expressjs/express/commits/master)。 ExpressJS 的作者现在去搞了个叫 Koa 的框架。而且以代码简短为荣(Koa's small ~550 SLOC codebase),以选项众多为荣(https://github.com/koajs/koa/wiki)。 所以 NodeJS 在 Web 领域继续朝着 Configuration over Convention 的路子在走。
然后作为一个新手很重要的是文档,我反正是没看懂http://koajs.com/ 的文档。相反 Rails 的文档只要你认真读,能回答很多你学习过程中的疑惑。
我们顺便来看看 Koa 能干什么
Koa is a new web framework designed by the team behind Express,
the team abandoned Express
which aims to be a smaller,
less feature, more choice to make
ditch callbacks and greatly increase error-handling
这两个不是你自己制造的问题吗?
. Koa does not bundle any middleware within core
所以你要去找一大堆的 middleware 来完成最基本的 session,flash,etc.
unopinionated(无主见), minimalist(简陋者),这些词背后都意味着当你想做的东西不简陋的时候,你就得自己去研究总结很多 opinion。
CoffeeScript 是明日黄花,直接用 ES6 + Babel 吧。
对于我这样右手有 RSI 的人来说能少打一堆没用的括号就会尽量少打。花括号圆括号全都要按着 Shift,累。
Node 有一个巨大的优势就是内建了 nonblockIO+Ractor 对于 web 这种重 IO 操作的应用来说更加的方便. 我想这两点是我想转 Node 的原因.
你再怎么 nonblocking IO,也要等数据库返回数据之后再发送内容,还要去解决异步的问题(参考 Koa 的文宣),所以虽然并发会更高,但是代码只会更繁琐,不会更方便。
我换回 Rails 了,这个客户做完就不用 Phoenix 了。还是太繁琐,太罗嗦,比如要把 conn 和 current_user 在 templates 里到处传,比如很多 Rails 帮你打点好的地方都需要自己花时间去打点。有这时间我还不如拿来给 Rails 多加几个 Server。再说了假设 Phoenix 的返回速度是 1ms,Rails 是 200ms,我也不想为了这 199ms 去给我自己增加那么多工作量。Ruby-China 现在打开需要 1.6s 的时间,换成 Phoenix 也许就能在 1.58s 内打开,速度提升了 1.25%!
最后我学了学 Phoenix,成功用微秒级的速度说服客户从 NodeJS 转 Elixir/Phoenix。开发效率上也只是略逊色于 Rails。Learning curve 也很平缓。
但是 Phoenix 和 Rails 比起来还是很残缺不全,而且 Phoenix 作者好像也有点简陋主义的倾向,但凡能多写两行弄出来的就不给加个 helper。所以我还是更喜欢 Ruby/Rails 的理念。而且 Phoenix 也有 one-man-project 的倾向。
不过 Phoenix 速度还是要比 Rails 快很多,这一点也让我放不下,所以现在还是更倾向于 Phoenix。我感觉 Rails 现在最大的缺陷就是 Ruby 造成的速度问题。哪怕 Ruby 作者 3x3 的口号我觉得也没什么吸引人的,因为按照 Phoenix 作者的说法(https://github.com/mroth/phoenix-showdown), Elixir/Phoenix 已经是 Rails 的 10 多倍了。
所以我期望中最完美的结合是 Rails 原班人马放弃 Ruby 转投 Elixir。搞个 Elixir on Rails 的大新闻出来。
抱怨了这么多主要是那一周被 NodeJS 折磨了没地发泄,sorry
最后给你们看我 prod 环境的 log,注意其中的µs
01:09:56.277 request_id=53nbaccbfib3ugpcg31ajcrlr1b13b4u [info] GET / [39/78]
01:09:56.373 request_id=53nbaccbfib3ugpcg31ajcrlr1b13b4u [info] Sent 200 in 96ms
01:15:13.716 request_id=8bhv93vm58b5donvvk98g548a6g9bckb [info] GET /
01:15:13.716 request_id=8bhv93vm58b5donvvk98g548a6g9bckb [info] Sent 200 in 282µs
01:15:45.240 request_id=tt5j6vhqsu2so2sh529qfam7di7ovj0u [info] GET /
01:15:45.241 request_id=tt5j6vhqsu2so2sh529qfam7di7ovj0u [info] Sent 200 in 313µs
01:16:47.404 request_id=2uv48orqkrqol62kuqst7me38r8e09vh [info] GET /
01:16:47.404 request_id=2uv48orqkrqol62kuqst7me38r8e09vh [info] Sent 200 in 218µs
01:17:29.837 request_id=pr2k21emb5l3hhlesc25f5i3tg45qsuv [info] GET /
01:17:29.837 request_id=pr2k21emb5l3hhlesc25f5i3tg45qsuv [info] Sent 200 in 178µs
01:50:20.497 request_id=3un89oqbhgjmhaiv2gnvp19m58ssddn6 [info] GET /
01:50:20.498 request_id=3un89oqbhgjmhaiv2gnvp19m58ssddn6 [info] Sent 200 in 191µs
02:09:52.167 request_id=1mqbkdt4ofrla3ioaa8e6l85u4umib9g [info] GET /
02:09:52.167 request_id=1mqbkdt4ofrla3ioaa8e6l85u4umib9g [info] Sent 200 in 190µs
06:50:40.028 request_id=3dn8vr2q3mubcga4usa4gbjq6lrr09tr [info] GET /
06:50:40.028 request_id=3dn8vr2q3mubcga4usa4gbjq6lrr09tr [info] Sent 200 in 305µs
07:24:49.306 request_id=tmrml479vagr43t4fep06mmu78tv8174 [info] GET /
07:24:49.306 request_id=tmrml479vagr43t4fep06mmu78tv8174 [info] Sent 200 in 208µs
13:56:16.896 request_id=qa161n1btahoakkmlh2ncspl2mpptio8 [info] GET /
13:56:16.896 request_id=qa161n1btahoakkmlh2ncspl2mpptio8 [info] Sent 200 in 201µs
最近刚开源的一个 koa 项目,基本上按着 rails 的思维去写,不得不吐槽 koa 资料太少了,要开发效率和成熟方案还是得 rails. kails 基本上实现了 rails 框架的一些基本功能,一切都要自己搞啊,方案调研都花了我好几天,感觉又可以搞好几篇博客了
已实现的功能:
我之前尝试研究过做一个 web terminal,Rails 没有找到现成的开源项目,Node.js 有。
Node.js 的 web terminal 实现相当简洁,几个 IO 对象 pipe 一下: UI <-> Socket <-> pty
Rails 当时还没有 5.0,因此做 web socket 还挺吃力
所以在 web terminal 这个场景上, Node.js 是完胜 Rails,不得不服。
但因为这个场景的优势,就完全放弃 Rails 去拥抱 Node.js,就一叶障目了,普通 web 场景,很多还是 Rails 高效。
作为一个开发者,应该多学几种语言、框架,在特定场景下选择最合适的技术。
后端就不要用什么 nodejs 了,那些看起来很美的东西都是忽悠你的。js 这种天生弱智的语言,就没法做后端。在浏览器上应用广泛,也是因为历史原因,再加上也确实没有更好的选择了,才造成今天的怪胎。想无阻塞高并发?elixir/phoenix 啊,beam 平台分分钟灭掉 node。说 golang 也牛逼?你用 golang 写个稳定可靠部署后不用管可水平扩展的分布式框架我看看?elixir+phoenix+OTP,你不再需要别的了。现在唯一的缺点就是轮子不太多,慢慢发展建设吧。现在这时候了,还考虑用 node 做后端,确实需要换换思维了。
Crystal +1,这个时候就是强势植入 Crystal 的最佳场景了,如 Ruby 般顺滑,如 C 一般的性能。还是内部 async 的,光 这里 体现出来的 WebSockets 可能性就够 ActionCable 狂流口水的。
上次吵了半天之后我已经对 Ruby 能不能成功转型不抱希望了,与其想改变那么多人,大热的天还不如我自己求变,换个地方玩就好了
为什么要把大好的时光浪费在这些东西上面呢?有空可以多看看国外真正做技术的公司在做什么,Node 这种垃圾只有一些垃圾社区会用。当然也有人会说亚马逊、阿里也用 node,人家只是为了方便招人罢了,用 node 做做不重要的微服务。真正解决问题的是用稳定的语言加上优秀的解决方案(算法等),而不是选择一门新奇的语言,通过某个片面的特性来提升效果。
没想到问个小小的问题怎么多好心人来解答. 哈哈个人不看好 elixir+phoenix. Elixir/phoenix 两年前就看过源码. Elixir 改良了 Erlang 的一些语法弱项.但是都是不痛不痒的语法. Eralng 做 web 性能肯定没的说. 我做大型 MMO 后台就是用 erlnag 写的框架. Nodejs 其实我 一直不看好,前几年刚出来就不看好. 主要是我这个功能不想自己写. 想用别人的,发现没有现成的 Gem 包,Node 到时有几个. 这两个在看 Node 的项目代码. 准备一直到 Ruby 上. So Easy. 不过这几天还真心觉得如果要和 Erlang 这种面向并发的语言比.Ruby,Pyhton,什么的都是小白. 如果想彻底支持并发,最后都会发展成 Erlang 这种类型. 不过 Erlang 以及领先 20 年了
#32 楼 @small_fish__ 我觉得可以试试,带不带的起来就要看天了。虽然我现在个人兴趣在 Rust,不过 Crystal 作为一门 work language 还是非常不错的,基本上 Ruby 我想吐槽的地方都避免了
看了这么多评论,只觉得现在 Ruby 社区已经有法西斯主义的倾向了。
强调 Ruby / Rails 优于一切和强调 Node.js 优于一切有什么不同么?
用不同的工具干不同的事情,用最快最适合的办法搞定最急需的事情,这才是一个 Senior 该干的事情吧。
现在已经不存在所谓的 callback hell, async/await 写起来也足够优雅,Node 在生产环境使用完全没有问题,前后端同一种语言带来的好处是明显的,ES6/ES6 写起来已经很舒服,可以不用 coffee.
准确地说,婚姻中永久性冲突比例是 69% 。一份长达 4 年的跟踪调查结果显示 ,情侣总爱因为同样的问题争论不休,比如:穿上了新衣服 、改了发型 、胖了或痩了几斤 、多了或少了几条皱纹 ,好像问题存在的时间不是 4 年而是 4 分钟一样,总是陷入重复的拌嘴状态。 你以为老了就会好吗? 心理学家丹·怀尔(Dan Wile)在《蜜月之后》一书中写道:当你选择一位长期生活伴侣时 ,你难免会选择一套特殊的无法解决的问题 ,你也许会同这些问题斗上 10 年、20 年甚至 50 年 。
Rails 能带来稳定的收入,和一定的心理优越, 变量或类起名时候的,在约定下尽量的优雅
这是非常棒的体验。
至于其他方面,现金流稳定的话,也许 “快” 等等,从来都不重要。
不过,在 ruby in domain 的论坛,说 ruby 优,别的有缺点,是 法西斯
倾向万分不妥
作为合格的 法西斯
在 ruby in domain 的论坛, 尊重 ruby 是有个人修养的体现,重度尊重是有行业智慧的体现,而讨论 Node.js 是 open 的体现,也是宣传和繁荣的智慧。
着眼中长期利益的 web 技术站,似乎还是 Ruby on Rails
仅待她如伴侣...
似乎又有写一篇公众号的冲动...
坛子里的码农追求的可不是稳定的收入,而是快速增长的收入。坛子里也有老板,深刻知道现在 Ruby 招人有多难。
尊重 Ruby 也不等于不能指出 Ruby 的局限性。说到 Ruby 的优点,优雅和让程序员快乐并不是让项目优秀的必要条件。反而 Ruby 的动态特性造成很多 bug 只有上线后才能找到,超过 100% 的测试覆盖率也不能保证。
根据适合的业务场景选择适合的语言,不要跟钱过不去。 我手上的一个项目说白了就是帮别人挂直播频道的在线人数,现在直播那么火。 前端的管理界面、设置界面用的是 rails,这个没话说,确实快捷方便。 后面的具体挂人数的这个东西,node 实在太给力了,1 核 2G 内存的配置的 VPS,轻松做到 5 万人在线,也就是保持 5 万个长连接。 要是用 ruby 早就内存爆炸了。
ES7 里面的 await,async 确实能让回调写起来方便很多,语义也更简洁明了,其他语言特性也都在演进,没如上所说那样不堪。ES7 虽说是未来版本,但目前 Babel 支持良好,ES6 发布之前,多少公司不照样使用 Babel 跑着 ES6.
从开发便利,社区成熟度,Ruby/Rails 无可挑剔,至少无人可敌,但是你要真想从性能方面来比,随便把当前游戏行业,直播行业拉出来溜溜,绝对是 Java/Node 完爆。
另外,不要把不熟当作槽点,你两天没把 Login 功能搞定,就吐槽 Nodejs,那如果换过来,你先入 Nodejs, 后入 Ruby/Rails, 也两天没搞定, 你是不是也跑到 Node 社区把 Ruby/Rails 吐个遍。。。。。
我也觉得社区法西斯主义越来越强,观点略同的拉到一派把观点不同的当作敌对。
Ruby/Node 我都喜欢, 这么说不是怕你来喷和稀泥,心性如此,不同场景,做不同选择。