<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Leon 的文章</title><description>Leon 写下产品的缘起、取舍与做出来的过程。</description><link>https://leon-made-this.work/</link><language>zh-CN</language><copyright>© Leon。文章正文保留全部权利。</copyright><item><title>AI 已经开始写代码，我却还没想清楚要做什么</title><link>https://leon-made-this.work/writing/wayfinder-from-sentence-to-product/</link><guid isPermaLink="true">https://leon-made-this.work/writing/wayfinder-from-sentence-to-product/</guid><description>一句模糊的语音想法，怎样在没有急着写代码的情况下，一步步变成可以开发的产品方案。</description><pubDate>Tue, 25 Aug 2026 16:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;small&gt;原载 微信公众号：&lt;a href=&quot;https://mp.weixin.qq.com/s/swVm_CUZfAlA6kszgFGAxg&quot;&gt;AI 已经开始写代码，我却还没想清楚要做什么&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;2026 年 7 月 26 日，我给 AI 发了一条语音转出来的消息。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;女儿三岁，最近对恐龙感兴趣，想给她做一个本地的恐龙合集。最好有 3D 效果，我们可以在电脑上看，也可以把恐龙转起来。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;span&gt;[图片：2026 年 7 月 26 日，我第一次用 Wayfinder 为这个想法建立产品地图]&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;small class=&quot;image-caption&quot;&gt;我发给 Wayfinder 的第一条消息。&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;语音里有不少口头语，说得还有些绕。当时只是一个父亲想陪女儿看看恐龙。&lt;/p&gt;
&lt;p&gt;今天再打开史前动物博物馆，里面已经有十八个展项。它公开上线后登上过 V2EX 当日最热第一，GitHub Stars 当时也过了五百。可在那条语音发出去的时候，我连它该做成网页还是应用都不知道。&lt;/p&gt;
&lt;p&gt;&lt;span&gt;[图片：现在的史前动物博物馆剑龙产品界面]&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;small class=&quot;image-caption&quot;&gt;后来做出来的史前动物博物馆。&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;我没有马上让 AI 写代码。我用 Wayfinder 先把已经确定的事和暂时没有答案的问题放进同一张 Map，然后一次只解决一个会改变方向的问题。&lt;/p&gt;
&lt;h2 id=&quot;先不写代码先把终点说清楚&quot;&gt;先不写代码，先把终点说清楚&lt;/h2&gt;
&lt;p&gt;Wayfinder 做的第一件事，是问我这轮结束时想拿到什么。&lt;/p&gt;
&lt;p&gt;它建议先做一份可以交给开发者的首版方案，只保证眼前这台 Mac 能用，暂时不直接做成品。&lt;/p&gt;
&lt;p&gt;我接受了先出方案，却改了后半句。我希望它是一个纯静态网页，可以放到 GitHub。别人下载以后也能在本地浏览器里打开，将来还可以在线访问。&lt;/p&gt;
&lt;p&gt;这段很短的来回，先拦住了一个会影响后面所有工作的分岔口。假如当时直接开写，我们很可能已经在做一个只适合我自己电脑的本地应用。&lt;/p&gt;
&lt;p&gt;这一轮的终点也从做出博物馆变成了把首版需要做的决定问清楚。它要描述一个可下载、可在浏览器里运行的 3D 史前动物馆，供家长陪三岁孩子一起探索。&lt;/p&gt;
&lt;h2 id=&quot;一次只解决一个能回答的问题&quot;&gt;一次只解决一个能回答的问题&lt;/h2&gt;
&lt;p&gt;目的地确认以后，Wayfinder 才开始建 Map。&lt;/p&gt;
&lt;p&gt;Map 里放着我们要去哪里、已经确认了什么、暂时说不清的地方，以及这轮明确不做什么。一个问题已经能被准确地问出来，才会成为一张 ticket。每张 ticket 只回答一个问题，同时写清它要等哪些前置结果。&lt;/p&gt;
&lt;p&gt;需要外部事实时就去调查，需要看见以后才能判断就先做原型，涉及偏好和取舍时再由我选择。每完成一张 ticket，结论都会写回 Map，被它挡住的下一张也随之解锁。&lt;/p&gt;
&lt;p&gt;&lt;span&gt;[图片：Wayfinder 从 Map 中取出一个能回答的问题，按依赖推进，再把结论写回同一张 Map]&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;small class=&quot;image-caption&quot;&gt;每个答案都会更新 Map，随后再打开下一个没有被阻塞的问题。&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;这比在聊天框里直接列一份计划麻烦，却解决了一个具体问题。新的任务不用重新猜项目是什么，也不用把所有历史对话都塞进上下文。它先读 Map，再接着处理眼前的问题。&lt;/p&gt;
&lt;h2 id=&quot;先查限制再做试验最后才选架构&quot;&gt;先查限制，再做试验，最后才选架构&lt;/h2&gt;
&lt;p&gt;最能说明这套方法的，是本地怎样不起服务就能打开这条线。&lt;/p&gt;
&lt;p&gt;我最初想得很简单。做成纯静态页面，下载到电脑，双击 HTML 文件就能看。&lt;/p&gt;
&lt;p&gt;Wayfinder 没有立刻选择技术栈。它先调查浏览器在 &lt;code&gt;file://&lt;/code&gt; 协议下加载 3D 模型和 JavaScript 模块的限制。结果显示，直接双击打开并不可靠。本地版本仍然需要一个很小的服务来启动，或者把所有资源内嵌进构建产物。&lt;/p&gt;
&lt;p&gt;下一步才是小试验。它真的加载了一只本地 GLB，播放本地中文音频，切换模型，也故意触发加载失败。到这里，我们知道浏览器路线能走，也知道哪些地方会出问题，却还没有决定正式架构。&lt;/p&gt;
&lt;p&gt;最后一轮才选定 React、TypeScript、Vite 和 Three.js。在线版放 GitHub Pages，本地下载版通过一个很小的 Node 服务启动。第一版不做 PWA，也不做桌面安装包。&lt;/p&gt;
&lt;p&gt;这三个步骤的顺序不能交换。先查浏览器限制，再跑最小试验，最后做选择，技术方案才有东西可以踩在脚下。&lt;/p&gt;
&lt;h2 id=&quot;当证据推翻计划就让计划改掉&quot;&gt;当证据推翻计划，就让计划改掉&lt;/h2&gt;
&lt;p&gt;Map 里的第一版规模原本大约是十二只动物。&lt;/p&gt;
&lt;p&gt;最初的调查只能证明网上存在许可允许公开再分发的候选。它不能证明这些模型放在一起好看，也不能证明文件下载回来以后真的能在浏览器里使用。&lt;/p&gt;
&lt;p&gt;于是我把候选逐个下载，检查贴图、动画、大小和结构，再放进同一个 Three.js 场景里转着看。第一轮结果并不理想。一套模型风格很统一，画面却太粗糙。有一只翼龙在列表页里看着没问题，下载后才发现模型是坏的。&lt;/p&gt;
&lt;p&gt;第二轮找到了更好的剑龙和肿头龙，也进一步确认免费的候选仍然拼不出一套质量稳定的十二只阵容。&lt;/p&gt;
&lt;p&gt;我宁愿先少做几只，也不想为了凑数把明显粗糙的模型放进去。第一版从十二只收缩到六至八只，最后先选八只。&lt;/p&gt;
&lt;p&gt;决定留在 Map 里以后，下一轮任务看到八只，也能知道数字为什么变了，不会因为忘记当时的判断，又把十二只塞回计划。&lt;/p&gt;
&lt;h2 id=&quot;有些答案要看见以后才能选&quot;&gt;有些答案，要看见以后才能选&lt;/h2&gt;
&lt;p&gt;页面怎样排，是另一类问题。&lt;/p&gt;
&lt;p&gt;这件事继续查资料没有多大帮助。AI 做出几种很粗的页面，里面只有占位的动物轮廓和能点的按钮，目的只是让我比较浏览方式。&lt;/p&gt;
&lt;p&gt;&lt;span&gt;[图片：方案 A 用柔和水彩风格展示三角龙]&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;small class=&quot;image-caption&quot;&gt;方案 A 的柔和水彩绘本方向。&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;[图片：方案 B 换成了分层剪纸绘本的构图]&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;small class=&quot;image-caption&quot;&gt;方案 B 的分层剪纸绘本方向。&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;我最后喜欢另一个方案的故事书式构图，却觉得方案 A 直接显示动物名字的切换栏更直观。正式方向就用了前者的页面结构，拿来后者的切换方式，又加上不同动物之间缓慢变化的背景。&lt;/p&gt;
&lt;p&gt;选择发生在我看过页面以后。AI 先把只能靠想象讨论的问题做成可以看、可以点的东西，我再告诉它喜欢哪一部分。&lt;/p&gt;
&lt;h2 id=&quot;先跑通一只剑龙再建整座馆&quot;&gt;先跑通一只剑龙，再建整座馆&lt;/h2&gt;
&lt;p&gt;到 7 月 27 日，支撑首版开发的决定已经足够完整。后面的编码也从一只剑龙开始。&lt;/p&gt;
&lt;p&gt;它先把内容、3D、音频和响应式界面从头到尾跑通一遍。模型能转，点击能听旁白，手机能看，加载失败还有替代画面。这只剑龙是最小的一次端到端验证。&lt;/p&gt;
&lt;p&gt;它通过以后，馆才扩成九种动物，后来又到十二种。今天公开的版本有十八个展项。&lt;/p&gt;
&lt;p&gt;十八个展项是后面一轮轮做出来、看出来、改出来的。Wayfinder 的主要工作停在第一只剑龙可以开工之前，它把通往这一步的路问清楚了。&lt;/p&gt;
&lt;h2 id=&quot;我只在事情真的有雾时用它&quot;&gt;我只在事情真的有雾时用它&lt;/h2&gt;
&lt;p&gt;现在，我只会在一种情况下开 Wayfinder。&lt;/p&gt;
&lt;p&gt;这件事确定要跨很多轮任务，其中还有几项尚未决定。一旦选错，后面的代码、素材或内容都会跟着返工。&lt;/p&gt;
&lt;p&gt;能在一两轮里说清并做完的功能，我不会专门建 Map。Wayfinder 很重，逐题确认也会累。它适合那些已经值得认真做，眼前又确实还有雾的事情。&lt;/p&gt;
&lt;p&gt;回头再看开头那句话，里面其实已经有了整个项目最重要的东西。我想和女儿一起看恐龙。网页怎么打开，第一版做几只，模型从哪里来，都是后来一项一项问出来的。&lt;/p&gt;
&lt;p&gt;每一步都很普通。问一个问题，查一点资料，看一个粗原型，再做一个选择。它们连在一起，真的把那句有点绕的话带到了一座可以打开的博物馆面前。&lt;/p&gt;
</content:encoded></item><item><title>女儿看到恐龙就跑，我给她做了一座博物馆</title><link>https://leon-made-this.work/writing/a-museum-for-my-daughter/</link><guid isPermaLink="true">https://leon-made-this.work/writing/a-museum-for-my-daughter/</guid><description>一个三四只动物的小试验，怎样长成一座允许孩子慢慢看、随时离开的 3D 博物馆。</description><pubDate>Tue, 25 Aug 2026 16:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;small&gt;原载 微信公众号：&lt;a href=&quot;https://mp.weixin.qq.com/s/yNgy0snvYcUtpTVQSs5nyg&quot;&gt;女儿看到恐龙就跑，我给她做了一座博物馆&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;有一次，同事笑着问我：“每个月自己花钱买 AI 和 Coding 订阅，又用了这么多 token，最后到底做出了什么？”&lt;/p&gt;
&lt;p&gt;我认真想了一下，一时没答上来。&lt;/p&gt;
&lt;p&gt;那句话后来一直留在我脑子里。我开始想，AI 除了帮我完成工作，还能不能帮我做出一些生活里真的需要、也可以直接打开给人看的东西。&lt;/p&gt;
&lt;p&gt;第一个需要，来自我三岁的女儿。&lt;/p&gt;
&lt;h2 id=&quot;她会跑开过一会儿又回来&quot;&gt;她会跑开，过一会儿又回来&lt;/h2&gt;
&lt;p&gt;她会看《汪汪队》一类的动画。&lt;/p&gt;
&lt;p&gt;有些情节里会出现恐龙。每当到了追逐打斗、恐龙突然出现，或者打得越来越激烈的时候，她就会从电视前跑回房间。&lt;/p&gt;
&lt;p&gt;过一会儿，她又会轻手轻脚地回来，站远一点偷偷看。恐龙一靠近，她再跑。&lt;/p&gt;
&lt;p&gt;有一次，她干脆躲到了凳子后面，只露出一个头，继续盯着电视。&lt;/p&gt;
&lt;p&gt;我抱过她，也告诉过她，不用怕，爸爸妈妈会保护她的。但是她还是会挣开，跑回房间。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;她会跑，也会回来。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;恐龙吸引着她，动画里的战斗、追逐和越来越激烈的动作又一次次把她吓跑。我开始想，如果把这些东西都拿掉，只让一只动物安静地待在电脑屏幕上，由她自己看看图片，或者转一转 3D 模型，她还会不会害怕？&lt;/p&gt;
&lt;p&gt;&lt;span&gt;[图片：一个匿名重绘的孩子躲在木椅后面继续看恐龙]&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;small class=&quot;image-caption&quot;&gt;躲归躲，恐龙还是要看的。&lt;/small&gt;&lt;/p&gt;
&lt;h2 id=&quot;最开始我只做了三四只&quot;&gt;最开始，我只做了三四只&lt;/h2&gt;
&lt;p&gt;最初真的只是一个很小的试验。&lt;/p&gt;
&lt;p&gt;我找了三四个恐龙的 3D 模型，把它们放进网页里。模型可以转，也可以从不同角度看，仅此而已。&lt;/p&gt;
&lt;p&gt;我在网页上调试的时候，女儿在旁边看到了屏幕里的恐龙。这回她没有跑。&lt;/p&gt;
&lt;p&gt;这只是发生在自己家里的一次观察，没有经过正式测试，也不能替其他孩子作结论。它至少回答了我最开始的问题。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;换一种观看方式，她愿意留下来。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;于是我觉得，可以再往前做一点。动物就这样一只一只加了进来。&lt;/p&gt;
&lt;p&gt;一开始，我把这个项目叫作“恐龙馆”。等猛犸象也加进来，我突然发现，这个名字已经装不下它了。&lt;/p&gt;
&lt;p&gt;猛犸象不是恐龙。继续叫“恐龙馆”，怎么想都不太对。于是它有了一个新的名字，&lt;strong&gt;史前动物博物馆&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;名字变了，馆也跟着一点点长大。陆地上的动物多起来后，天空和海洋展区也逐渐加入。最初只有三四只动物，后来有了陆地、天空和海洋三个展区，一共有 &lt;strong&gt;18 个史前动物展品&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id=&quot;每多做一点都要回到最开始那个问题&quot;&gt;每多做一点，都要回到最开始那个问题&lt;/h2&gt;
&lt;p&gt;东西越做越多，我越要回答一个问题。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;一个又好奇、又容易被突然的大动作吓到的孩子，应该怎样在这里看东西？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;动物得让她自己选。选中以后，可以慢慢转到侧面和背后，看看平时不容易注意到的地方。可以把剑龙转过去，看背上的骨板；也可以靠近一点，看沧龙用来游动的鳍状肢。&lt;/p&gt;
&lt;p&gt;模型可以放大，也可以缩小。声音不能突然响，所以普通话和英文旁白都不会自动播放，想听的时候再自己点。&lt;/p&gt;
&lt;p&gt;动物可以动，但是动作要尽量保持克制。我不想把动画里的追逐和压迫感重新搬进来，也不想靠血腥场面或狰狞的捕食姿态吸引孩子。如果某一只动物让她不舒服，换一只就好，也可以直接关掉。&lt;/p&gt;
&lt;p&gt;这里没有“必须看完”这件事。&lt;/p&gt;
&lt;p&gt;孩子先看动物。它生活在什么年代、体型有多大，科学上还有哪些地方不能确定，我把这些放到了家长资料里。家长愿意的时候，可以点开看看，再和孩子多聊两句。&lt;/p&gt;
&lt;p&gt;有时候，看见一个有意思的细节，这一趟就已经够了。&lt;/p&gt;
&lt;p&gt;&lt;span&gt;[图片：史前动物博物馆海洋展区里的沧龙完整界面]&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;small class=&quot;image-caption&quot;&gt;海洋展区里的沧龙。孩子想听时再点旁白，更多资料留给家长。&lt;/small&gt;&lt;/p&gt;
&lt;h2 id=&quot;ai-帮我找得更快最后仍要自己选&quot;&gt;AI 帮我找得更快，最后仍要自己选&lt;/h2&gt;
&lt;p&gt;做到后来，一个意外花时间的地方，是找 3D 模型。每只动物都要一个个筛，外形和动作要适合孩子，模型本身还得放得进网页，公开使用的许可也要核对。&lt;/p&gt;
&lt;p&gt;我开始让 AI 帮我查公开来源、整理候选。原来需要在很多网页之间来回翻找，现在可以先让 AI 缩小范围，再集中看几个可能合适的结果。&lt;/p&gt;
&lt;p&gt;它也会太过自信，停得太早。有时候，它找到一个题材合适、许可线索也对的低模模型，就觉得任务已经完成。实际打开以后，模型太粗糙，放进博物馆里不好看，我就得让它继续找。&lt;/p&gt;
&lt;p&gt;许可也是一样。AI 给出的摘要只能作为线索，实际使用之前，我还要回到模型的原始页面，重新核对许可证。&lt;/p&gt;
&lt;p&gt;AI 帮我少翻了很多页面。但是孩子看着舒不舒服，模型放进网页是否合适，最后留哪一个，仍由我决定。&lt;/p&gt;
&lt;h2 id=&quot;然后她真的把整座馆都看完了&quot;&gt;然后，她真的把整座馆都看完了&lt;/h2&gt;
&lt;p&gt;最终版本做好以后，我把博物馆重新打开给女儿看。这一次，馆里已经有十八个展品。&lt;/p&gt;
&lt;p&gt;她很感兴趣。在我的指导下，她学会了用 Tab 和 Enter 在界面里切换，也学会了拨鼠标滚轮，把模型放大、缩小。&lt;/p&gt;
&lt;p&gt;她对旁白没有表现出特别大的兴趣，也没有特别偏爱哪一只。她只是看完一个，再去看下一个，把馆里的十八个都看了一遍。&lt;/p&gt;
&lt;p&gt;桌面鼠标对一个三岁的孩子来说有点大，点选对她也还有些困难，但滚轮很好理解。我看着她伸出小手，拨一拨那个对她来说有些大的滚轮，屏幕里的史前动物靠近一点，再远一点，然后继续下一只。&lt;/p&gt;
&lt;p&gt;&lt;span&gt;[图片：剑龙在同一场景中从远处缩放到近处]&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;small class=&quot;image-caption&quot;&gt;拨动滚轮，动物会靠近一点，也可以再远一点。&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;最开始那个很小的问题，到这里算是有了一个答案。&lt;/p&gt;
&lt;p&gt;这只是我们家的观察，不能说明别的孩子也一定会有同样的反应。至少对她来说，好奇一直都在。换一种观看方式以后，她不用一次次跑开了，可以留下来慢慢看。&lt;/p&gt;
&lt;h2 id=&quot;那些-token-最后有了一个能打开的答案&quot;&gt;那些 token 最后有了一个能打开的答案&lt;/h2&gt;
&lt;p&gt;现在，史前动物博物馆已经可以在线打开。&lt;/p&gt;
&lt;p&gt;不用注册，没有广告。模型、图片和旁白都提前准备好了，孩子使用的时候不会临时调用 AI 或广告服务。&lt;/p&gt;
&lt;p&gt;如果家里也有一个对史前动物好奇的孩子，可以陪他进去挑一只，转着看看。想听的时候再点旁白，看够了就离开。&lt;/p&gt;
&lt;p&gt;我没有打算靠这座馆把孩子留在屏幕前更久。它只是给她多了一种接近这些动物的方式。&lt;/p&gt;
&lt;p&gt;以后如果那位同事再问我，花了这么多 token，最后到底做出了什么，我现在有答案了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;我给女儿做了一个可以自己慢慢看、随时离开的地方。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;最开始，里面只有三四只动物。后来，它真的长成了一座博物馆。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://leon-made-this.work/museum/&quot;&gt;打开史前动物博物馆&lt;/a&gt;&lt;/p&gt;
</content:encoded></item></channel></rss>