2019独角兽企业重金招聘Python工程师标准>>>

* 确保没有任何编译警告

* Erlang中String采用list实现,32位系统中,其1个字符用8个字节的空间(4个保存value, 4个保存指针)。因此string速度较慢,空间占用较大

* 在Server中,总是尽力书写尾递归(tail-recursive)的函数

* 使用'++'时,left list会被拷贝,然后添加到right list的头部,因此最好把length较短的list放在左侧

* 避免使用regexp,如果需要正则表达式,请使用re

* timer模块的大部分函数实现,依赖于一个process,如果过多使用timer,会导致这个process负载过大,影响效率。
  推荐使用erlang:send_after/3及erlang:start_timer/3

* 避免使用list_to_atom/1,因为erlang中atom数量最大为1048576, 且不进行GC控制。因此如果持续性的调用list_to_atom/1
  可能很容易达到系统上限,从而导致emulator terminate。请使用list_to_existing_atom/1。

* list内部实现为一个列表,因此length(List), 需要遍历整个list比较耗时

* 对于不同的数据类型,使用不同的size函数:tuple_size/1, byte_size/1, bit_size/1

* 使用binary match来进行binary的分割,而不使用split_binary/2

* 如果两个list都拥有很多数据,那么请不要使用'--',而是将数据转化到ordsets,然后调用ordsets:substract/2.

* 对于binary相关操作可以进行binary优化(bin_opt_info编译选项)代码框架:

*   f(<< attern1,...,Rest/bits>>,...) ->  
       ... % Rest is not used here  
       f(Rest,...);  
    f(<< attern2,...,Rest/bits>>,...) ->  
      ... % Rest is not used here  
      f(Rest,...);  
    ...  
    f(<<>>, ...) ->  
      ReturnValue.

* 调用lists:flatten/1可以将list扁平化,这个操作代价很大,比'++'还要昂贵。下面这些时候我们可以避免:
    将数据发送给port时
    调用list_bo_binary/1和iolist_to_binary前

* 小的函数可以让您方便的找出错误的函数和代码

