软件开发的第三种方式:当 AI 成为你的结对程序员

2026-05-11 20 预计阅读时间:1 分钟
来源:ruanyifeng.com AI 摘要 原文链接

免责声明:本文为 AI 摘要整理,建议结合原文阅读。摘要可能省略上下文、版本差异或边界条件,不作为官方说明。

预计阅读时间:12 分钟

软件开发的方式正在经历一次范式转移。过去我们熟悉两种路径——手写每一行代码的"工匠模式",和靠流程、测试、CI/CD 保驾护航的"工程化模式"。如今第三种方式正在成型:开发者不再逐行编写代码,而是通过意图描述让 AI 生成实现,人负责审查、修正和决策。这不是"让 AI 替你干活"的幻想,而是已经发生在日常开发中的真实变化。

前两种方式做了什么

第一种方式是个人英雄主义。一个程序员从零写出整个项目,代码质量完全取决于个人水平。速度快的时候很爽,但项目规模一旦膨胀,维护就成了噩梦——没有测试、没有文档、没有自动化保障,只有"这段代码我能看懂"的脆弱信心。

第二种方式是工程化。单元测试、代码审查、持续集成、分支策略、部署流水线……这些实践把软件开发从手艺变成了可重复、可验证的工程。代价是流程变重了,一个功能从想法到上线要经过多层关卡,但好处是系统稳定性大幅提升,团队协作有了共同语言。

两种方式各有适用场景,但它们有一个共同前提:人必须亲手写代码。第三种方式正在动摇这个前提。

第三种方式的日常形态

第三种方式的核心不是"AI 写代码,人不用动脑",而是人与 AI 的分工重新划分

  • 人负责:定义问题、拆解意图、审查输出、处理边界情况、做架构决策
  • AI 负责:根据意图生成代码骨架、填充重复性实现、提供多种方案供选择

日常开发中,这已经不是理论。以下是一个真实的开发场景:你需要给一个 Flask 项目加一个带限流的健康检查接口。传统方式下你要查文档、写代码、写测试、调试。第三种方式下,你先描述意图,再审查和修正 AI 的输出。

实践:用意图驱动的方式完成一个限流健康检查接口

下面是一个完整的可运行示例。先看项目结构:

flask_health/
├── app.py
├── requirements.txt
└── test_app.py

requirements.txt

flask==3.0.0
limiter==1.4
pytest==8.2.0

app.py——一个带限流的健康检查接口,包含手动编写的架构决策和 AI 生成后经审查修正的实现细节:

from flask import Flask, jsonify
from limiter import Limiter
from limiter.util import get_remote_address

app = Flask(__name__)

# 架构决策:限流策略按 IP 地址划分,每分钟 60 次
# 这是人做的决策,AI 不应该替你决定限流阈值
limiter = Limiter(
    key_func=get_remote_address,
    app=app,
    default_limits=["60 per minute"]
)

@app.route("/health")
@limiter.limit("60 per minute")
def health():
    """健康检查接口,返回服务状态和基本运行信息"""
    return jsonify({
        "status": "ok",
        "service": "flask_health",
        "version": "1.0.0"
    })

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000)

test_app.py——测试同样可以由 AI 生成初稿,人审查修正:

import pytest
from app import app

@pytest.fixture
def client():
    app.config["TESTING"] = True
    with app.test_client() as client:
        yield client

def test_health_returns_ok(client):
    """核心断言:健康检查必须返回 status=ok"""
    resp = client.get("/health")
    assert resp.status_code == 200
    data = resp.get_json()
    assert data["status"] == "ok"
    assert "version" in data

def test_health_rate_limit(client):
    """限流测试:超过阈值应返回 429"""
    # 发送 61 次请求,第 61 次应被限流
    for i in range(60):
        resp = client.get("/health")
        assert resp.status_code == 200

    resp = client.get("/health")
    assert resp.status_code == 429

运行测试:

pip install -r requirements.txt
pytest test_app.py -v

启动服务并手动验证:

python app.py
curl http://localhost:5000/health
# 应返回 {"status":"ok","service":"flask_health","version":"1.0.0"}

这个例子虽小,但体现了第三种方式的工作节奏:你决定限流策略和接口语义,AI 帮你快速填充 Flask + Limiter 的组合用法,你审查后修正细节(比如确认 Limiter 的 key_func 参数名、确认 429 状态码是否正确返回),然后写测试验证。

