最近圈子里流行一句话:先做一个垃圾出来。
别纠结完美,先把东西做出来再说。MVP,最小可行产品,硅谷创业圣经的核心教义。

我信了。我照做了。
垃圾,确实做出来了。谢谢大家的建议。
先做一个垃圾出来,这个建议本身没问题。问题是,没人告诉你做「垃圾」的过程中会发生什么。
一个完美的商业计划
故事的起点其实很体面。
我最早的构想是做一个文旅行业的数据产品。完整规划:日报、周报、月报。日报免费发公众号引流,周报和月报收费。当时画完商业模式图的时候,我觉得这个计划简直无懈可击。
然后我开始动手采集数据。
采上来一看,全是新闻标题。「某省召开文旅工作会议」「某景区迎来客流高峰」。没有数字,没有趋势,没有任何可以被称为「数据分析」的东西。我做出来的日报跟在百度搜「文旅新闻」然后复制粘贴的效果差不多。
收费?卖这个?
好吧,既然数据分析做不了,那我就退一步,先做个免费的新闻推送吧。至少能积累用户。
推送也没做成。具体原因我已经不记得了,反正就是一个目标接一个目标地往下掉。
回过头看这段经历,规律很清晰:我一开始不知道自己想做什么,就先随便定了一个最大的目标。发现做不到,就把目标缩小一圈。再做不到,再缩。
最后的最后,我想通了一件事:不赚钱了。做一个免费的工具放到GitHub上,当个人能力的见证,以后放在个人网站上也行。
从「完美商业模式」到「免费放GitHub当简历」。这个降级速度,我自己都佩服自己。
接手一堆「已完成」的代码
在这个状态下,我开始用Claude Code 重新规划这个项目。
新方向很简单,做一个命令行工具。用户输入一句话(比如「云南省2024年旅游收入」),工具自动搜索、采集网页、调用大模型分析,生成一份带表格和图表的研究报告。
Claude Code接到任务后,非常认真地制定了五阶段实施计划。Phase A到Phase E,分别是骨架搭建、搜索引擎、大模型分析、报告图表、终端打磨。
然后它就开始写代码了。
Phase A,完成。 Phase B,完成。 Phase C,完成。 Phase D,完成。 Phase E,完成。
没有意外。没有返工。没有「这里有点问题我想再改改」。五个阶段一马平川地写完了。
Claude Code对我说了四个字:「实施完成。」
我看着43个文件、2000多行代码、写好的README、画好的架构图。内心涌起一种复杂的情感:这就完了?
我好像什么都没做,但好像又做完了。
灵魂拷问
然后我问了Claude Code一个问题:
「这个产品,现在是一个完整的、可以拿出去直接给别人接了API就可以用的吗?下载的时候是下载一个文件包吗,不需要额外的任何其他动作了吗?」
答案是:不能。代码写完了,但从没跑过。
我们还没有跑过一次端到端测试,没有验证命令行入口能不能用,没有确认大模型API调用通不通,没有检查图表生成正不正常。
43个文件整整齐齐地排列在文件夹里。但从来没有人按过那个运行键。
行,那就先跑一次试试吧。
Bug大冒险
第一关:连门都进不去
报错。
Claude Code排查后发现,原因低级得有点好笑,命令行工具把我输入的查询文字当成了一个系统指令去匹配。它在指令列表里找不到「四川省2024年旅游数据分析」这条指令,于是直接拒绝执行。
就好像你去餐厅,对服务员说「来一份宫保鸡丁」。服务员说:「对不起,我们菜单上没有'来一份宫保鸡丁'。」你说这不是菜名这是我要点的东西。服务员:「不在菜单上的我不接受。」你说你们菜单上有宫保鸡丁啊。服务员:「但您说的是'来一份宫保鸡丁',这不一样。」
Claude Code的解决办法很朴素,把那个「智能」的命令行工具扔了,改成手动判断用户输入的第一个词。输入setup走配置,输入history看历史,输入其他任何东西都当查询处理。
代码丑吗?丑。能用吗?能。
第二关:一个匪夷所思的连环崩溃
修完上一个,再次运行。这次程序走得远了一些,成功读取了查询,开始调用智谱GLM的API。
然后,崩了。错误信息是一句让人困惑的话:
Invalid port: ':1'
谁的端口号是:1?
Claude Code排查了挺久,最后发现了一条堪称离谱的因果链。Windows系统有个代理配置,里面列着不需要走代理的地址。这个列表里有一项叫::1,是IPv6格式的本机地址,系统自带的,我从来没碰过。结果openai SDK底层的HTTP库在解析这个地址的时候,把最后那个:1识别成了端口号分隔符。:1不是合法端口。崩溃。
触发这个bug需要三个条件同时满足:Python 3.14预览版,Windows 11,以及系统自带的IPv6代理设置。少任何一个都没事。
代码逻辑没有任何问题。但我的开发环境恰好满足了这三个条件,成功触发了一个大概全世界只有我会遇到的bug。
而且这个bug不止影响了大模型调用,DuckDuckGo搜索库底层用的也是同一个HTTP库,同样会崩。等于说这个工具的搜索和分析两条核心通道全部被同一个bug堵死了。
第三关:把大厂SDK扔了
这个崩溃来自openai官方SDK的底层依赖链。可以修,但同样的定时炸弹可能埋在链条的其他地方。
Claude Code提了一个听起来有点疯的方案:把整个openai SDK删了。
理由是我们只用了这个SDK的一个功能,就是往大模型API发一个请求。就一个POST。用requests库,50行代码就能做完。
我同意了。因为我不懂啊!
至于DuckDuckGo搜索库那边,因为没法删它,Claude Code用了一个更土的办法:每次调用搜索前先把系统代理设置临时清掉,搜完再恢复。
第一次跑通,以及大模型编数据
修完这些bug后,工具第一次完整跑通了。查询:「四川省2024年旅游数据分析」。搜索找到了来源,大模型分析了内容,报告生成了,图表也画出来了。
但报告里有一个严重问题:大模型编了数据。
搜索到的四川省具体数字有限。大模型在分析环节直接「脑补」了一份看起来很专业的报告,「旅游总收入5000亿元,同比增长12.3%」「游客人次2.5亿,同比增长10%」。来源呢?写了一个「四川省旅游局」,附了个主页链接。点进去根本找不到这些数字。
5000亿、2.5亿、12.3%、10%,全是大模型自己编的。编得很圆润、很自信、很像那么回事。但就是假的。
这不是代码bug。这是大模型的天性:输入数据不够的时候,它不会说「数据不足,无法分析」。它会很专业地给你一份看起来完美的报告,然后里面的数字全是它发明的。
搜索引擎的问题
四川那次测试暴露了另一个问题:DuckDuckGo搜中文效果有限,找到的来源不多。
我问Claude Code:能不能换个搜索引擎?
Claude Code调研了一圈,Bing的搜索API已经退役了,Google要付费而且中文效果一般,国产的博查搜索API中文效果最好,还有个叫Tavily的有免费额度。我选了「多引擎可切换」方案,用户在配置的时候自己选用哪个。
实现完多引擎支持后,又跑了两次测试。
海南省。成功。搜索质量一般,但报告生成了。
云南省。效果好多了。搜索引擎找到了21个独立来源,其中13个页面成功提取了正文。报告里的核心数据“1.14万亿元旅游总花费、同比增长20.7%”全部可以追溯到云南人大网和省政府官网。
对比很明显:搜索结果质量直接决定报告质量。大模型不是解药,搜索引擎才是。
以为结束了
我以为到这里差不多了。
然后我让CC对全部代码做了一次系统审查。发现了21个问题。其中2个属于「特定条件下直接崩溃」级别。比如大模型API在异常时返回一个空列表,代码直接取第一项,崩了。4个属于「迟早出事」级别。剩下15个中低优先级,但每个都是真实的隐患。
全部修完。然后把代码推到GitHub。
第一次推送:连接超时。
第二次推送:加了个参数后连上了,但SSL证书验证失败。
第三次推送:同时加了三个特殊配置参数,终于成功了。
原因是在国内网络环境下,Git默认用的OpenSSL找不到系统证书链,需要手动切换到Windows原生的加密组件。这种问题在海外完全不存在。
推上去以后,我用「路人」的视角打开GitHub仓库看了一眼。发现了三个问题:README里赫然写着openai这个依赖包,就是被删掉的那个;项目说明里还在介绍几个早就不存在的代码文件;还有一个Claude Code的本地配置文件被意外提交了上去,其他用户完全用不到这个东西。
又改了一轮。又推了一次。
所以做垃圾这件事教了我什么
从「日报周报月报、收费变现」到「免费放GitHub当能力见证」,从「2000行漂亮代码」到「第一次运行连门都进不去」,从「大模型帮你做数据分析」到「大模型帮你编数据」——这个项目每一步都在纠正我的某个幻觉。
先做一个垃圾出来。这句话我之前只理解了字面意思。
做完以后才明白:重点不在「垃圾」,在「做」上面。
商业模式行不行,不做不知道。代码能不能跑,不按运行键不知道。大模型给的数据是真是假,不去核实不知道。IPv6本机地址会不会炸掉程序,这种事你连想都想不到要去想。
这些认知,没有一条是坐在那里空想能学到的。
这个工具现在能用了。它能搜索、能分析、能出报告。虽然很垃圾。但它存在了。
先做一个垃圾出来。我做到了。下一步是让它不那么垃圾。