Making of · 制作复盘Making of · Production Retrospective

一个章节是怎么做出来的How a Chapter Gets Made

以「同色异谱」这一章为例,从确定选题方向、资料核对、写大纲,到和 AI 一起做交互演示、逐条批注修改、移动端适配,再到收尾发布,把整个流程和真实踩过的坑完整复盘一遍。重点不是结果,而是每一步的判断依据。 Taking the metamerism chapter as a running example — from settling on the topic, fact-checking sources, and outlining, to building interactive demos with AI, annotating and revising line by line, and adapting for mobile, all the way to publishing — this is a full retrospective of the whole process and the real pitfalls along the way. The point isn't the result, but the reasoning behind each step.

目标Goal

目标:把一次章节制作沉淀成可复用的方法Goal: distill one chapter's production into a reusable method

这次复盘想达成的不是"讲好同色异谱",而是把"做一章"这件事本身拆成可复用的流程——下一章照着走就能少踩坑。之所以拿同色异谱当例子,是因为它恰好覆盖了一个章节会遇到的全部环节:抽象概念、必须查证的标准数据、两个从零写的交互演示、移动端布局陷阱、文案语气把控。把这一遍跑通,方法就能迁移到任何一章。 What this retrospective aims for isn't "explaining metamerism well" — it's breaking down the act of "making a chapter" into a reusable process, so the next chapter can follow it and hit fewer traps. Metamerism is the example precisely because it happens to cover every stage a chapter can involve: an abstract concept, standard data that must be verified, two interactive demos written from scratch, mobile layout traps, and tone control. Run this one through and the method transfers to any chapter.

本项目的定位是技术科普 + 工作流说明,不是参数百科。所有方法都服务于一个目标:让读者建立直觉,而不是记住名词。 This project is positioned as a technical explainer + workflow notes, not a parameter encyclopedia. Every method serves one goal: helping readers build intuition rather than memorize terms.
这章的难点The hard part

概念抽象An abstract concept

「不同光谱产生同一颜色」无法靠文字讲清楚,必须做出可以拖动、能看到颜色塌缩的演示。"Different spectra producing the same color" can't be explained with words alone — it needs a demo you can drag and watch the color collapse in.

这章的难点The hard part

数据要查证Data must be verified

CIE 色匹配函数、各光源光谱、ISO 同色异谱指数,都不能凭记忆,必须回到标准原文。CIE color-matching functions, illuminant spectra, the ISO metamerism index — none can rely on memory; they must go back to the original standards.

这章的难点The hard part

演示要可信Demos must be credible

两个 Canvas 演示要让匹配真的成立又真的失效,背后是一套需要调参的数值模型。The two Canvas demos have to make the match genuinely hold and genuinely fail, backed by a numerical model that needs tuning.

第一阶段Stage 1

确定选题方向Settling on the topic

每篇文章先回答一个具体问题,而不是从名词百科开始。选题阶段只做两件事:把问题问对,把它挂到工作流上。 Every article first answers a specific question rather than starting from an encyclopedia entry. The topic stage does just two things: ask the question right, and hang it onto the workflow.

好选题:先有困惑Good topic: start from a confusion

  • 为什么手机屏看色卡总差一点Why a color chart always looks a little off on a phone screen
  • 为什么不同人看同一台 OLED 颜色不一致Why different people see different colors on the same OLED
  • Assign 和 Convert 为什么不是一回事Why Assign and Convert aren't the same thing

坏选题:名词罗列Bad topic: a list of terms

  • 同色异谱知识点汇总A roundup of metamerism facts
  • CIE 色度学参数介绍An intro to CIE colorimetry parameters
  • Metamerism Index 标准说明The Metamerism Index standard, explained

同色异谱最终被定位成「色彩管理一切难题的根」——这句话决定了它在工作流里的位置:放在最前面的「基础」段,后面拍摄、后期、显示三段的问题都能回头挂到它身上。选题不只是定标题,更是定它和其他章节的关系。 Metamerism ended up framed as "the root of every color-management problem" — and that framing decides its place in the workflow: it goes in the very first "Basics" stage, and the problems in the later Capture, Post, and Display stages can all trace back to it. Choosing a topic isn't just setting a title; it's setting its relationship to the other chapters.

