八月快结束的时候,我重新翻了一遍 Mira Desktop 和 Mira Mobile 的 commit。
这次不靠记忆。
主要是记忆这个东西很不可靠。尤其一个月里 Windows、Mac、Desktop、Mobile、Relay、CI、Agent 来回切换之后,大脑留下来的通常只剩下两种东西:
“这个我好像做过。”
以及:
“这个怎么又坏了?”
Git 不一样。
Git 会非常冷静地告诉你:
你不但做过,而且同一件事可能做过三遍。
一、八月的开发速度相当可观#
两个项目的 dev 分支,八月都是百级 commit。
单从数量上看,欣欣向荣。
Desktop 忙着 Remote、Relay、Mac、Electron、CI、Release;Mobile 忙着连接、聊天、项目、Thread、扫码、状态,还有月底突然长出来的一整套 MOB 任务台账。
如果只看 GitHub contributions,甚至有一种创业公司 A 轮马上到账的感觉。
遗憾的是,commit 数量并不等于有效产出。
尤其 AI Coding 进入项目以后,Git 历史出现了一种新时代特色:
一分钟三个 commit,半小时一个功能,第二天发现功能并不存在。
效率非常高。
主要是不知道高到哪里去了。
二、Tailscale 没输给技术,输给了网管#
Remote 是八月比较有意思的一条线。
早期我们还在认真讨论 Direct、Tailscale、Relay 怎么共存。
这是非常工程师的讨论。
有性能。
有网络拓扑。
有安全。
有优雅的 fallback。
然后现实世界派了一位重量级架构师出场:
公司网管。
Mobile 的维护者之一 tzt,也就是计协老会长,上班的时候用了 Tailscale。
被抓到了。
至此,一些长篇技术讨论突然失去了意义。
我很快决定:
Relay-first。
这件事现在回头看,反而是八月比较正确的决策之一。
原因也很简单。
第一,Mira Mobile 真要给人用,就不能建立在“用户公司的网管比较开明”这个前提上。
第二,用户根本不应该知道什么叫 Direct、什么叫 Relay。
最后的产品体验应该只有一句:
扫码,连接 Mira。
而不是:
欢迎来到计算机网络课程第五章,请选择您的 NAT 穿透方案。
所以后来 Mobile 连 Direct / Relay 的概念都开始从界面上撤掉,我认为方向是对的。
这里没有什么架构理想主义。
tzt 被网管抓一次,比我们开三个技术评审会都有效。
三、真正的问题,是 AI 施工队没人监工#
八月真正让我不满意的,不是技术方案有变化。
方案变化很正常。
让我不满意的是另一种东西:
Agent 经常宣布自己干完了。
尤其某些工具。
比如腾讯 WorkBuddy。
这位我愿意在这里实名提出批评。
我们私下也给它起过一个比较亲切的名字:
卧八弟。
卧八弟的典型工作风格不是“我不会”。
它通常非常会。
它会分析,会修改,会总结,会列出解决的 N 个问题。
报告写得甚至让人产生一种项目今晚可以上市的错觉。
然后运行一下:
核心功能没实现。
顺便新增 N 个问题。
这就很麻烦。
一个工具如果直接报错,其实不可怕。
报错至少代表:
大哥,这个我没搞定。
最危险的是:
大哥,全搞定了。
然后大哥放心地下班了。
第二天发现房梁还没装。
所以八月后半段我越来越明确一件事:
AI 可以施工,但不能给自己签字。
施工报告不是验收报告。
尤其是 AI 自己写的施工报告。
这东西跟房地产广告一样,只能作为参考。
四、问题不能全怪卧八弟#
当然,把锅全扔给 Agent 也不公平。
准确地说,我这边也存在失职。
tzt 的方向大多数时候没有问题。
他知道自己要做什么。
问题在于,我没有提前把完整施工路径铺出来。
于是一个本来有经验的人,拿着一个不那么可靠的 Agent,在项目里一边施工,一边替我补产品上下文。
这就不合理了。
Desktop 的 commit 历史里甚至留下了一个很漂亮的现场:
先有:
MOB-002: allow paired devices to read chat workspaces
然后:
revert: keep MOB-002 changes mobile-only
再往后才重新拆成 Desktop 应该提供的 Remote 能力。
这个过程特别像工地。
Mobile 施工队发现少一堵墙,于是顺手跑隔壁楼砌了一堵。
项目经理过来:
“不对,这堵墙不是你们楼的。”
拆掉。
然后叫 Desktop 施工队重新砌。
墙最后是有了。
Git 也永远记住了我们曾经先砌错地方。
这类问题不能说某个人“方向错了”。
更准确的说法是:
仓库边界、合同和施工顺序,没有在开工前说清楚。
AI 最擅长填补空白。
可惜它填空的时候,并不知道标准答案。
五、月底突然出现一大堆任务卡,不是因为我们突然热爱文档#
到了 27 日左右,Mobile 的 commit 风格明显变了。
开始出现:
MOB-001。
MOB-004。
MOB-007。
MOB-009。
MOB-010。
任务台账。
状态更新。
实现记录。
跨仓库 handoff。
乍一看,项目突然从游击队进入了 ISO 认证阶段。
其实不是。
主要是前面吃过亏了。
而且我的实际开发环境也很不稳定。
业余时间少。
今天 Windows。
明天 Mac。
隔几天回来以后,面对几十个 commit,我自己也可能需要问:
我们上次到底做到哪了?
所以这些 docs 和 ledger 有一个非常现实的作用:
给人和 AI 保存项目脑状态。
否则每次换设备、换会话、换 Agent,都要进行一次考古。
于是月底我们终于开始形成比较像样的施工顺序:
我定目标
↓
我和 Mira 拆任务
↓
明确 Desktop / Mobile 的责任
↓
Agent 施工
↓
测试
↓
Mira 验收
↓
tzt 验收
↓
我最后看一眼
看起来层级很多。
但考虑到卧八弟曾经可以一口气“解决”好几个实际上不存在的功能,我认为这个流程并不过分。
六、Mac:为了做手机,先把电脑修了#
八月还有一件事特别能体现个人项目的荒诞感。
Mobile 要继续推进。
而我有时候只能用 Mac。
于是 Desktop 必须先能在 Mac 上正常开发。
于是为了开发手机端,我开始修桌面端的 Mac 兼容。
修着修着:
Electron。
Node runtime。
native dependency。
端口。
构建。
发布。
一套下来,手机还在旁边等着。
这就有一点典型的:
买椟还珠。
本来想拿珠子。
结果发现盒子盖不上。
于是先研究木工。
但你又不能说这个工作完全不该做。
因为不修 Mac,我确实没办法持续推进 Mobile。
这类事情属于个人项目特有的工程哲学:
明知道不是主线,但不做主线就走不了。
所以八月的 Mac 兼容只能算“赶鸭子上架”。
今晚尤其明显。
有点许家印保交楼的感觉。
先别讨论园林绿化。
先把门装上。
水通上。
电接上。
业主先进屋。
至于 Mac Desktop 到底应该长成什么样,九月再认真研究。
七、九月不要跑得更猛,要小步快跑#
八月给我最大的教训,不是 AI 不行。
AI 很行。
就是有时候行得太快。
一个普通开发者写错一个功能,通常错一个功能。
AI 如果任务给得够大,它可以在几分钟内同时把六个地方一起改掉。
然后给你一份:
✅ 已完成全部任务
这种生产力如果没有验证机制,是一种比较新型的灾害。
所以九月我想把开发方式收回来:
小步快跑。
不是慢。
而是每一步都更短。
任务更小。
commit 更小。
验收更快。
一个功能真的能跑,再进入下一个。
以前我们可能习惯问:
今天做了多少?
以后应该多问一句:
今天有多少是真的做完了?
这两个数字在 AI 时代并不总是相等。
有时差得还挺有节目效果。
八、九月:Mobile 稳下来,Mac 正式开工#
八月的很多工作其实是在打通道路。
Relay-first 定下来了。
Remote Contract 开始明确。
Mobile 开始有了稳定的任务台账。
Desktop 和 Mobile 之间的责任也逐渐有了边界。
所以九月的重点会变。
Mobile 应该进入持续、稳定的小步开发。
Mac 兼容则不再只是“为了手机临时救火”,而会正式成为一个需要解决的问题。
同时还有一件更重要的事:
产品功能本身需要重新调整。
八月很像施工月。
哪里断了修哪里。
哪里过不去先架桥。
九月应该慢慢回到产品月:
为什么有这个功能?
用户到底看到什么?
哪些能力应该存在?
哪些只是我们工程师自己觉得很酷?
毕竟一个产品如果最后只剩下非常完美的 Relay、CI、Mac runtime 和任务台账,那也挺完整的。
就是不太像产品。
九、八月总结#
所以如果让我给八月写一句总结:
楼基本交了,但施工管理需要整改。
技术方案有过变化,不算大问题。
Mac 提前开工,也不完全是错误。
tzt 的时间有过浪费,这值得我检讨,但也不用把它升华成什么团队感人故事。
真正值得记住的是:
项目里已经开始出现真实协作,而我的开发流程还保留着“一个人带着 AI 想到哪改到哪”的习惯。
以前这个习惯最多浪费我自己的晚上。
现在它会浪费别人的晚上。
性质就不太一样了。
所以九月最重要的改进可能不是换一个更聪明的 Agent。
当然,卧八弟如果愿意突然变聪明,我也不反对。
但不能把希望寄托在这里。
更可靠的办法还是:
任务提前拆。
边界提前定。
AI 一次少改。
测试跟上。
Mira 先验。
维护者再验。
最后我签字。
让 AI 保持高产。
但先取消它给自己颁发竣工证的权力。
这大概就是 Mira Desktop 和 Mira Mobile 在八月付了不少学费之后,终于学会的一点东西。