erlang

爱上erlang

2019-12-10  本文已影响0人  Alking

我为什么喜欢 erlang

前言

在久远的2013年之前,我还是一个面向对象程序员,当然也不是什么正宗的程序员,我只是一个问题解决者,那个时候和几个朋友一起开发了一款游戏,其中就有我很好的基友,史教授,那个时候我们使用的还是Unity(c#) +Java(Netty)技术栈,只能遇到什么问题,自己去解决。

那个时候为了更深入的理解什么是面向对象编程,更好的写好java,下了很多心思,读了不少书,看了不少博客。但是还是觉得没有彻底理解其中得精髓,至于读过哪些书,无外乎都是在书单上的。那个时候和我讨论比较多的是韵哥,也是他慢慢领我入门。之后有一天我看了一本《面向接口编程》,那个时候我就像顿悟一样,理解了java里面的那些核心设计,比如接口,比如抽象类,再加上我之后读过一些大牛的源代码,我才确信,我对面向对象的理解是那么的正确。

后来,我在14年加入了上海莉莉丝科技有限公司,这家公司使用的是erlang,我一开始对这门语言也是很抵触,因为那个时候的我,满脑子都是什么软件工程的思想,都是人月,都是TDD,那个时候我在当时的项目的工程里面没有见过一个单元测试,大家的代码相对而言比较杂乱。为了这个问题,我还和当时的技术leader fox讨论了好几次。最终的结论是,由于游戏项目的需求更改周期太短,没有那么多人力来维护测试代码。

一开始的那两年,我还只是按照之前对面向对象的理解,写着erlang逻辑代码,直到第3年,我将官方的文档彻彻底底的看了一篇,然后看看几个核心库(stdlib,kernel)的源代码,我才算是入了erlang的门

好了言归正传,还是来聊聊为什么喜欢erlang吧

正文

1. 语法足够简单纯粹

我前前后后接触过不少语言,其中我最喜欢的就是java和erlang了,因为这两个语言的语法足够简单,足够纯粹,语法糖少,限制很多,没有歧义,入门轻松。

最关键的还是我觉得这些特性,会让一个软件真正实现人月,真正的将一个人当做一个组件,可以更换。由于这些优势,你可以很轻松的去读另外一个人的代码。我曾经听说,在谷歌内部有两个大牛,某一天他们实现了同一个功能的代码,结果他们的代码竟然丝毫不差,连行数都一模一样。或许这就是软件工程的最终奥义吧,人可以不同,但是代码必须相同。

2.错误处理很有新意

要说错误处理,由于我对java和erlang比较熟悉,我就只聊聊他们的区别。

java对错误的处理,我认为已经达到极。就是那种必须检查异常的设计思想,让我很舒服,本意就是,如果这种情况,我不能处理了,我就throw(丢)出去,让调用这个函数的调用者强行来处理这个异常。我觉得和当今的工作方式很贴近,我不能处理的问题,我绝不处理,一方面是我没有这个能力,没有这个权限,另一方面或许我私自处理了,可能会对3放造成损失。所以我最最明智的决定就是将这个问题丢给我的领导,来让他强行处理这块烫手的芋头,从而从整体上让负作用降到最低,或许这就是设计者的初衷吧。

elang对错误的处理走了另外一条道路,将错误进行隔离,其目的也是将负作用降到最低。erlang采用actor模型+消息发送来构建整个系统。而每个actor实际上就是一个状态机,即使某一个actor因为处理不当,造成了错误也只是造成了局部错误,举个例子,如果将整个系统比喻成一个部队,那么错误造成的只是一个小兵的损失,然后由于erlang的监控者模型,可以很快的再填补一个小兵进来,从整体上来看,还是运转正常的。
虽然这种处理方式我觉得还是有很多需要注意的地方,比如这就要求在处理过程中不能有状态的改变,或者IO等对外部状态的改变。简单的说,这是一个无害的crash.

3. 代码简单

从实现简单的逻辑来说,我们日常写代码过程中,与 list, set, map打交道的时间最长。就比如遍历来说,erlang只需要一行代码搞定,而java估计要超过5行,举个例子

# java foreach
private void doSome(T item){...}
for( T item : list){
    doSome(item)
}

# erlang foreach
lists:foreach(fun(e)-> ... end, list).


# java list map
List<T2> lists2 = ...;
for ( T item : list){
    T2 = trans(item);
    lists2.add(T2)
}

# erlang list map
lists:mapt(fun(T) -> T2 end, lists).

......

虽然java8增加了一些函数式编程的特性,但是个人觉得这个特性对于代码的维护会增加一些复杂度

这些简单的操作,加上函数式编程方式,使得对于阅读代码的舒适度有很大提升

除了一些基本操作外,还有一些分布式操作还是比其他语言要简洁的,比如rpc,无需依赖其他的库就可轻松搞定rpc

4. 不停服热更方便快捷

erlang是函数式编程语言,热更新起来不要太方便,再有actor模型加持,就可以做到“飞机一边飞,一边更换引擎了"

上一篇 下一篇

猜你喜欢

热点阅读