案例

1. 实体事物理解

1.1. 网络引擎

1.1.1. 优化点. 网络引擎性能本质点在网络事件处理单帧所耗时间

1.1.2. 服务器引擎速度较低 20W QPS, 经过优化达到单链接40W QPS, 多链接 70W QPS.

1.2. 时钟层面

1.2.1. 使用精度与预计精度的统一, 精度分级.

1.2.2. 影响时钟性能的因素, 所使用的数据结构, 所使用的时间API的精度.

1.2.3. 时钟的实现让我理解了分时, 从而在多线程问题上没有再犯过错误.

1.2.4. 在C++领域有大量不同实现方法的定时器组件. 在使用上面 要么在性能上面非常差, 要么易用性上面非常差.

1.2.5. 很多定时器的之间性能差距能达到100+倍. 汇总各个定时器实现之优劣, 综合应用领域易用性优先原则.

1.2.6. 定时器的使用上面有很多需要注意的细节, 导致各种诡异bug. 通过对定时器各种实现的理解. 总结出如何规避这些问题.

1.2.7. 基础定时器功能实现, 指定触发时间间隔, 触发回调

1.2.8. 可指定第一次触发时间间隔

1.2.9. 动态绑定参数, 及回调实现

1.2.10. 可指定调用策略, 漏调补调模式

1.2.11. 安全移除定时器

1.2.12. 增加获取定时器已执行时间, 下一次执行时间间隔接口

1.2.13. 实现高性能对象池, 解决性能热点

1.2.14. 调试导致时间异常处理

1.2.15. 系统时间调整无关性处理

1.2.16. 支持 windows, linux, mac平台

1.2.17. 支持对象内存搬移, 鉴于使用中需要注意事项较多, 不推荐使用.

1.3. 脚本层面

1.3.1. 脚本负责 会经常变化的逻辑.

1.3.2. 自动枚举目录下所有lua脚本预加载, 脚本正确性检测

1.3.3. 自动化导出C++数据结构

1.3.4. C++ call lua的参数及返回值模板化实现自动化绑定

1.3.5. 支持直接热更, 以及热更失败相关处理逻辑

1.3.6. 支持lua5.3版本

1.3.7. 支持 windows, linux, mac平台

1.3.8. 本引擎实现 建议(只是建议, 如果必须要使用, 需要使用者自己处理 下述问题)使用者 规避在lua中定义lua的动态数据结构 以避免 脚本reload数据归属权不明确问题.

1.4. 数据库层面

1.4.1. dmsql 负责具体SQL语句的生成

1.4.2. dmsqldiff 负责数据库的库创建, 表创建, 表字段变更.

1.4.3. 多线程问题, command对象释放问题

1.5. 内存层面

1.5.1. 内存泄露认知 (一次性泄漏 , 常规性泄漏 , 偶发性泄漏 , 运行时泄漏)

1.5.2. 使用内存池解决内存碎片问题(问题点: 内存池 没有对象类型信息), 使用对象池解决内存泄漏问题(管理需要管理的内存).

1.5.3. 内存分配失败默认处理

1.5.4. 可以用工具检测出来的内存泄漏不是内存泄露, 即我们主要要解决的内存泄漏是: 运行时泄漏

1.5.5. 案例: 某次服务器存在内存泄漏, 我们通过打印对象池 发现 某个对象数量非常多. 经过排查, 发现在某些条件下 释放存在问题.

1.6. 多线程层面

1.6.1. io, 操作无关, 高耗, 低锁 使用线程效率较高.

1.6.2. 设计上规避多读多写.

1.6.3. 积极使用无锁队列.

1.6.4. 多线程的精髓为分时 理解了分时就理解了多线程.

1.7. 日志

1.7.1. debug不能解决所有问题, 但是日志可以.

1.7.2. 日志的写入应该是同步的, 日志分级, 分文件.

1.7.3. 根据项目情况选择合适的日志组件. (glog让我明白 从设计上解决问题的重要性)

2. 业务层面思考

2.1. 对象数据结构组织与控制以及对象生命周期管理

