看源码跟拆盲盒有点像,一开始兴奋,翻着翻着就懵了。尤其是那种层层嵌套的调用,今天看懂了,明天打开文件就跟第一次见一样。这时候笔记就成了救命稻草,但很多人记着记着就变成复制粘贴代码,最后存了一堆文件夹,再也没打开过。
别从头开始抄代码
最常见的误区就是把整个函数甚至类原封不动地复制到笔记里。这其实没啥用,等于是把源码换个地方放。真正有用的,是用自己的话讲清楚这段代码干了啥,为什么这么写。比如看到一个建立连接的方法,与其贴一大段代码,不如写一句:‘这里先检查本地端口占用,再发起反向隧道请求,失败三次后触发重连机制’。这样下次一眼就能想起来关键逻辑。
用流程图代替文字描述
有些逻辑光靠文字说不清。比如内网穿透里的 handshake 流程,客户端、中转服务器、目标机器之间来回通信,箭头一多就容易乱。我习惯在笔记里画个简易流程图:
Client → Server: 发起connect请求
Server → Client: 返回临时token
Client → Target: 带token请求接入
Target → Server: 验证token并确认
Server: 建立双向通道
这种结构比大段文字直观多了,回头查起来也快。
标注你卡住的地方
记笔记不是为了展示自己多厉害,而是记录真实的学习过程。某个回调函数为什么延迟执行?某个标志位什么时候会被清除?把这些问号都写下来,哪怕当时没答案。过几天再回头看,说不定已经能答上来了。这些‘坑点’反而是最有价值的部分,以后给别人讲或者自己复盘都用得上。
配合调试信息一起记
光看代码容易晕,动手跑一遍才知道实际走向。我在笔记里经常会贴一段日志输出:
[DEBUG] tunnel.go:124 - client connected, session_id=abc123
[INFO] proxy.go:67 - local port 8080 bound to remote tunnel
[WARN] relay.go:99 - heartbeat timeout, reconnecting...
然后在旁边备注:‘第3行警告说明网络抖动会触发自动重连,但不会断开已建立的会话’。这样就把抽象逻辑和实际运行状态对上了。
给关键函数打标签
同一个项目看久了,会发现某些函数反复出现。比如 handlePacket()、readConfig() 这种,可以给它们打标签归类。我的笔记里有个表格:
函数名 | 作用 | 调用频率 | 相关配置项
----------------|--------------------|----------|-------------
startTunnel() | 启动主隧道 | 每次启动 | server_addr
reconnectLoop() | 断线重连循环 | 异常时触发 | retry_interval
parsePayload() | 解析数据包头部 | 每次收包 | max_packet_size
时间一长,这张表比文档还管用。
记笔记的本质不是存代码,而是把自己的理解固化下来。每翻一次源码,就在脑子里建一层索引。等哪天要改功能或者排查问题,这些笔记就会悄悄帮你省下几个小时。”