第二阶段Stage 2

资料核对与立论Fact-checking and building the argument

涉及标准参数、格式、厂商曲线时必须查资料,不凭记忆写。引用优先级:ITU-R / SMPTE / ICC / W3C / 厂商官方文档。 Anything involving standard parameters, formats, or vendor curves must be looked up, not written from memory. Citation priority: ITU-R / SMPTE / ICC / W3C / vendor official docs.

最重要的一条纪律:「示意算法」和「真实测量」必须在页面里分清楚。读者要能判断哪些数字可以引用,哪些只是为了建立直觉。 The most important rule: "illustrative algorithm" and "real measurement" must be clearly separated on the page. Readers need to tell which numbers can be cited and which exist only to build intuition.

必须查证的数据Data that must be verified

CIE 1931 2° 色匹配函数(逐 5nm 的 x̄ ȳ z̄ 表)、D65/D50/A/F2 等光源光谱、ISO 18314-4 的同色异谱指数分级。这些直接写进了演示的计算核心,错一个数演示就不可信。The CIE 1931 2° color-matching functions (the x̄ ȳ z̄ table at 5nm steps), illuminant spectra for D65/D50/A/F2, and the ISO 18314-4 metamerism index grades. These go straight into the demo's computation core — one wrong number and the demo loses credibility.

标注为「示意」的部分The parts labeled "illustrative"

演示里用三个高斯峰合成的光谱不是真实测量光谱,是为了让读者能拖动、能直观比较而设计的模型。页面里明确说明这是示意模型,避免被当成实测数据引用。The spectra synthesized from three Gaussian peaks in the demo aren't real measured spectra — they're a model designed to let readers drag and compare intuitively. The page states clearly that this is an illustrative model, to avoid it being cited as measured data.

第三阶段Stage 3

写大纲与章节结构Outlining and chapter structure

用项目推荐的结构搭骨架:问题场景 → 核心直觉 → 基础定义 → 可交互演示 → 工作流落地 → 常见误区 → 资料来源。每段只讲一个要点,先讲「为什么」再讲「公式是什么」。 Build the skeleton with the project's recommended structure: problem scenario → core intuition → basic definitions → interactive demo → workflow application → common misconceptions → sources. Each section makes one point, and explains "why" before "what the formula is".

1

问题场景Problem scenario

四个真实困惑(跨屏、打样、不同人看 OLED、相机偏色)先让读者认出自己被影响过。Four real confusions (cross-screen, proofing, different people on OLED, camera color shift) first get readers to recognize they've been affected.

2

核心直觉Core intuition

一句话点破:人眼把无穷维光谱压成三维 XYZ,所以无穷多种光谱可以同色。One line lands it: the eye compresses an infinite-dimensional spectrum into three-dimensional XYZ, so infinitely many spectra can share a color.

3

基础定义Basic definitions

只解释后文要用到的术语:三刺激值 / CMF、同色异谱匹配、Luther 条件。Only the terms used later: tristimulus values / CMF, metameric match, the Luther condition.

4

五种失败Five failures

把抽象概念拆成光源、观察者、视场、几何、相机五类可识别的失效场景。Break the abstract concept into five recognizable failure cases: illuminant, observer, field of view, geometry, camera.

5–7

两个交互演示 + 工作流落地Two interactive demos + workflow application

演示 A 证明「不同光谱可同色」,演示 B 证明「换光源会失配」,再落到摄影/印刷/显示/HDR。Demo A proves "different spectra can match", Demo B proves "changing the illuminant breaks the match", then it lands in photography / print / display / HDR.

8–10

误区 + 资料来源Misconceptions + sources

澄清常见误解,列出可点击的权威链接收尾。Clear up common misunderstandings, and close with clickable authoritative links.

第四阶段Stage 4

做交互演示:最难也最容易翻车Building the demos: hardest and most failure-prone

