阶段二 · 课程学习指南

本阶段按「语族」组织。选一个语族精学(标 ★ 为必学主干),其他语族看懂语法即可。每一门课都按「为什么学 → 知识地图 → 经典案例 → 引发思考」展开。


一、Python 语族

1. 零基础学 Python(2023版)★ 第一门

为什么学:Python 是公认最适合小白的语言,语法像英语一样直白,而且 AI、爬虫、自动化、数据分析全用它。作为第一门语言,它能让你最快获得「我能写程序了」的正反馈。

知识地图:

  • 环境搭建与基础语法(变量、类型、运算符)
  • 流程控制(if / for / while)
  • 函数、模块、包
  • 字符串与文件操作
  • 异常处理、面向对象入门
  • 常用标准库(os / json / re / datetime)

经典案例:老师布置「人生第一个项目」:写一个程序,读一份 Excel 里 1000 人的姓名和手机号,自动把手机号中间 4 位打码,另存为新文件。小白一开始觉得「太难了」,30 分钟后看到程序跑出正确结果,兴奋得睡不着。老师点评:第一课的成功体验,比任何理论都重要。

引发思考:

  1. Python 为什么叫「胶水语言」?它擅长什么、不擅长什么?
  2. a = 1 和 a = '1' 有什么本质区别?内存里发生了什么?
  3. 为什么不建议用 Python 写操作系统或游戏引擎?
  4. 你身边有什么「重复劳动」,可以用 20 行 Python 自动化掉?

2. Python 核心技术与实战 ★ 进阶

为什么学:入门只教会你「能跑」,这门课教你「写得好」。性能、并发、设计模式、工程化——从「会写」到「会写好」,这是 Python 程序员的分水岭。

知识地图:

  • 数据模型与魔法方法(__init__、__iter__……)
  • 生成器、迭代器、装饰器(Python 的三大灵魂)
  • 多线程 / 多进程 / 协程与 GIL
  • 内存管理与垃圾回收
  • 单元测试、日志、性能剖析(profile)
  • 常用设计模式在 Python 中的落地

经典案例:小白用多线程下载 100 个文件,发现速度反而变慢了。老师一针见血:「Python 的多线程有 GIL 锁,同一时刻只有一个线程在干活;你该用多进程或协程。你看,threading 和 asyncio,一个是『换着吃盒饭的厨师』,一个是『一个人同时烧五口锅』。」 小白从此不再迷信「多线程 = 快」。

引发思考:

  1. 装饰器为什么能「不动原函数就增强它」?举一个日志、鉴权的实际场景。
  2. 生成器一次只占一个元素的内存,它到底是怎么做到的?(惰性求值)
  3. GIL 是什么?为什么 Python 要背着这个「历史包袱」?
  4. 一个爬虫要并发抓 1 万页,用线程、进程还是协程?为什么?

3. Python 自动化办公实战(选学,职场利器)

为什么学:对非程序员,这是「回报率最高」的一门课。Excel、Word、邮件、PDF、文件批处理——把 3 小时的手工活变成 3 秒的脚本。

知识地图:

  • openpyxl / pandas 处理 Excel
  • python-docx 处理 Word
  • 批量重命名、批量整理文件
  • 自动发邮件(smtplib)
  • 定时任务(schedule / 系统计划任务)
  • 爬取网页数据存为表格

经典案例:行政小姐姐每月要汇总 30 个分部的报表,手工复制粘贴 4 小时。学完这门课,一个脚本 10 秒搞定,还不会出错。老师问小白:你的工作里,有没有这种『重复 3 次以上』的活?如果有,它就是你第一个自动化项目。

引发思考:

  1. 为什么「重复劳动」是程序员的头号敌人?
  2. 自动化之前,为什么要先想清楚「边界情况」(空表、格式错、网络断)?
  3. 爬虫抓数据,什么能抓、什么不能抓?哪些红线不能碰?(遵守 robots 协议与法规)
  4. 如果让你自动化「给 50 个人发个性化周报」,脚本要分几步?

二、Java 语族

4. 零基础学 Java ★ 第一门(后端方向)

为什么学:Java 是「大厂后端之王」,岗位多、生态成熟、一学就是十几年。它是 JVM 语言,一次编写处处运行,也是理解「面向对象」最好的教材。

知识地图:

  • JDK / IDE 环境与 Hello World
  • 基本语法、类型、运算符
  • 面向对象三大特性:封装、继承、多态
  • 集合框架(List / Map / Set)与泛型
  • 异常处理、IO 流
  • 多线程与并发入门

经典案例:小白写了个「学生管理系统」,用 ArrayList 存学生。老师问:「如果系统要求按学号查找,1 万个学生,你现在的写法每次都要从头找,最坏情况找 1 万次。你会怎么优化?」 小白懵了。老师引出 HashMap:「这就是『数据结构』第一次走进你的代码——查一个,1 次搞定。」(这个伏笔,阶段三的算法课会正式揭开。)

