3/17 晚更新:感冒恢复后重新整理计划。原计划因生病耽误一周。
核心策略调整:不再”学完了再面”,而是”边学边面,边面边补”。
今晚就开始行动,简历明天就投出去,前两场面试就是模拟考。


当前处境分析

我有什么

  • 编程基本功还在,Go语法学过一遍(简介、变量已整理成博客),不是从零开始
  • 云计算国赛二等奖——能证明技术能力的硬指标
  • 半年实施经验——了解项目从开发到落地的全流程
  • 有内推资源,目标岗位明确

需要正视的

  • 脱离开发半年,手感需要恢复
  • 项目经验需要重新构建——不是”回忆旧项目”,而是”做一个新的、能说得清楚的项目”
  • 时间窗口极短,面试黄金期就在眼前
  • 身体刚恢复,需要合理分配精力,不能硬撑到崩溃

心态校准

感冒耽误了一周,焦虑是正常的。但焦虑本身不产生代码,只有坐下来敲键盘才会。

**关于”怕背不出来”**:面试不是默写考试。面试官问GMP不是让你背hchan有几个字段,而是看你能不能用自己的话讲清楚。理解了的东西不需要背,说不出来的地方恰恰说明还没理解——早暴露比晚暴露好。

**关于”怕面试受打击”**:前两场面试就是拿来”废掉”的。不要当终面,当成带答案的模拟考。挂了之后你会清楚地知道哪里不会,这比闷头学高效十倍。每一场挂掉的面试都在帮你缩小复习范围。


求职方向

主攻: Go 后端开发岗位
兼顾: 有Go需求的云原生/基础架构岗位
放弃: Java方向、大数据方向——精力有限,不分散


冲刺总览(今晚启动,3/17 - 3/22)

日期 主题 核心产出
Day0 今晚 3/17 启动 Go语法热身 + 简历初稿
Day1 周三 3/18 Go语法 + 底层原理 语法恢复 + GMP/channel能讲清 + 简历投出去
Day2 周四 3/19 MySQL + Redis + 项目启动 数据库面试题能答 + 项目骨架搭完 + 开始约面
Day3 周五 3/20 项目实战 + 网络编程 GoChat-Lite核心功能完成 + 可能有第一场面试
Day4 周六 3/21 项目收尾 + 面试 GitHub项目能看 + 面试实战
Day5 周日 3/22 查漏补缺 + 面试 根据面试反馈针对性补强

核心原则:简历第一天就投出去,面试从第三天开始穿插进行。
每日节奏: 08:00 开始,12:00-13:30 午休,23:00 停止。不熬夜——熬夜会让第二天报废。


Day0:今晚启动(3/17 晚 19:30 - 23:00)

目标:动起来。热身 + 简历初稿 + 投递准备。今晚不求多,求”已经开始了”。

19:30 - 21:00 | Go语法热身

  • 打开Go Playground或本地IDE,写一个goroutine+channel的小程序
  • 回顾自己写的golang简介和变量博客,快速进入状态
  • 写一个带select+timeout的并发示例,确认手感还在

21:00 - 22:30 | 简历初稿

  • 拿出现有简历,更新基本信息
  • 技术栈写上:Go / Gin / MySQL / Redis / WebSocket / Docker
  • 项目经历先写一个GoChat-Lite的占位描述(项目还没做,但方向已确定):

独立设计并实现基于WebSocket的实时聊天服务,使用Go+Gin+MySQL+Redis技术栈,支持多房间并发聊天、消息持久化、心跳保活,集成pprof性能监控。

  • 实施经历表述定稿:

负责产品交付与客户技术对接,主导部署方案设计,参与系统架构的落地实施。

  • 空窗期话术定稿:

离职后重新聚焦Go后端方向,系统学习并实践了Go并发编程、数据库优化、实时通信等技术。

22:30 - 23:00 | 明天的准备

  • Boss直聘/拉勾/牛客账号登录,确认能正常使用
  • 列出3-5个明晚要投递的目标公司/岗位
  • 联系内推朋友,告知自己在准备中,近两天会发简历

Day1:Go语法 + 底层原理(3/18 周三)

目标:把Go语法恢复到能写的状态,底层原理能讲清楚。晚上简历投出去。

上午 08:00 - 12:00 | Go语法全量恢复

08:00 - 09:30 | 类型 + 控制流 + 函数

  • 基本类型、变量声明、常量、iota
  • 数组与切片:make/append/copy、扩容机制
  • map:增删改查、并发不安全
  • 结构体:定义、嵌套、方法(值接收者 vs 指针接收者)
  • if/for/switch/select、函数多返回值、闭包、defer(LIFO)

09:30 - 11:00 | 接口 + 并发 + 错误处理

  • interface定义、隐式实现、类型断言、type switch
  • error接口、errors.Is/As/Wrap、panic/recover
  • goroutine + channel(无缓冲/有缓冲/方向限制)
  • select多路复用、超时控制
  • sync包:WaitGroup / Mutex / RWMutex / Once
  • context:WithCancel / WithTimeout / WithValue