交互图表是为了建立直觉,不是让页面显得复杂。坐标轴、单位、刻度、曲线来源都要标清楚。这一阶段的两个坑,是整章花时间最多的地方。 Interactive charts are for building intuition, not for making the page look complex. Axes, units, ticks, and curve sources all need to be labeled. The pitfalls in this stage took the most time of the whole chapter.

坑 1 · 演示 A 的匹配不对称Pitfall 1 · Demo A's match is asymmetric
症状Symptom
用 B 给一个看起来不鲜艳的颜色,让 A 去匹配,怎么调都匹配不上Set a dull-looking color with B and ask A to match it, and no amount of adjusting gets there.
原因Cause
A 用窄高斯峰、B 用宽高斯峰。振幅相同时,宽峰的积分能量是窄峰的 3–4 倍,A 永远追不上 B 的亮度。A uses narrow Gaussian peaks, B uses wide ones. At equal amplitude, a wide peak's integrated energy is 3–4× a narrow peak's, so A can never catch up to B's brightness.
修复Fix
对高斯峰按面积归一化,让振幅直接等于总功率,宽窄峰就能对称匹配。Area-normalize the Gaussian peaks so amplitude equals total power directly, and wide and narrow peaks can match symmetrically.
// 改前:振幅相同,宽峰积分能量是窄峰的 3–4 倍 → A 永远追不上 B
sum += (amps[k] / 100) * gaussian(lam, peak.c, peak.w);

// 改后:按面积归一化,振幅 = 总功率,宽窄峰可对称匹配
const norm = 1 / (peak.w * Math.sqrt(2 * Math.PI));
sum += (amps[k] / 100) * gaussian(lam, peak.c, peak.w) * norm;
// Before: equal amplitude → a wide peak's integrated energy is 3–4× a narrow one → A never catches B
sum += (amps[k] / 100) * gaussian(lam, peak.c, peak.w);

// After: area-normalize so amplitude = total power; wide/narrow peaks match symmetrically
const norm = 1 / (peak.w * Math.sqrt(2 * Math.PI));
sum += (amps[k] / 100) * gaussian(lam, peak.c, peak.w) * norm;
坑 2 · 「自动匹配」不等于一定匹配成功Pitfall 2 · "Auto-match" doesn't mean the match will succeed
症状Symptom
演示 A 里有些颜色看起来并不鲜艳,但点击自动匹配后仍然只能逼近,读者会以为算法坏了。Some colors in Demo A don't look saturated, yet clicking auto-match only gets close — readers assume the algorithm is broken.
原因Cause
另一组光谱基函数只能做 0–100 的非负加法。精确解可能需要负峰值,或需要某个峰超过滑块上限。视觉上的「不鲜艳」不等于落在另一组光谱模型的可达 XYZ 范围内。The other set of spectral basis functions can only do non-negative addition over 0–100. An exact solution might need a negative peak, or a peak beyond the slider's ceiling. "Looks dull" doesn't mean it falls inside the XYZ range the other spectral model can reach.
修复Fix
按钮改成「尝试匹配」,失败状态改为「受光谱范围限制」,并把求解出的原始峰值显示给读者。交互演示不只要展示成功,也要解释失败为什么合理。Rename the button "Try to match", change the failure state to "limited by spectral range", and show readers the raw solved peak values. An interactive demo should not only show success but also explain why failure is reasonable.
坑 3 · 演示 B 换光源后 ΔE 不够明显Pitfall 3 · Demo B's ΔE isn't dramatic enough after switching illuminant
症状Symptom
换光源后两个样本的色差只有 ΔE≈1.7,肉眼几乎看不出,失去教学冲击力After switching illuminant, the two samples differ by only ΔE≈1.7, barely visible to the eye — losing the teaching impact.
原因Cause
样本反射率太平、太亮,对波长不够敏感,换光源时颜色变化被平均掉了。The sample reflectances were too flat and too bright, not wavelength-selective enough, so the color change averaged out when the illuminant changed.
修复Fix
把样本 A 设计成对波长高度选择性(黄橙窄峰、低底噪),样本 B 用三个分离峰。结果:D65 下 ΔE=0.48(匹配),换到白炽灯 A 光源 ΔE=6.72、F2 荧光 ΔE=4.35、商用 LED ΔE=4.62(明显失配)。Make sample A highly wavelength-selective (a narrow yellow-orange peak, low noise floor) and give sample B three separated peaks. Result: ΔE=0.48 under D65 (matched), then ΔE=6.72 under incandescent A, 4.35 under F2 fluorescent, and 4.62 under a commercial LED (clearly mismatched).
两条经验:关键公式要单独命名成函数(如 buildSPD()planckianSPD()),不要写进绘图循环;演示的「成功」和「失败」都要能稳定复现,而且失败原因也要在界面上说清楚。 Two lessons: key formulas should be named as separate functions (like buildSPD(), planckianSPD()) rather than buried in the drawing loop; and both the demo's "success" and "failure" should reproduce reliably, with the reason for failure spelled out in the UI.
第五阶段Stage 5

