Skip to content

26 学习路线:七天速通,然后靠项目补细节 ​

详细程度:路线 · 约 7 分钟 材料:本手册 01 到 25 节 前置:任意一门主流语言的后端经验

这套手册怎么用 ​

手册 01 到 25 节的头部时长加起来是 1235 分钟,约 20.6 小时。它不是用来背的,而是用来建立一张图:Go 的世界观、核心范式、服务工程的套路、规模化之后的问题。这一版手册是讲课体改写后的形态,和旧版的差别值得知道:每节用具体现象开场、带可以直接跑的示例代码,读法相应变了,看到 go 代码块先抄下来跑一遍、猜输出,再对答案,比顺着读快一倍。细节有三层可以回查:

  1. 每节正文里吸收不了的细节收在"想深入:正文之外的干货"小节;再往外是"想深入去哪查",指向 work/digest/ 的知识点摘要(带页码,一般不用翻原材料原文)。
  2. 旧长版 notes/,每个主题有更长的讲解、完整练习和复盘记录。
  3. exercises/ 的练习包是已经写好的参考实现,测试本来就是绿的。过关的做法是把实现删掉自己重写,直到测试全绿,或者故意改坏一处再修回。

读完一节后做两件事:先不看答案回答"判断题",再选一个练习跑一遍。答不出来的,回去重读那一节的对应范式,而不是去翻细节。

七天路线 ​

天节目标练习(约 N 分钟)过关标准
101 节、02 节、03 节、04 节建立 Go 的世界观,会读写日常代码exercises/p1_5basics 的 TestSliceGrow(约 20)、exercises/p30 的 TestNilErrorTrap 与 TestMethodSetMatrix(约 25)能解释为什么指针类型能赋给接口而值类型不能;能说出 nil 接口陷阱的成因
205 节、06 节、07 节、08 节错误、并发、运行时的范式exercises/p3conc 的 TestPool 与 TestFirstOrTimeout(约 25)、exercises/p14pipe 的 TestPipeline(约 15)、exercises/p31sched 的 TestWorkerPool 与 TestNilChannelSelect(约 25)写出一个带 context 取消和 errgroup 的 pipeline,-race 干净;能解释 goroutine 泄漏怎么出现
309 节、10 节、11 节、12 节泛型取舍,服务分层、DI、HTTP 与数据库(11 节含认证:Session、JWT、长短 token、OAuth2)exercises/p33gen 的 TestConstraintNotType(约 15)、exercises/p5deep 的 TestProvideInvoke 与 TestGracefulShutdown(约 25)、exercises/p9db 的 TestTxAtomicity 与 TestNullStrategies(约 25)能画出 handler、service、repository 的依赖方向,说出每层依赖的是接口还是实现;能说出 JWT 为什么登不掉、长短 token 怎么解决
413 节、14 节、15 节缓存与消息、测试策略(14 节含 TDD 全流程与双写同步位置三选)、可观测exercises/p21test 的 TestBackoffTable 与 TestRetryVirtualTime(约 25)、exercises/p15slog 的 TestCtxRequestID(约 15)能说清缓存穿透、击穿、雪崩各自的对策;会写表驱动加 fake 的测试;能说出双写要在哪一层同步、什么条件下必须同库不同表
516 节、17 节、18 节稳定性与一致性:这是后端工程里最值钱的一块读 dnsproxi-go/tcp/server.go 的 MaxInFlight 丢帧限流,对比 main.go 里 worker pool 的阻塞式背压,再改造能手写令牌桶与三态熔断的状态转移;能说出 Saga、TCC、outbox 各自的适用场景
619 节、20 节、21 节微服务治理、注册发现、搜索与 Feed 的套路无单独练习,重做各节的内存版小例子能解释"先模块化再进程化"的拆分顺序;能说出推模型和拉模型的取舍
722 节、23 节、24 节、25 节运行环境,读完 dnsproxi-go,按 minifeed 阶段 1 到 4 读懂一版正确答案跑通 dnsproxi-go 的全部测试(本来就是绿的),做完 24 节的第一个改造,对照 25 节的表读 minifeed/ 的阶段 1 到 4 骨架能不看文档画出 dnsproxi 的请求路径,并指出每个范式在哪个文件;能说出 minifeed 阶段 5(关注与 Feed)你会先写哪张表