* 不要在同一行出现相同的符号
20    some_fun() ->
21       L = [{key1, v1}, {key2, [some_record#v21, v22]}],
22      ...
编译时,会提示line 21 '[' 语法错误, 因为21行有多个 '[' ,所以这个bug不能准确定位,你需要花时间去排查代码。
好的做法是:
20 some_fun() ->
21      L = [{key1, v1},
22            {key2, [some_record#v21, v22]}
23            ],
      ...
这样,编译其会提示你 line 22 '[' 语法错误,你很开就知道是那个地方错了。

* 使用 CTRL + \ 或 init:stop(), 可以退出Erlang, 使用CTRL + G 及 CTRL + C 弹出菜单选项,可以选择是否退出Erlang。
其中CTRL + G可以用来连接其他的shell, CTRL + C可以查看其他一些系统信息
Ctrl + C abort 是野蛮的退出方式

* use "open_port({fd,0,2}, [out])" make erlang program write standard error to unix system

* If you don't run experiments before you start designing a new system, your entire system will be an experiment!

* standard data structure desc:

Module         Description
sets         sets, i.e. a collection of unique elements.
gb_sets sets, but based on a general balanced data structure
gb_tree a general balanced tree
dict         maps, also called associative arrays
ets         hash tables and ordered sets (trees)
dets         on-disk hash tables

Suggestion:
elments count: 0 - 100 | 100 - 10000  |  10000 -
our select   :  list   |      ets     |  gb_tree

* 通过code:clash/0 检测代码中是否有module冲突现象(sticky)

* epmd -d -d 启动 epmd 可以查看erlang node之间的通讯

* 将正常的逻辑代码和错误处理代码分离,发生错误时,尽管错误。由另一个错误处理模块进行处理

* 类似于操作系统,我们的程序也可以分为kernel 和 user 两层, 对于kernel绝对不能出现错误, 对于user可以出现错误,进行恢复

* process顶层loop涉及的代码及函数,最好在一个module中实现

* process 的register name和module名称一致, 便于寻找代码

* 每个process具有一个单一的角色,比如:supervisor 用来进行错误恢复, work 工作者,可以出现错误, trusted worker 不会出现错误

* 通过函数调用可以实现的功能,就不要使用sever实现(如gen_server, 及类似的loop 实现)

* 给消息加一个tag,在发生错误的时候,可以定位到消息,同时也有利于程序的稳健

* 在消息循环中,对于unknown的消息,请调用lib:flush_receive/0 将其清除,减轻process msg queue的长度

* server中总是书写尾递归的循环

* 尽量使用record, 而不是原始的tuple来表现数据结构, 在使用record时,使用select match:
#person{name = Name, age = Age} = Person

* 对于返回值,最好也添加一个tag,用来说明返回值类型,或者执行成功与否

* 尽可能少的使用catch和try,在erlang程序中,不推荐主动捕获异常。只有当我们的逻辑特别复杂,我们可以使用throw来返回数据,使用catch来获取返回值。

* 当然程序与外界交互,外界数据不可靠时,需要使用catch和try

* 慎重使用process dictory, 当你使用get/1, put/1时,你的应用会具有很大的slide effect。可以通过加入一个新的参数来保存原本需要存储到process dictory中数据

* 如果不想使自己糊涂,请不要使用import

* 使用export时,将功能类似的接口组合在一起,并添加合理的注视,这样你的接口更清晰,别人使用起来更方便

* 不要书写嵌套太深的代码

* 不要书写太长的module

* 不要书写太长的函数

* 每行代码不能太长

* 避免使用 "_" 匿名变量,请为每个变量选择有意义的名称,如够某个变量暂时不使用,请以下划线 "_" 开始

* {error, enfile} enfile error in socket 是以为内linux系统中 ulimit 限制, 在root下修改:ulimit -n 25000

* {error, enotconn} 表示socket已经关闭

* 在erlang开发时,慎重使用macro,因为erlang的single assign的缘故,同时调用某个marco,而macro又定义了某个变量,可能导致badmatch错误。
比如:
-define(ADDLINEINFO1(F),
        (
        begin
        Str1 = lists:concat(["[Mod:", ?MODULE, " Line:", ?LINE, "]"]),
        Str1 ++ F
        end
        )).
-define(WARN(Log, F, D), log4erl:warn(Log, ?ADDLINEINFO(F), D)).
如果连续使用 WARN, 会出现此错误

* erlang中可以定义很多环境变量:
ERL_MAX_ETS_TABLES 设置最大的ets数目 默认1400
ERL_MAX_PORTS erlang最大的port数目 默认1024

* .app文件中的start_phases, 选项既可以用来作为include applications之间的同步启动,也可以用来对单个application进行分布启动。
顺序如下
包含included app:

application:start(prim_app)
=> prim_app_cb:start(normal, [])
=> prim_app_cb:start_phase(init, normal, [])
=> prim_app_cb:start_phase(go, normal, [])
=> incl_app_cb:start_phase(go, normal, [])
ok

无included app:
application:start(prim_app)
=> prim_app_cb:start(normal, [])
=> prim_app_cb:start_phase(init, normal, [])
=> prim_app_cb:start_phase(go, normal, [])
ok

转载于:https://my.oschina.net/zhangjie830621/blog/340814

对Erlang开发者的几点建议相关推荐

  1. 第四次 Erlang 开发者大会(CN Erlounge IV)正式开通注册通道

    ECUG 成立于 2007-10-14 日的 CN Erlounge II.全称为 Erlang China User Group(Erlang中国用户组).它是一个民间团体,致力于促进 Erlang ...

  2. 成为最差开发者的10条建议

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 这里有个[1024]红包等你来领取 昨天在devto上面 ...

  3. 成为一流软件开发者的 34 条建议

    点击上方"逆锋起笔",公众号回复 pdf 领取大佬们推荐的学习资料 本文来源:http://r6d.cn/qGAu 我们列出了一张包含 34 条建议的清单,来帮助你成为一流的软件开 ...

  4. 屏幕分辨率测试工具(舍弃)---chrome开发者工具devTools(强烈建议系统学习)

    2019-01-25 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://w ...

  5. 针对应用开发者的几点建议

    近日,Dzone网站上发布了一篇文章<Suggestions for App Developers>,针对应用开发者分享了一些开发经验,下面是该文的译文. 针对某一平台,进行了多年的应用开 ...

  6. 写给MongoDB开发者的50条建议Tip14

    本系列文章翻译自<50 Tips and Tricks for MongoDB Developers>,暂时没有找到中文版,反正自己最近也在深入学习mongodb,所以正好拿来翻译一下.一 ...

  7. 关于独立游戏开发者营销游戏的建议清单

    一个独立游戏开发者的销售清单(包含便携版本) 没有什么感觉比你创造了一个自豪的游戏后却只能看的它渐渐地被冷待更糟了.不幸的是,现在的游戏不仅仅满足于创作精彩的内容上.为了让你的GAME与众不同,现在你 ...

  8. 写给MongoDB开发者的50条建议Tip25

    本系列文章翻译自<50 Tips and Tricks for MongoDB Developers>,暂时没有找到中文版,反正自己最近也在深入学习mongodb,所以正好拿来翻译一下.一 ...

  9. 写给MongoDB开发者的50条建议Tip6

    本系列文章翻译自<50 Tips and Tricks for MongoDB Developers>,暂时没有找到中文版,反正自己最近也在深入学习mongodb,所以正好拿来翻译一下.一 ...

最新文章

  1. 绿色版mysql安装步骤
  2. 区块链BaaS云服务(21)腾讯CCGP“治理链”
  3. 图片验证码防暴力破解_Java
  4. 深度解析单例与序列化之间的爱恨情仇
  5. 文档词频矩阵_论文理解:从词嵌入到文档距离
  6. java bytearrayoutputstream 文件_Java ByteArrayInputStream和ByteArrayOutputStream示例
  7. 【LeetCode】【HOT】23. 合并K个升序链表(递归+分治)
  8. MyBatis学习总结(22)——Mybatis自增长ID获取
  9. sqlserverv中处理字符串包含、截取
  10. java和javascript双引号嵌套的问题
  11. android 自定义View【2】对话框取色色盘取色的实现
  12. 天翼宽带家庭网关用户:useradmin,nE7jA%5m 这个是中国电信的超级密码
  13. 【源码】基于遗传算法的VST混响插件
  14. 批处理对文件夹、所有子文件夹内的文件重命名、删除
  15. 微信支付商户平台 —公立医院申请
  16. 10个python办公黑科技,助你办公效率提高100倍
  17. 泽风大过:改过自新;坎为水:坦然面对
  18. linux中获取系统时间的几种方法
  19. 即插即用和热插拔的区别
  20. 运放放大倍数计算公式_低噪声前置高增益放大器设计

热门文章

  1. [Erlang 0034] Erlang iolist
  2. nginx 修改并隐藏版本号
  3. targetcli读取prefs.bin出错的问题的解决方法
  4. Facebook Messenger正式登陆Android Auto车载信息娱乐平台
  5. Git设置忽略文件/文件夹
  6. 关于双机热备,你该知道那些问题?
  7. IPv6相比IPv4在那些方面做出了改进?IPv4 to IPv6过渡的三种tunnel技术各自的特性...
  8. android studio快捷键大全
  9. linux c++开发问题汇总
  10. Linux中的MySql数据库远程连接