AI 时代做产品,把省下来的时间花在细节上
Categories: Thought

距离写完上一篇 Mole 出 Mac 版后,用户教会了我做产品 已经过去两个多月。这段时间里,Mole 从 1.13 一路发到了 1.18,加上了 AI 工具清理和系统数据清理,Windows 版也在 10 月 14 日晚上发了出来,GitHub 上的 Star 一转眼也到了 72.9K。
回头看这段时间,花时间最多的反而不是写新功能,而是做了一些在工程师看来挺划不来的蠢事情:把国内外 850 款 Mac 软件一个个装上、用一下、再卸掉;把 400 多封没激活的 license 邮件一封封补发出去;几十个图标前前后后改了三轮;还有把界面文案一句句改到第一次用的人也能看懂。
Mole 的官网是 mole.fit,CLI 在 GitHub 开源,Windows 版在 mole.fit/windows。
程序员天然喜欢做可扩展的事情,什么事都想着尽可能工具化、自动化、AI 化来解决,让自己偷懒。这两个月下来我的感受有点不一样,代码越来越便宜,谁都能很快做出一个能跑的东西,能拉开差距的,越来越是那些只有亲手做过才知道的细节。好在有了 AI,这些原来要花大量人力的蠢事,现在一个人也做得完了。
从 100 个到 850 个,软件工程哪有什么规范
我平时有点强迫症,电脑里的软件一直控制在 30 个左右。为了让 Mole 的卸载更彻底,清理残留的能力更强,最初那一轮我整理了国内外 300 多款 Mac 软件,下载下来 100 多个 G,分成 30 组,每组 10 个,让 Agent 借助 computer use 的能力去官网下载,依次安装到我的电脑上,检查目录、更新 bundle、自启动,再卸载,找剩下的残留,把缺的规则补进 Mole。
当时想着最多搞 100 个主流软件来测试,结果测完想着要不再搞 100 个,到了 200 个的时候,又想着再搞 100 个,后来又补充了 App Store 版本和扩展插件,一路到了 549、709、824,现在是 850 款。我的电脑一下子变成了下面这个非常凌乱的桌面,哈哈给大伙瞅瞅。

这个过程看着非常无聊,很多软件一装上就疯狂弹窗要权限,诱导你去买会员,有些还必须输入管理员密码,Agent 大部分能自己处理,少部分我在旁边帮一手。让我非常惊喜的是,AI 还顺手自己写了自动化安装、卸载、检查残留的脚本,让自己干得更轻松,挺聪明的,哈哈我就只能给它打打下手。
这也改变了我的一些固有观点。本来以为软件工程应该是规范的、有秩序的,跑了 100 个软件后,后面应该没什么可以补充的规则了,因为按理主流软件的开发规范完全可以枚举出来。结果越往后走越发现,完全不是这样,很多残留,怎么写通用规则都找不全,甚至有些 bundle id 干脆就不是反向域名,看着很规范的约定,可能只是当年某个程序员随手写的,没有任何理论可以解释出来,只能装一个查一个。
那一轮 300 多款软件测下来,Mole 补了 13 类可以复用的通用规则、90 多条精确清理路径,也顺手改掉了 30 多个原本以为要清、其实不该动的地方,还补了 100 多条单元测试。其中那些不该动的地方,对我来说和新找到的残留一样有价值,缓存可以重新生成,用户自己的文件却不能,几个软件共用的数据更不能因为卸了其中一个就清掉。
每款软件的卸载步骤我也整理成了中英文指南放在官网,现在 850 款都能免费看,没买 Mole 的小伙伴也可以照着手动卸载,看看你电脑上的软件在不在这个名单里。

