瞎扯淡 最近的一点小感悟

317583395 · 2017年10月31日 · 最后由 tassandar 回复于 2017年11月02日 · 2833 次阅读

做了几年 Ruby,今年回到成都,发现使用 ruby 的公司更少了,个别使用 ruby 的公司也都不缺人,工作机会少的可怜,有极个别的岗位薪水也比现在的少很多。

转 Java 或者前端?刚转薪水肯定不会高,对 Java 也没什么兴趣。

Remote?或许是一种可行的方案。

或者去北上广,工作机会肯定更多。

要不然去小公司做一个所谓的“技术经理”之类的,也不用写代码,但是估计慢慢的就废掉了。

学了一段时间的 Elixir,最后发现只能自己玩玩,工作机会比 ruby 更少,我所在的公司算得上比较关注前沿技术的公司了,同事们也都愿意尝试各种各样的编程语言技术等,但是身边的同事总是“Elixir 是什么?”

刚上大学的时候社会都在招 Java,毕业的时候社会都在招 Java,毕业几年了已经,社会还是都在招 Java。

相反在一些澳洲的小城市,虽然也是招 Java 的多,但是的 ruby 工作机会也大把,Elixir 的机会也不少。

大家怎么看

肉翻去澳洲

回北京。。

只有我觉得北京用 Ruby 的公司也明显变少了?

我是学 ruby 然后转行做程序员,然后一直做了大概两年 ruby 的 确实国内 ruby 的比较少,澳洲相对比较多 但是如果你打算一直做程序员,基本上很难一直只学一个语言,否则会极大的限制你的自由度。我 ruby 做的好好的,但是后来前端越来越重,事实上写的 js 远比 ruby 多。在实际的工作重难免要去做 SEO,页面优化之类的事情,虽然名义上是 ruby 项目也是实际写 ruby 的时间也会越来越少。并且如果自己没有跟进其他的技术,等到真的做选择的时候一味只知道 ruby 中如何做的,是会比较局限的。

ripple 回复

可能是如此的吧!大多数公司用 ruby 都做什么?请问除了 rails 或者其他的 web 开发,还有其他的应用没?

我在这个帖子 #18 楼回复了:

https://ruby-china.org/topics/34188

LZ 可以试一下加入 C++ 做几年服务端开发,你就知道原因了。

很多 Rubyist 搬弄概念,作为 C++ 开发者、Java 稍微偏向 IO 实现的开发者是很清楚的,因为他们经常要用到直接的 IO 去传输二进制,用自定义的协议,就连 Android 也有 Parcelable,那是为了解决 Activity <=> Activity 等消息传递的 IO Buffer Object。然后怎么 IO 比较快,做了一段时间之后,我发现他们嘴巴根本几乎不提什么 EventMachine,也不会提 libevent,他们更倾向于直接用系统的 API。

如果不想去考虑 IO 模型,可以直接用现成的而且实现得比较好的——Goroutine,或者 Erlang。

但是大家认真看一下这些语言有一个优势——他们可以直接内存级数据序列化,就是 buffer => struct,struct => buffer。

Ruby 本身就有一层 VM 对 struct 抽象成了 Object,而且 VM 还没有实现到 Hotspot 那种层面的指令级内存操作支持。加上一些损耗,效率怎么都比不上的,但是我倒是不理解他们还要往这方面跑。

写写 DEMO 告诉大家,噢是这个原理,还是不错的,可以学习一下,但是他们又不喜欢 DRY。你们去看看 midori 有几行代码自己写的 IO,连模型都是用人家的模块引入进来实现的,然后就把别人模块(比如 EventMachine,那是别人用 C 先写好的模型,然后 Ruby 加了外壳包装)的概念搬到自己这里介绍。

所以我才说有炒作之嫌,就是实际上是玩具,性能任何一个游戏服务器都比不上,先别说游戏级的,就普通的服务器框架比如腾讯的 Tars 都不如,不对,应该说根本提不上嘴,不足挂齿,说出来作者都有强烈羞耻感才对。

估计是 Rubyist 过于浮躁,总想着出名吧。

RoR 好歹是踏踏实实做他正在做的事情,哪怕 Twitter 不要它。但是 Ruby 在慢查询、一般条件需求的情况下,它在很认真的做事。

吾认为,Elixir 不能和 Ruby 相提并论,Ruby 早期发明的时候参照了 Python,难不成 Python programmers 整天嘴边搭着 Ruby?