细节调整与移动端适配Detail tuning and mobile adaptation

桌面端写完只是一半。多列布局、Canvas 高度、滑块溢出在手机上都会出问题,必须用 375px 宽度逐项核查。 Finishing the desktop version is only half the job. Multi-column layouts, Canvas height, and slider overflow all break on phones — you have to check each one at 375px width.

坑 4 · Canvas 在手机上塌成 150pxPitfall 4 · Canvas collapses to 150px on mobile
症状Symptom
图表在手机上只渲染成一条窄带,高度约 150px。The chart renders as a thin strip on mobile, about 150px tall.
原因Cause
canvas { height: 100% } 需要父元素有明确的 height 才能解析;父元素只有 min-height 时百分比高度失效,canvas 回退到 HTML 默认的 150px。canvas { height: 100% } needs the parent to have an explicit height to resolve; when the parent only has min-height, the percentage height fails and the canvas falls back to HTML's default 150px.
修复Fix
把父元素的 min-height 改成明确的 height(或让父元素进入 grid/flex 由布局给出确定高度)。Change the parent's min-height to an explicit height (or put the parent in a grid/flex so the layout gives it a definite height).
/* 失效:父元素只有 min-height,canvas 塌回 150px */
.canvas-box { min-height: 240px; }
canvas { height: 100%; }

/* 有效:父元素给明确 height,height:100% 才能解析 */
.canvas-box { height: 240px; }
/* Fails: parent only has min-height, canvas collapses to 150px */
.canvas-box { min-height: 240px; }
canvas { height: 100%; }

/* Works: parent has an explicit height, so height:100% resolves */
.canvas-box { height: 240px; }
坑 5 · 媒体查询里的选择器优先级Pitfall 5 · Selector specificity in media queries
症状Symptom
媒体查询里写了单列规则,但手机上多列布局没折叠。A single-column rule is written in the media query, but the multi-column layout doesn't collapse on mobile.
原因Cause
原规则是 .parent .child(两级),媒体查询里只写 .child(一级),优先级更低,覆盖不掉。The original rule is .parent .child (two levels); the media query only writes .child (one level), which has lower specificity and can't override it.
修复Fix
媒体查询里用同等或更高优先级的选择器。Use a selector of equal or higher specificity in the media query.
/* 不生效:优先级低于原规则 */
@media (max-width:560px){ .summary-chain{ grid-template-columns:1fr; } }

/* 生效:保持同等优先级 */
@media (max-width:560px){ .gamma-summary .summary-chain{ grid-template-columns:1fr; } }
/* Doesn't apply: lower specificity than the original rule */
@media (max-width:560px){ .summary-chain{ grid-template-columns:1fr; } }

/* Applies: keeps the same specificity */
@media (max-width:560px){ .gamma-summary .summary-chain{ grid-template-columns:1fr; } }

375px 发布前四项核查Four pre-publish checks at 375px

