我的答案:
这些因素,导致我在有工作压力的情况下,实在是腾不出时间学 Ruby(虽然自己很喜欢)。
Python 本身是做不了大数据、机器学习、深度学习之类的,现在它能做是因为它适合做胶水语言,调其他的轮子。其实 Ruby 也可以做到,只能说 Ruby 运气没有那么好。
启动 java 项目的时候,我总是在想,到底要不要传环境变量,这个环境是 dev 呢,还是 development 呢?schema 在哪呢,要怎么跑呢?
我写了小 100 行的 Java 代码,搞了一个批量获取的 API,RoR/Grape 10 行可以搞定吧?
Clojure 呢,语言本身不支持 debug。。。先完成什么,都靠干撸,都撸秃噜皮了,一手老茧。
有测试、开发环境的还好,很多都是没有的。。。
目录结构,完全看项目搭建者高兴。debug 都是从头 debug 到尾。
以后也许还会用 ruby,但作为工作语言估计没什么机会了,ruby 也就能做 web,但是即使在 web 已经没有太大优势了,不过 ruby 写起来真是舒服。
Ruby 比较适合的不是面向工资编程,而是面向收益编程。也就是说你用 Ruby 做了一件事,这件事有很大收益,包括但不限于 money,而大多数人为了工资,那肯定坚持不下去。
再者目前缺少大佬推广,为什么呢?现在阶段比较热的是深度学习,谁在这个阶段想把 Ruby 强推起来也难。谁叫 Matz 押宝的不是机器学习而是嵌入式呢?(毕竟日本是电子大国基因)。而对于业务系统而言,虽然我认为 Ruby 比 Java 更适合,但 Java 的以下特点稳固了他的霸主地位:
再看现阶段互联网、软件行业,主要处在业务系统填坑期,所谓“互联网+”也就是传统行业有大把的业务坑要填,这个阶段的最大诉求是“解决问题”,而 Java 的以上三个“工业语言”特性,来填坑最适合。Ruby 就不要在这里竞争了,Ruby 语言本身的“解决问题”的能力虽然也很强,但解决不了工源问题。而在大厂里面工会运动搞你也是分分钟的事。搞 Python 的还能说我做深度学习最好呀,Javascript 还能说有本事你写浏览器程序呀。Ruby....猝。
Ruby 的优势是 创造性生产 。但从 Ruby 语言本身来讲,恢复火爆取决与以下几个条件:
市场上“业务填坑”需求基本慢慢饱和,转而需要创造性生产的时候。比如之前的 web2.0 时代初期、移动互联网初期。当某阶段老的领域已经逐渐饱和,已经很难靠 Farm 挣到钱了,新领域的淘金运动开始,Ruby 和 Rails 的各种优势又能被无限放大。运气好的话出一个 Facebook 大厂,差一点能出个豆瓣这样的中厂。
内置/第三方 JIT 引擎性能开始爆炸,加上 Ruby 语言级别的良好特性,导至各种高性能领域期望使用 Ruby 作为首选胶水语言。
Ruby 押宝方向大爆发,比如之前押宝的嵌入式。(然而嵌入式这个方向难度还是很大的,毕竟比较硬,需要时间积累,高爆发领域还得是软一些的)
以上 3 个条件任意同时满足 2 个,加上大咖的宣传,即可恢复荣光。但即便如此 Ruby 仍不是工业级别 Farm 的语言。不建议 Rubyist 面向工资编程。
现在 Rubyist 应当考虑的是,找到自己愿意深耕 10 年以上的行业,这里说的行业不是互联网、软件,而是垂直行业,无论汽车、O2O、教育、服装、奢侈品、金融,或者更加细分的领域,深入其中,利用好 Ruby 的创造力,去创造工资以外的收益。当然就顺便就创造出了一些工作岗位。当然你也可以积累好 Ruby 的技术和团队,等下一个爆发的时候,可能你就是大厂的大佬。
因为 ruby 诱惑,节省脑力、体力,有美感 要是有 erlang 的并发能力就好了,话说 autofiber guild 什么时候加进来啊。什么时候 truffleruby 能用于生产啊。对未来还是有期待。
昨天我的好兄弟在实现一个比较复杂的业务逻辑的时候感慨了一句:还好是 Ruby. 这点我也很感慨,Ruby 的语音表达能力确实很强,我觉得写需求文档应该是 Ruby 最适合的场景,
比如数据库里有 users 表,提供这样一个 API,一次可以拿 1000 个。 多次调用 API 后,可以拿到所有的 users。
38 岁,高校实验员,从 perl 过来,被其优雅吸引,会写些数据分析和文本搜索的脚本,简单网页。希望 ruby, 或其继承者 crystal 变得更好。
这个是 ORM 的功能不是 springboot 的功能,使用 jpa 的话直接写方法名就能实现一条查询语句。而其他的 ORM 比如 nutz dao
之类的也不是随你喜欢用,总有一款适合你,毕竟有太多 java 实现了。并且只要支持 jdbc 的话让其支持 clickhouse 之类的也都能很方便的实现。(话说就没人想弄一个更好的 ORM 出来么,汽车引擎在怎么厉害也没法升级改造成跟飞船引擎不是
java 的累赘其实在于各种编程思想,比如需要定义一个借口跟其对应的实现类之类的,并且这方面因为所谓的业务代码的积累没法一下改变(我这 4、50 岁的大哥还在干编程相关的活,只不过是要不写 COBOL,要不写详细到方法名变量名的设计文档
我误以为 spirngboot 和 ror 一样是个全家桶。。。
既然说 orm,我们就把问题放在 orm 里讨论。
现在的问题是:遍历一样表,考虑到内存,需要分批次获取。
方便给代码吗?随便哪种 orm 的都可以,伪代码也行。
我知道 java 可以这么写(这种方法不是最好的,想知道更好的方法)
@Query("SELECT * FROM users WHERE id >= :startId"
+ " and ORDER BY id ASC LIMIT :limit")
List<User> getBatch(@Param("limit") long limit,
@Param("startId") long startId);
public List<User> getBatch(@NonNull Long limit, @NonNull Long startId) {
List<User> users = this.dbRepository.getBatch(limit, startId);
return users.stream().collect(Collectors.toList());
}
要遍历所有的,外面还要有一个循环。。。
RoR 里面,这么写
User.find_each do |user|
end
一样的功能,一次拿 1000 条,我忘了可不可以设置 1000 这个值了,但这个值一般没必要改。
如果确定是要遍历完,用 cursor 就好了,直接 jdbc(或 jdbcTemplate),不要 orm 了。 像 hibernate/JPA 这样的 orm 是有 session 的,遍历完一个表,session 都爆炸了。除非你每一批都打开新的 session,完成时关闭。
求代码,伪代码也行。
ror,不会内存溢出,因为每次拿 1000 个,就是上面的代码。
直接遍历,是每个都查一次 sql?数据量大一点,会很慢。
学 rust 中,不过商城啥还是用 ruby,有时为了方便用 go 写接口,rust 还在学,主要没啥好的 web 框架,go 直接拿来就用,就是 if err != nil 写的蛋疼
find_each 方法有一个参数 batch_size,默认为 1000,这个值是可以动态指定的 ,比如:
User.find_each(batch_size: 500). do |user|
end
find_each 是 order by 主键的,加上排序会有问题。 送你一个带 order 的扩展
class ApplicationRecord < ActiveRecord::Base
self.abstract_class = true
def self.find_eachs(limit: nil , batch: 1000 , order: :id , &block)
count = 0
last_offset = nil
next_break = batch
data = self.order(order).limit(batch)
until data.blank?
data.each do |dt|
count += 1
block.call(dt)
last_offset = dt.attributes[order.to_s]
break if count >= next_break
break if limit and count >= limit
end
break if limit and count >= limit
next_break += batch
data = self.where("#{order} > ?" , last_offset).order(order).limit(batch)
end
count
end
def self.find_each_datas(limit: nil , batch: 1000 , order: :id , &block)
count = 0
last_offset = nil
next_break = batch
data = self.order(order).limit(batch)
until data.blank?
block.call(data)
data.each do |dt|
count += 1
last_offset = dt.attributes[order.to_s]
break if count >= next_break
break if limit and count >= limit
end
break if limit and count >= limit
next_break += batch
data = self.where("#{order} > ?" , last_offset).order(order).limit(batch)
end
count
end
end
Java 写 web 还是给那种超大工程或者时间太多的人用的,Java 那套设计模式真的非常不友好。有那些时间还不如学学语法糖。 高级语言是给人设计的,人生苦短,我更爱用以人为本而不是以机器为本的语言。
有时候遇到暴涨的流量,用 elixir 还是省心不少的,比如我这个小项目,一个月内从上线到流量暴涨到千万以上一天,用 elixir 相对 ruby 省心不少的。 视频录的不是最高峰值,最高时候近 10 万用户同时在线。
elixir 性能是比 ruby 强太多,用过一阵,发现 go 更简单些,主要 elixir 学了还要再学点 erlang,我一看 erlang 头就大,
Umm。。。每次在 eclipse 里找各种按钮各种点一遍,controller 里写一堆 url,想直接返回个 executable javascript 我还得各种尝试,想死的心都有(别误会,没有贬低 java 程序员的意思,我只是说一下自己作为一个 java 小白的直观感受)。
如果是自己的项目,果断 Rails,能让我快速实现自己的想法而不至于陷入一些无关紧要的技术细节,即使周围的人都在学 java 用 spring,我还是坚持 Ruby,Rails。
个人观点,当年 Ruby 因为 Rails 而火,而如今已是 Nodejs 支撑下的大前端世界,Rails 这种全栈框架已经失去了自身的优势,前端已经不需要 Rails 参与了。
后端?不管你高不高兴,后端仍然是 Java 的天下,倒是可以和 PHP 竞争一下。 运维?也没 Ruby 什么事 AI?那是 Python 的天下 其它场景也好像没 Ruby 什么事
所以,很尴尬!
的确现在大前端是主流了,我自己的阅读产品也是 Angular(内容制作端和微信端)。不要大前端,稍微复杂一些的做起来就很受掣肘。 但 Ruby 做后端,开发效率的优势还是很大的。个人和小团队创业项目,后端语言首选还是 Ruby(除非是特殊领域)。
运维 Ruby 还是非常多的,包括有 AWS 员工献身说法他们内部,包括他前司 Atlassian,内部 DevOps 有很多 Ruby 写的工具,只不过这块的关键点不在语言上,所以也没什么好在社区说的。
ruby 适合小而美的团队,不适合大团队协作,也不是不能协作,而是耗费的成本太高,本质在于语言本身太过于灵活,越是灵活,对人的要求就越高。Java 这样工程化的语言,说实话,对于业务代码而言,不同级别的开发者写出的代码不会有太大的差别,而用 ror 写真是千差万别。不过我还是很喜欢 ruby 的,当前公司有 20 人的 ruby 开发,经历了非常多的问题,已经开始转向 Java,不过不打算抛弃 ruby,做内部服务,业务网关还是很不错的。
脚本语言的特点是高度智能化,特别是像 Python,Ruby 等,因为编程中可以为你代劳的,脚本语言基本都可以做到了,其带来的结果就是,编程更加高效。但编程语言只是工具,思想才是最重要的,语言不过是表达思想的工具。
另一方面,有的语言可以禁锢思想(像 C,C++),有的语言可以开阔思想如(脚本语言),简单的说,语言的结构特性也限定了你的思想结构、路线。
热爱计算机编程的人,其实不在乎语言的优劣,因为各种语言各有特点,细分场合应用更明显,例如 C,C++ 更适合嵌入式开发、系统开发;脚本语言更适合复杂业务的程序开发。
我在编程世界中浸淫已有七八年,各种语言都有接触,从最初的 Objective-C,C,C++,到 Python,C#,php,Java,JavaScript。现在在学 Ruby。
于我而言,没有坚持使用或放弃 Ruby 或某种语言的说法。理由是明显的,各种语言各有所长,选择其中适合的去开发项目。例如,我最初是做手机 iOS App 开发的,那时自然是使用 Objective-C;后来做 Windows 桌面程序开发,用 VC++,C#; 开发一些辅助的小程序,用 Python;做网络相关程序,用 Node.js;做安卓 App 开发用 Java;做网站开发用 php,JavaScript。
虽然,我用过的语言很多,并不是特别专精于某一种语言,但每种语言我都胜任相对于适合它的项目开发;这是因为有了网络搜索这个巨大的工具,获取某种语言相关的知识或解决某种语言相关的问题,可以说豪不费力。
做编程,不应该死死望着那点工资;而是,编程应该带给你乐趣和成就感。
Ruby 在国内市场并不主流,不过用的人也不少,工作岗位也不少。 但是个人已经不再使用 Ruby 了。Ruby 确实带来了一些欢乐,但是个人更喜欢函数类型的语言。 所以恰饭用 JS,写 React + RamdaJS + RxJS。 爱好用 Erlang,Lisp 和 OCaml。
ruby 只有北上广深,买不起房,学门老家有的技术继续当程序员。可能这么说比较 low,但应该说出了大多数换语言的 ruby 同学想法。 别说爱好别说情怀,没有工资拿一切都是故事。
ruby 不适合拿来赚工资钱了,事实就是:市场对 ruby 的需求非常少了! 但是,ruby 非常适合个人、小团队做创业性的小项目,其实就算不是小项目,百万级用户的项目也没啥问题。 就拿我个人来说,和一些朋友做一些小项目,我用 ROR,后台我一个人写就 OK 了,而且业务代码量也不少,但是用 ruby 一个人足够了。
ruby 适合小而美的团队,不适合大团队协作,也不是不能协作,而是耗费的成本太高
这句话同样用在 PHP Python
最近公司用 Py 写的项目,我真的不想吐槽…… class 没写几个,全都是 dict 一个个拼的,随意 import,全都是 function(data) 式的编程你干嘛不回去用 C,然后 dict 你都不知道上下文是啥,因为它不是 class 没有固定的 attribute。
Py 的对象还很另类,不 protected 然后 getattr setattr 作为属性寻找链很……
Ruby 比起 getattr setattr 更倾向于 method_missing、send,而且区分开方法和属性
Python 对于新学编程的人,是很简单,但是你用来写项目的时候,ORM、写几层封装你就知道什么叫蛋疼,注入麻烦而且死板,词法格式生硬。
很多人说词法生硬的代码才好维护,屁!谁说的!
本来可以通过 type_cast 顺势去递推逻辑的,显得很反射很 IoC 或是很 Design Pattern 的事情,Python 让你手足无措,只能老老实实写百行的 if else,层层嵌套多了拆成单个 function,function 写多了找得变态般的蛋疼。
如果只让我写 if else 和 function,我宁可用 C 语言,因为至少同样的语法 C 性能比 Python 好,另外还有 Go lang,所以能写 py 不如写这俩货,我根本不知道现在 py 流行在哪儿,估计不过是 tensorflow 选择了它作为 wrapper language 吧。还有它确实不 OO 的话比其它语言要更容易入门。但真正要写 project 要维护要更可读更便捷还是要用点技巧的。
Python 一句我撒手不管了我就让你什么都写不了只能写 if else 那就是好维护?
Sorry I don't think so~
阅读者看了一堆 py if else 之后可能还没进入主题
function(self) 这个梗……
lambda 只能一行写个短的
很多语句因为太长,pep8 linter 一开逼着你换行之后,你会发现丑得很难看
公司换用 go、python 或者说他俩流行我觉得最大原因是这俩货之前在上个十年没流行过,国内的技术选择是以资金为导向的,然后我觉得就是男的换个老婆,女的换个老公一样的事情。别人家的老婆 or 老公都是香的。
而且以国人的口味,也就是看别家孩子有什么自己就像有什么吧,所以跟风,而且还很容易冷落一些不被关注的东西。
归根结底还是 因为你穿着不主流的东西在国内都是被歧视的。
之前学习 Rails 的路径可能不对。Rails 对于我这样一个业余的、时间精力有限的开发者来说,实在太复杂、变化太快了。不管是开发、部署还是维护,Rails 总能给我带来各种问题,让我陷入困境。 回过头来看,正确的学习路径也许是 Ruby→Sinatra→Padrino→Rails。一门一门学习,一门一门掌握,一门一门精通,直至融会贯通,不管面对怎样的开发需求,都能游刃有余。 发现问题,及时调整,什么时候都不晚。现在就开始学习 Sinatra 吧,简单的需求,本来就应该用简单的工具、简单的方法来满足!
断断续续学 ruby、rails 主要出于兴趣,开始时不知为什么特别关注小众语言,就学了。后来慢慢理解学习一门语言,主要要弄明白它的内部机制和原理,用的多了,接触场景多了,就熟悉了,真正理解他的优势,自然而然就会映射到其他领域,rails 是最好的案例。 现在的框架很多,根本学不过来,但是很多都是异曲同工,只有理解后面的机制和原理,才能形成自己的一套设计模式,产生新的工具和应用,才能把语言的威力发挥出来。出一个框架就学,模仿做一些案例,很难有大的作为,图个热闹而已。 现在明白了,其实不在于学哪种语言了,关键的问题是把这种语言的优势在自己需要的场景里发挥到最大。 最近开始接触 golang 和 flutter,很多基础的原理和 ruby 还是一样的,总之这个世界上除了知识,不会越用越少,只会越用越多。