心态很重要,你到底想要什么,想做什么。

其实 C++ 在某些方面并不比 Java 高效,大量的 new delete 等系统调用很耗,还不如 JVM 有对象池、GC 高效利用,在你开发大规模业务型程序的时候,你会发现 java 优势的明显。

所以如果是做大数据、业务系统等方向的,还是选择 Java 好一些,如果公司有硬件方向需求的,比如 GPU 调用、一些设备调用的,就用 C++ (GPU 一般就是图形,这用在。。。我想说什么你们应该猜得到)。

请原谅我的言辞。

jakit 回复

因为他们经常要用到直接的 IO 去传输二进制,用自定义的协议

IO 传输协议跟 EventMachine、libevent 有什么关系?

但是大家认真看一下这些语言有一个优势——他们可以直接内存级数据序列化

跟语言有什么关系?什么叫内存级数据序列化?

而且 VM 还没有实现到 Hotspot 那种层面的指令级内存操作支持

什么叫 指令级内存操作?

写写 DEMO 告诉大家,噢是这个原理,还是不错的,可以学习一下,但是他们又不喜欢 DRY。

你当初不这么说的啊...

你给公司用 DEMO?你公司心得多大?DRY 是什么的缩写来着...你讲讲你的代码哪里体现 DRY 了?

你们去看看 midori 有几行代码自己写的 IO

不造轮子,这不就是 DRY?再换位思考下,你之前写 iOS 为啥要用 Cocoa 不学学 Facebook 从 CoreGraphics 绘制写起来?

所以我才说有炒作之嫌,就是实际上是玩具,性能任何一个游戏服务器都比不上

还真别说...10 - 12 年那会用 Ruby 写页游的多了去了... 那时候 Ruby 的性能比现在差多了,所以性能还是比得上某些游戏服务器的。

此外,是不是玩具看得是性能?

吾认为,Elixir 不能和 Ruby 相提并论,Ruby 早期发明的时候参照了 Python

错,Ruby 受 Lisp 影响很大,你为什么不多读读书呢... Matz 写过很多关于 Ruby 设计的书和博文出来,国内也引进过几本

其实 C++ 在某些方面并不比 Java 高效,大量的 new delete 等系统调用很耗,还不如 JVM 有对象池、GC 高效利用,在你开发大规模业务型程序的时候,你会发现 java 优势的明显。

难道 Java 的 new delete 的消耗就小?Java 还没值类型呢。C++ 不可以有对象池?不可以有 GC?

8 楼 已删除
Freeman1990 回复

Ruby 广泛运用在 iOS 的工具链上,于是乎据我所知,像美团这种不依赖 Ruby 的公司,内部也有 Ruby 团队,用于内部工具链、CI 的建设

jasl 回复

感谢回答。之前一直做 C 的。上半年开始的一个项目,主要以 Ruby 为主。用起来真的是很舒服。也用过 python,虽说也比 C 方便的多,但是感觉还是 Ruby 真的是比较“有趣" . 但是职位是真的少... 。看了好多招聘的,大多都是要 Rails 的经验。所以有了之前的疑问。

去澳洲砌砖,一块一刀,都去澳洲了还写什么代码。

jasl 回复

我当然知道 C++ 对象池,但是开发效率肯定没有 Java 从头到尾你不用担心这些的情况下更安心处理逻辑那样高,就像 ARC 引入了 ObjC 之后,你就可以从代码上少出现那种逻辑,更明了地去处理业务逻辑。

蜀黍别生气~ 我知道我的东西也不见得不玩具。但是起码我不会这么做(笑),我目前还没有把它公开呀。

【指令级内存操作】我指的是 Jazelle 可以通过指令集级别去进行优化中间代码,Ruby 好像没这个玩意吧,YARV 能跟它比吗。

再换位思考下,你之前写 iOS 为啥要用 Cocoa 不学学 Facebook 从 CoreGraphics 绘制写起来?

我最近确实在学习 OpenGL,正在做一个图形库,想取代 cocos(其实我又跑去招惹另一帮人了),所以很少在 ruby 社区卖萌了,噢对了,MooTive 部分控件确实有用 Core Graphics API draw 的。

内存级数据序列化

我想表达的是 struct 很轻,但是如果你把 IO 的 buffer 解析序列化成 Ruby Object 的时候,损耗很大。而且很依赖 C,还不如从头到尾用 C 写。

