Never let your sense of morals prevent you from doing what is right.

20,489 点击次数

作者: Centro Sun

  • 拒绝 AI 提前制造“屎山”:使用 CodeX CLI 早期开发的 8 条铁律

    拒绝 AI 提前制造“屎山”:使用 CodeX CLI 早期开发的 8 条铁律

    Vibe Coding快满一年了,踩过无数坑,也从坑里爬出过无数回,本着经济高效的理念,我现在使用的IDE收缩至俩,分别是Antigravity和VS Code,VS Code里接入DeepSeek和Codex,基本满足了我当下的需求。

    但蜜月期很快就结束了。

    当项目脱离了 “Hello World” 阶段,进入核心逻辑的快速迭代期时,我发现了一个极其致命的问题:AI 总是过度表现出一种“企业级”的求生欲。它对于“向后兼容”有着近乎偏执的狂热。

    明明是一个还在开发阶段(Phase 0 到 1)、连内测用户都没有的项目,我仅仅是想在数据库表里删掉一个不再需要的字段,CodeX 竟然给我洋洋洒洒写了一个长达百行的 Migration(数据迁移)脚本,甚至还在 API 层加了一个 Fallback(降级)兼容层!

    这简直是在给还在襁褓中的项目直接注入“十年历史遗留问题”的屎山基因。

    如果你也在用 AI 辅助构建新项目,并且不想在项目上线前就被毫无意义的复杂度压垮,请务必在你的 System Prompt 或 Cursor Rules 里,死死钉住以下 8 条架构决策铁律。

    1. 绝不保留向后兼容:过时的代码只有死路一条

    场景痛点: 假设你在写一个基于 Rust 的后端服务,中途发现早期设计的 DeviceConfig 结构体完全错了。你让 AI 去修改结构。AI 的第一反应往往是保留旧的 DeviceConfigV1,创建一个 DeviceConfigV2,然后写一堆 From trait 来做互相转换。

    我的规矩: 在项目未正式发布(或无外部依赖)前,过时的直接删,别加兼容层、别写 Migration、别留 Fallback。 我们不需要像维护一个有上万并发的在线支付系统那样去维护一个开发环境的数据库。如果表结构变了,直接 DROP TABLE 重新建;如果 API 路由变了,直接改名字。

    把时间浪费在为不存在的旧版本用户写兼容代码,是对开发生命力的极大消耗。

    给 AI 的 Prompt 约束: “本项目正处于 MVP 开发阶段,没有历史包袱。遇到废弃的字段、路由或数据结构,请直接进行破坏性删除(Destructive Deletion),严禁编写任何形式的兼容层、Migration 脚本或 Fallback 逻辑。”

    2. 拒绝预防性抽象:只要能跑的最简实现

    场景痛点: 你想加一个从本地读取 JSON 配置文件的功能。如果任由 AI 发挥,它能给你整出一个 ConfigProvider 接口,然后实现一个 LocalJsonConfigProvider,最后再来一个依赖注入工厂。

    我的规矩: 选能满足当前需求的最简单实现。不要预防性抽象,不要多此一举的配置层。 AI 极其喜欢炫技,它阅读了 GitHub 上成千上万的企业级开源项目,导致它认为“高内聚低耦合 = 疯狂加接口”。但在项目的探索期,过早的抽象是万恶之源。如果只需要读取一个文件,直接用标准的 fs::read_to_string 一把梭。等真的有一天你需要从 AWS S3 读取配置时,再去重构提取接口也不迟。

    代码越少,Bug 越少,AI 再次阅读上下文时消耗的 Token 也越少。

    3. 端到端优先:系统是切出来的,不是叠出来的

    场景痛点: 很多新手带着 AI 写代码,喜欢“分层堆叠”:先让 AI 把所有数据库表建好,然后写所有的 ORM 模型,接着写所有的 Service 逻辑,最后再碰前端。结果往往是底层写了 80% 的无用代码,一旦前端需求变了,整个底层都要推倒重来。

    我的规矩: 先跑通一个最小的端到端版本(Vertical Slice),再往上加东西。绝不为了未完成的复杂度,拆掉能跑的东西。 比如做那个网络自动化巡检系统,第一天我就只要求 AI 做一件事:前端点一个按钮 -> 后端接收请求 -> 通过 SSH 连上一台测试机拉取 uptime -> 回传前端显示。 就这一个极简的端到端切片。中间不搞复杂的任务队列,不搞状态机。

    一旦这条线跑通,系统就“活”了。之后你可以往这根线上挂载“定时任务”、“并发控制”、“复杂解析”,但始终要保证系统处于“可运行”状态。

    4. 强制模块化与关注点分离 (Separation of Concerns)

    场景痛点: AI 在生成长代码时,极其容易把业务逻辑、UI 渲染、甚至环境配置揉在同一个文件里。如果你在开发 WASM 前端,它可能会把组件的样式计算和网络请求死死绑定在一起。

    我的规矩: 虽然我们抵制“预防性抽象”,但这不代表我们可以写“面条代码”。组件必须保持模块化,关注点绝对分离。 把数据获取(Fetch)、状态管理(Store/State)和视图渲染(View)分开。当你告诉 CodeX “帮我修改卡片右上角的编辑图标样式”时,它只应该去改 View 层的代码,而不是重新生成一遍包含数据获取逻辑的整个大组件。

    5. 敬畏开源:优先用成熟的、有人维护的库

    场景痛点: 遇到一个稍微复杂的日期时间格式化,或者特定的字符串正则提取,AI 很多时候会“为了展现聪明才智”当场给你手写一个几百行的解析器。

    我的规矩: 没有明确理由,别自己重写。 遇到常见需求,第一时间去搜轮子。处理时间?去用成熟的包;做反向代理?直接挂 Nginx,别让 AI 在代码里手撸一个 HTTP 代理分发;做进程监控?系统级服务直接上 Systemd,容器级挂 Docker 重启策略,甚至直接用 fail2ban 搞定安全拦截,别在业务代码里写一堆轮询脚本。

    相信世界上最聪明的那拨开源维护者,不要相信 AI 临时在一秒钟内生成的正则。

    6. 榨干现有依赖:别动不动就引入新包

    场景痛点: AI 经常有“依赖饥渴症”。项目里明明已经有了 reqwest,它非要为了发一个简单的 HTTP 请求再让你装一个轻量级的包;明明 tokio 已经提供了定时器,它非要让你引入一个专门的 Cron 包。

    我的规矩: 先翻项目里已有的依赖能做什么,再考虑加新包或自己写。别上来就假设库里没有。 每次引入一个新的包,不仅增加了编译时间(比如在做 Rust 到 WASM 的编译时,LTO 优化的时间极其宝贵),还会增加安全漏洞的攻击面。在给 AI 发出指令前,我通常会附上一句:“检查 Cargo.toml / package.json,仅使用现有依赖完成此功能。”

    7. 架构决策往长了做:拒绝“临时凑合”

    场景痛点: “老板催得紧,这里的数据我们先写死在一个 JSON 文件里吧,以后有空再上数据库。” AI 也很乐意配合你这种短视行为,甚至会为你写一套非常精密的 JSON 文件读写互斥锁。

    我的规矩: 不接受”先这样以后再换”的临时方案。 经验告诉我们,IT 运维系统里的“临时方案”,往往最后都会变成运行了 5 年的“核心基础设施”。如果你知道这个功能最终需要落库查询(比如需要复杂的关系联表、资产树状层级),哪怕现在只有 10 条测试数据,也必须立刻上 SQLite 甚至 PostgreSQL,并搭建好基础的连接池。

    如果一开始的架构方向妥协了,后期迁移数据的痛苦,会让你想要把当初敲下这段代码的键盘砸碎。

    8. 别从零发明:抄成熟产品的作业

    场景痛点: 你需要设计一套 IP 地址管理系统(IPAM)或者设备机柜视图。AI 顺着你的思路,天马行空地设计了一套前所未有的、极其复杂的坐标系数据结构。

    我的规矩: 先看成熟产品怎么解决同一个问题,用已验证的模式。 在这个行业,几乎没有什么是没被人做过的。如果你在做网络自动化系统,不要让 AI 瞎编数据结构,直接告诉它:“去参考 NetBox 的核心数据架构,模仿它对 Site, Rack, Device 的层级抽象定义。” 如果你在做 ITSS 运维管理系统,就直接参考 iTop 的 CMDB 理念。

    站在巨人的肩膀上,然后让 AI 帮你把巨人的思想转化为代码,这才是驾驭 AI 的正确姿势。

    以上要点,汇总到你的AGENTS.md就是:

    注意!

    • 以下提示词仅适用于开发阶段的项目,切勿用于生产环境!
    • 如果你仍在迭代的项目需要频繁的进行数据库开发,第一条中的“别写migration”可以删除。
    1、不保留向后兼容。过时的直接删,别加兼容层、别写migration、别留fallback。
    2、选能满足当前需求的最简单实现。不要预防性抽象,不要多此一举的配置层。
    3、系统分层长。先跑通一个最小的端到端版本,再往上加东西。绝不为了未完成的复杂度拆掉能跑的东西。
    4、组件保持模块化,关注点分离。
    5、优先用成熟的、有人维护的库。没有明确理由别自己重写。
    6、先翻项目里已有的依赖能做什么,再考虑加新包或自己写。别上来就假设库里没有。
    7、架构决策往长了做。不接受"先这样以后再换"的临时方案。
    8、先看成熟产品怎么解决同一个问题,用已验证的模式,别从零发明。

    总结

    AI 是一个阅读过万卷代码,但没有任何真实项目挨骂经验的“超级初级程序员”。它极其勤奋,懂得所有的设计模式,但完全不懂业务的妥协与演进节奏。

    在 AI 编码时代,程序员的核心竞争力不再是写出无 Bug 的循环语句,而是“品味”“决断力”。我们必须像一个严厉的 Tech Lead,拿着戒尺,随时敲打试图制造屎山的 AI,逼迫它写出克制、精准、能打硬仗的代码。

    你对 AI 编码工具的态度是怎样的?欢迎在评论区分享你被 AI “坑”过的实战经历。

  • 继续优化和美化我的网站

    继续优化和美化我的网站

    今天做了比较大的更新。

    主要有页面顶部的阅读进度条、鼠标单击事件和标签页文本替换。

    另外,还增加了四个工具,入口放在首页,基本是我自己平日会用到的,大家如果对这些工具有什么建议可以跟我说,我会继续优化。

    嗯,就这样吧,简简单单。

  • 实况足球2018出现0xc000007b错误怎么解决

    实况足球2018出现0xc000007b错误怎么解决

    最近优化系统,用Autoruns清理了一些drivers里已经卸载的软件的sys文件,然后我那用了8年的从买到手就一直用的Windows 10一步步升级而来的Windows 11 25H2进不了系统了,也试过用PE来尝试修复,没想到在PE里运行Autoruns反而会破坏注册表,在一阵慌乱的操作之后,我放弃了,直接重装吧。

    好在平日做足了备份,D盘有软件,F盘有配置文件。

    重装之后我这Intel 7代的CPU总算感受到运行Windows 11也可以快起来了。

    一路升级而来,装过太多的软件,也卸载过不少,在系统正常的时候开机时间需要6分钟,所以我才打算用Autoruns优化一下的,这也算是一个契机吧,总算做了以前一直想做但没做的事情,全新的重装一遍系统。

    经过几天的奋战,基本上所有的软件都恢复如初了。

    接下来进入正题,除了Steam以外的单机游戏,出问题啦。

    存在问题的游戏正是标题所示的大名鼎鼎的实况足球 PES 2018。

    作为一名资深的实况足球游戏佬,是无论如何不能接受钟爱的实况足球无法运行在当下最新的系统之上的。是的,我既要、又要!哈哈!

    首次运行时的报错我记不清了,反正装完那一堆的vc++的运行环境就搞定了。

    接下来是最难搞的0xc000007b错误

    先上搜索吧,百度、必应挨个搜,确定了实况足球 2018运行的环境:

    我的PES 2018是WECN 2.1绿色版

    • .Net Frameworks 4.5或以上
    • DirectX 9

    都装上,还是不行。

    接下来我又去谷歌找,在YouTube上找到一个老哥的视频,讲解怎么解决这个错误的。

    前面说的我都做了,跟他一样,都不行。

    关键的来了,你说巧不巧,他用上了SysinternalsSuite里的Procmon,咱这套工具也是居家必备啊,直接上手。

    按照老哥的方法用Procmon进行分析,最终定位到的错误现象一致,然后就是按照老哥的方法,删除两个文件夹里的XINPUT1_3.dll,然后运行web版的DirectX安装程序,这个文件又回到了刚才的两个文件夹。

    再次尝试,挚爱的实况足球就又回来啦!哈哈!

    遇到这个问题的小伙伴就去看这个视频吧,一定能帮你解决问题!

  • Cherry Studio更新慢了,Lobe-chat活力依旧

    Cherry Studio更新慢了,Lobe-chat活力依旧

    这Cherry Studio,自从前段时间开始商业化之后更新就慢了呀。

    还是Lobe-chat爽啊,Beta分支一天更新好几个版本。

    现在的Lobe-chat-database版已经稳定运行数月,基于Docker部署,综合来说还是比较满意的,缺点也是有点的,目前总结下来有以下两点:

    • 修改嵌入模型之后(在自己选择的大模型提供商中增加嵌入模型),之前在环境变量中指定的嵌入模型就失效了,知识库里如果想向量化文档就会各种失败了。解决方法似乎是只能是重新部署一遍。
    • 另一个问题就是web版的lobe-chat不支持用STDIO模式的MCP就很痛苦了。基于Streamable HTTP的MCP不如STDIO的多,尤其是那些常用的,比如ChromeDevTools。
    • 还有一个问题就是token量一大的时候,页面就有些卡了,这个似乎也没办法。

    综合下来,lobe-chat还是比较适合日常用的,Cherry Studio目前基本上就是吃土的状态了,除非要用某些MCP调试网页的时候才会打开了。

  • ChromeDevTools路径问题修改

    ChromeDevTools路径问题修改

    抛开在改版时ChromeDevTools的无效帮助不说,这东西还是很有用的。

    但如果你的Chrome不是安装在默认的C盘路径下,就会无法调用这个MCP,怎么办呢?很简单,加参数:

    -e="D:\Program Files\Chrome\Application\chrome.exe"

    完整版json如下:

    {
      "mcpServers": {
        "chrome-devtools": {
          "command": "npx",
          "args": [
            "chrome-devtools-mcp@latest",
            "-e=\"D:\\Program Files\\Chrome\\Application\\chrome.exe\""
          ]
        }
      }
    }

    另外遇到的一个问题是版本的变化有可能会重置参数哦。

    昨天ChromeDevTools的版本是0.6,今天一来就是0.8了,开始没注意,又跟昨天一样调用失败了,于是去CherryStudio里看了一眼,原来是参数没了,重新加上就可以了。

    所以需要用这个MCP的小伙伴记得妥善保存好这个参数哦,并且时刻关注GitHub上的release log,说不定后面的版本会修复,这个参数就不再需要了。

    有用的话记得回来评论感谢我哦!