引发思考:

  1. 为什么 Java 要强调「面向对象」?不用对象,也能写程序,为什么还要用?
  2. == 和 equals() 有什么区别?为什么字符串比较常常出 bug?
  3. Java 的垃圾回收(GC)是自动的,那还会有内存问题吗?
  4. 「List 和 Map」你更常用哪个?它们的性能差别在什么场景体现?

5. Java 核心技术 36 讲 ★ 进阶

为什么学:入门学了「怎么用 Java」,这门课讲「Java 凭什么这样设计」。JVM 内存、类加载、并发工具、性能调优——面试必考、实战必备。

知识地图:

  • JVM 内存区域与对象的一生
  • 类加载机制与双亲委派
  • 并发:线程池、锁、volatile、CAS、AQS
  • Java 集合源码剖析(HashMap 为什么是红黑树?)
  • 反射、动态代理、注解
  • 性能调优与常见坑

经典案例:线上系统偶发「假死」,小白一脸茫然。老师带他抓线程栈(jstack),发现 50 个线程全卡在同一个锁上——死锁 + 线程池被占满。老师用 Java 并发工具重写,问题消失。小白第一次意识到:并发不是「加分项」,是「保命项」。

引发思考:

  1. HashMap 在多线程下为什么可能死循环?(JDK7 头插法)现在怎么修的?
  2. volatile 能保证什么、不能保证什么?为什么不能替代锁?
  3. 线程池的 7 大参数,你在生产环境会怎么设?为什么?
  4. 「反射」为什么慢?动态代理为什么在 Spring 里无处不在?

三、Go 语族

6. 郝林 Go 语言核心 36 讲 ★ 第一门(后端/云原生方向)

为什么学:Go 是「云原生时代的第一语言」——Kubernetes、Docker、etcd 全是 Go 写的。语法极简、并发是亲儿子,适合想搞后端、基础设施、微服务的人。

知识地图:

  • 语言基础:变量、类型、控制流、函数、方法
  • 指针、结构体、接口(Go 的面向对象是「组合」)
  • 并发原语:goroutine、channel、sync
  • 标准库:net/http、io、encoding/json
  • 错误处理与 panic/recover
  • 性能与内存模型

经典案例:小白用 Java 的思维写 Go,到处建 class 继承,写得很别扭。老师纠正:「Go 用『组合』不用『继承』,用『接口隐式实现』不用『implements 声明』。你看这个 http.Handler 接口——只要实现了 ServeHTTP 方法,自动就是 Handler,编译器帮你检查。这比 Java 少写一半样板代码。」 小白第一次体会到「语言设计哲学」的差异。

引发思考:

  1. goroutine 为什么比线程轻量得多?一个进程能开几十万个 goroutine 吗?
  2. channel 是什么?它和「共享内存 + 锁」有什么本质区别?
  3. 「不要通过共享内存来通信,而要通过通信来共享内存」——这句话你怎么理解?
  4. Go 的错误处理为什么是 if err != nil 满天飞?这是缺点还是优点?

7. Go 语言从入门到实战(选学,补全技能)

为什么学:补全 Go 的工程能力:模块管理、测试、性能、数据库交互、Web 开发,让你能用 Go 独立做项目。

知识地图:

  • go mod 模块管理
  • 单元测试与基准测试
  • 标准库 Web 开发(net/http、路由、中间件)
  • 数据库访问(database/sql、ORM)
  • 日志、配置、优雅退出
  • 性能剖析(pprof)

经典案例:小白写了个 HTTP 服务,压测发现 qps 只有几百。老师让他 go tool pprof 看火焰图,一眼发现 fmt.Sprintf 在热路径上疯狂分配内存。改掉后 qps 直接翻 5 倍。老师总结:Go 性能优化,先看火焰图,再动手,别瞎猜。

引发思考:

  1. 你的 HTTP 服务,如何做到「优雅停机」(正在处理的请求不中断)?
  2. 为什么 Go 的 defer 常用来释放资源?defer 的执行顺序是什么?
  3. 一个接口从「能用」到「抗压」,你至少要做哪三件事?

8. Go 项目开发实战 / Go 进阶·分布式爬虫实战(选学,实战升华)

为什么学:两门都是「真实项目全程演练」——前者做一个企业级 Go 项目(含架构、部署、K8s),后者做一个分布式爬虫(含队列、分布式、去重)。学完,你的 Go 从「会语法」变成「会做产品」。

知识地图(分布式爬虫):

  • 爬虫架构:调度、抓取、解析、存储
  • 并发模型与任务队列
  • 分布式去重(布隆过滤器)
  • 反爬应对(在合规前提下)
  • 监控与失败重试