AI 工具要装上用一次才知道
做 AI 清理之前,很多小伙伴就提过想清 AI 工具的数据。之前在我看来,AI Coding 的会话记录是非常重要的资产,所以这一块只清真正的缓存和旧版本。
不过随着平时天天用 AI,我自己本地也攒了非常多没那么大用的旧产物、旧会话和 worktree,也有用户的 opencode.db 一个单文件就涨到了 62 GB,急着问该怎么清。于是我把 30 多款 AI 工具逐个测了一遍,其中桌面端测了 13 个,命令行也是 13 个,另外还查了 OpenClaw、Hermes 和 Pi 卸载以后留下的目录。
和之前装完就卸不一样,这次能用上的工具我都登录了账号,在真实项目里真金白银地用了一次,问问题、跑 Agent、建代码索引、设定时任务,因为很多数据只有实际用过才会产生,只装不开是看不到的。
每装一个,AI 就对照装之前的状态,量它往家目录、~/Library、/usr/local/bin 和 shell 配置里写了什么,记进一份台账,然后看它占了多少进程和内存,最后用 Mole 卸载,卸完再按名字把整个家目录扫一遍,找没列出来的东西,缺什么当晚补进代码,再复测一次。
这一轮看到的东西比普通软件更让人意外。最直观的是内存,13 个桌面端同时开着一共占了大约 23 GB,有一款国产大厂的工具一启动就是 41 个进程,占了 4.49 GB 内存。这些工具大多是 VS Code 或 Electron 系,一个窗口背后跟着一串 helper,所以 Mole 状态页里让每个 App 只占一行,把它的所有子进程合在一起算,不然光看活动监视器,很难看清到底是谁在吃内存。
还有就是它们对系统做的小改动。有些工具第一次打开时,会往 /usr/local/bin 放一个 root 所有的命令链接,App 删掉以后这个链接就变成了死链接;有一款往 ~/.local/bin 放了一个 python3.12,之后在终端里输入 python3.12,实际运行的都是它自带的版本;最离谱的是某个国产命令行工具,我运行了一次,它先告诉我自己已经停止维护,然后完全没问我,就直接下载安装了它的新版本,改了 .zshrc,还把原来的命令改名成了 legacy。
体积上也很夸张。有个桌面端第一次用 Work 模式就下载了约 1 GB 的工具包,解压后是 3.1 GB,里面塞了一整套自带的 LibreOffice、FFmpeg 和 OpenJDK;我自己天天用的 ~/.codex 已经 24 GB,其中会话占了 17 GB;Claude 桌面版 14 GB 里有 12 GB 是 Cowork 虚拟机。还有很多 skill 安装器会往每一个 Agent 的目录都写一份 skills/,不管你装没装这个 Agent,所以我明明没用过 Qwen Code、iFlow 和 Droid,家目录下它们的配置文件夹却都在,Mole 的第一版还把它们当成了 2.4 MB 的工具残留,差点把我装的 skills 当垃圾一起清掉。
进程也是我没想到的。卸载完第二天早上再查,有两个命令行工具的目录删了又长了回来,原因是前一晚在终端里开着的会话进程还活着,程序文件已经在废纸篓里了,后台进程照样在往目录里写日志,命令行工具没有窗口,关掉终端标签并不一定会结束它。
测试过程中也看到了不少乱象,比如有的软件在你下载安装包时,会悄悄往剪贴板写一点东西用来跟踪安装渠道;有的装上后疯狂弹窗让你去做活动领 Token,牛皮癣满天飞,有一种捏着鼻子用的感觉。对比下来,Claude、Codex、Cursor 都比较克制,国内让我意外觉得不错的是 Qoder,界面干净,审美在线,没有乱来。
这些也让我改了一个之前的判断,会话确实珍贵,但用完的旧会话和 worktree 也确实占空间。现在的 AI 清理里,会话会按你选的保留时间列出来,15、30、90、120 天可选,每一条都带标题和时间,删之前先留一份恢复副本;worktree 只有在 git 能证明里面没有未提交的改动时才会出现;opencode.db 则是做数据库压缩,只把空出来的页还给磁盘,不替用户删对话。

