课程简介
本课程拒绝纸上谈兵,全程以一个真实的、设计糟糕的嵌入式 C++ 祖传类(见附录 A)为手术标本。 架构师讲师将带你戴上重构的“两顶帽子”,用 AI 当手术刀,用 GoogleTest 筑防线,手把手将泥潭中的老旧 C++ 代码平滑重构为高内聚、易测试、零堆开销的现代工业级 C++ 典范。
目标收益
完成本课程后,学员将获得实打实的能力跃迁与思维重塑。
工程心智升维:破除 C++ 认知误区。彻底厘清现代 C++ 零成本抽象与桌面 C++ 滥用的边界,深刻掌握 MCU 资源受限(几十 KB RAM)下现代 C++ 的铁律:坚决关闭异常、关闭 RTTI、生产代码杜绝隐式堆分配;掌握 Chromium 级防御性设计(CHECK/DCHECK 守卫哲学、值语义、RAII 与移动语义优化)。
效能突破:打造 PC 端第一开发板。掌握 Windows WSL2 + Linux + VS Code + Clangd + CMake 的极速本地工程底座;告别板卡依赖,实现“PC 本地秒级编译、原生执行调度与仿真、秒级反馈”的现代化极速循环,将日常调试验证周期缩短 90% 以上。
实战突围:精通 C++ 遗留系统接缝重构理论。熟练运用对象接缝、链接接缝与编译期模板接缝切断紧咬的硬件驱动与与编译期模板接缝,切断紧咬的硬件驱动与 RTOS 调用,让任何紧耦合 C++ 类在 PC 上成功独立实例化;熟练掌握马丁·福勒微步重构技法与绞杀者模式,杜绝风险巨大的推倒重来。
防线确立:构筑 GoogleTest & GoogleMock 工业级测试网。精通运用 GoogleTest 编写测试夹具、参数化测试;精通 GoogleMock 设计硬件外设(UART、Flash、Timer)的 Mock/Fake 替身;掌握特征测试技法,在不动生产代码的前提下,精准固化现有 C++ 类的行为,为重构筑起绝对安全的防空网。
AI 驾驭:建立人机结对共创工程飞轮。掌握面向嵌入式 C++ 的高阶 Prompt 模式工程(逆向提取领域模型、自动补全 GoogleTest 用例、坏味道识别、微步代码变换);让 AI 扮演架构副驾驶,在人类架构师把控下,百倍提效代码逆向与重构演进全流程。
纵深防御:掌握 Linux 级动静态代码体检武器。在本地原生集成 AddressSanitizer(Asan)与 UndefinedBehaviorSanitizer(UBSan),秒级捕获悬垂引用、野指针、越界与未定义行为;利用 lcov 获得清晰的行覆盖、分支覆盖报告。
培训对象
本课程专为正在使用 C++ 开发,却被技术债与低效流程折磨的嵌入式开发团队量身打造。
深陷“改不动、不敢动”的嵌入式 C++ 工程师:虽然在用 C++,但面对几千行的“带 Class 的面条类”无从下手,一改就崩,急需掌握安全重构路径与自动化测试手段。
被不可预测 Bug(HardFault、死锁、内存越界)困扰的固件开发者:受困于 C++ 隐式堆分配、虚函数膨胀、多任务竞态,渴望建立一套高可靠、确定性内存的现代 C++ 编程防线。
苦于“调试必须连板子、烧录等到心烦”的开发人员:极度依赖硬件板卡与仿真器,渴望在 PC 端搭建秒级运行的纯软件工程闭环。
面临架构腐化与交付延期的技术主管
课程大纲
|
模块一:破局与心智重塑——从 C++ 复杂度反噬中突围 直击嵌入式团队使用 C++ 的翻车本质,重塑“确定性、零堆、快速失败”的现代嵌入式 C++ 核心心智。 |
1.嵌入式 C++ 典型翻车现场与病理诊断 a)伪面向对象灾难:充满全局访问点的单例滥用;成千上万行、职责无所不包的上帝类。 b)桌面惯性渗透:隐式 malloc(如 std::vector、std::string 动态扩容)引发的 RAM 碎片化与 HardFault 猝死。 c)多态滥用与体积失控:深层虚继承带来的 VTable 内存消耗、隐式构造与代码膨胀;未定义的异常抛出在 -fno-exceptions 下的致命后果。 d)认知负荷超载:米勒定律(7±2 效应)在大型 C++ 类中的体现;为什么不加节制的 C++ 比 C 语言更具毁灭性? 2.核心竞争壁垒:工程(师)文化太极图模型 a)设计能力(压制系统熵增):∑局部复杂度 <整体复杂度原则;模块单向依赖、强类型接口契约与数据隐藏。 b)工程能力(确立质量闭环):为什么“没有单元测试保护的重构本质上就是重写”?工程基建对个体与团队的强制约束与赋能。 3.现代嵌入式 C++ 工业级铁律 a)编译选项裁决:为什么工业安全关键级系统必须强制 -fno-exceptions 与 -fno-rtti? b)内存确定性原则:生产代码 100% 杜绝动态堆分配。 c)Chromium 级快速失败哲学:CHECK、DCHECK 断言体系与硬件陷阱(__builtin_trap);为什么“隐蔽容错、苟延残喘”是嵌入式系统彻底崩溃的头号元凶? 4.AI 时代的变与不变 a)AI 时代的剧变:DIKW 模型。 b)AI 时代的应变:两大支柱,一个基石。 c)AI 时代的实战:人机共创工程飞轮。 d)AI 时代的心智:寄生 vs 驾驭。 e)AI 时代的落地:太极图的六大发力点。 |
|
模块二:极速反馈底盘——脱离硬件的 PC 现代 C++ 工作台与 GoogleTest 测试网 终结板卡调试诅咒,建立 PC 端(WSL2/Linux)秒级编译运行的原生开发环境,构筑自动化测试防空网。 |
1.走出板卡调试诅咒的基建重塑 a)传统嵌入式 C++ 开发痛点:依赖仿真器单步调试、偶发 Bug 难以抓取、全量编译漫长。 b)跨平台极速反馈架构:Windows WSL2 + Linux + make + clangd。 c)“PC 即第一开发板”:本地秒级编译与原生运行,将反馈周期由数十分钟缩短至毫秒级。 2.GoogleTest & GoogleMock 工业级测试体系 a)测试夹具的生命周期管理。 b)参数化测试快速覆盖复杂的协议输入矩阵。 c)GoogleMock 精髓:MOCK_METHOD 宏使用、EXPECT_CALL 行为期望、调用时序匹配(I与值匹配器。 3.替代桌面 STL 的受限 C++ 零成本抽象武器库 a)安全切片视图 cal::span b)值语义错误通道 cal::expected c)零堆闭包 cal::InplaceFunction:剖析为什么嵌入式中断与回调中严禁使用 std::function;利用 Placement new 与函数指针手写类型擦除。 4.【学员实操】环境点亮与第一个脱板 C++ 测试 a)学员在 WSL2 环境中配置 Makefile + GoogleTest 构建工程。 b)为通用的静态环形队列模板 cal::RingBuffer |
|
模块三:AI 驱动的遗留系统逆向与坏味道诊断——解构 C++ 屎山标本 面对附录 A 中那个典型的、将硬件、RTOS、隐式堆分配混作一团的 C++ 遗留类,展开精准体检。 |
1.标本走读:解剖附录 A 代码 a)硬件蔓延与硬编码:类成员函数内直接调用 usart_data_transmit 等底层硬件 API,导致类无法在 PC 端被 new 或栈上实例化。 b)伪封装与全局状态混乱:类表面上封装了数据,但充斥着 getInstance() 单例、public 成员暴露、中断处理中直接修改私有状态。 c)隐式堆分配地雷:使用 std::string 和 std::vector 拼接报文,在 MCU 长时间运行后必然引发堆内存碎片耗尽。 d)深层条件泥潭:转义字符处理、CRC 校验、历史存储与 LED 硬件动作交织在同一个巨大函数中。 2.AI 协同逆向工程:快速看透晦涩老代码 a)Prompt 战术 1:时序与状态机逆向——引导 AI 深度走读遗留类,绘制 UML 状态流转图,识别隐藏的时序依赖。 b)Prompt 战术 2:领域模型与契约提取——指挥 AI 提炼老代码中的“名词”与“动词”,输出抽象接口定义草案。 c)Prompt 战术 3:架构坏味道与风险审查——让 AI 基于 SOLID 原则与嵌入式约束(MISRA C++),生成《技术债与隐患清单》。 3.重构战术的核心:特征测试 a)迈克尔·费瑟斯原则:在不知道老代码具体怎么实现前,先用测试固化其“现有可观测行为”。 b)AI 辅助生成特征测试:向 AI 喂入老旧类输入输出特征,批量生成黑盒覆盖用例(正常帧、转义帧、CRC 错误帧、断包粘包用例)。 |
|
模块四:接缝手术刀:紧耦合 C++ 类的微步重构实战 本课程的核心手术台!利用接缝切断硬件依赖,运用现代 C++ 技法完成平滑解耦蜕变。 |
1.C++ 系统的三大接缝理论(Seams)实战应用 a)对象接缝与依赖倒置(DIP): i.将硬编码的外设库提取为纯虚抽象契约接口(如 IUartDriver); ii.通过构造函数依赖注入(Constructor Injection),使测试环境可轻松注入 Mock 替身。 b)链接接缝: i.在不改动生产源码的前提下,通过符号替换,切断无法被对象化的底层 C 函数(如 RTOS 系统调用、固件库中断开关)。 c)编译期模板接缝: i.利用奇异递归模板模式(CRTP)消除虚函数表开销,在性能极其苛刻的高频调用路径兼顾零开销与脱板可测性。 2.微步重构战术(“两顶帽子”法则与微步演进) a)第一步:架设接缝,脱板运行——将附录 A 标本中的硬件读写与 RTOS 发送提取为驱动契约接口,通过 GoogleMock 在 PC 端让老逻辑 100% 跑通测试网。 b)第二步:消除隐式堆分配——用 cal::span 与定长存储消除内部的 std::string 和 std::vector,实现确定性内存占用。 c)第三步:状态机化解多层条件分支——将混乱的状态标志位重构为标准的状态模式(State Pattern)或基于表驱动的状态转移。 d)第四步:职责分离与机制收敛——将协议转义、CRC 校验、业务处理拆分为高内聚的独立纯计算单元;利用 cal::InplaceFunction 替换硬编码的外部模块调用。 3.AI 协同辅助微步代码变换 a)如何编写精准指令让 AI 执行“Extract Method / Class”而不改变任何逻辑细节。 b)让 AI 成为实时的重构语法检查器,确保每一步细微改动后,GoogleTest 测试网持续全绿(Green Bar)。 4.【学员实操】附录 A 标本 C++ 类的外科重构手术 a)学员在 AI 辅助下,针对附录 A 标本建立 GoogleTest 保护网; b)徒手实施接缝抽取与依赖倒置重构; c)见证代码从“无法脱板测试、充斥堆分配的单体”,转变为“零堆分配、职责单一、可在 PC 端秒级全绿验证”的现代 C++ 优雅模块。 |
|
模块五:工程效能与质量闭环——动静态体检、编译加速与团队演进 代码不仅要能跑,还要健康、健壮。本模块带学员掌握 Linux 环境下顶级的静态扫描、动态内存排雷与性能剖析工具,用机器手段守卫质量底线。 |
1.Linux 顶级动态分析体检:ASan 与 UBSan a)为什么现代 C++ 重构完后依然要防范悬垂引用(Dangling Reference)? b)集成 AddressSanitizer (ASan):秒级捕获栈内存溢出、野指针引用与对象析构后使用(Use-After-Free)。 c)集成 UndefinedBehaviorSanitizer (UBSan):精准抓取有符号整数溢出、空指针间接访问等未定义行为。 2.测试充分性度量与质量防腐 a)利用 gcov / lcov 自动生成可视化代码覆盖率报告(行覆盖、分支覆盖)。 b)理解高可靠工业标准(ISO 26262/MISRA C++)下的覆盖率要求,识破虚假高覆盖率的陷阱。 3.C++ 工程效能优化:终结漫长编译 a)C++ 头文件依赖治理:前置声明、Pimpl 模式与接口隔离,消除头文件恶性级联编译。 b)利用 ccache 与现代构建系统(CMake + Ninja)实现秒级增量编译。 4.团队演进与平滑落地战术 a)绞杀者模式实战:面对数万行祖传 C++ 固件,如何用新重构的高内聚 C++ 模块逐步替代老模块,做到业务不停跑、系统稳步升级。 b)本地 Pre-commit Hook + 自动化 CI 编译验证矩阵:杜绝“修了 A 模块、搞挂 B 型号固件”的悲剧。 c)AI 时代的架构师新修养:善用 AI 杠杆,坚守架构底座,以确定性质效压制软件系统熵增。 |
|
模块一:破局与心智重塑——从 C++ 复杂度反噬中突围 直击嵌入式团队使用 C++ 的翻车本质,重塑“确定性、零堆、快速失败”的现代嵌入式 C++ 核心心智。 1.嵌入式 C++ 典型翻车现场与病理诊断 a)伪面向对象灾难:充满全局访问点的单例滥用;成千上万行、职责无所不包的上帝类。 b)桌面惯性渗透:隐式 malloc(如 std::vector、std::string 动态扩容)引发的 RAM 碎片化与 HardFault 猝死。 c)多态滥用与体积失控:深层虚继承带来的 VTable 内存消耗、隐式构造与代码膨胀;未定义的异常抛出在 -fno-exceptions 下的致命后果。 d)认知负荷超载:米勒定律(7±2 效应)在大型 C++ 类中的体现;为什么不加节制的 C++ 比 C 语言更具毁灭性? 2.核心竞争壁垒:工程(师)文化太极图模型 a)设计能力(压制系统熵增):∑局部复杂度 <整体复杂度原则;模块单向依赖、强类型接口契约与数据隐藏。 b)工程能力(确立质量闭环):为什么“没有单元测试保护的重构本质上就是重写”?工程基建对个体与团队的强制约束与赋能。 3.现代嵌入式 C++ 工业级铁律 a)编译选项裁决:为什么工业安全关键级系统必须强制 -fno-exceptions 与 -fno-rtti? b)内存确定性原则:生产代码 100% 杜绝动态堆分配。 c)Chromium 级快速失败哲学:CHECK、DCHECK 断言体系与硬件陷阱(__builtin_trap);为什么“隐蔽容错、苟延残喘”是嵌入式系统彻底崩溃的头号元凶? 4.AI 时代的变与不变 a)AI 时代的剧变:DIKW 模型。 b)AI 时代的应变:两大支柱,一个基石。 c)AI 时代的实战:人机共创工程飞轮。 d)AI 时代的心智:寄生 vs 驾驭。 e)AI 时代的落地:太极图的六大发力点。 |
|
模块二:极速反馈底盘——脱离硬件的 PC 现代 C++ 工作台与 GoogleTest 测试网 终结板卡调试诅咒,建立 PC 端(WSL2/Linux)秒级编译运行的原生开发环境,构筑自动化测试防空网。 1.走出板卡调试诅咒的基建重塑 a)传统嵌入式 C++ 开发痛点:依赖仿真器单步调试、偶发 Bug 难以抓取、全量编译漫长。 b)跨平台极速反馈架构:Windows WSL2 + Linux + make + clangd。 c)“PC 即第一开发板”:本地秒级编译与原生运行,将反馈周期由数十分钟缩短至毫秒级。 2.GoogleTest & GoogleMock 工业级测试体系 a)测试夹具的生命周期管理。 b)参数化测试快速覆盖复杂的协议输入矩阵。 c)GoogleMock 精髓:MOCK_METHOD 宏使用、EXPECT_CALL 行为期望、调用时序匹配(I与值匹配器。 3.替代桌面 STL 的受限 C++ 零成本抽象武器库 a)安全切片视图 cal::span b)值语义错误通道 cal::expected c)零堆闭包 cal::InplaceFunction:剖析为什么嵌入式中断与回调中严禁使用 std::function;利用 Placement new 与函数指针手写类型擦除。 4.【学员实操】环境点亮与第一个脱板 C++ 测试 a)学员在 WSL2 环境中配置 Makefile + GoogleTest 构建工程。 b)为通用的静态环形队列模板 cal::RingBuffer |
|
模块三:AI 驱动的遗留系统逆向与坏味道诊断——解构 C++ 屎山标本 面对附录 A 中那个典型的、将硬件、RTOS、隐式堆分配混作一团的 C++ 遗留类,展开精准体检。 1.标本走读:解剖附录 A 代码 a)硬件蔓延与硬编码:类成员函数内直接调用 usart_data_transmit 等底层硬件 API,导致类无法在 PC 端被 new 或栈上实例化。 b)伪封装与全局状态混乱:类表面上封装了数据,但充斥着 getInstance() 单例、public 成员暴露、中断处理中直接修改私有状态。 c)隐式堆分配地雷:使用 std::string 和 std::vector 拼接报文,在 MCU 长时间运行后必然引发堆内存碎片耗尽。 d)深层条件泥潭:转义字符处理、CRC 校验、历史存储与 LED 硬件动作交织在同一个巨大函数中。 2.AI 协同逆向工程:快速看透晦涩老代码 a)Prompt 战术 1:时序与状态机逆向——引导 AI 深度走读遗留类,绘制 UML 状态流转图,识别隐藏的时序依赖。 b)Prompt 战术 2:领域模型与契约提取——指挥 AI 提炼老代码中的“名词”与“动词”,输出抽象接口定义草案。 c)Prompt 战术 3:架构坏味道与风险审查——让 AI 基于 SOLID 原则与嵌入式约束(MISRA C++),生成《技术债与隐患清单》。 3.重构战术的核心:特征测试 a)迈克尔·费瑟斯原则:在不知道老代码具体怎么实现前,先用测试固化其“现有可观测行为”。 b)AI 辅助生成特征测试:向 AI 喂入老旧类输入输出特征,批量生成黑盒覆盖用例(正常帧、转义帧、CRC 错误帧、断包粘包用例)。 |
|
模块四:接缝手术刀:紧耦合 C++ 类的微步重构实战 本课程的核心手术台!利用接缝切断硬件依赖,运用现代 C++ 技法完成平滑解耦蜕变。 1.C++ 系统的三大接缝理论(Seams)实战应用 a)对象接缝与依赖倒置(DIP): i.将硬编码的外设库提取为纯虚抽象契约接口(如 IUartDriver); ii.通过构造函数依赖注入(Constructor Injection),使测试环境可轻松注入 Mock 替身。 b)链接接缝: i.在不改动生产源码的前提下,通过符号替换,切断无法被对象化的底层 C 函数(如 RTOS 系统调用、固件库中断开关)。 c)编译期模板接缝: i.利用奇异递归模板模式(CRTP)消除虚函数表开销,在性能极其苛刻的高频调用路径兼顾零开销与脱板可测性。 2.微步重构战术(“两顶帽子”法则与微步演进) a)第一步:架设接缝,脱板运行——将附录 A 标本中的硬件读写与 RTOS 发送提取为驱动契约接口,通过 GoogleMock 在 PC 端让老逻辑 100% 跑通测试网。 b)第二步:消除隐式堆分配——用 cal::span 与定长存储消除内部的 std::string 和 std::vector,实现确定性内存占用。 c)第三步:状态机化解多层条件分支——将混乱的状态标志位重构为标准的状态模式(State Pattern)或基于表驱动的状态转移。 d)第四步:职责分离与机制收敛——将协议转义、CRC 校验、业务处理拆分为高内聚的独立纯计算单元;利用 cal::InplaceFunction 替换硬编码的外部模块调用。 3.AI 协同辅助微步代码变换 a)如何编写精准指令让 AI 执行“Extract Method / Class”而不改变任何逻辑细节。 b)让 AI 成为实时的重构语法检查器,确保每一步细微改动后,GoogleTest 测试网持续全绿(Green Bar)。 4.【学员实操】附录 A 标本 C++ 类的外科重构手术 a)学员在 AI 辅助下,针对附录 A 标本建立 GoogleTest 保护网; b)徒手实施接缝抽取与依赖倒置重构; c)见证代码从“无法脱板测试、充斥堆分配的单体”,转变为“零堆分配、职责单一、可在 PC 端秒级全绿验证”的现代 C++ 优雅模块。 |
|
模块五:工程效能与质量闭环——动静态体检、编译加速与团队演进 代码不仅要能跑,还要健康、健壮。本模块带学员掌握 Linux 环境下顶级的静态扫描、动态内存排雷与性能剖析工具,用机器手段守卫质量底线。 1.Linux 顶级动态分析体检:ASan 与 UBSan a)为什么现代 C++ 重构完后依然要防范悬垂引用(Dangling Reference)? b)集成 AddressSanitizer (ASan):秒级捕获栈内存溢出、野指针引用与对象析构后使用(Use-After-Free)。 c)集成 UndefinedBehaviorSanitizer (UBSan):精准抓取有符号整数溢出、空指针间接访问等未定义行为。 2.测试充分性度量与质量防腐 a)利用 gcov / lcov 自动生成可视化代码覆盖率报告(行覆盖、分支覆盖)。 b)理解高可靠工业标准(ISO 26262/MISRA C++)下的覆盖率要求,识破虚假高覆盖率的陷阱。 3.C++ 工程效能优化:终结漫长编译 a)C++ 头文件依赖治理:前置声明、Pimpl 模式与接口隔离,消除头文件恶性级联编译。 b)利用 ccache 与现代构建系统(CMake + Ninja)实现秒级增量编译。 4.团队演进与平滑落地战术 a)绞杀者模式实战:面对数万行祖传 C++ 固件,如何用新重构的高内聚 C++ 模块逐步替代老模块,做到业务不停跑、系统稳步升级。 b)本地 Pre-commit Hook + 自动化 CI 编译验证矩阵:杜绝“修了 A 模块、搞挂 B 型号固件”的悲剧。 c)AI 时代的架构师新修养:善用 AI 杠杆,坚守架构底座,以确定性质效压制软件系统熵增。 |
近期公开课推荐