qinghuan
← 查看最新一轮文章

往期新增 / 2026.10.17 / 33 篇

从文件与数据,到模型的每一步计算

沿后端、AI、计算机基础三条线,把容易忽略的条件变成可以运行的小实验。每篇给出原始资料、验证范围与独立练习。

先看本文的问题是否与你有关,再读正文、运行示例、记录自己的结果。阅读分钟数不包含环境准备和实验时间;示例验证范围在运行说明及下载包内标明。

后端:查清数据与任务的完成条件

能阅读简单 Python 和 SQL。Java 三篇需完整 JDK 17 或更新版本;按每张卡片提示选择前置知识。

这一组留下什么:完成数据约束与恢复检查表;再按当前问题检查进程、线程、网络或 Java 对象生命周期。

想连着练,可以从这几步开始
  1. 列名后面写着 INTEGER,为什么还能存进一段文字?

    先区分存储类型、自动转换与业务允许值,写一张输入是否接受的对照表。

  2. 账号已经停用,为什么邮箱还是不能重新注册?

    再把约束放进生命周期:记录停用、重新注册与恢复账号分别检查哪些行。

  3. 数据库文件已经复制好了,为什么还是少了已提交的订单?

    数据能正确写入后,制作并恢复副本,检查文件完整与业务记录齐全是否同时成立。

  4. 递归查询已经用了 UNION,为什么还是绕着同一圈跑?

    最后沿数据关系向外查,分别定义节点、整行与路径的身份,并标明截断条件。

这是一条建议顺序;遇到当前项目的问题,也可以直接选择下面对应的文章。每篇的前置阅读另有说明。

阅读约 27 分钟 · 另留动手时间

子进程只是在打印日志,为什么 wait 一直等不完?

用一个只输出有限字节的子进程,复现父进程等退出、子进程等管道空位;再同时读取两条输出管道,让同一程序正常结束。

适合排查:工具启动后日志变多就卡住,主程序一直等它退出。

开始前:知道进程的输入、输出与退出码;不需要外部命令行工具。

  • 子进程
  • 管道
  • 标准输出
  • 资源回收
开始阅读与练习 ↗

阅读约 26 分钟 · 另留动手时间

请求早就发完了,服务器为什么还在等结束?

用真实本机 TCP 连接观察:sendall 返回、读取超时、收到 EOF 是三个事件;关闭发送方向后,仍可以接收对方的回复。

适合排查:请求已经发完,客户端和服务端却都在等待下一步。

开始前:先区分字节流与消息边界,再运行本机 TCP 实验。

  • TCP
  • 半关闭
  • EOF
  • Socket
开始阅读与练习 ↗

阅读约 28 分钟 · 另留动手时间

三个消费者只放一个结束标记,为什么程序还不退出?

把入队任务的结账、业务成功和线程退出分别观察:一个停止标记只会被一个消费者取走,queue.join 返回后仍可能有线程在等。

适合排查:单消费者能正常结束,增加工作线程后却关不干净。

开始前:知道 put/get 与线程;本文会解释两种 join 的区别。

  • 任务队列
  • 消费者
  • 结束标记
  • 线程退出
开始阅读与练习 ↗

阅读约 27 分钟 · 另留动手时间

UDP 只读得下半条消息,剩下的能留到下次吗?

在 Windows 本机实际收到 10040 错误后,再发一条带标记的新报文;观察尾部没有续读,并验证空 UDP 报文不等于 TCP 的结束。

适合排查:消息缺一截,下一次读取却拿到另一条消息。

开始前:知道 UDP 一次发送一条数据报;对照平台返回行为。

  • UDP
  • 报文边界
  • 缓冲区
  • Windows Socket
开始阅读与练习 ↗

阅读约 28 分钟 · 另留动手时间

文件已经加锁,为什么同一程序换个通道还会抛异常?

用同一 JVM 的两个文件通道和两个自建 JVM,观察重叠文件锁的异常、null 与成功获取,分清线程互斥和进程间协作。

适合排查:同一程序换了文件通道,拿锁时还是抛出重叠异常。

开始前:会用 Java 文件流和 try-with-resources;需要完整 JDK 17 或更新版本。

  • Java 17
  • FileLock
  • 文件锁
  • 进程协作
开始阅读与练习 ↗

阅读约 28 分钟 · 另留动手时间

反序列化会重新调用构造器吗?普通类和 record 为什么不同

用构造次数、父类字段、transient 初始化值和自生成字节,观察普通 Serializable、readObject 校验与 record 的三条恢复路径。

