大家好,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 我都喜欢,这么说不是怕你来喷和稀泥,心性如此,不同场景,做不同选择。