← 返回信息流
AI 资讯Hacker News·7 天前

我把儿子放进了沼泽

原标题:I Put My Son in a Swamp

速览

这篇文章以第一人称讲述作者将儿子放入沼泽的故事。标题本身具有冲击力,可能涉及育儿、冒险或隐喻。作为AI/科技资讯栏目收录,但内容与AI无明显关联。

AI 深度解读

背景

一位刚成为父亲的软件工程师,在新生儿出生后,发现自己无法停止用技术手段追踪孩子的一切。他原本只是用 Baby Buddy(一款自托管的婴儿追踪应用)记录喂奶、尿布、睡眠等数据,但一个干净的 REST API 在凌晨两点对他这种思维模式的人来说,就是一道“挑战”。于是,他沿着这条路径越走越远,最终构建了五个不同的界面来追踪同一个婴儿,其中包括一个名为 Swamp 的模型扩展,将儿子建模为一个“类型化资源”。这篇文章记录了这个看似荒诞、实则充满现实意义的过程。

核心内容

作者将他的新生儿建模为一个类型化资源,附带一个 sync 方法,用于拉取过去七天的生活数据并生成版本化快照;还有一个报告堆栈,汇总睡眠和进食情况;以及一个经过精心设计的 delete 方法,确保幂等性——因为删除同一个尿布记录两次不应该报错。他并不是一开始就想把婴儿放进“Swamp”里,只是之前已经把所有其他东西都放进了 Swamp。

“放进 Swamp”是什么意思?
Swamp 将真实资源建模为带有方法的类型化对象,并将每次运行记录为版本化数据,供其他模型读取。用户可以在 TypeScript 中编写扩展。作者上周用它自动化了家庭证书颁发机构,但整个过程中他一直在想那件他整晚都在处理的事——不是证书,而是婴儿。

他们在家运行 Baby Buddy——一个自托管的轻量级应用,用于追踪新生儿的喂食、尿布、睡眠、吸奶、用药等。它有一个干净的 REST API。于是作者编写了 @kneel/babybuddy:一个模型,将整个实例读取为快照,并写回新条目,附带一组在快照上运行的报告。记录一次喂食、修正一次误记录、修补一个错误的时间戳,然后向它提问。

报告会“出卖”你
总结一周的新生儿数据会得到一些数字,单独看有点疯狂:过去七天,96 次喂食,65 次独立的睡眠时段。最长连续睡眠是4小时46分钟——作者知道精确到分钟,因为他有一个名为 sleep-longest-stretch 的报告,他像别人查天气一样频繁地运行它。

最让作者触动的是用药报告。他原本用来回答“我们是否按时给了维生素 D”,结果回答了一个他没问的问题:“Neil 实际上什么时候想起维生素 D”。结果不是按时——时间戳聚集在午夜、凌晨2点、凌晨3点,也就是他每次清醒到足以想起的时候。他脑海里的时间表和数据库里的时间表并不一致,而只有其中一个会保留记录。这就是仪器化任何事物的真正价值:某个夜晚,仪表盘会还给你一张你本不想主动提供的自画像。

这不是第一个界面,而是第五个
作者承认这很愚蠢,但他说这话时带着对那个做这件事的自己的爱意:Swamp 扩展是他追踪这个孩子的最新方式,不是唯一的方式,而且远非唯一。

  • 移动应用:一个基于 Capacitor 的 Baby Buddy 包装,去掉了尖锐边缘。支持生物识别锁,防止手机放在沙发上时暴露整晚记录。可以语音记录尿布,因为双手总是占着。锁屏上有一个运行中的喂食计时器,旁边是你不愿意看的已用时间。支持 iOS 和 Android。
  • Pebble 手表应用:凌晨3点记录喂食的最佳界面,就是手腕上的物理按钮,只发出大约四个光子。启动计时器、停止、选择量、完成,全程没有手机屏幕那种唤醒整个神经系统的眩光。作者承认手表应用目前领先于他的硬件——他还没买到那块表。还有一个戒指界面,他也还没拿到戒指。他为两个仍在等待的设备编写了软件,这大致说明了他的精神状态。
  • 对话服务器:一个 MCP(模型上下文协议),让作者、Claude 或语音助手直接说出“他在11点吃了90毫升”。它会写出与应用、手表、Swamp 模型同步的相同喂食记录。
  • Home Assistant:负责“唠叨”的层。10:30 提醒仍醒着的人准备夜奶瓶,11:00 提醒放入维生素 D。如果没人确认,它会再次询问。这是一个非常礼貌的拿着剪贴板的机器人,目前记忆力比他们俩都好。