别森气,我只是提点想法

没想到有这么多回复,作为开发肯定不只掌握一门或者几门编程语言,就像医生一样,专科医生肯定也有其它科室的知识,差别只是对哪个更专罢了,学会一门编程语言不难,用一门新的语言做个“不复杂的东西也不难”,难在新学的语言的最佳实践、范式、还有一些概念性的东西,比如就 JavaScript 而言,我个人觉得“精通”JS 要比“精通”RUBY 要难很多,除了语言本身还有各种框架,React 和 Angular 的哲学就不一样。

我看过个别工作 N 年的后端开发,声称 JS 玩得 6 的,实际上代码写出来东拼西凑,不知道是从哪里 copy paste 过来的,能干活和能干得漂亮不一样,对我们这些大多数“智商一般”的后端开发来说,要成为一名合格的前端开发,还是要有很长一段路要走。

就 ruby 来说,同样也有一些多年 RUBY 开发经验的程序员写出的代码不忍直视的。

感谢 6 楼这位兄弟的回复,我非常同意你说的 心态最重要,你到底想要什么,想做什么。其它的内容如果讨论下去可能会造成大家的“不适”,建议就此打住吧。

有位兄弟说北京的 RUBY 职位也变少了,搜了一下北京招 ruby 的大公司貌似也就那么几个。

其实我最想吐槽的是,为什么到处都是 Java?

317583395 回复

JS 跟 C++ 一样能处理字节流,就是很麻烦,转成 Array 处理 uint,Perl PHP Python Ruby 用 pack 来包数据,而且 PHP 的 pack 也是转 Array,Ruby 这里社区有一个帖子不也是 [] 运算符处理二进制其中序列某 byte,另外它的转换产出我记得也是个 Array。

https://ruby-china.org/topics/34437

只要你熟悉其中一个工具就够了,能做的功能基本上都能做,JS 只是受浏览器兼容制约,不同的浏览器对 ECMA 实现程度不一。反正吧,fill 一下 shim 一下,各种风格爱好的人也参差不齐。

而且不能评价。因为不同的人有不同的价值观、趋向,所以不要下结论,喜欢用什么就用什么,就像商店那么多衣服,总不可能说买某一件才是最理智啥的,每个人有不同的判断观点,自己喜欢某一件就好。

我在发表的观点里面有陈述:

在某些方面并不比 Java 高效,大量的 new delete 等系统调用很耗,还不如 JVM 有对象池、GC 高效利用,在你开发大规模业务型程序的时候,你会发现 java 优势的明显。

所以如果是做大数据、业务系统等方向的,还是选择 Java 好一些,如果公司有硬件方向需求的,比如 GPU 调用、一些设备调用的,就用 C++ (GPU 一般就是图形,这用在。。。我想说什么你们应该猜得到)。

一般的情况下,你对硬件没有啥要求,你又不去频繁读写 fd,不去做 USB device IO,C++ 就发挥不了优势,templete for Object pool 委托,也就是上面他说的对象池,实际上并不是万能的,其实现代的方法应该是 dynamic pointers,但是据我所知,基本上 C++ 开发他们都不喜欢用这种,而是几乎尽可能静态、语法 scope,也就是限定在某个地方用,需要别的地方稍微调用一下的就引用(refenrece),因为这样效率高。

我说的 new delete 只是一个方面,实际上系统调用还有很多,Linux API 书有多厚就有多少,Java 好处明显就是你不用去关心 System implementations,更不用把这些行为 behavior 的代码写到你的源码文件中,因为它已经帮你 wrapping 好了,你只需要把 Java 的这些对平台抽象的 API 接起来。

所以,不仅仅是 GC,从【系统实现抽象】方面也是一个优势。

.net 刚出现的时候,不是声称要做一套与系统无关的抽象平台吗?就这么回事~

还有的就是,脚本语言都是动态的,它们的代码基本是靠上下文、具有一定强度的衔接,我不记得怎么表达了,假设 Ruby Perl 都是这个对象依赖另一个对象的某个方法,然后直接就调过去,如果另一个对象没这个东西,大不了也就是终止运行,就是错误没有静态语言那种首先声明好大家该怎么协调,然后再进行通讯的法则好。

所以才会诞生 Crystal language,像 PHP 开发往往习惯性各种灵活的反射而数据结构变得很模糊,几乎只有写的那个人自己知道那个 scalar 是什么。