1. 多列布局是否折叠为单列。  2. Canvas 实际渲染高度是否接近设计值,而不是 150px。  3. readout / tooltip 是否遮挡图表主体(加 max-width 限制)。  4. input[type=range] 是否在容器内、没有横向溢出(窄屏要 min-width:0; width:100%)。1. Do multi-column layouts collapse to one column?   2. Is the Canvas's actual rendered height close to the design value, not 150px?   3. Do readouts / tooltips cover the chart body (add a max-width limit)?   4. Is input[type=range] inside its container without horizontal overflow (narrow screens need min-width:0; width:100%)?

第六阶段Stage 6

和 AI 协作:让它快,但不要让它定稿Working with AI: let it be fast, but don't let it have the final say

这个项目不是让 AI 一次性生成网页,而是把 AI 当成「研究助理 + 前端执行者 + 反复修改的搭档」。真正决定质量的,是人如何指出问题、要求查证、并把含糊的反馈变成可验证的修改项。 This project wasn't about having AI generate the page in one shot, but treating AI as a "research assistant + front-end executor + iteration partner". What really decides quality is how the human points out problems, demands verification, and turns vague feedback into verifiable edits.

最有效的协作方式不是写一个很长的万能 prompt,而是持续用浏览器批注指出:哪里看不懂、哪里不严谨、哪里不符合专业语气。 The most effective collaboration isn't one long do-everything prompt, but continuously using browser annotations to point out what's unclear, what's not rigorous, and what doesn't match a professional tone.
AI 适合做AI is good at

搭骨架和快速试错Scaffolding and fast iteration

先让 AI 把章节结构、交互控件、Canvas 图表、响应式布局做出来。第一版不追求完美,重点是尽快变成可以看的页面。Let AI first build the chapter structure, interactive controls, Canvas charts, and responsive layout. The first version doesn't aim for perfect — the point is to reach a viewable page fast.

人必须做The human must do

判断内容是否成立Judging whether the content holds

PQ / HLG 曲线、CIE 马蹄图、Luther 条件、EDID、gain map 这类内容不能只靠 AI 记忆。关键数据要回到标准、厂商文档或论文。Content like PQ / HLG curves, the CIE horseshoe, the Luther condition, EDID, and gain maps can't rely on AI memory alone. Key data goes back to standards, vendor docs, or papers.

反复做Done repeatedly

用批注压实页面Tightening the page with annotations

「这个图为什么从中间开始」「坐标轴没有数字」「公式看不懂」「文案太像 AI」这类具体批注,比抽象地说「优化一下」有效得多。Concrete annotations like "why does this chart start from the middle", "the axis has no numbers", "this formula is unreadable", "the copy sounds too much like AI" are far more effective than vaguely saying "improve it".