所有这些界面都不基于标准的 Baby Buddy——底层的 Baby Buddy 已经不再标准了。作者在其中添加了通过 FCM 推送通知、每条记录的审计字段(以便查看谁记录了什么)、软删除计时器(防止误操作直接消失),以及编写了几个新报告。“追踪婴儿”悄然变成了“重新平台化婴儿追踪器”,这句话如果他能睡够觉,会觉得尴尬。

五个界面,一个婴儿。每一个都是通往同一个 REST API 的不同入口。

为什么这么做?
你可以把这一切看作一个不睡觉的男人在造玩具,这并不全错。但底下有真实的东西,而且是整篇文章最不技术性的部分。新生儿是一个24小时运行的项目,由两个人每人睡大约五小时轮班操作。最困难的不是某一次喂食,而是交接——凌晨1点,一个人去睡觉,另一个人接手表,这只有在双方都看着同一组事实时才能成功:上次什么时候吃的?吃了多少?该吃了吗?维生素 D 吃了还是只是梦到的?所有追踪——应用、手表、语音、唠叨、Swamp——都不是量化自我,而是两个极度疲惫的成年人之间共享的事实来源,让他们在黑暗中、在不吵醒对方询问的情况下,跨越班次交接,保持一个连续的故事。婴儿只是数据的来源。

值得保留的一点
如果有一个工程教训在接触真实新生儿后幸存下来,那就是:声称完整但实际上不完整的数据,比没有数据更糟糕。作者写 sync 方法时,每个查询默认限制记录数——这在正常情况下是合理的,但想象一下,一个父母同步一个长时间窗口,悄悄地丢弃了最早的条目,得到一个看起来完整的摘要。所以现在快照携带了一个 truncated 标志,诚实地说“还有更多”,摘要也会明确说明,而不是用一张整洁的小表格撒谎。同样的直觉也体现在计时器软删除而不是真正删除上,以及停止计时器不会静默丢弃正在运行的计时器上。两个父母,两个设备,一个婴儿:总会有人停止错误的东西,或者两次删除同一个东西。工具的工作是让这种事变得平淡无奇,而不是因为家庭的竞态条件而惩罚你。

此刻孩子正在睡觉——已经睡了19分钟,根据计时器,作者绝对会停止查看它,因为查看它会唤醒报告,而报告会唤醒他。这个扩展在 Swamp 注册表上开源,如果你也运行 Baby Buddy 并且也无法忍受不去动一个能用的 API。

作者通过 Shrug PW 将这些同样的直觉应用于他人的基础设施。风险更高,但睡眠更好。

关键要点

  • 将婴儿建模为类型化资源:使用 Swamp 扩展,通过 sync 方法拉取版本化快照,通过报告堆栈分析睡眠、进食等数据,并确保删除操作幂等。
  • 五个不同的追踪界面:移动应用(语音记录、生物识别锁)、Pebble 手表应用(物理按钮低打扰)、戒指界面(硬件未到手先写软件)、对话服务器(MCP 支持语音/LLM 输入)、Home Assistant(定时提醒),全部指向同一个 Baby Buddy REST API。
  • 真正的动机不是量化自我:而是为两个极度疲惫的父母
查看原文 →thepotato.tech