JavaScript 的分流 TypeScript 也是为了实现这一种严格类型系统,确定类型。我觉得最大的好处还是方便查阅,别的开发者看到这个东西,就知道你这个 interface 接上我的 class 需要什么 data。

jakit 回复

首先,你不要回避我的问题啊,我列了那么多条呢。

你说的开发效率我不谈,这个东西没有可以对标的案例量化。

【指令级内存操作】我指的是 Jazelle 可以通过指令集级别去进行优化中间代码,Ruby 好像没这个玩意吧,YARV 能跟它比吗。

你这个 好像 用得点睛,答案是有,YARV 好歹也是个虚拟机,就算你不愿意在 Google 上多找找资料你也得知道常见如尾递归优化吧,本坛有很多论坛讨论 比如 https://ruby-china.org/topics/5351

其次,字节码层面已经很难做复杂的优化了,但是 Ruby 暴露了自己的 Parser http://ruby-doc.org/stdlib-2.4.2/libdoc/ripper/rdoc/Ripper.html 导出的是 sexp 风格的 AST,在此基础上可以做的文章就多多了

另外 Ruby 本身强大的动态特性导致他绝大多数应用不需要在字节码、AST 层面执行,而 Java 不在这个层面很多事情非常难搞,比如 DI,即使对标的 C# 在 .Net 平台上也用不上 Spring 这样的框架。

我最近确实在学习 OpenGL,正在做一个图形库,想取代 cocos(其实我又跑去招惹另一帮人了),所以很少在 ruby 社区卖萌了,噢对了,MooTive 部分控件确实有用 Core Graphics API draw 的。

跟我说的没有关系,我也不关心你在做什么

我想表达的是 struct 很轻,但是如果你把 IO 的 buffer 解析序列化成 Ruby Object 的时候,损耗很大。而且很依赖 C,还不如从头到尾用 C 写。

隐藏内存的语言对象模型都轻不起来,你一直在讲 Java,那好,Java 把 IO buffer 解序列化,损耗就不大,那么 Java 的反序列化性能优化怎么做的?JS、PHP、C# 、C++ 常见的语言里有多少不大的?

jasl 回复

搜了下 Jazelle 这玩意不就是 JIT 么?不过是输出专有硬件的指令集去,Java machine、Lisp machine 都是有特定历史原因的产物,这些东西有多少是做到大规模应用的?

另,说到 JIT,Ruby 其实也有 JIT 的实现 IBM 给做的,本坛也有介绍 Ruby + OMR JIT 简介

另外 mRuby 的 JIT 就要完成了,这就是官方的了

jasl 回复

好啦好啦,你是在辩证 YARV 也不差,可以,这点我没有否定 YARV

无论 Hotspot 和 YARV,都是先把这些序列化用的代码转一个个指令,执行的时候基本上就是流水线处理这批东西,所以还是屏蔽了原本垂直方式直接对 buffer 的处理。

我觉得不应该我来和你讨论,你上知乎找 R 大讨论两个实现去,话说:

另外 Ruby 本身强大的动态特性导致他绝大多数应用不需要在字节码、AST 层面执行,而 Java 不在这个层面很多事情非常难搞,比如 DI,即使对标的 C# 在 .Net 平台上也用不上 Spring 这样的框架。

只要有运行时、虚拟机的语言,心脏都是动态的,Java 你可以随时在 reflect 的时候动态注入一些 attribute 和 method,ObjC 也如此,只是你在后面调用这些东西的时候,由于它静态的,没办法通过编译,要不然它就不静态了。

你想说这个?

jakit 回复

我没有辩证 YARV 不差,我只是在回答你的问题:

【指令级内存操作】我指的是 Jazelle 可以通过指令集级别去进行优化中间代码,Ruby 好像没这个玩意吧,YARV 能跟它比吗。

另,我有 R 大微信,之前教育过你 GIL 的那个曾是 R 大的室友,其实我们都是认识的。

jasl 回复

噢,那路或多,我还真感谢那位在 GIL 帮我跳出 obj marking 坑的前辈

jakit 回复

那是因为你对 GIL 一知半解,GIL 对应用的影响本来是面试题里死记硬背的东西

jasl 回复

那时候真心没办法,对 IO 还不够了解,Ruby 才刚接触,GIL 理解程度肯定就是刚上手,然后我换了职业找到了一位比较燥的 tutor,做了相关的东西后,学到了很多新的东西。