经典案例:小白写的爬虫抓 1 万页时挂了,因为他用单线程「老老实实」一页页抓。老师把任务丢进 channel + 20 个 worker 并发消费,2 分钟跑完,还加了断点续抓——「并发 + 队列,就是分布式系统的雏形。你已经在用阶段七的知识了。」 小白惊呼「原来分布式没那么神���」。

引发思考:

  1. 单机并发和分布式,分界线到底在哪?什么时候才需要「分布式」?
  2. 爬虫挂了怎么恢复?「断点续抓」依赖什么数据结构?
  3. 去重 10 亿个 URL,用 map 会内存爆炸,你会用什么方案?

四、JavaScript 语族

9. JavaScript 核心原理 ★ 第一门(前端方向)

为什么学:JS 是浏览器的唯一语言,也是前端一切框架(React/Vue)的底座。这门课讲的是「JS 这门语言本身怎么工作」——作用域、闭包、原型、事件循环,全是面试必考、写码必备。

知识地图:

  • 变量提升、作用域、闭包
  • this 指向的四种情况
  • 原型与原型链、class 的本质
  • 事件循环(Event Loop)与宏任务/微任务
  • Promise、async/await
  • ES6+ 新特性(解构、箭头函数、模块化)

经典案例:小白写 for 循环绑定点击事件,点击后全部输出同一个数字,抓狂。老师指着代码说:「闭包捕获的是变量,不是值。var 时代的经典坑——你看到的结果不是 bug,是作用域规则。」 改 let 或立即执行函数后正常。小白从此理解:JS 的「坑」背后,都是「规则」。

引发思考:

  1. 闭包是什么?它为什么能「记住」外面的变量?内存上怎么实现的?
  2. console.log(1)、Promise、setTimeout 的输出顺序是什么?为什么?
  3. 原型链上找不到属性会怎样?Object.prototype 是终点吗?
  4. 为什么说「JS 是单线程的」?那它怎么做到「异步」?

10. JavaScript 进阶实战(选学,工程化进阶)

为什么学:从「语言」走向「工程」:设计模式、性能、安全、测试,写「能上线」的 JS。

知识地图:

  • 常用设计模式在 JS 中的实现
  • 函数式编程:柯里化、compose
  • 异步编程进阶与并发控制
  • JS 内存管理与内存泄漏��查
  • 工程化:模块化、构建、代码规范

经典案例:小白写的页面越用越卡,老师用 Chrome DevTools 的 Performance 面板一查:内存曲线一路上涨——事件监听器没解绑 + 定时器没清理,页面在「慢性失血」。清理后曲线平稳。老师总结:「前端性能问题,八成是『内存泄漏』和『频繁重排』。」

引发思考:

  1. 你写的页面为什么会越来越卡?排查内存泄漏的标准步骤是什么?
  2. 函数式编程和面向对象,各适合什么场景?
  3. 「防抖」和「节流」有什么区别?分别用在什么场景?

五、C/C++ 与 Rust 语族(性能/底层方向)

11. 现代 C++ 实战 30 讲 ★ 第一门(底层方向)

为什么学:C++ 是「性能天花板」语言:游戏引擎、数据库内核、浏览器、操作系统全是它。学 C++,你会把「内存、指针、RAII」这些概念刻进骨子里,反过来理解其他所有语言都更容易。

知识地图:

  • 从 C 到 C++:引用、重载、默认参数
  • 类与对象、构造函数/析构函数、RAII
  • 智能指针(unique_ptr / shared_ptr)
  • 标准库容器与算法(STL)
  • 移动语义与右值引用
  • 模板与泛型编程入门

经典案例:小白问「为什么 C++ 要搞出智能指针这种复杂的东西?」老师演示:「用裸指针 new 一个对象,忘了 delete,内存泄漏;异常发生时,delete 那行永远执行不到,直接崩。而 RAII——把资源绑定在对象生命周期上——对象销毁,资源自动释放,天塌下来都不漏。」 小白感叹:「原来 C++ 的复杂,都是被『资源安全』逼出来的。」

引发思考:

  1. 指针和引用有什么区别?为什么 C++ 说「能用引用就别用指针」?
  2. 移动语义解决了什么问题?为什么 std::move 能「偷」资源?
  3. RAII 思想在其他语言(如 Python 的 with、Go 的 defer)里是怎么体现的?
  4. 为什么智能指针不能解决所有问题?(循环引用)

12. 罗剑锋 C++ 实战笔记 / C++20 实战高手课(选学,深入现代 C++)

为什么学:第一门课带你入门,这两门带你用上「现代 C++」——C++11 到 C++20 的新特性,让 C++ 写起来更安全、更简洁、更像「现代语言」。

