C++

1. 格式化[热点]

(1) 格式化一定要使用统一的解决方案(占位符方式) 可以规避掉大多数问题.(即使是行业中水平很高的人也在这个上面栽过跟头)
(2) fmt

2. 内存

(1) 内存泄露认知 (一次性泄漏 , 常规性泄漏 , 偶发性泄漏 , 运行时泄漏)
(2) 使用内存池解决内存碎片问题, 使用对象池解决内存泄漏问题.
(3) 内存分配失败默认处理
(4) 可以用工具检测出来的内存泄漏不是内存泄露, 即我们主要要解决的内存泄漏是: 运行时泄漏
(5) gperftools

3. 日志[热点]

(1) debug不能解决所有问题, 但是日志可以.
(2) 日志的写入应该是同步的, 日志分级, 分文件.
(3) 根据项目情况选择合适的日志组件.(glog让我明白 从设计上解决问题的重要性)
(4) dmlog

4. 线程

(1) io, 操作无关, 高耗, 低锁 使用线程效率较高
(2) 设计上规避多读多写.
(3) 积极使用无锁队列.
(4) 多线程的精髓为分时 理解了分时就理解了多线程
(5) C++11 std::thread

5. 锁

注意: 锁的强度越高 效率越低, 生命周期越长 效率越低 选择合适的锁(优先选择高性能的锁)
(1) wait-free -> ringbuffer 对使用环境有要求 实现难度较大
(2) lock-free -> linux 内核中广泛应用, wait-free的算法都是lock-free的
(3) obstruction-free -> 乐观锁 -> lock-free 的算法都是obstruction-free的
(4) atomic -> std::atomic
(5) lockless-based -> std::mutex std::lock_guard
(6) lock-based -> semaphore

6. 网络[热点]

(1) 调整运行帧数为合理数值
(2) 统计协议带宽占用率
(3) 统计协议处理耗时
(4) 心跳 要自己起一个timer主动发. 防止可能的隐患.
(5) 协议 选择合适的协议 性能高->低 (二进制 > protobuf > xml) 流量低->高 (protobuf > 二进制 > xml)
(6) 网络库 asio libevent libuv libev libzmq (7) 网络引擎性能本质点在网络事件处理单帧所耗时间 (8) 网络引擎优化要点 [1] 减少cp [2] 减少锁的粒度. [3]减少api调用次数.

7. 协议

(1) 制定统一协议标准 (2) protobuf(idl重要性) (3) luapb (动态协议导入, 静态协议导入, encode, decode, id2name, name2id, table2json, json2table, table2xml, xml2table, xml2json, json2xml, table2yaml, yaml2table)

8. 时钟

(1) 使用精度与预计精度的统一, 精度分级.
(2) 影响时钟性能的因素, 所使用的数据结构, 所使用的时间API的精度.
(3) 时钟的实现让我理解了分时, 从而在多线程问题上没有再犯过错误.
(4) dmtimer

9. db(mysql)

(1) 自动化.
(2) 逻辑简单稳定.
(3) 设置好主外键, 能明文的最好明文, 方便运维
(4) innodb [注意blob限制] myisam[有性能要求]
(5) 统一使用utf8字符集
(6) 避免使用扩展sql 方便将来移植
(7) 创意: 存储格式为xml格式 使用mysql提供的xpath API 从而解决了无尽的运维需求的问题(这里性能会有降低)
(8) dmorm
(9) dmgen4sql

10. 脚本(lua)

(1) 自动化.
(2) 功能全部由C/C++实现, 数据结构也由C/C++提供
(3) lua只负责调用, 不使用本身lua的数据结构(为了解决lua reload数据归属问题), 不实现复杂逻辑(简单原则).
(4) dmlua

11. 配置文件[热点]

(1) 自动化.
(2) 文件格式选择 使用者角度 (csv > xml > bin) 开发者角度(xml > csv > bin) (3) dmconfig(json,csv,xml,xlsx,markdown)

12. 效率与优化

(1) 不写低效的代码, 不提前优化
(2) 不使用不成熟的优化手段
(3) 做性能评测(性能评测另一个用途是用于迅速熟悉一个新的模块或者系统) 进行热点定位
(4) 效率是一个综合的东西. 资源不对等不要比效率.
(5) 最终决定效率的是所使用的数据结构

13. 编码风格

(1) 统一标准 简单明确. 可参考google C++编码规范.
(2) 有新同事加入团队一定要安排几次review.(提升最低标准, 熟悉编码规范)
(3) 对性能有需求的地方尽量使用C风格实现.
(4) 规避使用未定义行为编码
(5) 编写有质感的代码. 当问题出现时 review时

LV1. 不知道有没有问题(无法定位问题)
LV2. 可能有问题(模糊定位问题)
LV3. 有问题(准确定位问题)
LV4. 没问题( 理想 )

14. 编码格式

(1) C++新标准中,提供了类似u8”中文”这种方式标记一个字符串是utf8字符串,避免编译器无法正确识别编码造成的乱码。 (2) 然而测试结果在gcc下,如果源代码文件的编码不是utf8,那么哪怕用了u8”中文”也是会导致乱码的,然而如果使用utf8编码,msvc编译器又会提示各种错误导致编译失败…… (3) 目前的结论是,想要跨平台的使用相同的代码,请使用UTF-8 with BOM编码,并用u8”中文”形式标记中文。测试结果gcc和msvc都可以正确识别,不会造成乱码问题。

