写在开篇:
见贤思齐焉,见不贤而自省
三人行,必有我师焉
老员工做的并不一定是最好的,一定要时刻以最高的标准要求自己
多与组内人员进行交流,快速融入团队,提升自己的综合能力
独立思考、多归纳总结(一份耕耘一份收获)
端正做事的态度,虚心细心、做一个活好的程序员
整体结构
Erlang语言篇
代码规范
工具篇
Erlang 语言篇
一、一些必须深究的基础概念
Erlang 基本数据类型:atom, list, tuple, dict, maps, set, binary, record, Port, Pid
基本数据类型
官网数据类型介绍
Erlang 常用数据结构实现
原子一般用来做枚举、函数返回值
list 列表和字符串等,可以表示各种不同数据类型的有序集合, 注意list的某些操作的复杂度
tuple 个数固定的元组, Record的内部实现也是使用的tuple
record 类似c语言的struct, 某类数据的一个集合体;比如 #user{}等
常存在于ets中,作为全局的数据结构
dict 字典、maps(类似于hashmap)
binary Erlang二进制,可以直接使用模式匹配,效率很高
pid 进程描述符
Printed process ids < A.B.C > are composed of 6:
A, the node number (0 is the local node, an arbitrary number for a remote node)
B, the first 15 bits of the process number (an index into the process table) 7
C, bits 16-18 of the process number (the same process number as B) 7
Ports (Erlang对socket和网络io的底层封装)
Ports provide the basic mechanism for communication with the external world, from Erlang's point of view. They provide a byte-oriented interface to an external program. When a port has been created, Erlang can communicate with it by sending and receiving lists of bytes, including binaries.
Ports and Ports Drivers
C_Ports
Term Sharing
数据结构使用时注意事项:
尽可能简单,作为代码参数或者进程消息的时候,需要考虑是否涉及到内存拷贝,尽量减少内存拷贝和网络拷贝
Erlang Process
进程如何创建、如何执行、如何结束的
进程字典(有副作用)、进程信息如何查看、何时需要垃圾回收
进程的调度、并发、进程间通信(Pid ! {msgTag, args})
进程的瓶颈、开发中注意事项(gen_server应该注意什么)
抓取Erlang进程运行时信息
Erlang 常用网站:
otp官网
erlang官网带搜索文档
Learn you some Erlang
坚强2002的博客
常见编译错误
错误和异常
erlang运行时错误
二、代码规范
良好的代码规范是一个合格产品成功的一半
Erlang编程规范
翻译注释版
注释
文档注释
%%% This is handler of user_login
%%% Created: 2016-12-03
%%% author: Jemes Bond
函数API注释
务必包含简要功能描述和返回值类型
%% Function: make a unique 64bit positive integer
%% Ret : N -> is_integer(N), N > 0
make_unique_64bit_id() ->
N = xxx.
模块设计和划分
充分理解策划的需求,并且能够抽象出功能架构和其它各个模块的交互
代码结构简单清晰,已与扩展(高内聚、低耦合)
单个函数不超过50行、缩进不超过三次
学会拆解功能单元、提炼基本的工具类函数
每个函数只做一件事情
设计模式六大原则
快速理解-设计模式六大原则
设计模式虽然是主要是面向对象的,但是任意语言都需要良好的设计模式
Erlang的一个文件module就相当于面向对象的一个类提供的对外接口
对应单个函数而言,仍然遵循API常见的设计原则:
对于给定的输入,应该返回期待的输出或者抛出异常
参数尽量在1-5 之间,不要过多的参数,结构过大的参数
返回值在注释中声明清楚, erlang没有return语句,当函数嵌套很深的时候,
可以让调用者一下子就知道返回类型; 并且减少后期维护的难度和bug
尽可能少的使用进程字典
进程字典的优点是访问效率最快
但是进程字典破坏了函数式编程的环境,导致给定的输入在不同的进程字典情况下,
出现的结果不是固定的这个副作用
B = f(A).
良好API设计的10个原则
日志
日志是我们自己的审计账本,sgame已经上线、出了问题必须有日志可查。
目前日志分为两大类:
上报sdk的通用oss日志
这部分日志主要记录了玩家登录、在线、物品、金钱流向等, 可以通过hue系统查看
game自己的日志
记录关键业务流程、关键数据的日志,一般存在logs目录下, 100个文件顺序替换
1) 日志文件分类 (game_svr.log charge.log crash.log battle.log task.log vehicle.log),
不同的业务尽量放在不同的文件中,防止某类日志过多,把重要系统的日志冲掉
2) 日志的级别:
线上的日志级别是info/error/warn
如果是内网调试,且使用make debug编译,可以打印debug日志
高频的日志输出一定不要出现在线上
日志一定要有意义,包含必要的玩家信息和当时的现场信息
日志尽量简洁
关键业务进出一定要有日志(尤其是涉及到玩家购买和修改多处数据的事务类)
养成测试的好习惯
一个一流的程序员首先是一个很好的QA,知道自己的代码在哪些情况下可能出现问题,并且尽早的预防
底层模块一定要严格的单元测试、分支测试、白盒测试、黑盒测试、边界测试、非法输入测试,把一切可能的错误尽早的暴露
以及可能的性能压力测试
Erlang的大部分测试都可以写在模块后面,然后在终端模式下直接运行即可。
github第三方库的学习
我们代码中也用到了很多第三方库,都在server/3rd目录下,这些库很多其实并不是特别复杂,但是使用非常广泛,很多可以借鉴的东西,包括一些开源软件的规范等
mochiweb 一个使用非常多的轻量级http服务器库。
代码中充值、聊天、gmtools等均有使用
Erlang MySQL driver
Erlang protobuffer Google Protobuffer的Erlang实现,Sgame前后端通讯协议和mysql Binary序列化都是使用的Protobuffer
其他 json/ geodata2/ log4erl / entop-master等 自行查阅
Erlang资源大全中文版
erlang有哪些好用的库
三、工具篇
内网软件站: \192.168.1.150\lilith_share[Common | server] 目录基本涵盖了常用软件,或者通过外网下载最新版,然后拷贝
目前 SGAME使用的otp版本为 19.1
代码编辑器
vim 纯键盘跨平台编辑器,只需要熟悉几个常用的命令即可操作
[Sublime+samba for windows]
notepad++ 看各种代码格式、以及转换格式等
代码合并比较: Beyond Compare
代码编译调试环境 linux
SecureCRT远程登录(替代方案 putty等)
常用shell命令:
sed awk shell
查找类 ag/grep/find
网络相关:
10 个你需要了解的 Linux 网络和监控命令
Linux常用网络命令介绍
快速成长的建议:
最大可能行的利用Linux的Manual:
man man
man grep
erl -man erlang/erl/lists/maps/ets/application/gen_server
google/百度/知乎/github/stackoverflow/
记笔记或者写blog (推荐印象笔记),好记性不如烂笔头