# study_plan **Repository Path**: wangyuew/study_plan ## Basic Information - **Project Name**: study_plan - **Description**: c++进阶学习 - **Primary Language**: C++ - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-03-16 - **Last Updated**: 2026-03-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # study_plan #### 介绍 适用对象:已有一定 C++ 开发经验,希望系统进阶,重点提升现代 C++、STL、并发、网络编程、工程化与实战能力。 --- ## 1. 计划目标 这套计划的目标不是“看完几本书”,而是把你训练成能完成中小型 C++ 工程项目的人。完成后,你应当能够: 1. 写出更现代、稳定、可维护的 C++14 风格代码。 2. 理解对象生命周期、资源管理、拷贝/移动语义。 3. 熟练使用常用 STL 容器、算法和工具组件。 4. 编写基础并发程序,理解锁、条件变量、原子与线程池。 5. 完成 Linux Socket 网络编程基础项目,并理解 epoll 与事件驱动。 6. 具备基础工程化能力:CMake、测试、日志、配置、调试、Sanitizer、重构。 7. 手里有一套能展示学习路径的代码仓库,而不是只剩书签和笔记。 --- ## 2. 总体节奏 ### 每周学习时长建议 - 周一到周五:每天 60~90 分钟 - 周六:3~4 小时 - 周日:1.5~2 小时 ### 每天固定 4 步 1. 看知识点 30 分钟 2. 写代码 45 分钟 3. 测试或验证 15 分钟 4. 记录笔记 10 分钟 ### 执行原则 - 每天至少保留两样产出:代码、测试、笔记。 - 每周必须形成一个可运行 demo 或小模块。 - 周日必须做复盘,不跳过。 - 前 8 周尽量以 **C++14** 为主线,不混太多 C++17/20 写法。 --- ## 3. 开始前半天准备(不计入 12 周) ### Day 0:环境与仓库准备 1. 安装开发环境 - Linux 或 WSL2 - g++ 或 clang++ - cmake - gdb - git 2. 建立仓库结构 ```text cpp-advance/ notes/ examples/ projects/ tests/ third_party/ scripts/ README.md CMakeLists.txt ``` 3. 默认编译选项(开发阶段) ```bash -std=c++14 -O0 -g -Wall -Wextra -Wpedantic ``` 4. 创建进度记录文件 ```text notes/progress.md ``` 5. 约定每周至少一次提交周总结。 --- ## 4. 推荐资料与使用方式 ### 核心书籍 1. **A Tour of C++** - 用途:建立现代 C++ 全局地图 - 用法:第 1~4 周快速总览和回查 2. **Effective Modern C++** - 用途:吃透 C++11/14 风格与坑点 - 用法:第 2~6 周主攻 3. **C++ Primer** - 用途:补基础、查漏补缺、看容器与语言细节 - 用法:全程作为补漏书 4. **C++ Concurrency in Action** - 用途:并发系统学习 - 用法:第 7~8 周主攻 5. **UNIX Network Programming** - 用途:网络编程主线书 - 用法:第 9~10 周主攻 ### 常查资料 - cppreference(语言和标准库接口查询) - Linux man 手册(socket / bind / listen / accept / connect / select / poll / epoll) - C++ Core Guidelines(代码习惯、接口设计、资源管理) - CMake 官方教程 - GoogleTest 文档 - GDB 文档 - Clang/GCC 警告与 Sanitizer 文档 ### 资料使用方法 - **A Tour of C++**:先建立全局地图。 - **C++ Primer**:碰到基础薄弱点就翻,不建议逐页硬啃。 - **Effective Modern C++**:看现代写法和易错点时重点翻。 - **Concurrency in Action**:并发阶段认真看。 - **UNP + man**:网络阶段以书和手册配合写代码。 - **cppreference**:每天都查,不靠记忆硬写接口。 --- ## 5. 项目仓库目录模板 建议在第 1 周就按下面结构组织代码,后续逐渐填充: ```text cpp-advance/ ├── CMakeLists.txt ├── README.md ├── notes/ │ ├── progress.md │ ├── week1_review.md │ ├── week2_review.md │ └── ... ├── examples/ │ ├── w1/ │ ├── w2/ │ ├── w3/ │ └── ... ├── projects/ │ ├── w2_buffer/ │ ├── w3_dispatcher/ │ ├── w4_factory_callback/ │ ├── w5_lru/ │ ├── w6_config_parser/ │ ├── w7_blocking_queue/ │ ├── w8_threadpool/ │ ├── w8_async_logger/ │ ├── w9_protocol_echo/ │ └── w10_chatroom/ ├── tests/ │ ├── w5_lru_test.cpp │ ├── w7_queue_test.cpp │ └── ... ├── scripts/ │ ├── build.sh │ ├── run_tests.sh │ └── format.sh └── third_party/ ``` ### 第 11 周工程化后可升级为 ```text cpp-advance/ ├── CMakeLists.txt ├── README.md ├── apps/ │ ├── chat_server/ │ └── chat_client/ ├── core/ │ ├── common/ │ ├── util/ │ ├── log/ │ ├── config/ │ ├── net/ │ └── concurrency/ ├── examples/ ├── tests/ ├── notes/ ├── scripts/ └── third_party/ ``` --- ## 6. 提交规范建议 ### 提交信息格式 ```text [阶段/周次] 类型: 简短说明 ``` ### 类型建议 - feat:新增功能 - fix:修复问题 - refactor:重构 - test:新增/调整测试 - docs:笔记、文档更新 - chore:构建、脚本、目录整理 ### 示例 ```text [w1] feat: add Trace lifecycle demo [w1] docs: summarize RAII and object lifetime [w2] feat: implement StringLite copy control [w2] fix: handle self-assignment in StringLite [w5] feat: add LRU cache with list and unordered_map [w7] feat: implement blocking queue with condition_variable [w8] refactor: improve thread pool shutdown flow [w10] feat: add epoll-based chatroom first version [w11] chore: migrate project to CMake targets [w12] test: add sanitizer checks for blocking queue ``` ### 每周最低提交要求 - 周一到周五:至少 3 次提交 - 周六:至少 1 次项目功能提交 - 周日:至少 1 次复盘或整理提交 ### Tag 建议 - `v0.1-week4-modern-cpp` - `v0.2-week8-concurrency` - `v0.3-week10-network` - `v1.0-final-12weeks` --- ## 7. 12 周 / 84 天详细执行表 # 第 1 周:对象生命周期、RAII、const、类的基本功 ### 本周目标 - 理解对象生命周期与资源管理 - 建立 RAII 思维 - 熟悉构造、析构、初始化、const 正确性、多态基础 ### Day 1 学:对象生命周期、作用域、栈对象/堆对象。 写:`Trace` 类,打印构造、拷贝、移动、析构。 产出: - `examples/w1/day1_trace.cpp` - 生命周期图一页 ### Day 2 学:`const` 修饰、引用、本质区别、`const` 成员函数。 写:10 个小例子,专门判断 `const` 修饰对象。 产出: - `notes/w1d2_const.md` ### Day 3 学:构造函数、初始化列表、默认构造、`explicit`。 写:`Person` / `Config` 类,对比赋值初始化和初始化列表。 产出: - `examples/w1/day3_init.cpp` ### Day 4 学:析构、资源释放、RAII 思想。 写:`FileGuard`,构造打开文件,析构关闭文件。 产出: - `examples/w1/day4_file_guard.cpp` ### Day 5 学:类不变式、封装、接口与实现分离。 写:给 `FileGuard` 加禁止拷贝能力,思考原因。 产出: - `notes/w1d5_invariant.md` ### Day 6 学:虚函数、虚析构、对象切片。 写:`Shape` / `Circle` / `Rectangle`,故意制造一次对象切片。 产出: - `examples/w1/day6_polymorphism.cpp` ### Day 7 复盘: - 重新运行本周 demo - 写 1 页总结:为什么 C++ 强调 RAII - 给自己出 10 个口头问题并回答 产出: - `notes/week1_review.md` ### 本周交付 - `Trace` - `FileGuard` - 多态切片 demo - 周总结 --- # 第 2 周:拷贝控制、Rule of 3/5/0、移动语义 ### 本周目标 - 理解浅拷贝/深拷贝 - 掌握拷贝构造、赋值、移动构造、移动赋值 - 真正建立 move 语义直觉 ### Day 8 学:浅拷贝 vs 深拷贝,默认拷贝的风险。 写:错误版 `StringLite`,内部持有 `char*`,故意触发双重释放。 产出: - `examples/w2/day1_bad_string.cpp` ### Day 9 学:拷贝构造、拷贝赋值、自赋值。 写:修正 `StringLite` 的拷贝构造和赋值。 产出: - `examples/w2/day2_copy_control.cpp` ### Day 10 学:左值、右值、`std::move`。 写:为 `StringLite` 加移动构造、移动赋值,打印日志观察调用。 产出: - `examples/w2/day3_move.cpp` ### Day 11 学:Rule of 3 / 5 / 0。 写:整理 `StringLite`,补齐五大函数。 产出: - `notes/w2d4_rule3450.md` ### Day 12 学:`noexcept` 与移动优化,容器为何更喜欢可移动对象。 写:用 `std::vector` 做 `push_back/emplace_back`,观察行为。 产出: - `examples/w2/day5_vector_move.cpp` ### Day 13 项目日:简化版 `Buffer` 或动态数组类。 要求: - 动态扩容 - 拷贝控制 - 移动控制 - 下标访问 产出: - `projects/w2_buffer/` ### Day 14 复盘: - 对比 `StringLite` 和 `Buffer` - 写总结:`std::move` 究竟做了什么 - 补 3 个边界测试 产出: - `notes/week2_review.md` ### 本周交付 - `StringLite` - `Buffer` - 移动语义总结 --- # 第 3 周:auto、decltype、lambda、using、enum class、现代语法习惯 ### 本周目标 - 形成现代 C++ 书写习惯 - 理解类型推导和 lambda 捕获 - 开始配合 STL 算法写更简洁的代码 ### Day 15 学:`auto` 推导规则。 写:20 个变量声明,先猜类型,再验证。 产出: - `notes/w3d1_auto.md` ### Day 16 学:`decltype` 与 `auto` 的差异。 写:几个返回值场景,比较不同写法。 产出: - `examples/w3/day2_decltype.cpp` ### Day 17 学:`nullptr`、range-for、`using`、`enum class`。 写:把旧风格 typedef / NULL / 普通枚举 demo 重构。 产出: - `examples/w3/day3_modern_basics.cpp` ### Day 18 学:lambda 语法、值捕获、引用捕获、`mutable`。 写:5 个 lambda 小例子,重点看捕获行为。 产出: - `examples/w3/day4_lambda_basics.cpp` ### Day 19 学:lambda 配合 STL 算法。 写:把手写循环改成 `for_each / transform / sort`。 产出: - `examples/w3/day5_lambda_stl.cpp` ### Day 20 项目日:命令分发器。 要求: - 命令用 `enum class` - 处理函数用 lambda - 使用 `unordered_map` 或 `map` 产出: - `projects/w3_dispatcher/` ### Day 21 复盘: - 写一页总结:什么时候该用 `auto` - 给命令分发器补 5 条非法输入测试 产出: - `notes/week3_review.md` ### 本周交付 - lambda 练习集 - 命令分发器 --- # 第 4 周:智能指针、std::function、完美转发入门、可变参数模板入门 ### 本周目标 - 理解所有权与智能指针边界 - 掌握常见回调封装方式 - 建立 forward 的基础理解 ### Day 22 学:所有权概念,为什么 `unique_ptr` 是默认选择。 写:把多态示例改成 `unique_ptr` 管理。 产出: - `examples/w4/day1_unique_ptr.cpp` ### Day 23 学:自定义 deleter。 写:`unique_ptr` 管理文件句柄。 产出: - `examples/w4/day2_custom_deleter.cpp` ### Day 24 学:`shared_ptr`、`weak_ptr`、循环引用。 写:构造循环引用错误示例,再用 `weak_ptr` 修掉。 产出: - `examples/w4/day3_shared_weak.cpp` ### Day 25 学:`std::function`、可调用对象。 写:回调注册器,支持函数、lambda、仿函数。 产出: - `examples/w4/day4_function_callback.cpp` ### Day 26 学:转发引用、`std::forward`,理解即可,不强求高级模板技巧。 写:实现 `make_object` 风格小函数模板。 产出: - `examples/w4/day5_forward.cpp` ### Day 27 项目日:对象工厂 + 回调系统。 要求: - 工厂返回 `unique_ptr` - 注册表保存构造逻辑 - 支持事件回调 产出: - `projects/w4_factory_callback/` ### Day 28 复盘: - 写一页总结:为什么不要把 `shared_ptr` 当万金油 - 给工厂系统补 5 个失败场景 产出: - `notes/week4_review.md` ### 本周交付 - 智能指针实验集 - 工厂 + 回调系统 --- # 第 5 周:STL 容器体系与选型 ### 本周目标 - 熟悉常用容器的结构、复杂度、适用场景 - 掌握迭代器失效问题 - 能根据场景选择合适容器 ### Day 29 学:`vector / deque / list` 差异。 写:三种容器分别做头插、中插、尾插,记录体验。 产出: - `notes/w5d1_sequence_containers.md` ### Day 30 学:`map / set` 与 `unordered_map / unordered_set` 差异。 写:同一组数据分别放入两类容器,观察顺序和接口。 产出: - `examples/w5/day2_assoc.cpp` ### Day 31 学:迭代器失效。 写:制造 6 个迭代器失效案例,再逐个修掉。 产出: - `examples/w5/day3_invalidation.cpp` ### Day 32 学:`stack / queue / priority_queue`。 写:简单任务优先级调度 demo。 产出: - `examples/w5/day4_adapters.cpp` ### Day 33 学:容器选型原则。 写:给自己出 10 个场景题,回答“该选什么容器,为什么”。 产出: - `notes/w5d5_choose_container.md` ### Day 34 项目日:LRU Cache。 要求: - `unordered_map + list` - `get/put` - 容量淘汰 产出: - `projects/w5_lru/` ### Day 35 复盘: - 给 LRU 补测试 - 写一页为什么选 `list + unordered_map` 产出: - `tests/w5_lru_test.cpp` - `notes/week5_review.md` ### 本周交付 - 容器选型笔记 - LRU Cache --- # 第 6 周:STL 算法、字符串、pair/tuple、配置解析器 ### 本周目标 - 用算法替代大量手写循环 - 掌握字符串处理与基础工具模块开发 - 形成“能写小工具组件”的能力 ### Day 36 学:`sort/find/count/remove_if/for_each`。 写:准备一份学生成绩或任务数据,全部用算法处理。 产出: - `examples/w6/day1_algorithms.cpp` ### Day 37 学:`transform/accumulate/partition`。 写:把 Day 36 代码里至少 3 个循环改写成算法。 产出: - `examples/w6/day2_transform_accumulate.cpp` ### Day 38 学:`lower_bound / upper_bound / binary_search`。 写:有序数组查询 demo。 产出: - `examples/w6/day3_binary_search.cpp` ### Day 39 学:`string`、`stringstream`、字符串切分、去空格。 写:工具函数:`trim/split/join`。 产出: - `examples/w6/day4_string_utils.cpp` ### Day 40 学:`pair / tuple` 使用边界,何时换成结构体。 写:把一个返回多个值的函数改成 `pair/tuple`,对比可读性。 产出: - `notes/w6d5_pair_tuple.md` ### Day 41 项目日:简单配置文件解析器。 要求: - 支持 `key=value` - 忽略注释和空行 - 读取字符串、数字、布尔值 产出: - `projects/w6_config_parser/` ### Day 42 复盘: - 给配置解析器补非法输入测试 - 用它给前面项目加载配置 产出: - `notes/week6_review.md` ### 本周交付 - 算法练习集 - 配置解析器 --- # 第 7 周:线程、锁、条件变量、阻塞队列 ### 本周目标 - 掌握线程基础、竞态条件、互斥量和条件变量 - 编写可用的线程安全阻塞队列 ### Day 43 学:`std::thread`、`join/detach`。 写:3 个最小线程程序,分别传值、传引用、传 lambda。 产出: - `examples/w7/day1_thread_basics.cpp` ### Day 44 学:`mutex`、竞态条件。 写:共享计数器 demo,先写错,再用 `mutex` 修正。 产出: - `examples/w7/day2_mutex.cpp` ### Day 45 学:`lock_guard` 和 `unique_lock`。 写:同一 demo 各写一版,比较接口差异。 产出: - `notes/w7d3_lock_types.md` ### Day 46 学:`condition_variable`、等待条件、虚假唤醒。 写:最小生产者/消费者 demo。 产出: - `examples/w7/day4_cv.cpp` ### Day 47 学:死锁成因、锁顺序。 写:制造一个双锁死锁,再用一致加锁顺序解决。 产出: - `examples/w7/day5_deadlock.cpp` ### Day 48 项目日:线程安全阻塞队列。 要求: - `push` - `pop` - `close/stop` - 条件变量等待 产出: - `projects/w7_blocking_queue/` ### Day 49 复盘: - 给阻塞队列补多线程测试 - 写一页条件变量常见错误 产出: - `tests/w7_queue_test.cpp` - `notes/week7_review.md` ### 本周交付 - 线程实验集 - 阻塞队列 --- # 第 8 周:atomic、future/promise、线程池、异步日志 ### 本周目标 - 理解原子与锁的边界 - 了解 future/promise/async - 实现一个可用线程池与异步日志雏形 ### Day 50 学:`atomic` 与锁的区别。 写:原子计数器 demo,对比普通整型和加锁版。 产出: - `examples/w8/day1_atomic.cpp` ### Day 51 学:`future/promise`。 写:后台线程算结果,主线程等待取值。 产出: - `examples/w8/day2_future_promise.cpp` ### Day 52 学:`std::async` 的方便与限制。 写:并行计算几个任务,比较体验。 产出: - `examples/w8/day3_async.cpp` ### Day 53 学:线程池设计:任务队列、工作线程、关闭流程。 写:先画线程池设计图。 产出: - `notes/w8d4_threadpool_design.md` ### Day 54 写:线程池第一版。 要求: - 固定数量工作线程 - 可提交无返回值任务 - 能优雅停止 产出: - `projects/w8_threadpool/` ### Day 55 写:线程池第二版。 增加: - 返回 `future` - 异常处理 - 队列关闭逻辑 产出: - 持续完善 `projects/w8_threadpool/` ### Day 56 复盘: - 用线程池做一个异步日志系统雏形 - 写总结:线程池关键在关闭与异常路径 产出: - `projects/w8_async_logger/` - `notes/week8_review.md` ### 本周交付 - 线程池 - 异步日志雏形 --- # 第 9 周:Socket 基础、TCP/UDP、消息边界、协议设计 ### 本周目标 - 掌握基础 Socket 编程流程 - 理解 send/recv 的实际行为 - 建立消息协议设计意识 ### Day 57 学:TCP/UDP、IP/端口、字节序、socket 生命周期。 写:画 socket API 调用流程图。 产出: - `notes/w9d1_socket_flow.md` ### Day 58 写:最小 TCP 服务端。 要求: - `socket/bind/listen/accept` - 接一个连接 - 回固定字符串 产出: - `examples/w9/day2_tcp_server.cpp` ### Day 59 写:最小 TCP 客户端。 要求: - 连接服务端 - 收消息并打印 产出: - `examples/w9/day3_tcp_client.cpp` ### Day 60 学:`send/recv` 不保证一次发完/收完。 写:模拟部分发送和部分接收。 产出: - `notes/w9d4_partial_send_recv.md` ### Day 61 学:粘包/拆包、消息头 + 消息体。 写:设计简单协议: - 4 字节长度 - 1 字节类型 - N 字节正文 产出: - `examples/w9/day5_protocol.cpp` ### Day 62 项目日:协议版 Echo 程序。 要求: - 客户端发消息 - 服务端按协议解析并回显 产出: - `projects/w9_protocol_echo/` ### Day 63 复盘: - 用 `nc` 或自写客户端做多轮测试 - 写一页为什么网络编程里最怕想当然 产出: - `notes/week9_review.md` ### 本周交付 - TCP client/server - 协议版 Echo 程序 --- # 第 10 周:非阻塞 I/O、select/poll/epoll、聊天室 ### 本周目标 - 理解阻塞/非阻塞与 I/O 复用 - 掌握 epoll 基本使用 - 实现聊天室第一版 ### Day 64 学:阻塞 vs 非阻塞,I/O 复用为什么存在。 写:把第 9 周服务端改成非阻塞版。 产出: - `examples/w10/day1_nonblocking.cpp` ### Day 65 学:`select/poll` 思想。 写:最简 `select` 版 server,可处理多个客户端。 产出: - `examples/w10/day2_select_server.cpp` ### Day 66 学:`epoll`、LT/ET、事件驱动。 写:最小 `epoll` event loop 骨架。 产出: - `examples/w10/day3_epoll_skeleton.cpp` ### Day 67 写:`epoll` Echo Server。 要求: - 新连接接入 - 可读事件处理 - 回写消息 产出: - `examples/w10/day4_epoll_echo.cpp` ### Day 68 学:连接管理、读缓冲/写缓冲。 写:给 `epoll` server 增加连接对象封装。 产出: - `notes/w10d5_connection_design.md` ### Day 69 项目日:聊天室第一版。 功能: - 登录名 - 广播消息 - 退出通知 产出: - `projects/w10_chatroom/` ### Day 70 复盘: - 给聊天室加心跳或超时踢出(二选一) - 写总结:`epoll` 带来的不是魔法,而是事件驱动的组织方式 产出: - `notes/week10_review.md` ### 本周交付 - `epoll` Echo Server - 聊天室第一版 --- # 第 11 周:工程化、CMake、模块划分、日志、配置、单元测试 ### 本周目标 - 把 demo 堆砌式代码改造成更像项目的结构 - 接入 CMake、日志、配置、测试 ### Day 71 学:CMake target 思维。 写:把一个旧项目接入 CMake。 产出: - `CMakeLists.txt` ### Day 72 学:项目分层与目录划分。 做:将主项目拆成 - `core` - `net` - `util` - `app` - `tests` 产出: - 目录结构重构完成 ### Day 73 学:日志模块设计。 写:同步日志器第一版,支持: - 时间 - 等级 - 输出到文件/控制台 产出: - `projects/common/logger/` ### Day 74 学:配置模块设计。 写:将第 6 周配置解析器接入主项目,支持端口、日志级别、线程数配置。 产出: - `projects/common/config/` ### Day 75 学:错误码、返回值设计、失败路径。 写:重构主项目里最乱的 3 处错误处理逻辑。 产出: - `notes/w11d5_error_handling.md` ### Day 76 项目日:补单元测试。 优先测试: - LRU - 配置解析器 - 阻塞队列 - 协议解析 产出: - `tests/` ### Day 77 复盘: - 写项目 README - 画模块依赖图 - 列 5 个仍然丑的地方 产出: - `README.md` - `notes/week11_review.md` ### 本周交付 - CMake 化工程 - 日志模块 - 配置模块 - 测试基础 --- # 第 12 周:调试、Sanitizer、静态检查、设计模式落地、最终收尾 ### 本周目标 - 建立基础调试与质量保障习惯 - 做一轮真正的收尾与重构 - 形成可展示的最终项目和总结 ### Day 78 学:`gdb` 基础:断点、单步、查看栈、变量。 做:挑一个旧 bug,用 `gdb` 重现并定位。 产出: - `notes/w12d1_gdb_cheatsheet.md` ### Day 79 学:编译警告和代码异味。 做:打开更严格 warning,尽量清理到接近零警告。 产出: - warning 清理提交 ### Day 80 学:AddressSanitizer / LeakSanitizer。 做:在容易出错模块上跑 sanitizer。 产出: - `notes/w12d3_asan_lsan.md` ### Day 81 学:ThreadSanitizer,数据竞争定位。 做:在线程池或阻塞队列上跑一次。 产出: - `notes/w12d4_tsan.md` ### Day 82 学:设计模式只挑实用的。 做:在项目里落 1~2 个: - 工厂 - 策略 - 观察者 产出: - `notes/w12d5_patterns.md` ### Day 83 最终项目日。 做: - 清理目录 - 补 README - 补架构图 - 跑完整测试 - 做 3 分钟口述总结:这个项目的分层和难点 产出: - 项目最终版 ### Day 84 总复盘。 做: 1. 写 2~3 页总结:这 12 周最值钱的 10 个点 2. 列出自己的薄弱项 3. 规划下一阶段 8 周计划 产出: - `notes/final_review.md` ### 本周交付 - 经过调试、测试、重构的主项目 - 一份像样的 README - 最终复盘文档 --- ## 8. 每周必须看到的硬结果 12 周结束时,仓库里至少应有: - `Trace` - `FileGuard` - `StringLite` - `Buffer` - 命令分发器 - 工厂 + 回调系统 - `LRU Cache` - 配置解析器 - 阻塞队列 - 线程池 - 异步日志雏形 - 协议版 Echo Server - `epoll` 聊天室 - CMake 化项目 - 单元测试 - README - 最终总结 --- ## 9. 每周复盘模板 每周日直接照着写: ```text 本周学习主题: 本周完成内容: 本周最难的 3 个点: 我真正理解了什么: 我还模糊的点: 下周最重要的目标: 本周代码里最丑的 2 处: 我准备怎么重构: ``` --- ## 10. 如果某周被工作打断,怎么降级执行 降级原则: 1. 保核心概念 2. 保最小项目 3. 保周日复盘 可以砍掉的部分: - 额外练习题 - 多余的 demo 变体 - 非核心的补充阅读 尽量别砍的部分: - 本周主项目 - 每周总结 - 测试与验证 --- ## 11. 计划完成后的下一阶段建议(8 周方向) 如果 12 周顺利完成,下一阶段可以从下面选一个方向继续: 1. **Boost.Asio / 网络框架化** - 将 socket + epoll 项目做更规范的抽象 2. **HTTP 服务器** - 请求解析、路由、静态资源、线程池配合 3. **简化 RPC 框架** - 序列化、服务调用、连接管理 4. **C++17/20 补强** - `optional`、`variant`、`string_view`、`filesystem` - 并行算法、ranges(了解) 5. **性能与内存优化** - 小对象优化 - 内存池/对象池 - Profiling --- ## 12. 一句话执行建议 别等“我准备好了再开始”。 最好的开始方式是: - 今天完成环境准备 - 然后直接做第 1 周 Day 1 - 晚上把 `Trace` 和生命周期笔记交出来 只要第一天真正动手了,这套计划就已经跑起来了。