公司不愿意用 ruby 说根本招不到人。程序员不愿意学 ruby 说根本找不到工作。我是挺喜欢 ruby 的,对 ruby 不火感到很遗憾。
ruby 的高开发效率是建立在用 ruby 的程序员能有比较高的个人素质上面,一个新手要能够成为即战力需要很长的时间。于是更加没有公司愿意培养 ruby 工程师了,一来需要的入手时间比较长,二来还需要这个人具有一定的潜力,从头培养根本划不来。不靠公司培养,新鲜血液全靠一些爱好者自学,这种生态真的很令人捉集。
大环境是还缺乏一些新的业务的增长点,最悲观的情况下,我个人判断 Ruby 最差会成为下一个 Lua。
写 Rails 的话其实也不用担心,起码北上深是不会愁工作的,论坛的招聘帖也集中这些城市,而且交流下来看的话是供小于求。
我个人另一个判断是现在 Web 行业处于转型期,WASM 还有 PWA 对于 Ruby 还有其他有兴趣做应用开发的语言都是新的机会,而且前端社区现在火的框架也在发展 SSR,最终可能会造成一种轮回
还有一个是,我相信 Rails 在企业级系统上会有很大作为,这种系统的特点是 业务复杂、对 UI 要求不高、需要配合公司管理模式长期迭代。
Rails 支撑多变的业务需求还有很大的发挥空间(我刚在公司做了这方面的分享),但是在社区层面缺乏总结。
我们现在是在做类似这样的项目,UI 从一开始定稿之后出新需求都是直接套 但是需求变得很快。。我潜意识里还是认为 rails 适合做小而美的网站。。这是我的偏见吗
(先声明:我现在说的都是主观观点)
我觉得 SSR 反而是拉回正轨了,JS 不是不可以一统天下,可以让 JS 接管和用户相关的工作,有微服务的加持下,后端让合适的技术解决合适的业务(Spark 做数据平台,Go 做 实时,Java 写业务系统等等),然后 JS 把这些离散的业务系统串联起来,再展示给用户,相当于现在的后端更后,让 JS 的“服务器端”做“后端的前端”(有点绕),这样产品形态(UI/UX)的变更就完全交给前端开发来完成了,按照产品的需要来组合后端提供的各种服务。
在这个模式之下,后端开发专注于实现业务,精进后端的技术栈。前端开发掌握 SSR 为了更高效的实现 UX,又避免了学习过多的传统后端的技术栈(在目前的形势下,前端即使有了 node.js,由于前端开发没有系统的受过数据库等后端技术栈的学习,实际上是给很多项目造成过负面贡献的,相信不少后端开发有这个体会)
我觉得这才是正确的道路。
Rails 的 SSR 能力非常强大,这就和 JS 的发展路线产生了冲突,目前来看 JS 或者说前端社区赢了,现在的前后端分离,Rails 的 SSR 能力等于废掉。
再看表达业务逻辑,做业务逻辑的精髓在于,精确地表达,即使是 Ruby,惯例上,也提倡不要炫技,用最朴素的代码去编写,根据我的经验,这个时候,代码量上 Ruby 不会比 Java 少多少,这就造成另一个尴尬,Java 的人好找,Go 的性能好,不如直接用他们了。
虽然看业务逻辑上语言的优势可以忽略不计,但是为了支撑表达业务逻辑,不同的语言、技术带来的生产力差异是非常大的。
比如 ORM 领域,ActiveRecord 可以称为地表最强。
.Net 的 Entity Framework 可以说一般场景下不输 AR,因为 EF 有地表最强 IDE VS 提供工具支持去方便的生成模型的代码,并且在 C# 的 partial class 的支持下,可以对开发者隐藏掉这些生成出来的代码,让代码组织更干爽,在 C# Linq 的支持下允许写出类似 AR 的链式查询或者用类 sql 的 DSL 去查询,灵活性甚至胜了 AR 一筹。
但是 Java 的 Hibernate 呢?手动声明字段,Migration 不管,Getter、Setter 自己搞,甚至还得学个 HQL。
为啥 ActiveRecord 只在 Ruby 上有,其他语言抄不走?因为 Ruby 提供了必要的基础设施。而 ActiveRecord 已经可以称为一种 pattern 了,是 pattern 导致的开发效率的差距。
一个例子就是,我最近在公司内部、在论坛、在线下聚会都在推我写的 form_core 还有他所采用的 动态虚拟模型生成 的手法,我们都知道 AR 的模型(或者说数据结构)很容易使用,包括数据验证等等常见的需求都满足了,但是 AR 的模型只解决静态的数据结构,动态的数据结构呢?比如类似京东,不同的商品类型的商品参数是不同的且由用户去定义。这个场景很常见,比如过去我在知人,员工的档案需要 HR 定制、工作流的表单也是用户定制的,我也研究过 Redmine 任务的字段也是可以定制的,但是他们在解决这个场景上做法就很传统,Java、PHP 任何语言也都那么去做,那用 Rails 还有啥开发效率优势?但是用了我的动态虚拟模型手法就不同了,动态定义的数据结构最后转化成一个符合跟 AR 一样的模型,类似数据验证直接交给模型去处理了,不需要额外的开发工作,开发效率自然巨幅提升,而且扩展性、代码可维护性也有保障。
而这个手法也是来自当时解决工作的灵感的总结,所以我就产生了年头,如果关键业务场景的解法能总结成模式,那么生产力重新和其他语言产生代差,会不会在现有条件下(没有新的增长点)让 Rails 再热一次?
举个例子,最近我收到很多帮招人的邀请,是做数字货币的交易所,为啥。。。因为 貔貅 是世界上唯一一个开源的产品级交易所
我们项目目前也有这样的需求,就是一个模型部分字段是通用的,但是有一部分是不相同的,我们是把不同的部分存成了一个 jsonb 字段。动态虚拟模型应该是有普遍需求的!
可以看看 https://github.com/jasl-lab/form_core 的 dummy 能做到的效果,我发现还有很多点可以去总结的。
另外我昨天还跟同事感慨,现在分享 Rails 使用技巧的帖子越来越少了,我自己也在想,这么多年来我自己独创的技巧估计都有不少了,但是我主观上有惰性去总结成帖子,因为感觉这些别人不知道其实也没啥影响,但是模式是能够带来巨大生产力差距的,值得去推广
@jasl 我支持你做一个类似 RailsCasts 的分享(不一定是视频哈,文本就好),你是 Ruby 圈的领头人,我们都愿意跟你走!我也曾有打算做分享的想法,但是由于工作原因(现在更多做业务吹牛逼去了)做不了,但是很希望 Ruby 圈子有更多优质的内容出来,聚集更多的人气。
首先如何定义“尴尬”?
如果从创始人的野心来看,Rails 更尴尬。Ruby 本来就是定位为取代 Shell 和 Perl 的脚本语言,能取得今天的地位难能可贵。而 Rails 定位为 SaaS 框架,在当前 SaaS 不再流行的大势下逐渐暗淡也是没有办法的。
可以总结一下现在论坛里对 Ruby 的赞美,无外乎“Ruby/某框架的思想先进”,或者“Ruby 让人快乐”,我觉得已经偏离了 Ruby 能不能做好的项目这个初衷。个人感觉 Ruby 没有静态类型检查,性能差和难于部署等缺点阻碍了 Ruby 项目的质量。现在越来越多的人意识到,软件部署只是软件开发的第一步,Ruby 已经越落越远。
我今天本来写了个帖子的,后来忘了 Submit
姜叔叔 @jasl #12 楼的答案,其实 已经接近我想说的
我当初介绍 Ruby 好处的时候,其实有一个核心的地方就是【它是动态的】,这一点在所有强类型语言中都能 get 到他们没有的好处。
ActiveRecord、元编程的核心在于【动态注入】。
然而,所有的静态编译语言,在编译的时候都要做一件事情:行为检查。
这件事情,让静态语言没办法动态地为一个对象添加方法同时能在后续的代码中写出直面调用的代码。
比如,ObjC 允许你在 Runtime 注入一些东西,你可以给 obj 注入 getAttribute 到 Runtime,但是你在代码中写 [obj getAttribute] 是直接编译不过,告诉你 getAttribute method 不存在的。
Ruby 作为动态语言,就像 JavaScript:
var obj = {};
obj.name = 'test';
obj.age = 1;
obj.getName = function() { return this.name; }
你是可以为 obj 注入 getName,并且在下文马上调用它。
name_of_obj = obj.getName()
“这将允许你进行对象的后天编程,让喜欢抽象的程序员留了一大片自由幻想的天空。”
——《谈谈我对 Ruby 的看法》
文中给了例子,我在这里再贴一遍(单例类):
class Parent
def say_hello
p 'hello'
end
end
child_a = Parent.new
child_a.say_hello // 孩子会父母的说 hello 行为
# 孩子 child_a 后天自己学会说 bye
def child_a.say_bye
p 'bye'
end
child_a.say_bye // 说 bye
child_b = Parent.new // 父母又生了个孩子
child_b.say_bye // 但是他不会说 bye
我在那篇文章话浅,但指代的含义很深,如果有广泛编程经验的人,他们一定理解我说了什么。
JavaScript 现在比较火,吾辈看来,也是的得益于它无尽的抽象灵活的能力,它不需要太复杂的 OOP,能够像 lisp 那样轻而易举以 scope 撬动整个抽象出层层叠叠的多次元的世界。
可参考:为什么说 JavaScript 是披着 C 外衣的 Lisp? https://www.zhihu.com/question/20423080
很荣幸的是,Ruby 的单例类赋予了开发者这项能力。
所以,在写 Model 的时候,不用再去担心语言有没有像 ObjC 的 @property 辅助性设施帮你 sythesize getter setter,也不在像 Java 的注解辅助性给开发框架的人对属性 alias 或者别的操作。
残念,这些一切的一切,Ruby 元编程默秒全~
只能说,偏爱 Ruby 的,已经成为大叔,他们在承担起创业的重任,家庭小孩的责任,没有太多的时间叫嚣“Ruby VS xxx",但并不代表 Ruby 不火了。
能干什么事情跟语言没关系,是有人写轮子,没有 Rails 那 Ruby 还是能写 Web,只是不会有太多人去用的 Ruby 写 Web 了
我跟人觉得吧,现在许多人都有一种思想误区要特定语言才能干某些事情(当然也有些 DSL 是这样),当你说你想写爬虫很多人都叫你去写 Python,你想做 CMS 别人的第一反应会是 PHP。但像 Ruby,Python,Java 这些通用语言基本上可以满足日常的开发。Ruby 难找工作我也深有同感,拉勾上的招聘贴 Javascript 的数量比起 Ruby 多了何止 30 倍,作为一个开发者,我们似乎没有办法去控制 Ruby 的火热程度,就像我们没用办法控制 JavaScript 的火热程度那样(或许去开发各种各样的框架是一条路,但 Ruby 社区的人似乎更愿意去维护一个好用的框架,而不是去开发各种各样的框架让别人无从选择)。我现在在做前端开发,但是并不妨碍我对 Ruby 的喜爱,如果真的找不到 Ruby 相关的工作,我倒是愿意在工作之余的时间一些 Ruby 相关的东西,如果有机会给社区做点贡献也是很好的。
非工业化语言,又没有 AI 加成,在个人开发者群体还算受欢迎,未来可能还不错的发展是 ruby 能进一步在个人开发者和小型创业公司流行,这就要靠社区大众努力的"忽悠"了..