系统数据是最难测的一块
前阵子翻 Reddit,看到很多人抱怨 Mac 设置里的系统数据动辄一两百 GB,问到底是些什么、能不能删。但这个数字其实只是一个分类结果,Apple 的官方说明也是把其他分类没归进去的文件都算在里面,它并不是一份可以照着删的清单,所以 Mole 的系统数据分组只写自己量出来能处理多少,不去硬凑系统设置里的那个总数。
难的地方在于,这一块没办法在我自己的电脑上装一个查一个,每台 Mac 的系统数据都不一样,很多情况只能等用户报上来,再一层层去查。
比如可清除空间,系统报出来的数字里混着 iCloud 可以收回的文件、系统自己会释放的缓存,一台一个本地快照都没有的 Mac,这个数字也有 142 GB 左右。早期的 Mole 曾用它去估算快照能清多少,结果估出来能清 50.7 GB,清完可用空间实际只多了几 GB。现在快照这一行不再写预估大小,清完以后直接去量磁盘可用空间实际变了多少,而且 APFS 删完以后空间不是一下子回来的,要等它不再增长了才算数。中间还抓出一个 bug,读取可用空间时一直拿到的是缓存住的旧值,导致清完永远显示释放了 0。
还有一位用户的系统数据里,堆了 179.53 GB 的壁纸渲染缓存,整整 6644 个文件,每张壁纸、每种屏幕尺寸各存一份没压缩的 BMP,系统自己从来不删。第一版能把它扫出来,却一个字节都删不掉,因为壁纸进程一直在后台运行,检查文件占用的命令对单个文件又会报错,被当成了不确定。最后改成只列出一周以前的、而且不是正在显示的那几张,交给用户确认,这个在 1.17 里已经可以用了。
至于像我自己电脑上的 119 GB iPhone 备份和 79.5 GB Parallels 虚拟机,这种东西很大,但不应该交给一个全选删除按钮,Mole 只显示大小和管理入口,不能勾选,也不算进可清理空间,让人回到对应的地方确认清楚再说。