适合排查:构造器检查过的值,从对象流恢复后却不满足原来的条件。

开始前:知道 Java 继承、构造器、transient 与对象流;实验只读自己生成的字节。

  • Java 17
  • Serializable
  • record
  • 构造器
  • 状态校验
开始阅读与练习 ↗

阅读约 30 分钟 · 另留动手时间

ServiceLoader.load 没报错,为什么真正使用插件时才失败?

用单文件生成服务描述元数据,观察首次实例化、重复迭代缓存、reload 后的新对象,以及延迟出现的 provider 构造异常。

适合排查:插件发现时没报错,第一次使用却失败,reload 后旧实例还在。

开始前:知道 Java 接口、实现类与类加载器;单文件会自行创建服务描述文件。

  • Java 17
  • ServiceLoader
  • SPI
  • 延迟加载
  • 生命周期
开始阅读与练习 ↗

AI:把模型中的数字放回具体计算

先准备概率、加权平均与 Python 列表。蒸馏另需简单导数,可先补读正文的前置链接。

这一组留下什么:给每个概率、损失与向量输出写明输入、单位、成立条件和独立对照。

想连着练,可以从这几步开始
  1. 同样的线索,换一批人就不该给同样的概率?

    从只有两种颜色、两种类别的分布开始,亲自计算先验、后验和归一化。

  2. 预测没变,只把米换成厘米,损失为什么涨了 4.605?

    把离散类别换成连续数值,核对密度、方差与物理单位,避免直接比较裸损失。

  3. 区间写着九成覆盖,为什么某一类样本一次也没包住?

    再把误差排成名次,分清总体覆盖、分组表现与小样本的有限取整。

  4. 蒸馏把温度升高,为什么还要把损失乘回 T²?

    有概率与导数基础后,逐项算软目标、损失和梯度,检查温度究竟改变了什么。

这是一条建议顺序;遇到当前项目的问题,也可以直接选择下面对应的文章。每篇的前置阅读另有说明。

阅读约 21 分钟 · 另留动手时间

视觉 Agent 找对了按钮,为什么坐标却落在别处?

逐步撤销截图缩放与裁剪,分清图片像素、视口 CSS 坐标和文档坐标,再拒绝过期观察。

适合排查:视觉模型圈出了按钮,交给点击接口的坐标却偏了。

开始前:会按比例换算和加减坐标;只运行计算,不接真实界面。

  • 视觉Agent
  • 坐标变换
  • 截图
  • CSS像素
  • 观察有效期
开始阅读与练习 ↗

阅读约 19 分钟 · 另留动手时间

可以先在页面里动手

还有空着的专家,为什么 MoE 仍跳过一部分 Token?

用八个输入、两个专家和固定名额,分清路由偏好、实际负载、溢出旁路与闲置容量。

适合排查:一部分专家还有空位,另一部分却已经溢出。

开始前:会看概率列表与容量限制;页面可以先改参数观察。

  • MoE
  • 专家容量
  • 稀疏计算
  • 负载均衡
  • 推理边界
开始阅读与练习 ↗

阅读约 26 分钟 · 另留动手时间

可以先在页面里动手

每一帧最像空白,为什么整段最可能读出 a?

穷举九条 CTC 路径,分清逐帧贪心、重复合并与标签概率求和,并检查重复字符需要的额外帧。

适合排查:逐帧贪心结果与整段标签概率不一致,重复字符还丢了。

开始前:会做概率乘法、加法和短列表枚举。

  • CTC
  • 语音识别
  • 序列对齐
  • 动态规划
  • 概率求和
开始阅读与练习 ↗

阅读约 24 分钟 · 另留动手时间

前向只选一个,反向为什么还有梯度?

用三个选项手算直通估计,比较硬选择的有限差分与人为规定的替代梯度,并检查非线性损失的区别。

适合排查:硬选择的小扰动结果不变,训练程序却还给出了梯度。

开始前:先理解 Softmax、链式求导与数值差分;正文提供导数基础链接。

  • 直通估计
  • Gumbel-Softmax
  • 离散选择
  • 自动微分
  • 梯度检查
开始阅读与练习 ↗

阅读约 27 分钟 · 另留动手时间

扩散训练换成预测原图,为什么损失不能照搬?

从两步加噪的方差账目出发,区分单步与累计噪声,再核对噪声、原信号和 v 三种目标的误差换算。

适合排查:每一步加噪声都看得懂,累计噪声和训练目标却对不上。