分工的边界在哪里

第三种方式最容易犯的错误是两个极端:

极端一:完全信任 AI 输出。 把生成代码直接粘贴上线,不做审查。AI 生成的代码经常在边界情况上出错——限流阈值不合理、异常路径没处理、依赖版本不兼容。这些错误在审查阶段花十分钟就能发现,上线后排查可能要花半天。

极端二:拒绝使用 AI。 坚持逐行手写,认为"只有自己写的代码才可靠"。这忽略了 AI 在重复性工作上的效率优势。一个熟练开发者手写上面的 Flask + Limiter 组合可能要 20 分钟查文档加调试,而意图描述 + 审查修正可能只要 5 分钟。

合理的分工边界是:架构决策、业务语义、安全相关逻辑由人主导;重复性实现、模板代码、多方案探索由 AI 主导,人审查

一个更贴近日常的命令行场景

不是所有 AI 辅助开发都发生在编辑器里。很多时候你用命令行和 AI 交互来完成运维、调试、数据处理的任务。下面是一个用 shell 脚本 + AI 辅助思路完成日志分析的例子:

假设你有 Nginx 访问日志,想快速统计过去一小时访问量最高的 10 个 IP。传统做法是翻 AWK 语法;第三种方式下,你描述意图让 AI 生成命令,你审查后执行:

# 意图:统计过去一小时 nginx 日志中访问量最高的 10 个 IP
# AI 生成的初版命令(审查后修正了时间过滤逻辑)

# 先确认日志路径和时间格式
head -5 /var/log/nginx/access.log

# 统计过去一小时的 Top 10 IP
awk -v cutoff="$(date -d '1 hour ago' '+%d/%b/%Y:%H:%M:%S')" '
$0 >= cutoff {
    split($1, a, " ")
    count[a[1]]++
}
END {
    for (ip in count) printf "%6d %s\n", count[ip], ip
}
' /var/log/nginx/access.log | sort -rn | head -10

审查要点:cutoff 的日期格式是否和日志中的格式一致?Nginx 日志的时间字段在第几个位置?这些细节 AI 经常搞错,必须人工对照实际日志格式确认。

如果日志格式不同(比如 JSON 格式),改用 jq

# JSON 格式日志的同类统计
jq -c 'select(.time >= "$(date -d '1 hour ago' --iso-8601=seconds)") | .remote_addr' /var/log/nginx/access.json.log \
  | sort | uniq -c | sort -rn | head -10

采用第三种方式的检查清单

在团队中引入第三种方式,不是买一个 AI 工具就完事了。以下是一份实用的检查清单:

检查项 说明
审查流程是否到位 AI 生成的代码必须经过人工审查才能合并,和人工代码走同样的 review 流程
意图描述是否清晰 模糊的意图产生模糊的代码。"加一个接口"不够,"加一个限流 60 次/分钟的 JSON 健康检查接口"才够
测试是否覆盖 AI 输出 AI 生成的代码和手写代码一样需要测试覆盖,不能因为"AI 写的应该没问题"就跳过
边界情况是否人工验证 限流阈值、错误处理、并发场景、安全相关逻辑——这些 AI 经常遗漏的地方必须人工检查
团队是否达成共识 哪些模块允许 AI 辅助、哪些必须手写(比如安全模块、支付逻辑),团队需要明确约定
是否保留人的决策记录 代码注释或 commit message 中记录"为什么这样做"的决策理由,AI 无法替你做这个

第三种方式的真正代价

第三种方式节省了写代码的时间,但审查和决策的时间不会减少,甚至可能增加。因为你需要理解 AI 生成的代码才能审查它,而理解别人写的代码(即使是 AI "写"的)从来都比自己写更费脑。

另一个隐性代价是对 AI 的依赖惯性。长期用 AI 生成代码,开发者对底层 API 和语言细节的熟悉度可能下降。当 AI 输出出错而你缺乏判断力时,调试时间反而更长。保持"能脱离 AI 手写核心逻辑"的能力,是使用第三种方式的安全底线。

第三种方式不是替代前两种,而是在它们基础上增加了一个新维度。工程化实践(测试、CI、代码审查)依然是地基,AI 是加速器。地基不牢的时候加加速器,只会更快地撞墙。


相关推荐