写点什么

我用大模型砌“屎山雕花”:5 天肝出几万行代码!产品经理的 AI 编程翻车记

  • 2025-07-02
    北京
  • 本文字数:7269 字

    阅读完需:约 24 分钟

我用大模型砌“屎山雕花”:5天肝出几万行代码!产品经理的AI编程翻车记

作者 | 松子(李博源)


五天,两万多行代码,重构三次。


我,一个基本不懂技术的产品经理,竟然用大模型"雕刻"出了一套看似能跑的房子。说实话,当我看着屏幕上密密麻麻的代码时,心情挺复杂的。



从 MCP 开始的“万能车床”


我先来讲讲最初接触 MCP 技术的经历。


为了解决工具接入能力不足的问题,Anthropic 公司推出了类似 MCP(Model Context Protocol)的协议,定义了应用程序和 AI 模型之间交换上下文信息的方式。这使得开发者能够以一致的方式将各种数据源、工具和功能连接到 AI 模型。可以把 MCP 想象成大模型的 USB 接口。



MCP 功能出现后,春节无聊的我抱着试试看的心态搭建了两个应用——百度搜索、股票搜索与分析。将股票封装了一套 web 服务并通过 mcp 调用。


Sample1 :百度搜索服务接口定义示例 { “name”: “baidu_search”, “description”: “使用百度搜索 API 获取网络信息”, “functions”: [ { “name”: “search”, “description”: “根据关键词执行百度搜索”, “parameters”: { “type”: “object”, “properties”: { “query”: { “type”: “string”, “description”: “搜索关键词” }, “limit”: { “type”: “number”, “description”: “返回结果数量上限” } }, “required”: [“query”] } } ] } `


Sample 2 股票分析:当分析师提出"帮我分析最近三个月电动汽车行业的销售趋势"这样的请求时,MCP 协议使 AI 能够自动发现并调用这些服务。


提示词:


调用百度搜索完成一个 2024 年 Q4 的国内手机出货调研分析报告,并做一个可视化分析专题,将结果用 html 保存到本地文件 download/mcp 目录下面,命名为手机出货量分析。





过程中,自己也没想到没想到,这一试就停不下来了。那种感觉,就像是突然获得了超能力。以前需要"确定产品逻辑 -> 设计 -> 研发"的漫长流程,现在变成了:


  • 把想法告诉 AI

  • AI 直接产出高保真的交互原型

  • 甚至是功能完备的产品 demo


原本需要几周等待的工作,几个小时就能搞定。瞬间感觉当一个产品经理掌握了大模型中高层次技能,确实有种"超蓝变身"的感觉。


深入"屎山":两万行代码的诞生


有了第一次成功的经验后,我开始更大胆的尝试。在短时间内,我用大模型构建了一个某知识库应用可运行 demo ,就是在这种背景下诞生的。


Python 文件 193 个,共 31278 行代码;JavaScript 文件 96 个,共 9731 行;HTML 文件 136 个,共 23024 行,17 个智能体 …


看着这些数字,连我自己都震惊了。


一个从来没碰过代码的人,竟然能在 5 天内"写"出这么多代码?



到 5 月份的今天我已经用该能力完成了 3 个“屎山”演示的构建 。但问题是:这真的是"编程"吗?



PS: 这个是我写的几千行提示词其中的三句与根目录项目的控制文件


AI 编程的甜蜜陷阱


门槛降低了,但天花板更高了


刚开始,我以为 AI 编程就是"自然语言编程"。想要什么功能,直接告诉 AI 就行。


结果发现,这 TM 是个巨大的误解。


当代码量超过几千行时,你会遇到这些问题:


架构选择的困境:前端用 Vue、React 还是纯 CLI?后端选 Go、Python 还是 Rust?数据库用 MySQL 还是 PostgreSQL?


对于我这种非工程师背景的人来说,这些选择就像是在外语考试中选择 ABCD,完全靠蒙。


有次我问 AI:“用什么数据库比较好?”


AI 回答得很专业:MySQL 适合简单应用,PostgreSQL 功能更强大,Redis 适合缓存…


但它不会告诉我:你这个应用根本用不着复杂的数据库功能,SQLite 就够了。


版本管理的缺失:大部分人都在"Vibe Coding"——凭感觉写代码,但不做版本管理。就好像在深山老林里瞎转悠,不留回头路的标记。


我就是典型的反面教材。写到 1/3 重构了四次,另外过程中突然想改架构,直接就在原文件上改。结果改着改着,连自己都不知道哪些功能还能用。


等代码写到一半发现方向错了,想回滚?对不起,没路了。AI 告诉我一大堆东西,我回复了一句话:我不懂技术不知道如何改…


安全性的盲区:AI 联网后,投毒者可能通过各种方式污染生成结果。缺少 Code Review 的代码,安全性就有天然缺口。


我后来用大模型检查代码时发现,AI 生成的 API 调用居然把敏感信息以明文方式传输 。


还有其他很多,感觉就是坐在“屎山上雕刻”。哈哈,这个比喻很形象。


从"能跑"到"能用"的巨大鸿沟


更扎心的是,当你兴冲冲地写完几万行代码后,发现:


  • 70% 的功能是重复的(不同页面写了相似逻辑)

  • 性能问题一大堆(数据库查询效率低下)

  • 用户体验惨不忍睹(界面逻辑混乱)

  • 维护成本极高(找个 bug 要翻好几千行代码)


这就是"屎山"的本质:看起来很宏伟,实际上摇摇欲坠。


比如我做的某个搜索功能,AI 很贴心地为每个搜索请求都创建了新的数据库连接。结果并发一高,服务器直接爆了。


还有个更离谱的:AI 为了实现"智能推荐",把所有数据都加载到内存里进行计算。1000 条数据没问题,10000 条数据就卡死了。


调试成了最大的噩梦


写代码容易,调试难。


当你的应用出现 bug 时,你面临的不是一个错误,而是一连串连锁反应:


  • 前端报错:“Cannot read property of undefined”

  • 后端日志:“Database connection timeout”

  • 用户反馈:“页面白屏了”


作为一个不懂技术的产品经理,我的调试过程基本上是这样的:


  • 把错误信息复制给 AI

  • AI 给出一个"可能的解决方案"

  • 照搬 AI 的代码

  • 告诉 AI 说我不懂代码,你直接给我修改。

  • 引发新的 bug

  • 回到步骤 1


最长的一次调试,我花了整整一天时间,就为了修复一个表单提交的问题。


还有个更离谱的,为了修改几个 bug 2 天的 token 消耗了 xxx, 我看完 emo 了。



ps: 这是我调试 bug 的内容


我看到后台 log 有返回数据了(这是之前 bug:有一个报错, 就是在智能问答中,发去了消息成功(不管开关是否使用知识库都是同样问题),但是智能问答页面上的智能小助手还是… 没有正确把这个结果在前端显示。)


:127.0.0.1 - - [01/Apr/2025 09:27:06] "POST /smart-qa/ask/stream HTTP/1.1" 200 - 2025-04-01 09:27:07,020 [WARNING] app.services.stream_parser: 未知事件类型: message_end, 数据: {'event': 'message_end', 'conversation_id': 'ffdb0ce0-84a9-4647-a31c-811d2915825a', 'message_id': 'a0da8019-48cc-46e4-8438-2b8e5811706f', 'created_at': 1743470825, 'task_id': '1eb185a0-74f2-4359-b339-6b83fc2a89e1', 'id': 'a0da8019-48cc-46e4-8438-2b8e5811706f', 'metadata': {'retriever_resources': [{'dataset_id'.=
复制代码


坐在屎山雕刻了“三朵花”的顿悟


第一次重构:发现架构的重要性


第一版代码写完后,我发现前后端耦合得一塌糊涂。一个简单的功能修改,需要同时改动十几个文件。


更要命的是,我根本不知道哪些文件之间有依赖关系。


有次想调整一个按钮的颜色,结果把整个用户管理模块搞崩了。后来才发现,那个 CSS 文件居然还控制着数据表格的样式。


这时我才意识到:AI 具备的是执行能力,不是架构思维。


它可以帮你写出符合语法的代码,但不知道什么时候该分层,什么时候该解耦。


第二次重构:学会与 AI 协作


吸取教训后,我开始尝试更科学的方法:


从高层到低层逐步提示:先描述整体目标,再细化到数据模型、API 设计,最后才是具体实现。


比如我会先说:“我要做一个知识库系统,支持文档上传、搜索、分类”,然后再具体到"用户表需要哪些字段"、“搜索接口怎么设计”。


先写测试用例:明确预期功能,让 AI 根据失败的测试生成代码。这比用自然语言描述需求靠谱多了。


说实话,写测试用例对我这种产品经理来说也是个挑战。但逼着自己写,确实能把需求想得更清楚。


制定规则文件:为项目创建编码规范,包含使用的库、命名规则、架构模式。


我的规则文件长这样:


  • 前端统一用 Vue 3 + Element Plus

  • 后端统一用 Python Flask

  • 数据库字段命名用下划线分隔

  • API 响应格式统一用 JSON

  • 错误处理统一返回 error_code 和 message


使用工作空间:把前后端代码放在同一个环境里,让 AI 理解全貌。


这个真的很重要。AI 能看到整个项目结构后,生成的代码一致性明显提高了。


第三次重构:接受"屎山"的现实


第三次重构时,我终于想通了一个问题:


也许"屎山"就是 AI 编程的必经之路。


为什么这么说?


四、"屎山"存在的合理性


快速试错的价值


传统开发流程下,一个 feature 从需求到上线,至少需要 2-4 周。而 AI 编程可以让你在 2-4 小时内看到可运行的原型。


哪怕是"屎山",也能让你快速验证想法、收集反馈、调整方向。


在产品早期,这种快速迭代的价值远大于代码质量。


我用 AI 做的第一个搜索功能,虽然性能一塌糊涂,但至少让我确定了用户确实需要这个功能。如果按传统流程,光是写需求文档就得一周。


学习成本的权衡


对于非技术背景的产品经理来说,学会使用 AI 编程的成本,远低于学会传统编程。


即使生成的是"屎山",也比完全不会编程要强。


至少你能:


  • 快速验证产品想法

  • 和技术团队更好地沟通

  • 理解技术实现的复杂度


现在我和开发同学讨论需求时,再也不会说出"这个功能很简单,加个按钮就行"这种话了。


渐进式优化的可能


"屎山"不是终点,而是起点。


有了可运行的原型后,你可以:


  • 找专业开发者进行代码 review

  • 逐步重构核心模块

  • 基于用户反馈确定优化重点


这比从零开始要高效得多。


而且,很多时候"屎山"的存在本身就是价值。它证明了这个想法是可行的,只是实现得不够优雅而已。


五、那些踩过的坑


过度依赖 AI 的判断


刚开始用 AI 编程时,我几乎把所有决策都交给了 AI。


AI 说用 Redis 做缓存,我就用 Redis;AI 说需要微服务架构,我就拆分服务。


结果搞出了一个 over-engineering 的怪物:为了实现一个简单的 CRUD 操作,竟然用了 6 个不同的服务。


后来我意识到,AI 的建议往往是"理论上最佳",但不一定适合你的具体场景。


忽视性能和安全


AI 生成的代码在功能上通常没问题,但在性能和安全方面经常有坑。


比如我发现 AI 特别喜欢用嵌套循环解决问题,N²的时间复杂度张口就来。还有就是对用户输入基本不做验证,SQL 注入的风险很高。


这些问题,如果没有专业知识,很难发现。


代码复用率极低


AI 每次生成代码时,都倾向于写"完整"的解决方案,很少复用已有代码。


结果就是同样的逻辑在项目里出现 N 遍,每遍还略有不同。改个公共功能,要改十几个地方。


AI 编程的正确姿势


混合使用不同 AI 模型


经过这次折腾,我总结出一套相对靠谱的方法:


  • 某模型用于规划功能和架构设计

  • 某模型快速生成代码实现

  • 某模型处理复杂的逻辑问题


PS(某模型请对着自行对号入座,2333)


每个模型都有自己的长处,组合使用效果更好。


遵循软件工程基本原则


AI 再强,也改变不了软件工程的基本规律:


  • 模块化设计:将复杂问题拆分成小块

  • 关注点分离:UI 逻辑和业务逻辑分开

  • 版本控制:每个阶段都要有回滚能力


这些原则,AI 不会主动提醒你,需要人来把控。


我现在的习惯是:每实现一个功能,就提交一次代码。出问题了至少能回到上个稳定版本。


理性看待"屎山"的价值


说到底,"屎山"只是一个过程,不是目标。


关键是要明确你的预期:


  • 如果是验证想法的 MVP,"屎山"完全可以接受

  • 如果是要长期维护的产品,就需要专业团队介入

  • 如果是学习技术的工具,"屎山"反而是很好的教材


客户沟通的新姿势


从"纸上谈兵"到现场演示


最让我兴奋的是,AI 编程彻底改变了我和客户的沟通方式。


以前的流程是这样的:


  • 和客户开会,听需求

  • 回去写 PRD,画原型图

  • 再约客户确认需求

  • 技术评估,出设计稿

  • 再和客户沟通修改意见


现在?完全不一样了。


上周和某电商客户的会议就是个典型例子:


客户说想要一个智能客服系统,能自动回答用户问题,还要支持多轮对话。


以前我只能拿着纸笔记录,然后说"我们回去研究下技术方案"。


现在我直接说:“您稍等,我现在就给您做一个 demo。”


然后当场用 AI 写了个简单的客服界面:


  • 前端用 Vue + Element Plus,界面很酷炫

  • 后端调用 GPT API,实现智能对话

  • 加了几个预设的 FAQ,看起来很专业


半小时后,一个能跑的客服 demo 就出来了。客户当场就能体验,输入问题,AI 回答,多轮对话,样样都有。


客户的反应?


“哇,这个界面不错,但是能不能把这个按钮换个颜色?” “回答的语气能不能更亲切一点?” “能不能加个转人工的功能?”


你看,这才是真正的需求沟通。不是你想象客户要什么,而是客户真正用了之后告诉你要什么。


掌握的几个"装逼"技巧


经过这几个月的摸索,我总结出几个屡试不爽的客户沟通技巧:


技巧一:现场造轮子


客户说需求时,我会边听边在电脑上敲代码。看起来像在记录,实际上是在用 AI 快速搭建原型。


等客户说完,我的 demo 基本也做好了。


关键是要掌握好节奏:太快了显得不真实,太慢了失去惊喜感。我一般控制在 15-30 分钟。


技巧二:从小功能开始


不要一上来就做复杂系统,先从一个小功能入手。比如智能客服,我先做个简单的问答界面,让客户看到 AI 能回答问题。


然后根据客户反应,逐步加功能:多轮对话、知识库检索、转人工…


这样客户能看到整个产品是如何"生长"出来的。


技巧三:预埋几个"彩蛋"


在 demo 里提前准备几个小惊喜。比如客户问到某个功能时,我会说"巧了,我刚好做了这个",然后展示一个看起来很复杂的功能。


实际上这些功能可能就是几行代码调用个 API,但视觉效果很震撼。


技巧四:让客户参与


最重要的是让客户觉得这个产品是"我们一起"设计的。


“您觉得这个按钮放哪里比较好?” “您希望这个颜色更深一点还是浅一点?” “这个功能的名字您觉得叫什么比较合适?”


然后现场修改,让客户看到自己的想法立即变成现实。


这种参与感是传统 PPT 和原型图永远无法提供的。


我的产品原型矩阵


经过最近几个月的折腾,我已经用 AI 构建了好几个产品的可运行原型:


  • 智能客服系统:支持多轮对话,FAQ 自动匹配

  • 文档知识库:内容类几个垂直领域的文档模版与结构自动分割、自动解析,智能搜索和问答

  • 数据分析平台:各类文档导入,自动提取数据并做分析,自动生成图表和分析报告以及工程项目相关风险。

  • 会议纪要助手:语音转文字,自动提取关键信息,与流程集成

  • 内容审核工具:文本合规检查,敏感信息识别


以及合同审核与风险分析等…


当然了,每个原型都不算完美,但都能跑,都能让客户直观地感受到产品的价值。最关键的是,这些原型让我在客户面前的话语权完全不一样了。


以前客户会质疑:"你们真的能做出来吗?"现在客户会说:"这个功能不错,但我还想要…"从质疑能力,到讨论需求,这是质的飞跃。


AI 编程改变了什么


产品经理的能力边界


以前产品经理的工作止步于 PRD,现在可以直接做出可交互的原型。


这种变化不只是效率提升,更是思维方式的转变。当你能快速实现想法时,你会更大胆地去试错。


团队协作方式


有了 AI 编程能力后,我和技术团队的沟通方式完全变了。


以前:


  • 我:这个功能能做吗?

  • 技术:应该可以,但需要评估下

  • 我:大概多长时间?

  • 技术:暂时不好说,先调研下


现在:


  • 我:我做了个原型,你看看技术实现有什么问题

  • 技术:整体思路没问题,但这里的性能需要优化

  • 我:好的,我先改改,你再看看


效率提升不是一点点。


对技术的理解深度


虽然写出的是"屎山",但这个过程让我对技术有了更深的理解。


现在看技术方案时,我能大概判断实现的复杂度,也能理解为什么某些需求"看起来简单,做起来复杂"。


意外的商业价值


说个更实在的:这种能力直接提升了我的商业价值。


以前和客户谈项目,我需要带着技术同事,还要准备各种材料。现在我一个人就能搞定前期的需求确认和 demo 演示。


客户签约率明显提升了。不是因为我的销售能力变强了,而是因为客户能直观地看到产品的效果。


"眼见为实"这四个字,在 ToB 销售中太重要了。


最近有个客户直接说:“你们这个 demo 做得不错,我们想直接基于这个原型来开发。”


当然,我很诚实地告诉他这只是个原型,真正的产品开发还需要专业团队。但至少,我们拿到了这个项目。


从"屎山"到"产品矩阵"


现在回头看,那些被我称为"屎山"的代码,其实构成了我的产品能力矩阵。


每个原型都像是一个"技能点",让我能够快速应对不同类型的客户需求:


  • 需要智能客服的,我有现成的 demo

  • 需要数据分析的,我能现场做个图表

  • 需要文档处理的,我有知识库原型

  • 需要工作流的,我有审批系统模板


这些原型的技术质量可能不高,但组合起来的威力很大。


就像游戏里的技能树,单个技能可能很普通,但全部点满后就是另一个维度的存在。


写在最后


这段时间的 AI 编程经历,让我对技术有了全新的认知。


以前总觉得编程是工程师的专利,现在发现:在 AI 时代,编程正在成为一种新的表达方式。


就像当年的 PS 让设计门槛降低,AI 正在让编程门槛降低。


虽然我写出的是"屎山",但这座"屎山"让我:


  • 理解了产品实现的复杂度

  • 学会了和 AI 协作的方式

  • 获得了快速原型的能力

  • 对技术有了更深的敬畏


更重要的是,它改变了我对产品开发的思维方式。


现在的产品经理,如果还停留在"写 PRD 交给研发"的模式,很可能会被时代抛弃。


未来的产品经理 = 产品经理 + 设计师 + 初级开发者。


而 AI,就是那个让这种融合成为可能的工具。


当然,这不意味着产品经理要替代工程师。专业的事情还是需要专业的人来做。


但至少,我们可以在"想法"和"实现"之间,建立一座更短的桥梁。


至于"屎山"?能跑就行。反正后面还有重构的机会。


而且说不定,过几年 AI 进步了,连重构都不用人操心了。


(这篇文章的观点可能仅从非技术角度阐述,但当下的折腾是最真实的。如果你也想尝试 AI 编程,建议先从小项目开始。别像我一样,一上来就奔着几万行代码去。)


该如何从屎山上下呢?请听下回分解。


后记:写完这篇文章,我突然想起一个问题:当 AI 能生成完美代码的那一天,"屎山"还会存在吗?也许不会,但至少现在,"屎山"是我们通向未来的必经之路。


有感兴趣的可以进一步交流。


作者简介:


松子(李博源),BI& 数据产品老兵一枚,漂过几个大厂,23 年开始在 AI 大模型领域创业,现某厂 AI 及产品副总经理。


今日好文推荐


手撕900万行屎山代码、少干28万小时!AI 编程大刀挥向“古老”编程语言


18天光速打脸!OpenAI刚夸TypeScript最合适,转头就用Rust重写Codex CLI


“不用 Cursor和 ChatGPT、手写代码的开发者,怕不是疯了?”


谷歌突袭发布AI应用,无需Wi-Fi、手机就能跑大模型!网友实测两极分化


活动推荐


6 月 27~28 日的 AICon 北京站将继续聚焦 AI 技术的前沿突破与产业落地,围绕 AI Agent 构建、多模态应用、大模型推理性能优化、数据智能实践、AI 产品创新等热门议题,深入探讨技术与应用融合的最新趋势。欢迎持续关注,和我们一起探索 AI 应用的无限可能!



2025-07-02 12:191

评论

发布
暂无评论

流媒体协议之WebRTC实现p2p视频通话(二),kotlin数组转集合

android 程序员 移动开发

深入探索 Android 网络优化(二、网络优化基础篇,移动开发框架

android 程序员 移动开发

深入浅出,Andorid 端屏幕采集技术实践,附大厂真题面经

android 程序员 移动开发

热修复——Tinker的集成与使用,android系统工程师面试题

android 程序员 移动开发

毕业3年,我是如何从年薪10W的拖拽工程师成为30W资深Android开发者!(1)

android 程序员 移动开发

注意!关于怎么理解 onStart可见但不可交互,程序员千万不要小瞧了这个问题

android 程序员 移动开发

深入学习-Gradle-自动化构建技术(五)Gradle-插件架构实现原理剖析-

android 程序员 移动开发

深入浅出:MVVM+ViewBinding,互联网寒冬公司倒闭后

android 程序员 移动开发

炸裂!万字长文拿下HTTP 我在鹅厂等你!(1),html5移动开发框架

android 程序员 移动开发

炸裂!万字长文拿下HTTP 我在鹅厂等你!,入职阿里啦

android 程序员 移动开发

深入探索 Android 内存优化(炼狱级别-上)(1),2021年最新Android面试点梳理

android 程序员 移动开发

深入理解 RecyclerView 的绘制流程和滑动原理,android应用开发教程答案

android 程序员 移动开发

滴滴DoKit Android核心原理揭秘之函数耗时,android组件化

android 程序员 移动开发

深入探索编译插桩技术(三、解密 JVM 字节码,都是精髓

android 程序员 移动开发

毕业6年,技术人的不惑之路,移动app开发工具

android 程序员 移动开发

深入RecyclerView学习—缓存机制,kotlin带参数的单例模式

android 程序员 移动开发

深入探索 Android 内存优化(炼狱级别-上),安卓消息分发机制

android 程序员 移动开发

深入理解Flutter动画原理,安卓framework

android 程序员 移动开发

热修复设计之热修复原理(三),kotlin后端框架

android 程序员 移动开发

浅谈ConcurrentHashMap,android游戏开发大全第二版代码

android 程序员 移动开发

深入Android系统 Binder-2-使用,阿里P7亲自讲解

android 程序员 移动开发

深入浅出,Andorid 端屏幕采集技术实践(1),android面试题整理最新

android 程序员 移动开发

温故知新:深入理解Android插件化技术,Android高级插件化强化实战

android 程序员 移动开发

求职注意事项:Android面试中不可犯的这些“九大失误,Android常用面试

android 程序员 移动开发

没有对象怎么面向对象编程呢?真让人头秃!,sharedpreferences跨进程

android 程序员 移动开发

浅析NestedScrolling嵌套滑动机制之实践篇-仿写饿了么商家详情页

android 程序员 移动开发

深入解析Android的StateListDrawable,【工作感悟】

android 程序员 移动开发

熟悉Android打包编译的流程,超硬核

android 程序员 移动开发

毕业3年,我是如何从年薪10W的拖拽工程师成为30W资深Android开发者!

android 程序员 移动开发

浅谈Android网络通信的前世今生--网络基础,深度剖析原理

android 程序员 移动开发

深入Flutter TextField,android开发流程图

android 程序员 移动开发

我用大模型砌“屎山雕花”:5天肝出几万行代码!产品经理的AI编程翻车记_生成式 AI_松子(李博源)_InfoQ精选文章