实战经验

从传统开发到AI开发真的提效了吗?

围绕一个电商后台管理系统的重构案例,对比传统手写代码与AI辅助开发的完整过程。用具体的时间数据、代码片段和踩坑记录,揭示AI辅助开发的真实效率提升点与新增风险。底层分析AI代码生成的机制差异,以及为什么"快"的同时带来了新的维护成本。

我把最后一行AI生成的代码提交到Git。看着测试环境里那个原本需要两周才能上线的后台管理系统,三天就跑通了,我第一反应不是兴奋,而是后背发凉。

这不是什么高科技项目,就是一个标准的电商后台:商品管理、订单处理、用户权限、数据报表。传统开发模式下,这套系统我做了整整一个月。这次,我用了Condex,三天交付。

但事情没那么简单。

AI不是在“理解”代码,而是在“预测”代码

测试发现了一个Bug:商品分类树在刷新页面后,顶层节点的数据丢失了。我查了半小时,发现是AI在生成前端代码时,把useEffect的依赖数组写错了——它漏掉了userId这个变量。

javascript// AI生成的代码(有问题)
useEffect(() => {
  fetchCategories().then(setCategories);
}, [token]); // 漏掉了userId

// 应该是
useEffect(() => {
  fetchCategories(userId).then(setCategories);
}, [token, userId]);

我当时的第一反应是:AI怎么连这种基础错误都会犯?后来我想明白了——AI在生成这段代码时,只看到了函数定义,没有看到完整的组件上下文。它在训练数据里见过无数类似的useEffect,但它不知道这个组件的userId是从哪来的。

这是我第一次意识到,AI辅助开发的根本变化:它不是在"理解"代码,而是在"预测"代码。

效率的提升是真实的

我重新梳理了一遍整个开发过程。传统开发时,我花在第一周的时间主要是:搭项目骨架、配置环境、写重复的CRUD代码、调试前后端联调问题。这些工作AI都能做,而且做得比我还快。

以订单列表页为例。传统开发需要:* 写后端Controller、Service、Mapper,约150行

  • 写前端页面组件、API调用、表格渲染,约200行
  • 联调调试,约2小时

AI辅助开发时:* 我用自然语言描述需求:"生成一个订单列表页,支持分页、搜索、状态筛选"

  • codex在30秒内生成了前后端代码,约350行
  • 我只花了15分钟修改和调试

效率提升了约4倍。 这不是夸张,是我用时间记录器实测的数据。

但效率的提升主要来自哪里?我分析了代码生成的底层逻辑。

传统开发时,我的思维路径是:需求→架构设计→模块划分→编码实现→调试优化。每一个环节都需要我主动思考。

AI辅助开发时,我的思维路径变成了:需求→提示词工程→代码生成→审查修改→集成测试。看起来步骤差不多,但重心发生了转移——我从"写代码的人"变成了"审代码的人"。

这个转变带来的第一个好处是:重复性工作的成本几乎归零。表单验证、API封装、组件样式,这些AI都能秒级生成。我花的时间越来越少。

但第二个坏处也很快显现:我对代码的"肌肉记忆"消失了。

AI 只会复刻范式,不会读懂需求

线上环境出现了一个性能问题:订单列表页在数据量超过10万条时,接口响应时间从200ms飙到8秒。我检查了SQL,发现是AI生成的查询没有加索引。

更离谱的是,AI在生成SQL时,自动加了一个LEFT JOIN,但那个关联表根本不需要。我追根溯源,发现AI在生成这段代码时,参考的训练数据里有一个类似的电商系统,那个系统确实需要LEFT JOIN,但我们的业务场景完全不需要。

sql-- AI生成的SQL(有问题)
SELECT o.*, u.username, c.category_name
FROM orders o
LEFT JOIN users u ON o.user_id = u.id  -- 这个JOIN根本不需要
LEFT JOIN categories c ON o.category_id = c.id
WHERE o.status = ?
ORDER BY o.created_at DESC
LIMIT ? OFFSET ?

我当时的判断是:AI不懂业务逻辑。但深入分析后,我发现更深层的问题:AI的代码生成是基于概率的,而不是基于理解的。 它在训练数据里见过无数类似的SQL查询,它选择LEFT JOIN是因为在统计上这是"常见模式",但它不知道这个模式在我们的业务场景里是多余的。

这让我想起了一个比喻:传统开发像是亲手砌砖,每一块砖的位置、角度、力度都在你的掌控中。AI辅助开发像是让一个经验丰富的包工头给你砌墙,他砌得很快,但他不知道你这堵墙后面要挂多重的画。

更隐蔽的安全漏洞

我在代码审查时发现,AI生成的用户权限校验逻辑有一个漏洞。它生成的代码只校验了token是否有效,但没有校验当前用户是否有权限访问这个资源。

javascript// AI生成的权限校验(有问题)
app.get('/api/orders/:id', async (req, res) => {
  const order = await Order.findById(req.params.id);
  res.json(order); // 没有校验当前用户是否有权访问这个订单
});

// 应该是
app.get('/api/orders/:id', async (req, res) => {
  const order = await Order.findById(req.params.id);
  if (order.userId !== req.user.id && !req.user.isAdmin) {
    return res.status(403).json({ error: '无权访问' });
  }
  res.json(order);
});

我后来想明白,这不是AI的错,而是我的错。我在写提示词时,只说了"生成订单查询接口",没有明确说"需要权限校验"。AI在生成代码时,会根据训练数据里的常见模式自动补充逻辑,但它不知道哪些逻辑是"必须的",哪些是"可选的"。

底层分析:为什么会有这些变化?

我从代码生成的机制层面分析了一下AI辅助开发的本质变化。

传统开发时,代码的生成路径是:人类思维→人类语言→代码。每一个环节都有人类的理解和判断。

AI辅助开发时,代码的生成路径变成了:人类思维→人类语言→AI理解→概率预测→代码。中间多了一个"概率预测"的环节。

这个变化带来的核心差异是:传统开发中,代码的正确性由开发者的理解保证;AI辅助开发中,代码的正确性由开发者的审查保证。

这意味着开发者的角色发生了根本性转变:从"创造者"变成了"编辑者"。

这个转变的好处很明显:重复性工作被自动化,开发速度大幅提升。但坏处也很明显:开发者对代码的"所有权感"减弱了。 当你亲手写每一行代码时,你会对每一行代码负责。但当代码是AI生成的,你更容易产生"这只是AI随便写的,有问题再改"的心态。

这种心态在开发初期是高效的,但在维护阶段会付出代价。

给开发者的建议

如果你准备使用AI辅助开发,我有几条建议:

  • 不要完全信任AI生成的代码。 每一行代码都要理解,都要审查。AI生成的是"草稿",不是"终稿"。
  • 保持对代码的"所有权感"。 即使代码是AI生成的,你也要把它当成自己写的。这意味着你要负责它的每一个Bug,每一次性能问题。
  • 重视提示词工程。 AI生成的代码质量,很大程度上取决于你的提示词质量。清晰、具体的提示词能减少80%的返工。
  • 预留代码重构的时间。 AI生成的代码往往"能跑但难维护"。在项目计划中,一定要预留重构时间。
  • 建立代码审查机制。 即使只有你一个人开发,也要定期review自己的代码。AI生成的代码更容易引入隐蔽的Bug。
登录收藏

评论 (0)

暂无评论,快来发表第一条评论吧