15. debug的方式

(1) review [前置条件 13.4][修炼法则] (2) debug[快速法则]
(3) log[通用法则]

16. 国际化

(1) 自动化.
(2) 使用统一的解决方案, 规避直接在代码中直接使用字符串明文.
(3) dmgen4error

17. 单元测试

(1) 构建单元测试(gtest)
(2) dmgen4gtest

18. 第三方库

(1) 选择 稳定 熟悉的库
(2) 选择更新频率较低的库
(3) 对先进的解决方案做二次封装, 减少维护成本.(造轮子的过程中心得)

19. 数据类型

(1) 尽量规避浮点数的使用
(2) 优先使用符号数, 例(int32, uint32 优先使用int32)
(3) 使用可预测数据类型,例(uint8, uint16, uint32, uint64)

20. C++学习历程

LEVEL1 C++ 不好(内容太多)
LEVEL2 C++ 好(使用方便)
LEVEL3 C++ 不好(细节太多 容易出错)
LEVEL4 C++ 好(掌握细节)
LEVEL5 C++ 不好(效率太差)
LEVEL6 C++ 好(选择性的使用)
LEVEL7 C++ 不好(C的回归)

21. 架构

(1) 简单
(2) 稳定
(3) 易排查, 易扩展
(4) 可拆解

22. 基础素养

(1) 钻研精神, 勤学善问, 有好奇心
(2) 积极向上的态度, 创造性的思维
(3) 团队协作精神
(4) 谦虚谨慎 不骄不躁 工匠精神
(5) 写出高质量的代码(稳定, 易读, 规范, 易维护, 专业)

23. 理解的角度

观察 (细节)
看 (大局)
感受 (发现规律)
洞见 (点爆发)
所谓理解就是要理解模式

24. 问题理解层级

(1) 发现问题
(2) 解决问题
(3) 规避问题
(4) 消灭问题
(5) 创造问题

25. 问题规避原则

(1) 设计上规避(例如: glog在设计上面使用多线程独立文件来规避单文件加锁问题)
(2) 约定规避(例如: 约定使用int64放大若干倍数来替代浮点数)
(3) 实现规避(例如: 在高性能要求的场景, 使用纯C的数据结构来替代复杂的C++数据结构)
(4) 潜规则规避(例如: 利用平台语言或者数据结构的特性 来规避问题)

26. 如何消灭问题

(1) 编码规范
(2) 数据驱动开发
(3) 代码生成技术
(4) 为什么消灭了问题? 人是最不可控的, 减少了人本身对事物的影响.

27. 是否需要学习多种语言

理解 “在一种语言上编程” 和 “深入一种语言编程” 的区别(惯用法则)

28. 编程方法论

28.1. 防御式编程

28.2. 契约式编程

29. C++注意事项

Mobile Preview

30. 编程感悟

程序的精髓在于数据结构的组织与控制.
稳定的需求是产品质量的基石.
真正的需求,潜藏在人性因素与其他一系列因素的相互关联之中.

31. 常用书籍

https://github.com/brinkqiang/dmdoc

32. 开源定制库

32.1. 模块化定制版 dump文件生成

https://github.com/brinkqiang/dmbreakpad

32.2. 模块化定制版 命令行参数解析析

https://github.com/brinkqiang/dmflags

32.3. 基于 iconv 编码转换 实现自动化探测编码格式 仅需指定输出编码格式

https://github.com/brinkqiang/dmiconv

32.4. 模块化定制版 curl

https://github.com/brinkqiang/dmcurl

32.5. 模块化定制版 fmtlib C++格式化库库

https://github.com/brinkqiang/dmformat

32.6. 模块化定制版 google性能分析库库

https://github.com/brinkqiang/dmgperftools

32.7. 模块化定制版 log库, 基于spdlogg

https://github.com/brinkqiang/dmlog

32.8. 模块化定制版 protobuf 支持3.7/3.14版本本

https://github.com/brinkqiang/dmprotobuf

32.9. 模块化定制版 C++ csv读写库库

https://github.com/brinkqiang/dmcsv

32.10. 模块化定制版 C++ xml读写库库

https://github.com/brinkqiang/dmxml

32.11. 模块化定制版 C++ json读写库库

https://github.com/brinkqiang/dmjson

33. 个人开源库

33.1. 高性能定时器, 支持cron表达式

https://github.com/brinkqiang/dmtimer

33.2. C++ ORM

https://github.com/brinkqiang/dmorm

33.3. C++/lua引擎 基于toluapp

https://github.com/brinkqiang/dmlua

33.4. C++/lua引擎 基于sol2 分析C++头文件实现自动化导出

https://github.com/brinkqiang/dmsolpp

33.5. C++ 错误码自动生成器器

https://github.com/brinkqiang/dmgen4error

33.6. C++ 协议派发生成器器

https://github.com/brinkqiang/dmgen4pbmsg

33.7. C++ config文件自动化生成器 支持json, xml, csv, md等格式

https://github.com/brinkqiang/dmconfig

33.8. C++ SQL语句生成器

https://github.com/brinkqiang/dmsql

33.9. C++ SQL表库自动化对比 差异SQL生成器

https://github.com/brinkqiang/dmsqldiff

33.10. C++ 协议头通用处理库

https://github.com/brinkqiang/dmmsgparser

33.11. C++ 唯一ID生成库

https://github.com/brinkqiang/dmsnowflake