下面这个图来自演讲:ElixirConf 2015 - Keynote: Elixir Should Take Over the World by Jessica Kerr
她用了一个惊人的标题。演讲中以库恩的科学范式,引出了编程范式的跃进。除了 Elixir 外,还提到 Elm。可惜我英文一般,不能完全听懂。
希望 Elixir 能把函数式编程带入主流开发,看明年能否进入前 10 名排行。
入门学习请参考:
我也想过类似的问题:
我三年前就说过 Elixir 在语法上比 ERlang 有一定进步,但不是绝对优势。个人认为 Elixir 很鸡肋。Elixir 的最大亮点是他对字符串的处理,管道调用,宏什么的在 Erlang 中也能搞定。
程序员觉得好不一定能流行,得老板觉得好才行。别的不说,有培训班培训 Elixir 吗?Elixir 程序员辞职了老板能花低薪马上招一个补上吗?PHP 那么丑陋那么混乱仍然生生不息,老板喜欢啊
我认为软件工程最大的挑战是:持续满足业务复杂度的同时,保持工程的可维护性 ,语言对这方面的作用也是最关键的。
以前我认为最合适的是 Ruby。但 Ruby 的性能确实限制了在很多场景的使用,有时候我不得不转用其他语言。 而 Elixir 出现后,不仅在语法上有改进(模式匹配、管道、宏),代码更加简洁明了,而且性能还很高,是个极好的选择。
不管是不是流行,只要好用,能解决问题,就会有价值。至于是不是需要和大众一样,就见仁见智了。推荐一篇文章:
“The best way to build a dev team: Go where the devs aren’t.”
https://medium.com/@cameronp/the-best-way-to-build-a-dev-team-go-where-the-devs-aren-t-d3f226cfe749
btw. 我们在生产环境用 Elixir,已经快半年了,开发过程很流畅(自己写了一些库),运行一直很稳定。我们在寻找有冒险精神的 Elixir 开发者。
我很久没来了,原因就是去搞 Elixir 了。 在我的推动下我们公司已经两个项目用 Elixir 了。
我个人觉得 Elixir 会有前途的。个人看好,有以下几个原因:
元编程 很多人对这点不以为然,但是这是曾经 Ruby 能发际的原因之一。元编程跟 DSL 可以快速的提高开发效率。 今天还有人跟我讨论 Go 跟 Elixir 谁更适合开发 Web App, 我就问个简单问题,Go 有没有类似 ActiveAdmin 类似的 Admin Panel, 只需要几行代码就能做 CRUD 的。 Elixir 有的: https://github.com/smpallen99/ex_admin
函数式/高并发 Immutable state 在高并发的情况下优势其实还是很大的。 另外函数式的语言,真的很 User Friendly, 很多 Ruby 开源库,稍微复杂一些的,写的差一点的,有什么问题,打开 github 看源码是摸不到头绪的,因为大家运行时的 state 只看代码看不清,要 clone 下来,运行一下,debug 一下,看看在某个时间,某个状态,某个变量是什么值。 函数式语言跟过程式语言相比,我觉得去掉了时间这个概念。我现在打开 Elixir 的源码,可以很容易看清,因为没有剪不断理还乱的依赖关系。所有东西都是有进有出,只要能想想的出进去的是什么数据,就能预测到出来是什么数据。
OTP/Erlang VM 还是今天跟那人讨论 Go, 他说大家都能高并发,Elixir 有什么了不起,Go 运算速度还快。我问他 goroutine crash 了应用是不是就 crash 了。他说 Go 有专门处理错误范式,不会那么经常 crash 的。 我说 Elixir/Erlang 的哲学就是 let it crash。 我给他说你看 西部世界 么?OTP 带给 Elixir/Erlang 的,就是那样子的世界,每个 OTP 应用都像 西部世界 里的一个 Host, 只不过不需要人工复活,自己有自己的使命,可以跟其他的 Host 交流。哪天死了,不要紧的,不需要什么人管,早上起来,又精神满满,开心的走出去做他们使命里必须要做的事情了。 他怀疑且不屑的说,说 Crash 就 Crash 就算哪门子程序语言。我也懒得再给他解释这个了。
Elixir 不是一批更快的马 亨利福特说,如果我问人们想要什么,人们不会说汽车,人们肯定会要更快的马。 自从我十多年前做 Java 开始,已经学了好多更快的马,我自己这一两年做 Elixir 的感受就是, 不敢说 Elixir 是汽车,但肯定不是马,至少是得是个三蹦子吧。 Elixir/Phoenix已经改变了我很多以往对软件开发的看法。 比如最基本的就是,一个 Web 应用,进来一些文本,出去一些文本,在这个过程中,为什么我们要生成几百个对象,而不能把个过程想象成一个数据流,数据从服务器流水线上经过,经过了一系列的转换。成为了用户需要的形式。 Ecto 在对数据库保存做 validation 的思考也是这样的,ActiveRecord 就是有个 object,满足了一定条件才能存进数据库,Ecto 不是,Ecto 是一段数据要进到数据库,要经过一段数据处理流水线,流水线上有质检员,每个质检员负责检查不一样,一个不通过,就不能保存了,通类型的数据,可根据不同经过不同的流水线,比如用户登录,跟用户注册,可以有不同的流水线,这一点如果在 Rails 里面做,conditional validation.是非常恶心的。
有效的学习是对原有认知有结构性改变的学习。 这是这两天听李善友教授讲课听来的,即便是 Elixir 不能发迹,我觉得我的认知经过学习 Elixir/Phoenix 有了结构性改变,看问题更透彻了。就凭这一点,学习 Elixir/Phoenix 也值了。
#3 楼 @lilijreey 不止是语法好吧。。看看 Erlang 的生态就知道了,不是一般的烂,Elixir 简直给 Erlang 带来了新的希望。另外,语法(包括宏)意味着生产力的上升,这个作用也是很大的
@darkbaby123 用这个好了 http://aldusleaf.org/monitoring-elixir-apps-in-2016-prometheus-and-grafana/ 基本相当于自造的 Newrelic。当然还可以考虑 statsd 打到各种地方
#17 楼 @hisea 赞一个。最近在啃 Programming Elixir 1.3,这个语言带给人的思维改变是非常有意思的。做练习的时候经常有种感叹“居然还可以这样用!” 。有些事情对没了解过 Elixir 或者 FP 的人来说是很难描述清楚的。
我一开始也不理解 let it crash 的设计,觉得如果每个异常都 crash 去了那也太频繁了。深入了解一些后才明白不是这么一回事。很多语言把异常作为控制流的一种,有些地方甚至只用 if/else/case
描述理想状态的流程,其他情况一律设计成异常类。Elixir 并不把异常作为控制流的一种,异常只用在那些“正常情况下几乎不可能发生的事情”上,比如数据库断线,HTTP 请求超时,配置文件不存在等等。那些在预料之中情况一般都用 {:error, reason}
加模式匹配处理掉了。这样想其实也挺合理。更进一步思考,没有哪个程序能保证处理了一切意外情况的,这种时候简单重启一下保证服务不挂掉反而是更好的做法。
erlang 的并发思想很有意思,进程模型做并发确实提供了很好的鲁棒性,再加上 fp,简直不要再美。不过流行的希望确实不大,已经诞生二十多年的语言,不能指望一夜翻身。
不管 Elixir 会不会火,但是绝对是值得去学习和尝试的。 我刚开始写 Erlang 代码的时候,也感觉很别扭,各种不方便,可是到后面思维方式发生转变之后发现越写越爽,这是我之前发的一篇文章,当时接触 Erlang 时间不长,认识还比较浅显 https://ruby-china.org/topics/21520
我的下一个项目可能会采用 Elixir 来搞
Elixir 解决了很多 erlang 遗留的问题,有明日之星的样子。但是,普通 web 项目,Elixir 上的框架不如成熟的 Rails 好用。
比较难,ruby 火了是因为 rails 出现,go 是因为 docker,Elixir 现在还非常小众,而在现在这个大环境下,各种仿 rails 的框架,Elixir 如果想靠 Phoenix 杀出一条血路还是比较困难的。也许等它成为明日之星时,你我早已经不写代码了。
明日之星难说,Ruby 是今日之星么?
Ruby 至今都算是个小众语言,但是不代表不好,不值得学,不值得用。
要看你把语言拿来当什么。是当工具,当赚钱的饭碗,还是什么。
之前跟我讨论 Go 的同学就是,说最讨厌的就是 Ruby 的元编程。Go 没有觉得就简单很多。
我说你当初选择 Ruby/Rails 是自我的主动选择么?还是这个工作给钱多你就来了。
如果这样的话 Go 确实是一个更好的工具。
我是自主选择的,我看到了 Ruby 好的地方,
08 年,自己上班做 Java 回家玩 Ruby, 玩了两年才找到第一个 Ruby 工作。
我就是在家里磨了两年的刀,没有公司需要。
就真的是纯享受磨刀的过程,也没想着砍什么柴。
现在对 Elixir 也是这样的。
給樓上點個讚,俺也是先自己瞎學了一通然後才找到用 Ruby 的工作的。不過老實說,Rails 的適用範圍比 Elixir/Phoenix 廣多了,如果不是高負載高併發場景,後者並沒有什麼用武之地。
#50 楼 @blacktulip 这也是萝卜白菜各有所爱。Web 框架的适用范围也不就那些。如果说比功能现在流行的框架都不差,细节处各有优劣。这些框架多余么?我觉得不多余。毕竟除了考虑功能,照顾开发者偏好也很重要。能让做 Web 的 Elixir 的开发者有个好工具,Phoenix 达到这点就足够了。至于高并发么,我只能说,虽然大多普通人都是钱够用就好,但也没人会嫌自己钱多。
#62 楼 @kooglezhang 我看的是《Programming Elixir》有中文版,入门挺好的。
看完书把官网 guides 仔细过一遍,就入门了。
另外还有一些书适合进阶。比如《Programming Phoenix》、《Metaprgramming Elixir》。
#28 楼 @darkbaby123 let it crash 在 erlang 里面是因为有监督机制,其他语言没有这种内建的监督机制。其他语言例如 java,可以将主控程序 try catch 下层库的异常,捕获到一些异常后重新初始化下层库。但总的说来,没有监督机制这样规范。
#67 楼 @jimrokliu 是的,Supervisor 是 OTP 内建的行为之一,经历了这么多年足够稳健。类似的机制其他语言并不是不能做,不过稳定性这东西是需要时间积累的。