知识地图(C++20 高手课):

  • 模块(Modules)、协程(Coroutines)
  • 概念(Concepts)、范围(Ranges)
  • 新容器与算法、格式化输出
  • 性能与并发的最佳实践
  • 大型项目中的 C++ 工程实践

经典案例:小白听说「协程」是 C++20 的杀手锏,问老师干嘛用的。老师答:「协程让你能用『同步的写法』写『异步的代码』——读网络、等 IO 的时候,函数可以暂停,不占线程。对写网络服务和游戏引擎的人来说,这是革命性的。你看,现代 C++ 越来越像『带性能的脚本语言』。」

引发思考:

  1. C++20 的协程和 Go 的 goroutine、Python 的 asyncio,本质区别在哪?
  2. 为什么「模块」能替代头文件?它解决了什么问题?
  3. 你会在什么场景选择 C++,而不是 Go 或 Rust?

13. Rust 语言从入门到实战 ★(新时代底层之王)

为什么学:Rust 连续多年被评为「最受喜爱的语言」。它要性能有性能,要安全有安全——「所有权」机制让内存错误在编译期就被消灭。未来系统软件、区块链、高性能后端的重要语言。

知识地图:

  • 所有权、借用、生命周期(Rust 的灵魂)
  • 模式匹配与枚举
  • 错误处理(Result / Option)
  • trait 与泛型
  • 并发安全:Send / Sync
  • 常用工具链:cargo、clippy、rustfmt

经典案例:小白写了一段「安全的」C++ 代码,问老师「我这没 bug 吧」。老师把同一段逻辑用 Rust 写,编译器直接报错:「你这里把数据的所有权转移走了,后面又用它——编译期就拦住了。在 C++ 里,这是运行期才会爆的内存错误;在 Rust 里,写不出来这种代码。」 小白震撼:「安全不是靠小心,是靠设计。」

引发思考:

  1. 所有权到底是什么?它和 GC、手动管理有什么本质区别?
  2. 为什么说 Rust 能「不用 GC 也能保证内存安全」?代价是什么?
  3. 借用的规则(可变借用唯一、不可变借用可多个)为什么能杜绝数据竞争?
  4. Rust 的学习曲线为什么陡?值不值得?什么岗位最需要它?

14. 张汉东 Rust 实战课 / 陈天 Rust 编程第一课(选学,实战深化)

为什么学:入门讲规则,实战课带你用 Rust 做真实项目(CLI 工具、Web 服务、网络协议、并发框架),把「所有权恐惧」变成「习以为常」。

知识地图:

  • 用 Rust 写 CLI 工具、Web API
  • 异步 Rust(tokio)
  • 网络编程与协议解析
  • 并发与并行编程实战
  • 生态与工程实践

经典案例:小白用 Rust 重写了一个原来用 Python 写的命令行工具,启动速度从「秒级」变成「毫秒级」,内存占用从 50MB 变成 2MB。老师:「这就是为什么区块链节点、高性能网关要用 Rust——省下的每一分资源,在规模效应下都是钱。」

引发思考:

  1. 你目前的工作或学习中,有什么场景值得用 Rust 重写?收益在哪?
  2. Rust 的异步(tokio)和 Go 的 goroutine,模型上有什么异同?

六、Kotlin 语族(JVM/移动端方向)

15. Kotlin 编程第一课 / 快速上手 Kotlin 开发(选学,Android/JVM)

为什么学:Kotlin 是 Android 官方语言,也是「更好的 Java」——语法简洁、空安全、协程,还能和 Java 无缝混用。做移动端或想体验现代 JVM 语言必学。

知识地图:

  • 空安全(? / !! / ?:)——消灭空指针异常
  • 数据类、扩展函数、高阶函数
  • 协程(Coroutine)与 Flow
  • 集合操作(map/filter 链式调用)
  • 与 Java 互操作

经典案例:小白写 Java 最怕 NullPointerException,转到 Kotlin 后发现:「类型系统直接告诉你这个变量可能为空,编译器逼你处理,NPE 从『运行期炸弹』变成『编译期提醒』。还有扩展函数——给 String 加个 isPhoneNumber() 方法,Java 得写工具类,Kotlin 一行搞定。」

引发思考:

  1. Kotlin 的协程和线程池有什么区别?为什么它不阻塞线程?
  2. 「空安全」是通过什么机制实现的?成本是什么?
  3. 如果让你从 Java 迁移到 Kotlin,你会先迁移哪部分?为什么?

本阶段小结

语言是手段,不是目的。 学完本阶段,你应该:

  1. 精通一个语族(能独立写项目);
  2. 看懂其他语族的语法(遇到能读、能查);
  3. 记住一句话:「所有语言都在解决同一个问题——怎么更好地操纵内存和计算。区别只是取舍。」

下一站:03_阶段三_计算机核心内功/,开始修炼算法、网络、操作系统这三大内功。