2026-08-21 一小时分享会 · 从设计到投影现场 · 全链路复盘 · v1
当天做完当天讲:给一场 60 分钟的公开分享设计内容、做演示稿、加现场实操段、 顺手修 iOS 真机 bug、最后追投影发糊的原因。 重点是同一天内三次把工具的假象当成产品的 bug,形态完全一样。
事实记录(不可修改区)
- 场景:2026-08-21 下午一场 60 分钟公开分享《一小时,让一屋子不写代码的人相信自己也能做出一个游戏》,
案例用 zombie-world(B站 Toy
19242799980544) - 区间:
b58e6e8(10:31)→e4c8ee4(16:57),9 个提交,全部当天 - 测试:95 条全绿(新增 4 条锁住演示稿内嵌的小游戏)
- Toy 提交审核 1 次,已过审上线(
v8547,含 iOS 触屏加固 + 全局错误探针) - 未提交:手机端 UI 修复仍停在预览
- 新增两个公开地址(服务器手工 nginx 配置,不在任何仓库):讲稿页 / 课前准备单
- 另一个仓库:抢救了一次崩掉的交互式 rebase(139 个文件被删,
rebase --abort全部还原,零丢失) - 没有 iOS 真机复验:过审后只拿到「安卓 / Windows / Mac 正常,iOS 连诊断面板都看不到」, 触屏是否修好至今无人验过
一、同一天三次,同一个形态
工具给了我一个结果,但那个结果回答的不是我以为的那个问题。 三次都不是「工具算错了」,也不是「我读错了输出」——工具都正常工作,我读得也对。
1. --window-size 回答的是「截图多大」,不是「布局视口多宽」
用 headless Chrome 截 390px 宽的图,看到右侧文字被切,判定手机端横向溢出,
据此改了一轮响应式。用 --dump-dom 把真实值打出来才发现:
viewport 489、docScrollWidth 489、越界元素 0——根本没有溢出,
--window-size 没改布局视口,只裁了截图。
顺带留下一个次生错误:为这个假问题加的 overflow-x:hidden
会把真溢出藏起来,比不加更糟,后来撤掉了。
(同一轮里另外两处改动——栅格写 minmax(0,1fr)、长串可断行——是对的实践,留下了。
为假问题做的改动里,也可能混着对的东西,要分开处置。)
2. curl -o 回答的是「字节流是什么」,不是「解压后的文本是什么」
抓线上构建核对修复有没有上线,grep 全部零命中,一度以为发布的是旧版。
实际是没解压,拿到的是 gzip 流。加 --compressed 之后 5 项全部命中。
3. git status 回答的是「相对我本地记的那个远端」,不是「相对真实的远端」 ❗
站点仓库显示 ahead 44,我据此给出风险评估:
「44 个提交、三周工作会一起上线,其中 6 个会重启线上后端服务」,
并按这个等级设计了整套绕行方案。
git fetch 之后:真正没推的只有 2 个。那 44 个早就在远端也早就上线了。
这一条代价最大:它不是浪费几分钟,而是让我给出了一个错误的风险评估, 差点让作者为此做本不必要的取舍。→ 开工前先对基线律_v1 的新形态: 不是「在旧检出上开发」,而是拿陈旧的 ref 去做风险判断。
三次合起来构成 全站文字截断体检_检测工具本身要先被证伪_v1 的第四个亚型,详见那篇。
二、唯一一次「先量再改」,也是唯一一次一改就中
现场反馈「投影上非常糊」。第一嫌疑是演示稿用 transform: scale()
把固定的 1280×720 舞台放大——教科书级的糊法。但这次先量了:
| 量什么 | 结果 | 结论 |
|---|---|---|
| 1920 下实际渲染 vs「位图拉伸」参照的锐度 | 3 倍 | 原生重绘,缩放不是病因 |
| 断网渲染 vs 联网渲染 | 逐像素完全相同 | Google Fonts 一直就没加载上 |
真因是宋体:fonts.googleapis.com 国内取不到,标题掉回 Windows 自带的 SimSun,
而宋体是给小字设计的、横画极细,66px 投到对比度低的投影仪上就是一片糊。
修法:把演示稿真正用到的 916 个字做成子集内嵌 (思源宋体 700 / 思源黑体 400·500·700 / JetBrains Mono 500·700,子集后 535 KB), 顺带把正文字重从 300 提到 400——投影上细字重本来就是最先糊的那一档。
实测:断网 file:// 打开与联网渲染逐像素相同(差异 0.00%),
标题墨量比掉回宋体时多 21%。代价是文件从 311 KB 涨到 1025 KB,
换来这份稿子彻底不依赖网络。
可迁移的一条:字体是渲染质量的一部分,不是装饰。 凡是要在别人机器上放映 / 打印 / 投影的网页,webfont 就该内嵌子集, 而不是指望目标环境能连上字体 CDN。
三、做对的地方
从一条「看起来不相干」的反馈里定位 ❗
iOS 的反馈有两条:「走不动、开不了枪」和「长按会弹出拷贝菜单」。 前一条与几十种原因相容;后一条只与一种相容——
代码里 preventDefault 挂在「认领成功」之后,所以长按菜单一出现,
就说明那一下触摸压根没被接管,而不是接管了没反应。
范围一下子从「触摸链的任何一环」缩到「中间某一步抛了异常,把后面全带走了」。
主诉描述的是症状,那条不相干的细节描述的是机制。 收到多条反馈时,优先追那条「跟主诉无关、但你解释不了」的。
把「不能观测」当成第一优先级修
→ 独立成律:沉默失败先装嘴律_够不到的环境先给它一层能看见的报错_v1
分享稿的骨架:不讲成就,讲卡住
60 分钟的落点不在「我做了个游戏」,而在两处: 开场让全场先在手机上打一局(把「这是真的」变成体感), 第 05 段整段讲我卡住的四次(把「他行我不行」拆掉)。
而当天上午真机反馈来的那个 iOS bug,当场变成了第五次—— 一个此刻还没修好、也验不了的 bug,比任何准备好的案例都硬。 讲稿里那句「改法已经提交审核,但我到现在也没有 iOS 设备,改完了验不了」, 是全场最该说的一句。
演示稿的几个现场功能,都是为「讲的人」设计的
- 导航栏鼠标一动才出现、静止 2.6 秒淡出——读者会动鼠标,用遥控笔讲的人不会, 一条规则自己就把「阅读」和「演讲」两种场景分开了,不需要模式切换
- 讲稿时间戳自动算(按段落预算,单页可覆盖),改一次结构不会全部对不上
- 滚轮翻页要区分真滚轮和触控板:前者一档一页 + 短冷却, 后者累积到阈值翻一页后「下锁」,必须等这次滑动彻底停下来才重新武装
四、下次改进
如果重来,最想改哪一步:把「先量再改」提到第一位,而不是第四位。 这一天有四次判断,只有第四次是先量的,也只有那次一改就中。
行动清单:
- 任何截图 / 抓包 / 状态查询,先确认它回答的是不是你要问的那个问题
git status的 ahead/behind 在git fetch之前不作数, 尤其是要拿它下风险判断的时候- 遇到「就是不行」类反馈,先装观测手段再改
- 反馈里那条「看起来跟主诉无关」的细节,优先当作定位线索
- 要在别人机器上放映的网页,webfont 内嵌子集,别指望目标环境能连上 CDN
关联文档
- 本轮提炼的律:沉默失败先装嘴律_够不到的环境先给它一层能看见的报错_v1
- 第四亚型的归属:全站文字截断体检_检测工具本身要先被证伪_v1
- 新形态的归属:开工前先对基线律_v1
- 同项目上一轮:2026-08-20_zombie-world_联机重构与局内货币_全链路复盘_v1
- 同项目上一轮提炼的律:约束型结论先复核律_文档写的不可能会过期_v1
- 实操段用到的工具:2026-08-18_DeepSeekHarness保姆级教程_两日全链路协作复盘_v1
- 复盘纪律:复盘事实先行原则