第 1 到 4 天每天 3 到 4 节加约 1 小时练习:第 1 天头部时长 175 分钟,约 2.9 小时(40+35+45+55);第 2 天 190 分钟,约 3.2 小时;第 3 天 245 分钟,约 4.1 小时(11 节吸收了认证、各节吸收了原材料细节后变长,是全表最重的一天);第 4 天 185 分钟,约 3.1 小时。 第 5 到 7 天读得慢一点是正常的:第 5 天的三节都是"深入"档,185 分钟,约 3.1 小时;第 6 天 140 分钟,约 2.3 小时;第 7 天 22 到 25 节共 115 分钟,约 1.9 小时,是全表最轻的一天,但走读 dnsproxi 与 minifeed 骨架的时间不受头部时长约束,留足半天。七天合计 1235 分钟,约 20.6 小时(见下面"如果时间更紧"的裁法)。

之后进入项目线,这才是真正的学习:

  • dnsproxi-go(24 节):把前面的范式在真实代码里找一遍,再做改造。第一批改造:让缓存接受带 AD 标志的查询、给 main 接上信号、去掉命中路径的拷贝。
  • minifeed(25 节):按蓝图自己做一个缩小版,每个阶段用测试验收。做这个项目时遇到的每个具体问题,再回头查对应的节和原材料。

两个说明。练习时间按"删掉实现重写到测试全绿"估算,表里的分钟数是第一次做(读懂参考实现再加自己写)的开销,第二次做可以砍半。第 5 天的练习不是写代码而是读代码:MaxInFlight 在 dnsproxi-go/tcp/server.go,worker pool 背压在 dnsproxi-go/main.go,两者是"丢帧"和"排队"两种过载策略的活例子,读完试着说出 22 节的哪个机制决定了 TCP 版必须丢帧。

进阶路线的三条经验 ​

七天之后怎么继续走,三个人的进阶自述给出同一套答案(TBX03 从测试转研发的孔令飞、TBX06 游戏公司后端主程罗杰、TBX07 从销售转分布式存储工程师的徐祥曦),叙事细节略,这里只收可操作的结论:

  1. 先定位,再补缺口。能力大致分五级:初级能读项目代码,中级能独立写完整程序、能做二次开发,高级熟练用 channel、interface、并发并用 OO 思想做项目,资深与专家再往上加编程哲学、生态与架构能力,专家要少依赖搜索、有自己的方法论、能设计高可用可伸缩的应用并领军团队;级别间没有标准边界,当自评坐标用。初中级自学就够:快速通读两本经典基础书(《Go 程序设计语言》《Go 语言编程》),不求记住,先知道知识点有哪些、能用在哪,再写适量小代码段,就具备读项目代码的能力;高级及以上必须靠工作中的真实研发实战,想在 Go 上走远就在合适时机切到研发岗。资深阶段最常见的四个痛点是知识盲区、学不到最佳实践、知识不成体系、缺一线项目练手,作者的解法是大规模调研后自己造脚手架:调研 2000+ 开源项目、5000+ 文章,按最佳实践写出 iam。〔TBX03 p1-2〕〔TBX03 p4-5〕〔TBX03 p8-9〕〔TBX03 p9-10〕
  2. 升级的引擎是需求驱动的实战循环。没有现成需求就把痛点抽象成需求(人工发版效率低、易出错,那就做一个版本发布系统);实战精髓是"抄"和"改":在 GitHub 找优秀项目二次开发,学设计又最快交付,比从零自研更省也更稳;循环是"发现需求、调研开源、二开、团队分享",期间刻意减少对搜索引擎的依赖,需要时用 channel、interface 和 OO 思想去改造项目。〔TBX03 p5-7〕TBX07 的作者是同款路线:主动问存储团队"你们缺人不?"换来转岗,"当什么都准备好时,往往也就没有机会试一试了";硬啃纠删码论文(思而不学则殆),看不懂就战略性撤退,借一门化学公开课把有限域补上,两周用 Go 加 Plan9 汇编写出 ISA-L 七成性能的第一版,再换矩阵运算形式追平并开源;更早的一场算法比赛(求 2^64-1 内最大素数,靠刚学的费马小定理和素数定理)让他第一次把想法变成几毫秒的程序。〔TBX07 p3-6〕架构能力走先业务后云原生:先了解当前业务的整体部署方式、手动搭一个小型测试环境、走读核心代码,再手搭 Kubernetes、部署小型微服务系统、配齐日志监控调用链;工作里有架构任务就踊跃参与,以工作驱动最高效。〔TBX03 p10-11〕
  3. 输入必须配输出和复习,问题要先于文档。听讲与阅读的知识留存率最多 10%,不复习第二天只剩 5%;复习四步:当天细读,次日复习并做笔记,有实战内容就抽时间写代码,一个月内再复习一次。输出三选一:讲给同事、用进日常工作、写博客,教会别人才算真正掌握;零散博客能解恐惧但不成体系,要成体系地学,再读源码上层次;选型别信单点言论,"Go 简单不用框架"把人坑进标准库硬搞,社区主流其实是 gin;Python 完整学过三遍、零实践,至今写不出代码,没有实践的语言学习无效。〔TBX06 p2-7〕架构设计的方法论在 TBX07:先把"设计一套存储系统"转成一个个具体问题,由问题引导出新问题,长成一张有组织的网再落纸面;引路人用"是还是不是"的追问打磨了四个月才允许动手,好问题比先写的文档值钱。〔TBX07 p7-8〕

