且听疯吟 如此生活三十年
关于 Erlang 的一些想法

断断续续学习和使用 Erlang 几个月了,感觉跟之前看待这门语言有了点变化,还是挺有意思的。
作为初学者可能理解不太准确,但有些东西还是可以记录一下。

关于函数式编程

  • 刚开始从其他语言转移到函数式语言的时候还害怕所谓的思维转换,实际上担心有点多余

  • 入门并不难,能理解把循环写成尾递归的过程就基本没什么问题了

  • 更少的心智负担,不再需要考虑是传值还是传引用,以及糟糕的副作用

  • 在某些问题上更接近思维过程,不需要关心怎么做,只需要关心做什么

    比如 erlang 的 quicksort 可以这么写(注意这并不是高效的写法):

    qsort([]) ->
        [];
    qsort([Pivot | T]) ->
        qsort([X || X <- T, X < Pivot])
        ++ [H] ++
        qsort([X || X <- T, X >= Pivot]).
    

关于 Erlang

  • 语法简单
    • 没有大量的复杂的概念,不像某些《Thinking in XXXX》,看完巨厚一本书你发现自己还是啥也不懂
    • 没有大量的奇技淫巧
    • 大概看了一个多月,就基本可以把 ejabberd 代码从头到尾过一遍了
    • 多看多用,我自己入门看的 《Erlang Programing》
  • pattern match
    • 用过才知道有多好用
    • 据说效率极其惊人
    • 据说 C# 也要加入了
  • 并发
    • process
      • 需要并发执行一个任务的时候,最容易想到的就是新开一个 process 去处理
      • Erlang 的 process 是轻量的,开启和关闭消耗也小,不需要操心各种并发问题
    • 避免锁
      • 实际上开始写命令式代码的时候,我倒是不怎么担心死锁,担心的反而是应该在哪里加锁……
      • Erlang 的并发模型没有试图去解决锁的问题,而是从根源避免了它,那就是根本不允许全局变量共享(当然你需要共享,可以使用 ETS 或者外部数据库)
      • 对我而言,这种做法减轻了不少心智负担
  • 鼓励崩溃和热更新
    • 写代码的时候 Server 不用不停重启刷新的感觉太好
  • 效率
    • 入门快

      比如我这种不合格的程序猿看了一点《Erlang Programing》就开始写 ejabberd 的模块了
    • 很容易用

      比如我这样不合格的程序猿也可以很顺利的手写稳定的服务器了
  • 部分不怎么好的地方
    • 字符串的处理
      • 没有单独的字符串类型,而是用 List,从编码效率到处理效率,都不怎么好看
      • 正则表达式的转义让人蛋疼无比
    • unicode 字符

      可能一不小心就容易坑了,当然这点在慢慢改进了
    • record

      可能 OTP17 后的 map 会方便点
    • 工具链

      从 IDE 到 debug profile 到 compile,体验都比较……怎么说呢,原始吧。
      目前用 Intellij IDEA + Erlang Plugin,还凑合。
    • 出了问题搜索不到

      嗯,这个时候就会嫌弃 Google 不够智能不能帮你写代码了