顺便在社区很久都没帖子了,卖个萌而已。

jakit 回复

你既然认同自己 还不够了解才刚接触 那就 少臆断,不懂的可以多提问

你看看你自己从来这边到现在的回复,对技术的评价都是个啥,我在跟你的邮件里也指出了这个问题,你现在才承认

jasl 回复

其实每个人都一样,每个人都有自己擅长的、观察到的方面,同时也有观察不到,没有了解的地方。

你在 27 楼回复

搜了下 Jazelle 这玩意不就是 JIT 么?

我只是不打算纠结下去,所以

你上知乎找 R 大讨论两个实现去

每个人都有自己视觉范围的圈子,不能随便去否定别人说别人 Java 某些东西就不好了,或者 Ruby 什么 facility 不好。

我并不是没有用 rack,在 15 年的时候,我用的是 Plack / PSGI,这玩意跟 rack 一毛一样。

我的 style 明显就是喜欢重复制造齿轮,你会发现我的代码中很多冗余的实现,实际上很多余,很没必要,实际我是故意这么写的,我就不用社区包,我就希望我把整个世界重新写完。

恨不得重新发明一门语言,然后重新从 Base Object 开始去实现。

jakit 回复

问题是你一直在评价 Ruby 啊,我主要否定你在 Ruby 上的看法,Ruby 的事,我比你懂多了吧,而你恰恰这里臆断的东西太多。

而且,你谈到

估计是 Rubyist 过于浮躁,总想着出名吧。

这是我作为 Rubyist 不可以接受的。

再说 Java 还有别的语言、技术,你怎么知道我就不懂 Java 呢?你怎么知道我不会点别的呢?就说你搞 iOS,国内唐巧虾神喵大,国外那个 Chris,我和他们谈笑风生

我的 style 明显就是喜欢重复制造齿轮,你会发现我的代码中很多冗余的实现,实际上很多余,很没必要,实际我是故意这么写的,我就不用社区包,我就希望我把整个世界重新写完。

你刚刚不还提 他们又不喜欢 DRY。 你这个 style,DRY 么?

jasl 回复

写写 DEMO 告诉大家,噢是这个原理,还是不错的,可以学习一下,但是他们又不喜欢 DRY。

我表达的是:他们就应该 DRY,这样子大家可以了解原理。

其实上面你的帖子提到 JIT 的时候,我想说 Rubinius,它 DRY 了一堆 Ruby implementation of Ruby,虽然这样效率有堪商榷,但是代码很利于学习。

好啦好啦好啦,我不敢乱发帖子了,我会很乖的,我不臆断好了吧。

jakit 回复

我想说 Rubinius,它 DRY 了一堆 Ruby implementation of Ruby,虽然这样效率有堪商榷,但是代码很利于学习。

那到底他们喜不喜欢 DRY 呢?

jasl 回复

撒,我怎么知道呢,我站在我的观点看,我是觉得,这样有利于展示吧。

我和我的 tutor 也有不喜欢的地方,他喜欢快准狠,减肥药一样的,我喜欢把东西描述得很清晰,但他觉得啰嗦。

就像 ObjC,长长一堆,一个简单的 variable 写出文章出来 还代码即注释,其实我挺喜欢的,这样很文学气质。但是有些人就不喜欢这样,他觉得又长又臭,耽误时间。

我喜欢抽象一点,他喜欢浓缩一点,所以我喜欢用 Ruby / ObjC,他喜欢用 C++。

然后当然也有非常庞大的那种,啰嗦得不得啰嗦的风格的,“写出 spark“ (引自 Delton 某个地方他提到的)的 Java 复杂型抽象。

我不敢点评了,免得引来麻烦。

jakit 回复

那么你不知道就怎么说 但是他们又不喜欢 DRY ?

我不难为你了,这个 thread 留给大家评判吧

jasl 回复

真。大神👍 👋

C...ese like the biggest one, they do not get independent thinking, just do fake thinking, finally, choose the big est one. Choosing the speed-est one, the 鲁棒-est one, are the same as the biggest one.

now, it is Java with CN style

From now on, the chances of using niche languages in authoritarian countries are shrinking, but in the world except CN, it is the opposite.

The winter is coming...

其实说的是事实啊,没人感觉其实 这个论坛这段时间也越来越沉寂了吗....

需要 登录 后方可回复, 如果你还没有账号请 注册新账号