教程标题写着“一小时工作坊”。我往下翻,第一步不是接线,不是装库,也不是先让你 pip install 一堆东西——是把一个 blink 烧进板子,让板载灯一秒亮一次。
digitalWrite(LED_BUILTIN, HIGH);
delay(1000);
digitalWrite(LED_BUILTIN, LOW);
delay(1000);
看到这四行,我就知道作者干过活。
这一秒一闪跟教学节奏没关系,跟排查有关系。它在回答三个问题:板子活着吗、烧录链路通吗、你那台笔记本的驱动是不是在骗你。三个里有一个答案是否,后面的 LED 矩阵、状态机、喂食动画就全是白搭。
我见过太多“AI 五分钟给你搭个 XX”的演示,第一步就甩三百行出来,跑不起来,然后开始猜。猜驱动、猜版本、猜权限。猜到一小时过去,发现问题出在 USB 线只能充电不能传数据。
教程的需求清单里明明白白写着“一根 USB 线”。
这个细节我给满分。写 runbook 的人都知道,让人卡住的从来不是知识,是线。
——
串口开在 9600,读单个字符。f 喂,p 玩,s 睡或者醒。
f -> hunger -3, joy +1
p -> joy +3, energy -2, hunger +1
s -> asleep 取反
这接口丑得要死。丑有丑的好处:一个字符一条命令,中间没有解析层,没有 JSON,没有引号转义。半夜手抖敲错一个字母,它顶多不响应,不会连锁。
再看那几个数。hunger、joy、energy,死夹在 0 到 10,每次加减都带上下界。初始值给的是 3、6、8。
不是 5/5/5。
我看到这个数就懂了——初始值不一样,说明作者真跑过,调过手感,不是把三个字段往模板里一填交差。夹上下界更是,现在写代码的人很少这么干,宁可信任上游,出了事再补一份复盘。
然后是整套东西里唯一一条真正像生产的设定:十秒一次的 tick。
用户什么都不干,能量照掉、饿照涨、心情照跌。合上笔记本走人,它自己在那边烂下去。
这条比整个 LED 矩阵都值钱。“没人动它它就不会变”——这是每个刚上 on-call 的人的第一个幻觉,也是我接过的电话里最常见的开场白。凌晨三点打过来,第一句永远是“我没动过任何东西”。再往下问两句,多半是“我好像动过一点点”。
所有“它一直好好的”,翻译过来都是“我不知道它从什么时候开始坏的”。
心情判定写在代码里:
hunger >= 7 或 joy <= 3 -> 皱眉
joy >= 7 -> 笑
其余 -> 平嘴
一个阈值告警,藏在一行 if 里,没写在任何文档里。
五年前为什么定 7 不是 6?没人记得。改它的那个人也不记得。屎山就是这么起头的——不是什么高深的设计失误,就是一个当初随手拍的数,后来长成了一条别人不敢碰的线。
补一刀:AI 读这段一定会告诉你“7 是个魔法数字,建议提取成常量”。它说得对。它不知道这个数是某次漏报之后调上来的,改完照样漏报,