11:00 - 12:00 | 关键字 + 指针 + 包管理

  • 25个关键字快速过,重点:defer/select/interface/chan/go
  • 指针、new vs make、值传递
  • go mod、包可见性、init()执行顺序

下午 13:30 - 18:00 | Go底层原理(面试核心)

13:30 - 15:00 | GMP调度模型

  • G(goroutine本质,初始栈2KB)、M(OS线程)、P(逻辑处理器)
  • 调度流程:创建G → P本地队列 → M执行
  • work stealing + hand off
  • syscall阻塞时M与P分离、netpoller
  • 能用自己的话讲清楚整个流程(不是背,是理解后复述)

15:00 - 16:00 | channel底层 + 内存逃逸

  • hchan:环形缓冲区buf、sendq/recvq等待队列、lock
  • 发送/接收流程、close行为、nil channel阻塞
  • 逃逸场景:返回指针、interface{}、闭包、大对象
  • go build -gcflags="-m -l" 验证

16:00 - 17:00 | GC + pprof

  • 三色标记法 + 混合写屏障
  • GC触发条件、STW、GOGC
  • pprof:CPU/内存/goroutine profiling
  • net/http/pprof集成方法

17:00 - 18:00 | Gin框架速通

  • 路由、中间件、JSON绑定与响应
  • 用Gin写一个最小CRUD API(半小时能跑起来就行)
  • 项目分层结构:handler → service → repository → model

晚上 19:30 - 23:00 | 简历投出去 + 开始约面

19:30 - 20:30 | 简历定稿

  • 基于今晚初稿,补充今天学到的技术细节
  • 准备1分钟自我介绍(对着镜子说一遍)
  • PDF导出,确认格式正常

20:30 - 22:00 | 投递 + 内推

  • 内推朋友:正式发送简历
  • Boss直聘/拉勾/牛客:投递5-10个目标岗位
  • 主动打招呼,不要只是”投递”按钮
  • 尽量约到3/20(周五)或之后的面试

22:00 - 23:00 | 当日回顾

  • 标记今天没理解透的点
  • 记录到每日日志

Day2:MySQL + Redis + 项目启动(3/19 周四)

目标:数据库和缓存面试题能答,项目骨架搭完。持续跟进投递回复,积极约面。

上午 08:00 - 12:00 | 数据库核心

08:00 - 09:00 | MySQL基础

  • CRUD + JOIN + 聚合函数
  • 用Go操作MySQL:GORM或sqlx基本用法

09:00 - 10:00 | 索引(面试必问)

  • B+树:为什么选B+树而非B树或Hash
  • 聚簇索引 vs 非聚簇索引(回表)、覆盖索引
  • 联合索引 + 最左前缀原则

10:00 - 11:00 | 索引失效 + 事务

  • 索引失效场景:函数/运算、隐式转换、LIKE %开头、OR、最左前缀违反
  • EXPLAIN分析执行计划
  • ACID、隔离级别(重点:可重复读+MVCC)、锁(行锁/间隙锁)

11:00 - 12:00 | 数据库设计 + 架构概念

  • 三大范式 + 反范式
  • 读写分离(binlog → relay log)、分库分表(垂直/水平)
  • 慢SQL排查思路

下午 13:30 - 18:00 | Redis + 项目启动

13:30 - 15:00 | Redis

  • 五大数据结构 + 使用场景
  • 持久化:RDB vs AOF
  • 缓存穿透/雪崩/击穿 + 解决方案
  • 过期策略、内存淘汰(LRU/LFU)
  • 分布式锁:SETNX + 过期时间
  • Redis为什么快:单线程 + IO多路复用 + 内存操作

15:00 - 18:00 | GoChat-Lite项目启动

  • go mod init、目录结构搭建
  • MySQL建表:users + messages(含联合索引)
  • model定义 + repository层
  • 用户注册/登录接口(JWT)
  • Gin路由 + 中间件

晚上 19:30 - 23:00 | 网络编程 + 跟进投递

19:30 - 21:00 | WebSocket + 网络编程

  • WebSocket握手流程:HTTP Upgrade → 101
  • 心跳保活、长连接管理
  • 消息推送模型:单播/广播/组播
  • TCP socket基础 + 粘包处理
  • 微服务概念速览 + 对象存储基本操作和场景

21:00 - 22:30 | 跟进面试

  • 检查投递回复,积极回复HR消息
  • 有面试邀约就约3/20下午或3/21
  • 准备针对性的面试问题(查看公司技术栈)

22:30 - 23:00 | 当日回顾

  • 记录进度
  • 明天全天写项目,提前想清楚实现步骤

Day3:项目实战 - GoChat-Lite(3/20 周五)

目标:项目核心功能跑通。如果有面试,下午优先面试,代码晚上补。

上午 08:00 - 12:00 | WebSocket核心

08:00 - 10:00 | Hub + Client

  • Hub结构:管理所有连接,负责消息广播
  • Client结构:conn + send channel + 用户信息
  • Hub.Run():select监听register/unregister/broadcast
  • Client.ReadPump() + Client.WritePump()