经验 1 · 让 AI 先解释,再让它改页面Lesson 1 · Have AI explain first, then change the page
做法Approach
遇到争议点时,先问「为什么会这样」,再让 AI 修改。比如演示 A 里淡色也匹配失败,先确认原因是非负峰值约束,而不是直接改成「看起来能匹配」。On a contested point, ask "why does this happen" first, then have AI make changes. For example, when a pale color also fails to match in Demo A, first confirm the cause is the non-negative peak constraint, instead of just changing it to "looks like it matches".
价值Value
这样能避免把真实限制藏掉。好的科普页面不是把所有问题美化成成功,而是让读者知道失败在物理上为什么合理。This avoids hiding real constraints. A good explainer page doesn't dress every problem up as success; it lets readers see why failure is physically reasonable.
经验 2 · 交互图表必须可读,不只是可动Lesson 2 · Interactive charts must be readable, not just movable
常见问题Common issue
曲线有了,但没有坐标轴数字;图能拖动,但横纵比例不对;模式切换按钮有了,但读者不知道当前看的是哪一种模式。There's a curve but no axis numbers; the chart is draggable but the aspect ratio is wrong; there's a mode-switch button but readers don't know which mode they're looking at.
改法Fix
每个交互图表都要回答三件事:X 轴是什么、Y 轴是什么、当前模式是什么。PQ / HLG / SDR 同图对比时,必须写明是线性亮度、对数亮度,还是分段线性亮度。Every interactive chart must answer three things: what's the X axis, what's the Y axis, and what's the current mode. When comparing PQ / HLG / SDR on one chart, state whether it's linear, log, or piecewise-linear luminance.
经验 3 · 公式不要只「写出来」,要排成读者能读的形状Lesson 3 · Don't just "write out" a formula — lay it out so readers can read it
问题Problem
ST 2084、HLG、OOTF 这类公式如果挤成一行,读者只会跳过。AI 很容易把公式当成普通文本堆上去。Formulas like ST 2084, HLG, and OOTF, if crammed into one line, just get skipped. AI tends to dump formulas in as ordinary text.
改法Fix
把公式拆成步骤:先定义输入输出,再列分段条件,再列常数。需要时用「先算 N」「再算亮度比例」这样的短句代替一整条长公式。Break the formula into steps: define inputs and outputs first, then list the piecewise conditions, then the constants. Where it helps, use short phrases like "first compute N", "then the luminance ratio" instead of one long formula.
经验 4 · 文案要克制,少用漂亮但空的比喻Lesson 4 · Keep the copy restrained; avoid pretty but empty metaphors
问题Problem
「时代的新痛」「奥秘」「神器」「物理学的代价」这类说法看起来顺,但会让技术页面显得不可信。Phrases like "the new pain of our era", "mystery", "killer tool", or "the price of physics" read smoothly but make a technical page feel untrustworthy.
改法Fix
把比喻改成可验证的描述:例如「OLED / QD-OLED 显示中的观察者差异」「窄峰原色会放大观察者同色异谱」。标题也要直接告诉读者这一节解决什么问题。Turn metaphors into verifiable descriptions: e.g. "observer differences on OLED / QD-OLED displays", "narrow-band primaries amplify observer metamerism". Headings should also tell readers directly what problem the section solves.
第七阶段Stage 7

收尾与发布Wrapping up and publishing

文案语气要克制、可验证,避免营销腔和 AI 腔。最后过一遍发布清单,确认入口接好。 The tone should be restrained and verifiable, avoiding marketing-speak and AI-speak. Finally, run through the publish checklist and confirm the entry points are wired up.

优先用Prefer

  • 观察者差异 / 明显偏差 / 显著上升observer difference / clear deviation / significant rise
  • 光谱限制 / 设计特征spectral limitation / design characteristic
  • 形成完整工作链路forms a complete workflow chain

避免用Avoid

  • 时代的新痛 / 踩坑翻车the new pain of our era / hitting potholes
  • 奥秘 / 玄学 / 神器救命mystery / dark art / life-saving killer tool
  • 突然连成一条线 / 物理学的代价suddenly connects into a line / the price of physics

发布前清单Pre-publish checklist

页面标题和 meta description 已更新Page title and meta description updated
所有资料来源链接可点击All source links are clickable
图表坐标轴、单位、刻度完整Chart axes, units, and ticks are complete
交互控件默认状态清晰Interactive controls have a clear default state
移动端无文字溢出或按钮挤压No text overflow or button crowding on mobile
首页工作流入口已接好Homepage workflow entry is wired up
JS 改完跑过一次语法检查Ran a syntax check after editing JS
git status 只含本次要发布的文件git status contains only the files for this release
收尾Wrap-up

可复用的方法论A reusable method

把整章的流程压缩成三句话,下一章可以直接套用。 Compress the whole chapter's process into three sentences, ready to apply to the next one.

先有问题
再有内容
Question first,
content second

每章开头是一个真实困惑,不是名词定义。选题阶段就把它挂到工作流上。Each chapter opens with a real confusion, not a definition. Hang it onto the workflow at the topic stage.

先有直觉
再有公式
Intuition first,
formula second

交互演示先让读者看到现象,再给计算模型。示意算法和真实数据要分清。Interactive demos show the phenomenon first, then the computational model. Keep illustrative algorithms and real data separate.

先在手机上
看一眼再发布
Take a look on mobile
before publishing

375px 宽度逐项核查 Canvas 高度、网格折叠、滑块溢出,再走发布清单。At 375px width, check Canvas height, grid collapse, and slider overflow one by one, then run the publish checklist.