Web Worker 实战:把计算搬出主线程,要付的三笔账
2026-11-03
主线程卡住不是因为计算太多,而是因为计算和渲染、输入共用一个事件循环。Worker 能把计算搬走,但搬走要付三笔账:消息的深拷贝、线程的启动与调度、共享内存的竞态。本文用可运行代码拆开结构化克隆、Transferable、SharedArrayBuffer 与 worker 池,并给出不该用 Worker 的场景。
4587 字
|
23 分钟
Web Components 实战:生命周期、Shadow DOM 边界与声明式 Shadow DOM 的代价
2026-11-02
把 Web Components 当成「不用框架的组件」会连续踩进四个坑:constructor 里读不到属性、connectedCallback 会重复执行、样式穿不过 Shadow 边界、SSR 输出的内容抓不到。本文用可运行代码拆开自定义元素、属性同步、Shadow DOM 与声明式 Shadow DOM,最后给出不该用它的场景。
4804 字
|
24 分钟
「快了快了」:进度汇报的修辞学
2026-11-01
「快了」「就差联调了」「整体完成了 90%」——这些句子不是进度,而是一种文体。拆解进度汇报里六种常见句法,逐条翻译它们真正在说什么,再给出一份追问清单和一份不容易心虚的汇报模板。
3156 字
|
16 分钟
编译器报错大赏:一句话能写几屏
2026-10-31
六行 C++、一个忘了实现的 operator<,GCC 回了 78 行,Clang 回了 220 行。这篇拆开报错的三层结构(error / required from / note),讲清模板实例化为什么把调用栈倒着打印,再给出三招把报错读短:从开头那条 error 读、搜自己的文件名、把长表达式拆成具名变量。
1720 字
|
9 分钟
教程地狱的出口:学一门新技术,先设计它怎么让你失败
2026-10-30
教程地狱的成因不是意志力,而是反馈:教程保证每一步都成功,真实环境却从不保证。本文把学习拆成一张三问验收卡、一个最小验证项目、一张失败矩阵和一次「预测—运行—解释」循环,附 10 小时预算、止损线和可执行的脚手架脚本。
3524 字
|
18 分钟
LLM 推理服务部署:vLLM、SGLang 与连续批处理各自解决哪一段
2026-10-29
把 Ollama 换成生产级推理服务,最先撞上的不是模型精度,而是 GPU 在等:等一整批请求凑齐、等最长的那条输出结束、等同一段系统提示词被反复预填。本文用一个可运行的调度模拟对比静态批处理与连续批处理,再拆开 PagedAttention 的块表、前缀缓存的命中条件、chunked prefill 与 PD 分离的取舍,最后给出按 KV cache 反推并发的容量估算方法和 vLLM/SGLang 的选型边界。
5893 字
|
29 分钟
事务隔离级别不是四档开关:MVCC 的读视图、当前读与幻读的边界
2026-10-28
把隔离级别当成从低到高的四档,会同时误判 MySQL 和 PostgreSQL。本文从一次写偏斜事故出发,拆开 MVCC 的版本链与读视图,区分快照读和当前读,用一段可运行的模拟器复现不可重复读、快照下的「幻读」与写偏斜,再解释 InnoDB 的 next-key lock 和 PostgreSQL 的 SSI 各自承诺了什么、没承诺什么。
5823 字
|
29 分钟
CSS :has() 实战:父选择器只是表象,真正要理解的是关系查询与失效成本
2026-10-27
把 :has() 当成「父选择器」会漏掉一半用法,也会低估它的代价。本文用卡片布局、表单状态、数量查询等场景讲清相对选择器的匹配方向,再拆解三个容易静默失效的语法边角(不可嵌套、非 forgiving、特异性抬升),最后解释为什么一次指针移动可能让它比 :focus-within 更贵。
4380 字
|
22 分钟