省去的:三人的时间线与推荐清单(go-micro 已大版本分裂、二进制手搭 Kubernetes 的教程与现行 kubeadm/kind 做法有代差,只作理念参考)、TBX07 的 Go 贡献礼节(改进集中到一次提交,别刷屏式反复提交)、TBX06 的笔记回顾习惯;叙事细节略,完整叙事在 work/digest 的 TBX03、TBX06、TBX07 三个单元。

如果时间更紧 ​

只读"深入"档的节:04、05、06、07、10、13、14、16、17、18、19,头部时长相加是 655 分钟,约 10.9 小时;这是手册的主干,其余节需要时再查。更狠的裁法:主干里再只留 06、10、13、16,头部时长合计 255 分钟,约 4.3 小时,配合 24 节的项目走读,够应付"快速接手一个 Go 服务"的场景。 时间更紧时的读法也要变:跳过每节的示例运行,只读正文和"小结",判断题用来抽查理解。代价记在心里:这一版手册的可运行示例是理解成本最低的部分,跳过它们等于退回旧版浓缩笔记的读法。

反过来,时间充裕的加法不是加节,是把 24 节的改造做完一批(TC 截断、AD 标志、信号关停三选一),或者按 25 节的阶段表把 minifeed 的阶段 5 做掉。项目的收获永远大于多读一节。

如果想按主题而不是按顺序读 ​

想解决的问题先读
一个接口怎么设计才好测、好换04、10、14
一个服务怎么扛住流量高峰13、16,练习对照 dnsproxi-go/guard/ 的令牌桶与熔断
数据怎么搬、怎么保持一致17、18
服务多了怎么管19、20、23
程序怎么交付到机器上跑22、23,练习对照 labs/compose/ 的三服务编排
怎么读别人的 Go 项目02、24,以及旧章 notes/p4-ejdb.md、notes/p5-deepsearch.md
面试前突击16、13、19,加上 WX-sms 的短信服务话术
评审被问"为什么不用 X"27 节场景决策对照,判据都在"先问"后面

最后借课程总结一页,收拢贯穿全书的三条工程原则:接口为预期中的变化而定义,知道哪里会变但不知道怎么变时,只按当下需求做最简单的抽象,别指望设计一个用十年的接口;超前设计不超前实现,异步优先但先保证正确;微服务、DDD、最佳实践都是工具不是目标,走投无路再上微服务,别盲从"最佳实践"。〔W21-1 p3〕〔W21-1 p9〕

手册之外还有什么 ​

  • 旧长版 notes/ 详细完整,适合当参考手册;work/digest/ 是原材料每个单元的知识点摘要(带页码),用来判断某一讲值不值得读。
  • 原材料在本地、不入库(Tony Bai 的 52 讲、21 周项目课、go_basic 等代码包),各节末尾的页码指向它们。