3. 抽象

3.1. C++学习历程

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

  • C++ 学习路径:
    Level 1: C++ 初学者 评判标准: 了解 C++ 基本语法,能够编写简单的程序,例如控制台输出、变量使用、简单运算等。 用例: 编写简单的 “Hello World” 程序,进行基础的数值计算。 Level 2: C++ 熟练者 评判标准: 掌握 C++ 核心语法,熟悉常用数据结构和算法,能够编写结构化的程序,例如分支、循环、函数等。 用例: 实现简单的排序算法,编写学生管理系统等小型程序。 Level 3: C++ 应用者 评判标准: 理解面向对象编程 (OOP) 的概念,能够使用类、继承、多态等特性,编写面向对象的程序。 用例: 设计并实现简单的游戏,开发图形界面应用程序。 Level 4: C++ 专家 评判标准: 掌握 C++ 高级特性,例如模板、异常处理、运算符重载等,能够编写高质量、可复用的代码。 用例: 开发高性能库或框架,设计并实现复杂的数据结构和算法。 Level 5: C++ 大师 评判标准: 深入理解 C++ 内存管理机制,能够进行底层优化,编写高性能、高效的代码。 用例: 开发实时系统、高并发应用,对现有代码进行性能分析和优化。 Level 6: C++ 架构师 评判标准: 能够根据需求选择合适的 C++ 特性,设计并实现大型软件架构,并能进行跨平台开发。 用例: 设计并实现分布式系统、云平台等复杂软件项目。 Level 7: C++ 悟道者 评判标准: 对 C++ 有着深刻的理解,洞悉其设计哲学和发展历程。 能够灵活运用 C++ 和 C,根据项目需求选择最佳方案。 积极参与 C++ 社区,推动 C++ 语言的发展。 用例: 编写高性能、可移植的库或框架。 参与 C++ 标准制定或开源项目贡献。 指导和培养下一代 C++ 开发者。

  • C++ 学习方式: 自学: 通过书籍、在线课程、教程等资源进行自主学习。 学校教育: 在大学或培训机构接受系统性的 C++ 教育。 实践项目: 通过参与实际项目,在实践中学习和提升 C++ 技能。 社区交流: 加入 C++ 社区,与其他开发者交流学习经验,互相帮助。
  • C++ 学习内容: 语言基础: 语法、数据类型、运算符、控制流等。 标准库 (STL): 容器、算法、迭代器等。 面向对象编程 (OOP): 类、继承、多态、封装等。 模板: 函数模板、类模板、模板元编程等。 内存管理: 指针、动态内存分配、智能指针等。 异常处理: try-catch-throw 机制,异常安全等。 并发编程: 线程、互斥锁、原子操作等。 网络编程: Socket 编程、网络协议等。 图形界面编程: 使用 Qt、wxWidgets 等库进行图形界面开发。
  • C++ 学习目标: 兴趣爱好: 出于对编程的热爱,想要学习 C++ 并探索其可能性。 职业发展: 希望成为 C++ 开发工程师,从事相关领域的软件开发工作。 学术研究: 进行 C++ 相关的学术研究,例如编译器开发、语言设计等。
  • C++ 学习挑战: C++ 语言本身的复杂性: C++ 语法庞大,特性繁多,学习曲线陡峭。 内存管理的难度: 手动管理内存容易出错,需要开发者具备较强的责任心和调试能力。 新标准的不断更新: C++ 标准不断演进,开发者需要持续学习新特性。
  • C++ 学习建议: 循序渐进,打好基础: 从基础语法开始,逐步深入学习 C++ 的各个方面。 多实践,多练习: 将所学知识应用到实际项目中,通过实践来巩固和提升技能。 阅读优秀的 C++ 代码: 学习其他开发者优秀的代码风格和设计模式。 积极参与 C++ 社区: 与其他开发者交流学习经验,互相帮助,共同进步。

3.2. 理解的角度

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

3.3. 问题理解层级

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

3.4. 问题规避原则

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

3.5. 如何消灭问题

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

4. 编程感悟

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