开发学习日志

Personal Dev Journal

开发学习日志

一个人写代码的地方。这里留着每天真正动手做过的事:写坏的构建脚本、读了一半的源码、 凌晨两点才想通的那个空指针,以及后来终于跑通的那组测试。写得慢,但基本都真实发生过。

01

关于我

先说说为什么写这些

我叫阿德里,做后端和工具链方向的工作。白天写业务代码,晚上折腾那些「看起来没产出但很有意思」的东西: 编译器的报错信息、一个 HTTP 请求到底经过了哪些层、为什么同样的配置换台机器就跑不起来。

最开始写日志是因为忘性大。同一个坑踩第二遍的时候,我翻回自己三个月前的记录,看到当时写下的一句话 ——「别在 CI 里用 shell 拼字符串」——然后省了两个小时。后来就慢慢写成了习惯, 从最开始的几句备忘,变成现在带上下文、带复现步骤、带失败方案的完整笔记。

这里不放简历、不接广告、不做课程。写下来的东西只对一类人有用:正在做类似的事、 刚好卡在类似的地方的人。如果某篇记录让你少花半小时,那它就没白写。

02

近期记录

按时间倒序,最新的在最上面
  1. 把本地开发环境搬进容器之后

    花了两个晚上,把四台机器上各不相同的那套依赖收拢成一个镜像。中间最麻烦的不是写构建文件, 而是搞清楚旧环境里那个从没写进文档的环境变量到底从哪来的。最后靠对比进程环境变量列表找到了。

  2. 一次慢查询排查的完整过程

    接口从 80ms 掉到 1.4s,日志里什么都看不出来。最后定位到一条看起来毫无问题的关联查询: 索引其实建了,但字段的字符集和另一张表不一致,整个索引被放弃。改字符集,恢复。

  3. 重新读了一遍事件循环

    之前一直以为自己对异步模型的理解没问题,直到写了一个在微任务里递归的循环,把页面卡死了。 这次认真读了规范里的执行顺序,顺手把几个常见误解整理成了一篇笔记。

  4. 给旧项目补上自动化测试

    一个跑了三年的项目,改动全靠手点。先从最容易出错的那三个模块下手,写了 60 多个用例, 第一天就抓出两个一直存在却从没被发现的边界问题。

  5. 把常用脚本整理成了一套工具

    散落在十几个文件夹里的临时脚本,终于被归到了一起。统一了参数风格,加了使用说明, 现在开新项目不用再复制粘贴那一堆自己也看不懂的旧代码了。

03

踩坑与修复

每一条都真的花过时间

配置文件里的空格

缩进差一个空格,服务启动时报了一个和缩进毫无关系的错。现在养成了习惯: 改完配置先跑一遍解析校验,再看业务日志。

  • 配置
  • 排查

时区把日期算错了一天

统计报表的数字对不上,原因是服务容器跑在 UTC,而业务逻辑默认按本地时间取当天。 统一在入口处显式声明时区之后,问题消失。

  • 时区
  • 数据

并发下的共享状态

一个缓存对象被多个请求同时改写,偶发数据错乱且极难复现。改成不可变结构之后, 这类问题再没出现过。

  • 并发
  • 设计

依赖版本锁定

本地能跑、线上报错,排查到最后是小版本号依赖被自动升级了。 现在所有环境的依赖版本都写在锁文件里,构建前强制校验。

  • 构建
  • 依赖
04

在读与在学

慢一点,但读完了就写笔记

同时读的东西不会超过三样,多了就都读不进去。习惯是:先看官方文档把概念过一遍, 再找一个真实项目的源码对着读,最后用自己的话写一遍——写不出来的部分,就是还没懂的部分。

今年重点补的是两件事:数据存储的底层原理,以及 怎么把复杂系统拆成能独立测试的小块。前者解释了很多「为什么这样设计」, 后者直接改变了写代码的顺序。

  • 数据库实现 · 从存储引擎到查询优化,边读边记
  • 网络协议 · 把常见请求的完整链路画成图
  • 构建系统 · 弄明白依赖图是怎么被计算的
  • 测试设计 · 从「测什么」到「怎么测才不变成负担」
  • 当前数据库实现原理
  • 刚读完设计数据密集型应用
  • 工具Git · Docker · Vim
  • 语言Go · TypeScript · Python
  • 笔记Markdown,纯本地
  • 更新每周两篇左右
05

联系方向

欢迎就技术细节讨论

写信给我

如果你在做类似的题目,或者发现某篇记录里的结论有问题,欢迎写邮件过来。 带上复现步骤和环境信息,我看到都会回。技术讨论之外的事就先不聊了。

hi@adriadherent.xyz