有件事要先说明。 2026 年 4 月,本刊登过一篇文章:江原道华川一位种了三十年番茄的农户,把谷仓里的三十本笔记搬到了一个画面上。那是一篇点名、点年龄、点地区的采访。
这个现场不是某一家特定的农户。 所以我们不把原采访原样重刊。取而代之,我们把同样的形状从头到尾自己做了一遍。 以下所有画面和数字都出自我们做的东西,不是任何一家农户的记录。
把这个区分放在开篇的理由是:原文整篇的论点是「你也做得到」这份许可,而这份许可压在案例的真实性上。没有确认真实性就重复同一句话,那不是许可,是广告。
所以这篇要证明的东西变窄了。不是「某位农户做到了」,而是「这样的工具长这个样子,而且实际能做到这么多」。
原文的心脏里没有实物
原文的轴是好的。纸停在「写下来」这一步。 把东西翻出来相互比对,交给了人的记忆和耐心。而一旦以同样的字段堆起来,记录就变成可以追问的东西。
我们现在仍认为那个物性上的转变是对的。问题是那篇文章一次也没有把它拿出来看。
- 他实际说了什么 —需求原文 0 行
- 那句话变成了怎样的画面定义 —定义摘录 0 行
- 经过了哪些步骤做出来 —制作过程 0 步
- 三十本笔记的迁移 — 只有「抽空在搬」这句话
而全文最精彩的「移栽后第 18 天开第一朵花」这个发现也一样。那是要五年数据堆起来才成立的主张,可那批数据和它显现出来的画面都不在。
这次我们把三样东西并排放。说出来的 → 变成定义的 → 真正被画出来的。
说出来的
做的过程中,我们把需求写成三句话。不用开发术语。
- 「选个作物,今年的记录就一溜儿出来。」
- 「记录要能单手完成。」
- 「去年这时候什么样,挨着显示出来。」
三句话变成了三个工具。
log offers: log.season, log.add, log.compare
变成定义的
第一句变成了画面的这一部分。不是代码,是声明。
{
"type": "list",
"items": "{{season}}",
"emptyMessage": "Nothing recorded this season yet",
"itemTemplate": {
"type": "linear", "direction": "horizontal", "spacing": 12,
"children": [
{ "type": "text", "text": "{{item.date}}" },
{ "type": "text", "text": "{{item.action}}" },
{ "type": "text", "text": "{{item.tempC}}°C" },
{ "type": "text", "text": "{{item.note}}" }
]
}
}
第二句变成了一个按钮。
{
"type": "button",
"label": "First flower",
"onTap": {
"type": "tool", "tool": "log.add",
"params": { "crop": "Tomato", "action": "firstFlower", "tempC": 19.5 }
}
}
第三句让画面多了一个。就一行路由。
"routes": { "/": "ui://pages/today", "/compare": "ui://pages/compare" }
整个应用是四个 JSON。 编译器不会运行。
真正被画出来的
今天的画面。移栽后第几天、以及往年的平均值,都在上面。

按一下「First flower」,就多出一行。

以及把各个年份叠着看的画面。

18.2 天在任何地方都没被写下来
这是这一篇里最重要的部分。
原文把「18 天」当成结果写了出来。在这个样例里,那个数字不是常量。 它每次都从记录里算出来。
/// Days from transplant to first flower, per season.
///
/// This is the whole "eighteen days" claim, and it is arithmetic over the
/// rows — no constant anywhere. A year with no flower recorded yet is left
/// out rather than guessed at.
而且验证会直接确认这一点。算出来的值一旦以字符串形式出现在源码里,就判失败。
AVG=$(grep -o "average from records: [0-9.]*" captures/run.log | awk '{print $4}')
if grep -RIn --exclude-dir=captures -F "$AVG" farm_server/bin farm_log.mbd bundle_host/lib; then
echo " the average $AVG appears literally in the source — it must be computed"
exit 1
fi
通过时的日志。
average 18.2 computed from records, not present in any source file
「它是从记录里冒出来的」和「有人把它写了上去」,在画面上长得一模一样。 所以我们把分辨它们的办法放进了通过条件。