补发 400 多封邮件,顺便做了个小魔法
国庆的时候,我花了一天做了件拖了很久的事,把 Mole 从 5 月开售到 9 月底买了却还没激活的订单翻了一遍,大约 400 多单,用 AI 写了一个简单的本地脚本把用户邮箱和 Key 列出来,然后按购买月份、国家和语言,一封一封重新发了出去。不是促销邮件,也不是催促激活,更多就像发个微信一样,告诉用户不要忘记了,不急着用也可以。
有意思的是,陆陆续续收到了非常多各个国家用户的回信,比我预想的要有意义很多。有用户说买来就是想支持我继续开发,自己更喜欢用 Terminal 版本,还有人完全忘记了 GUI,一直在使用 CLI。也有用户非常用心,买了两个,一个给自己,一个给家人,打算当圣诞节礼物,所以一直没激活,Key 已经存进了密码管理器,让我感觉这个世界真美好。
也有用户一开始在公司电脑上用,后来公司禁止使用不在范围内的软件,一直在等自己的新 Mac;还有用户是在我打折的时候买的,现在还没有 MacBook,等自己新机到手就立马去激活。也有人回了一个「Prefect!」,还有人在国庆假期说,假期也该好好摸了(mole),这些回信看着都很开心。
不过其中也有不少用户其实是邮箱填错了,可能是打太快了,把邮箱写成了 gmai.com、gmail.con、cloud.com 这一类,也没来找我;也有用户是第一封邮件没有收到,为了早点用上又买了一遍。
在后台数据里看,这些人全都是同一个状态,未激活。如果直接给所有人发同一封催活邮件,反而可能把问题想错了,买来支持、留着送人、等新电脑的人,他们没有遇到需要催促的问题,邮箱填错和信没收到的人,才是真的没拿到激活码。这几种情况,光看后台数字是分不出来的,只有一封封看回信才知道。
所以顺着这件事,我把购买后的流程补了一截,付款完成后,会自动跳到 Mole 官网的一个页面,直接展示激活 Key,即使用户邮箱填错了,或者邮件被拦截了,也能在购买后第一时间看到。Mole 还多了一个有意思的功能,用户在网页上点击激活,就能一键把已经安装好的 Mole 客户端唤起来,自动在许可证激活页面填好这个 Key,用户不用自己复制粘贴,点下确认按钮就好了。
这个小魔法拆开看,就是网页交给 macOS 一个 Mole 能识别的链接,系统再把它交给客户端,客户端只把 Key 放进输入框,不会替用户自动确认激活,最后还是走原来的许可证校验,把最后一步留给用户。写过客户端和前端的工程师,可能会认为这个技术实现其实很简单,但是对大部分用户来说,会感觉卧槽、神奇、魔法,这个产品帮我多做了些事情。或许这也是我做产品一直追求的,多做一些有趣的功能,让用户感受到这种魔法,有一点黑客与画家的感觉。
最近我又在做一件差不多的事,给 5 月 Mole 刚上线就买了的那批老用户写信,简体、繁体、英文、西班牙语、法语各写了一份,信里主要是谢谢他们这么早就支持,说说这几个月 Mac 版加了系统数据和 AI 清理,在 Mole 里检查更新就能用上,最后留一句,用着有任何不顺手的地方,或者想要什么新功能,直接回信告诉我。
就这么一封短信,前前后后也改了好几遍,前几版读着总有一点推销的感觉,像是一封营销邮件,后来一句句改成平时和朋友说话的口气,简单、清晰、不啰嗦,读着像是我自己会发出去的信,才算满意。
Paul Graham 在 Do Things that Don’t Scale 里写过,Wufoo 早期给新用户手写感谢信,Stripe 会当场拿过用户的电脑直接帮忙装好。放到现在代码没什么壁垒了,这些看似不可扩展的笨功夫反而更值钱。
换一套图标,改一轮文案
这两个月花时间最多的细节,是把 Mole 里的图标整套换掉。之前用的是系统图标,简单场景完全够用,但细看会缺少一点灵性。调研了一圈,Remix Icon 写 Web 时用得很多,放到 App 上感觉不是很好看,最后选了 Phosphor,大概 70% 可以直接用,剩下 30% 是我用 Opus 5.5 写 SVG 自绘的,这样整体线宽和风格才能一致。
![]()
我一直想着,做出来的产品应该是有灵性、有生命的,用的人能感觉到这里面花了心思,图标这种小细节就是个很好的入手点。比如大伙看「保持常亮」我用的是一杯咖啡,有一种 Caffeine 的比喻,让电脑好像喝了咖啡一样睡不着;「关于」一般会用一个带圈的 i,但我想着应该是 hello,所以用了挥手的标志;「诊断」正常会用排查的标志,这里用了一个听诊器,更像是给电脑做一次体检。
结果发出去之后,用户的反馈让我意识到有些图标其实可以再来优化一下。有几个图标我自己觉得挺好,用户却觉得不够直观,「检查更新」用了一个下载的图标,被大家读成了下载,GPU 的小方块看不出是显卡,压缩包的图标看不懂,两根叠在一起的内存条也不太像内存,还有人说清洁屏幕的海绵和关于的挥手看不懂。仔细想想确实是这样,图标首先得让人看懂,好不好看在其次。
于是这几个都按大家的建议又改了一轮,检查更新换成了顺时针箭头,GPU 画成了双风扇显卡,压缩包换成了归档盒,音频从音符换成了耳机,清洁屏幕回到了最初刷子的意思,内存回到了芯片,关于最后还是换回了最正统的 ⓘ,只是按整列的线宽重新画了一遍,其中不少前前后后改了三次,终于舒服了。
![]()
文案上也是同样的折腾。之前写代码把 Claude 和 Codex 的额度都用得差不多了,翻出吃灰了一阵子的 Gemini,切到 3.8 Flash High,试着让它帮我看看文案,结果让我很惊喜,它写代码可能不算最顶尖,但写大白话写得很好。我把 Mole 的设置项、清理项说明和官网内容几乎全过了一遍,要求很简单,说人话,简单、清晰、易懂,让第一次用的人也能秒懂,不要文绉绉,也不要有 AI 味。
我让它输出改前、改后的对比和原因,再一条条看,那感觉真像请了一位很有耐心的语文老师坐在旁边,帮我把很多程序员自嗨的表达改成了正常人看得懂的话。比如缓存删除那一项,原来的说法容易被误解成整个 App 的删除方式,现在写清楚它只管清理页的普通缓存,卸载不受影响。
无障碍帮了大忙
测几百个软件的时候,还有一个意外的收获。Mole 刚出来的前几个版本就开始支持视障用户,加了很多无障碍属性,没想到这次帮了大忙,AI 借助这些属性,可以非常准确地找到每个按钮和元素的位置,测试顺利了很多。
无障碍属性提供的不只是一个坐标,还有这个控件叫什么、是什么类型、现在是什么状态,界面稍微变动,脚本依然能找到同一个按钮,如果只靠截图和坐标,弹窗一变、窗口一动,就很容易点偏。苹果从一开始就想着每个人都应该能平等地用电脑,很多地方都能被 VoiceOver 读到,这点真好。独立开发的小伙伴做 App 和网页时,可以让 AI Coding 顺手把无障碍补上,视障用户能用上了,日后做自动化测试时往往也会反过来帮到自己。
一台 Mac,加一台 ThinkPad
做 Windows 版的时候也是这样一个一个测出来的。其实 Windows 这边不是从零开始,Mole 的 Windows CLI 年初就开始陆续维护,有社区同学一起贡献,现在 CLI 已经很成熟了,有了这个底子才有了这次的桌面版。桌面版用的是 Windows 原生的 C# 和 WinUI 3,Mac 版的 Swift 代码几乎用不上,来来回回写了差不多一个月,攒下 7.8 万行代码和 4000 多个测试用例。测过的 486 款 Windows 软件大多是在 Mac 上的 Parallels 虚拟机里跑的,我又买了一台 ThinkPad X1,24 小时开着,Mac 通过 UU 远程和 ssh 连过去,让 AI 直接操作这台真实的电脑做安装、卸载和清理验收。