开始前:会计算平方、平方根、方差与均方误差;先对照标量例子。

  • 扩散模型
  • DDPM
  • 累乘噪声
  • 预测目标
  • 损失权重
开始阅读与练习 ↗

阅读约 23 分钟 · 另留动手时间

整段向量一样像,逐词匹配为什么能分出差别?

用二维向量算出 ColBERT 的 MaxSim,检查方向、重复项与补齐掩码,理解多向量检索到底保留了什么。

适合排查:文档平均向量一样,逐词匹配分数却不同,补齐位置还抬高分数。

开始前:知道向量点积和归一化;输入是固定小向量,无需下载模型。

  • ColBERT
  • 多向量检索
  • MaxSim
  • 后期交互
  • 检索评测
开始阅读与练习 ↗

计算机:跟着位置、路径与状态看运行

能阅读 Python 条件、循环和列表。网络篇从 IPv4 地址开始,算法篇会说明各自前提。

这一组留下什么:留下共享位置、路由选择、序号比较和任务时间表;算法专题可按问题单独练。

想连着练,可以从这几步开始
  1. 两个文件描述符编号不同,为什么读取位置仍会互相影响?

    先用六个字节追踪共享状态:不同入口读到哪里,哪个动作会影响另一端。

  2. 五条路由都能到这个地址,电脑为什么偏要走最细的那一条?

    再用五层网段做一次选择,把“匹配到”与“最终选中”分别记录。

  3. 编号从255回到0,是旧消息又来了,还是新消息?

    为连续消息加上有限序号,观察越过最大值后为什么还要限制比较范围。

  4. 优先级最高的任务,为什么会被一个没抢它锁的任务拖住?

    最后画出三个任务的运行顺序,把准备运行、等待锁与持锁者的执行机会分开。

这是一条建议顺序;遇到当前项目的问题,也可以直接选择下面对应的文章。每篇的前置阅读另有说明。

阅读约 19 分钟 · 另留动手时间

连起来很快,删一条边为什么不能把并查集倒着操作?

两张不同的图能留下完全相同的分组状态,却在删除同一条边后给出相反结果。用这个反例看清并查集保存了什么。

适合排查:新增关系很快,删除后旧的连通分组却还说连得上。

开始前:先知道图的点、边,以及 BFS 如何查询可达性。

  • 数据结构
  • 并查集
  • 图
  • 连通性
  • 信息丢失
开始阅读与练习 ↗

阅读约 19 分钟 · 另留动手时间

布隆过滤器删掉一项,为什么另一项也突然查不到了?

一个亮起来的格子可能属于多条记录。先观察清零造成的漏报,再看计数器为什么仍需要“确实插入过”的依据。

适合排查:过滤器取消一项后,另一项被错误地判为不存在。

开始前:知道哈希会把不同对象映射到共享位置。

  • 数据结构
  • 布隆过滤器
  • 计数器
  • 删除
  • 假阴性
开始阅读与练习 ↗

阅读约 20 分钟 · 另留动手时间

可以先在页面里动手

缓存多留一个位置,为什么反而要重新读取更多次?

同一串访问、同一种 FIFO 规则,只把容量从 3 改为 4,未命中却从 9 增加到 10。逐步查看被换走的是谁。

适合排查:缓存多了一个位置,重新读取次数反而增加。

开始前:先理解命中与淘汰;可直接在页面逐步比较两个容量。

  • 缓存
  • FIFO
  • LRU
  • Belady异常
  • 逐步状态
开始阅读与练习 ↗

阅读约 23 分钟 · 另留动手时间

两个程序都确认文件不存在,为什么最后仍覆盖了对方?

让两个真实进程先检查、再按指定次序创建。比较 w 与 x,把检查结果和真正取得创建资格分开。

适合排查:两个进程都检查文件不存在,创建后却覆盖了对方内容。

开始前:能区分进程和文件路径;代码会建立自己的临时文件与子进程。

  • 文件系统
  • 创建竞争
  • 排他创建
  • Python多进程
  • 受控实验
开始阅读与练习 ↗

阅读约 24 分钟 · 另留动手时间

把所有房间接起来最省线,为什么从门口走到每间却不一定最短?

三条候选连线成本是 2、3、4。最小生成树花 5,起点最短路树花 6;它们优化的是两份不同账本。

适合排查:总连线最省钱的方案,从起点走到各处却不一定最短。

开始前:先知道图的点、边、路径成本;正文提供图与并查集回读链接。

  • 图算法
  • 最小生成树
  • Kruskal
  • 最短路径
  • 并查集
开始阅读与练习 ↗