10:00 - 12:00 | 消息收发 + Redis集成

  • WebSocket升级接口 + 消息格式(JSON)
  • 房间加入/离开广播、消息广播
  • 消息异步持久化到MySQL
  • Redis:在线用户Set + 最近消息List缓存

下午 13:30 - 18:00 | 功能补全(或面试)

如果下午有面试:面试优先,以下内容移到晚上或Day4补。

13:30 - 15:00 | 心跳保活 + 前端页面

  • 读超时 + ping/pong机制
  • 一个HTML页面:登录 + 聊天窗口 + 消息输入(原生JS,不求美观)

15:00 - 17:00 | 联调测试

  • 完整流程:注册 → 登录 → 加入房间 → 收发消息 → 退出
  • 修Bug

17:00 - 18:00 | 推送GitHub

  • git init + commit + push
  • 确认GitHub上能看到完整代码

晚上 19:30 - 23:00 | 面试复盘 + 项目补充

19:30 - 21:00 | 如果今天有面试

  • 记录面试中被问到的问题
  • 标记答得不好的点,针对性复习
  • 这些”答不上来的题”就是你明天的复习重点

19:30 - 21:00 | 如果今天没有面试

  • 继续完善项目功能
  • 或复习Day1/Day2标记的薄弱点

21:00 - 23:00 | 项目README初稿

  • 项目简介 + 技术栈 + 快速启动
  • 简单架构说明

Day4:项目收尾 + 面试(3/21 周六)

目标:项目能拿得出手,面试持续进行。

上午 08:00 - 12:00 | 项目打磨

08:00 - 09:30 | 代码质量 + pprof集成

  • go vet / golangci-lint检查
  • 集成net/http/pprof
  • 优雅退出:监听信号,关闭连接,等待消息落库
  • 补1-2个关键单元测试

09:30 - 11:00 | README完善

  • 项目简介(一句话说清楚)
  • 技术栈 + 架构说明
  • 快速启动指南
  • 核心功能截图

11:00 - 12:00 | 最终推送

  • 代码整理、最终commit
  • 打tag v1.0.0
  • 确认GitHub页面展示正常

下午 13:30 - 18:00 | 面试 + 面试题

有面试优先面试。没有面试就刷面试题。

面试高频题清单(未面试时刷):

Go:

  • slice扩容 / map底层 / GMP / channel底层
  • 逃逸分析 / GC三色标记 / defer+return
  • context使用 / goroutine泄漏排查

MySQL:

  • B+树索引 / 聚簇vs非聚簇 / 索引失效(5种以上)
  • 事务隔离级别 + MVCC / 慢SQL优化

Redis:

  • 五种结构+场景 / 穿透/雪崩/击穿
  • RDB vs AOF / 分布式锁 / 为什么快

晚上 19:30 - 23:00 | 面试复盘 + 补强

  • 记录今天面试中所有被问到的题目
  • 每个没答好的题,写出标准答案
  • 更新简历(如果项目已完成,去掉占位描述,写真实内容)
  • 继续投递新的岗位

Day5:查漏补缺 + 持续面试(3/22 周日)

目标:根据前几天面试暴露的弱点针对性补强,持续面试。

全天策略

上午 08:00 - 12:00

  • 复习前几天面试中答不好的题目(这是最高优先级)
  • 如果项目还有未完成的功能,补完
  • 模拟面试:对着屏幕讲一遍”项目介绍”(控制在3分钟内)

下午 13:30 - 18:00

  • 面试(如果有约)
  • 没有面试则继续刷面试题 + 投递新岗位
  • 研究目标公司的技术博客或开源项目,准备针对性问题

晚上 19:30 - 23:00

  • 面试复盘
  • 五天总结:完成了什么、还差什么、下一步计划
  • 继续投递,保持节奏
  1. 08:00准时开始,不等”状态好了再开始”——坐下来就是最好的状态
  2. 每个时间块结束时,在对应的checkbox打勾,不管完成质量如何
  3. 遇到卡壳超过30分钟,跳过并标记,晚上或第二天补
  4. 午休必须休息,不要”再看一会儿”——下午的效率取决于中午的休息
  5. 23:00强制停止,身体还没完全恢复,透支身体会让后面几天全废

每日记录

每天结束时在这里记录:完成了什么 / 没完成什么 / 明天需要调整什么

Day0(3/17 今晚)

Day1(3/18)

Day2(3/19)

Day3(3/20)

Day4(3/21)

Day5(3/22)


写给自己

你因为生病丢了一周,但你没有丢掉方向。

焦虑说明你在乎,但焦虑不写代码。
害怕面试说明你认真,但前两场面试本来就是拿来”废”的。

你不需要准备到完美才开始面试。
没有人在第一场面试时是完全准备好的。
面试官问到你不会的东西——好,那就是你今晚的复习重点。
这比你自己猜”他们会问什么”高效一百倍。

现在,打开IDE,写一个goroutine。

No reason not to start.