现在我的 Mac 是整个研发的主力端,上面跑着 Parallels 虚拟机,连着旁边的 ThinkPad X1,数据线还插着一台 Android 小平板,打开 adb 调试以后,AI 可以帮我操作一些没有 API 的服务,再加上 Xcode 里的 iPhone 模拟器。所有的 AI 上下文都在这一台 Mac 上,平时终端里开着 7 到 10 个 Tab 的 Agent 在跑任务,社交平台上收集到的建议和反馈会进到 Notion,AI 搞定后自动标记完成,这也是为什么我一个人可以把 GitHub 上那么多 issue 逐个清掉,哈哈。

用 Mac 开发 Windows 软件的具体做法,比如代码怎么分层才能在 Mac 上跑测试、虚拟机怎么用脚本驱动,我单独写在了 Mole 博客的这一篇里,选型上的取舍也在你不知道的客户端开发里聊过,有同样需求的小伙伴可以看看。
看似无用功的打磨
AI 让代码写得更快,也让做出一个看得过去的界面容易了很多,人看着好像什么都不用做了,动动嘴就行,但我这段时间的体会是,人在这里的作用反而更大了,AI 帮我们省下来的时间,刚好可以用来做这些看似无用功的打磨。
把 850 款软件一个个装上卸掉,把收到的回信一封封看完,把几十个图标改上三轮,这些事情 AI 不会替你决定去做,但做完之后,能让 1% 的用户在用你产品的时候,时不时体会到一种秒懂、卧槽、变魔术的感觉,那就非常非常有价值了。
把踩过的坑写成清理规则、补进 100 多条单元测试、整理成公开指南,下次就不用再从头来过,这些笨功夫才算没有白费。
测过的软件越多,越想让 Mole 保持现在的克制,不上传用户的本地文件和会话内容,不加任何使用统计,能用默认值解决的就不加开关。
接下来 Mac 这边我想先测到 1000 款,Windows 那边也会接着补,大伙电脑里如果装了什么特别难卸载、或者残留很深的软件,欢迎到 GitHub 讨论帖 告诉我,我放进下一轮的测试清单里。踏踏实实做出一个自己用着舒服、别人也觉得靠谱的工具,就很开心了。
CLI 在 GitHub 开源免费,Mac 版在 mole.fit,Windows 版在 mole.fit/windows,欢迎小伙伴们随时来吐槽。