ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

AI编程智能体能否构建可维护软件?从代码质量到工程实践

AI编程智能体能否构建可维护软件?从代码质量到工程实践 这次我们不聊某个能出图的模型也不聊某个本地推理框架更不聊某个一键启动包。这次的问题更底层一点AI 编程智能体现在已经能写代码、能改代码、能跑测试、能读文档但它写出来的东西到底能不能被长期维护这个问题的现实意义非常大。过去两年GitHub Copilot、Cursor、Claude Code、Codex以及国内的通义灵码、文心快码这类 AI 编程智能体已经大面积进入日常开发。很多团队发现AI 把写出能跑的代码的门槛拉得很低但写出能维护的代码这件事并没有因为代码生成速度变快而自动解决。甚至可以说代码生成越容易代码腐烂的速度就越快。原因很简单维护成本从来不是看代码怎么来的而是看代码的结构、测试、文档和变更日志有多清晰。一个能用但改不动、测不了、看不懂的模块在工程上就是负资产。这篇文章不讲抽象概念直接拆成可以执行的内容。第一把可维护软件定义成可测量、可判断的标准第二梳理 AI 编程智能体在需求、设计、编码、测试、评审、运维这条完整链路里的真实能力边界第三给出一套可落地的验证实验用圈复杂度、测试覆盖率、重复代码率这些指标量化对比 AI 生成的代码和人工编写的代码第四补充接口 API 调用、批量任务、资源成本观察、常见问题和工程最佳实践。想直接看结论的可以跳到最后两节。先给读者画像。这篇文章适合正在评估要不要让 AI 编程智能体进入生产项目的技术负责人适合每天被 AI 生成代码淹没但总觉得质量不踏实的开发者也适合准备写AI 辅助开发规范的团队。如果你只是想让 AI 生成一段一次性脚本本文的部分章节可以跳过但第 5 节的验证方法和第 9 节的护栏建议建议还是完整看一遍。1. 核心能力速览先给出 AI 编程智能体在可维护软件这个维度上的整体判断。下面的表格不是某个产品的官方参数而是对主流 AI 编程智能体能力现状的通用归纳。具体到某个工具、某个模型结果会有差异但大致边界是稳定的。能力项现状描述代码生成短函数、单文件、样板代码效率高跨文件、多模块修改容易走偏代码补全主流编程语言熟练度高私有框架、历史遗留代码效果明显下降单元测试生成能生成测试用例和 mock但业务语义和边界条件需要人工核对缺陷修复能定位局部 bug涉及架构假设的缺陷经常修出回归代码审查能发现空指针、异常未处理等局部问题难以发现架构级缺陷重构小范围重命名、提取函数可用大范围架构重构风险高文档生成能生成 API 文档和注释但容易产出表面文档上下文处理一次性可读的代码量有限大型代码库需要外部索引和检索依赖处理依赖升级、安全补丁需要人工确认存在幻觉版本号的风险可维护性结果取决于使用方式没有约束时倾向于生成能跑但不清晰的代码从这张表可以得出两个判断。第一AI 编程智能体的强项是局部产出。给它一个函数、一个文件、一个清晰的接口定义它能很快给出可运行的实现而且代码风格通常不差。第二它的弱项是全局约束。可维护软件依赖的模块边界、依赖方向、业务规则收敛、测试策略、变更记录这些都不是单次代码生成能解决的问题而是架构决策和工程制度问题。AI 可以把砖砌得快但墙体承重结构还是得人来定。2. 可维护软件的定义与判断标准要回答AI 能不能构建可维护软件首先得说清楚什么算可维护。不同团队定义差别很大但行业里有几个共识维度。2.1 四个可观察特征可读性新成员能通过读代码和文档在短时间内理解模块职责而不是靠问原作者。可测试性核心业务逻辑不需要启动整个系统就能做单元测试关键分支有测试保护。可修改性新增需求时改动集中在一个模块内不引发大面积连锁修改。可观测性系统运行异常时能通过日志、指标、链路追踪快速定位问题。这四个特征共同决定了软件的维护成本。一个软件哪怕功能完全正确只要可读性差、不可测试、一改就崩它在经济上就是不可维护的。可维护性的本质是降低未来变更的不确定性而 AI 编程智能体带来的最大问题恰恰是让当前变更变得太容易让未来变更变得太难。2.2 可量化的指标可维护性不能只靠感觉需要量化。常用的指标包括圈复杂度单个函数的路径分支数量过高说明函数太难理解、太容易出错。耦合度与内聚度模块之间的依赖关系是否合理同类职责是否收敛在同一个地方。重复代码率相同逻辑是否被多处复制复制意味着修改时要多处同步。测试覆盖率行覆盖率和分支覆盖率是否达到团队标准关键路径是否有测试保护。变更失败率每次发布后出现故障的比例这是维护质量的最终检验指标。平均修复时长从缺陷发现到修复上线的时长反映代码的可诊断性。2.3 为什么这个标准对 AI 特别重要AI 编程智能体的问题是它生成的代码在当下看起来是对的但在将来可能很难改。典型情况包括为了通过测试而把逻辑写成一长串 if-else为了处理边界情况而复制粘贴同一段代码为了完成功能而绕开已有的抽象层直接访问底层数据。这些代码在生成时测试是绿的但三个月后需要修改业务规则时维护者会发现无从下手。所以评估 AI 编程智能体不能只看功能完成率必须看可维护性指标。这也是本文第 5 节实验设计的核心思路。3. AI 编程智能体在开发链路中的能力边界把软件开发拆成一条链路需求分析、架构设计、编码实现、测试验证、代码评审、发布运维、持续演进。AI 编程智能体在每一个环节的能力是不同的笼统地说AI 写代码行不行没有意义必须按环节看。3.1 需求分析与架构设计只能辅助需求分析需要跟业务方对话、梳理歧义、判断范围这些 AI 可以做总结和整理但不能替人决策。架构设计更是如此。AI 可以给出选型建议、画出模块划分草案但它不理解组织架构、业务战略、团队技能这些影响架构的隐性因素。把架构决策完全交给 AI是当前风险最高的用法。因为架构决策一旦出错错误会被 AI 后续生成的每一段代码放大。3.2 编码实现效率最高也最需要约束这是 AI 编程智能体最强的环节。无论是补全函数、生成样板代码、写 SQL、写正则、做数据转换AI 都能大幅提速。但速度提升也带来了新的问题AI 倾向于在现有代码里打补丁而不是遵守架构约束。比如项目中明明有统一的异常处理类AI 可能直接 throw 一个裸异常项目中明明有 Repository 层AI 可能直接在 Controller 里写查询逻辑。解决办法是在 AI 工作前把约束写清楚接口规范、命名规范、禁止事项、现有抽象层说明。约束越明确AI 生成的代码越接近团队标准。3.3 测试验证能生成不能保证有效AI 生成单元测试的能力已经相当强尤其是在给定输入断言输出这类场景。但它生成测试时存在两个明显问题一是测试容易写得过拟合只覆盖代码当前实现路径而不是业务需求本身导致重构时测试跟着实现一起改失去保护作用二是 mock 过多测了一堆交互却没验证真正的业务结果。有效做法是把变异测试这类手段引入验证流程。如果一个测试在代码行为被故意改坏时仍然通过说明这个测试没有保护价值。3.4 代码评审AI 先审人再审AI 代码审查工具能够快速发现格式问题、明显的空指针风险、未处理的异常、硬编码密钥等局部问题这部分的效率提升很实在。但对于这个模块是不是应该拆开这个地方的依赖方向是不是反了并发模型有没有问题这类需要整体设计判断的问题AI 仍然力不从心。推荐的流程是AI 先做第一轮审查过滤低级问题并生成审查意见摘要人工再重点看架构、并发、安全、业务语义四个维度。这样既利用了 AI 的速度又保留了人工的判断。3.5 发布运维与持续演进工具链生态正在补齐现在不少 AI 编程智能体已经能通过插件或 API 操作 CI/CD、读取日志、定位线上问题甚至自动生成回滚建议。这个方向对可维护性是有帮助的因为它降低了信息检索的成本。但注意运行在生成阶段和运行在生产环境的 AI 需要完全不同的安全策略。生产环境的自动变更必须有人工审批和完整的审计日志否则一旦 AI 基于错误上下文做出破坏性操作回滚成本会非常高。4. 评估 AI 编程智能体的环境准备如果你想在自己的项目里实测 AI 编程智能体能否产出可维护代码核心不是挑一个最好的 AI 工具而是先搭好一套能测量可维护性的评估环境。下面给出一个通用方案以 Python 项目为例其他语言替换对应工具即可。4.1 准备一个真实业务模块评估代码可维护性不能用 hello world 或者算法题。建议选一个包含以下特征的真实模块有明确的业务规则例如订单状态流转、优惠计算、权限判断。有多个文件、多层依赖。有一定历史改动模拟维护场景。如果公司内部有合适的开源项目或已脱敏的代码库用它效果最好如果没有选一个中等规模的开源项目也行。4.2 搭建质量度量工具链以 Python 项目为例可以安装下面这些工具# 创建虚拟环境并安装依赖 python -m venv .venv source .venv/bin/activate # Windows 用 .venv\Scripts\activate pip install pytest pytest-cov radon ruff # 安装你选定的 AI 编程智能体客户端按实际工具调整 # npm install -g anthropic-ai/claude-codepytest-cov统计行覆盖率、分支覆盖率。radon计算圈复杂度、维护指数maintainability index。ruff静态检查输出代码风格问题和潜在 bug。Git必须使用版本控制所有评估都要基于 commit 对比不能只看最终文件。4.3 建立基线在让 AI 动手之前先对原模块跑一遍度量记录基线数据# 跑测试并输出覆盖率 pytest --covyour_module --cov-reportterm-missing # 计算圈复杂度和维护指数 radon cc your_module -s radon mi your_module -s # 静态检查 ruff check your_module记录下三组数字测试覆盖率、平均圈复杂度、静态检查问题数。这三组数字就是后续对比 AI 改造效果的基线。4.4 准备任务描述模板为了让评估公平任务描述必须明确写清楚验收标准否则 AI 会自由发挥。建议模板包含需求背景、输入输出约束、现有模块结构说明、禁止改动范围、测试要求、代码风格要求、交付物清单。任务背景订单模块需要新增部分退款能力。 约束 1. 只能修改 order 目录下的文件。 2. 状态流转必须复用现有的 OrderStatus 枚举禁止增加新的状态值。 3. 所有新增分支逻辑必须有单元测试覆盖行覆盖率不低于 90%。 4. 代码必须通过 ruff check 检查。 5. 不允许使用任何新的第三方依赖。 交付物代码变更、测试用例、变更说明。清楚了约束之后AI 生成的代码才具备评估意义。如果任务描述本身很模糊得到的代码也不能代表 AI 的真实能力只能代表没有项目管理能力时 AI 的默认表现。5. 可维护性验证实验设计这一节给出三个可以直接复用的实验设计每个实验都围绕一个真实场景功能新增、缺陷修复、长期维护。5.1 实验一AI 生成新功能 vs 人工实现选取一个业务模块分别让 AI 和人工实现同一个功能然后在同样标准下度量两种产物的可维护性指标。实验的关键是控制变量需求描述一致、验收标准一致、允许使用的技术栈一致。最终对比项包括测试覆盖率AI 生成的测试是否覆盖了业务边界还是只覆盖了实现路径。圈复杂度新增函数的平均圈复杂度是否过高。模块耦合AI 是否在已有抽象层之上编码还是绕过抽象直接操作底层。评审问题数让两名不了解实验背景的工程师做 code review记录发现的问题数。从行业实践来看AI 在功能完成速度上明显领先但在评审问题数上不一定占优。这正是需要用数据进行管理决策的原因而不是凭印象说AI 写代码不行或者AI 写代码很强。5.2 实验二AI 修复缺陷后的回归风险在代码库里保留一个真实缺陷让 AI 修复然后观察它是否引入了回归。观察点有三个修复是否定位准确是修了根因还是只修了表面症状是否新增了测试是否改变了与原缺陷无关的文件。命令层面可以用 Git 和 CI 做检查# 查看 AI 修改涉及的文件范围 git diff --stat HEAD~1 # 运行全量测试观察是否有非预期失败 pytest # 计算修改后的圈复杂度变化 radon cc your_module -s如果 AI 修一个 bug 改动了大量无关文件说明它没有建立最小变更意识。这是影响可维护性的重要信号。实际项目中一次缺陷修复涉及 1 到 2 个文件是正常的超过 5 个文件且没有合理解释就要在评审环节重点追问。5.3 实验三模拟长期维护观察迭代成本把 AI 生成的代码放进去然后让一个新的开发者或一个新的 AI 会话基于它做三次迭代需求记录每次迭代的耗时和回归次数。这个实验模拟的是真实维护场景第一版代码写完后后面的人能不能快速理解并修改。迭代越到后面越慢、回归越多说明前期的可维护性越差。这个实验成本最高但最有说服力因为可维护性本来就是站在时间维度上评估的。5.4 用质量门禁收敛结果不管实验怎么做强烈建议在评估分支上配置质量门禁。代码不满足门槛不允许合入。质量门禁的作用不是限制 AI而是把可维护的定义固化下来。# .github/workflows/quality-gate.yml 示例 name: quality-gate on: [pull_request] jobs: analyze: runs-on: ubuntu-latest steps: - uses: actions/checkoutv4 - name: Set up Python uses: actions/setup-pythonv5 with: python-version: 3.11 - name: Install dependencies run: pip install pytest pytest-cov radon ruff - name: Run tests with coverage run: pytest --covyour_module --cov-fail-under80 - name: Run radon complexity check run: radon cc your_module -s -n C - name: Run ruff check run: ruff check your_module这个示例里的模块名、覆盖率阈值、复杂度阈值都需要按实际项目调整。质量门禁的价值在于AI 生成的代码和人工代码走同一个门禁才叫公平对比。6. 接口 API 与批量任务如果你想规模化使用 AI 编程智能体比如批量代码审查、批量生成单元测试、批量修复低级 lint 问题那就需要考虑接口 API 和批量任务设计。6.1 接口 API 接入方式主流 AI 编程智能体通常提供两类接入方式一是交互式客户端适合单人日常使用二是编程接口适合写入自动化流程。具体接口路径和鉴权方式以官方文档为准下面给出一个通用的调用模板。import os import requests # 以通用 OpenAI 兼容接口为例实际地址、模型名、请求头需要按服务商文档替换 api_url os.environ.get(AI_AGENT_API_URL, https://api.example.com/v1/chat/completions) api_key os.environ.get(AI_AGENT_API_KEY, ) payload { model: your-model-name, messages: [ { role: system, content: 你是一位资深代码审查工程师请只输出可执行的问题列表不要修改代码。 }, { role: user, content: 请审查以下代码按严重程度输出问题\n open(target.py, encodingutf-8).read() } ], temperature: 0.2, max_tokens: 2000 } headers { Authorization: fBearer {api_key}, Content-Type: application/json } response requests.post(api_url, jsonpayload, headersheaders, timeout120) print(response.json())注意不同服务商的接口格式差异很大有的返回choices[0].message.content有的是output字段有的还需要传会话 ID。写自动化脚本时先用手动方式拿到一次响应确认字段结构后再处理。另外体温参数建议调低代码审查和生成场景下温度越高越容易产生不稳定的输出。6.2 批量代码审查脚本批量任务是 AI 编程智能体在可维护性方向上最有价值的场景之一。比如每次合并请求都自动让 AI 做一轮预审查把问题汇总给开发者。下面是一个简单的目录批处理脚本思路import os import time import requests INPUT_DIR ./changed_files OUTPUT_DIR ./review_reports os.makedirs(OUTPUT_DIR, exist_okTrue) def call_review_api(filename, code): 调用审查接口实际请求参数需要按服务商文档调整 # 复用上面定义的请求逻辑 # 返回审查结果文本 pass for filename in os.listdir(INPUT_DIR): if not filename.endswith(.py): continue with open(os.path.join(INPUT_DIR, filename), encodingutf-8) as f: code f.read() # 调用审查接口这里需要实现 call_review_api # time.sleep(1) # 避免触发限流实际按接口限制调整 result_text call_review_api(filename, code) report_path os.path.join(OUTPUT_DIR, filename .md) with open(report_path, w, encodingutf-8) as f: f.write(# Review Report\n\n) f.write(f## File: {filename}\n) f.write(result_text)批量任务设计有三个要点输入输出分目录管理每个文件单独调用失败不阻塞其他任务记录调用时间、token 消耗和失败原因方便排查。批量跑代码审查时建议限制并发数为 1 到 2避免触发接口限流也方便控制成本。6.3 批量任务的失败重试AI 接口调用不可避免会遇到超时、限流、内容截断。批量任务必须设计重试和告警机制。推荐策略是网络类错误重试 3 次指数退避内容截断时增加 max_tokens 后重跑业务类错误如代码内容不合法记录后跳过人工处理。脚本运行完成后输出一份失败清单而不是静默失败。7. 资源占用与成本观察评估 AI 编程智能体除了功能效果还要看资源和成本。代码生成类任务不像图像视频推理那样吃显存但如果走本地大模型硬件门槛依然存在如果走云端 API主要看 token 消耗和延迟。7.1 本地模型 vs 云端 API本地部署的代码模型对硬件要求差异很大。小参数模型可以跑在消费级显卡上大参数模型需要多卡或高显存服务器。显存占用取决于模型参数量、量化方式、上下文长度和并发数。最稳妥的做法是部署前先跑一次最小推理测试确认峰值显存和单次生成耗时再决定并发策略。这里不能给一个放之四海而皆准的数字每个模型、每个量化版本都不一样必须按实际环境测试。云端 API 的优势是省去硬件和运维成本但需要注意三个指标单次请求延迟、token 单价、上下文长度上限。代码审查类任务通常输入很长整个文件甚至整个模块一次请求可能消耗几千到几万 token批量运行时成本增长很快。建议在脚本里做 token 统计按文件和按任务维度记录成本。7.2 上下文长度与遗忘问题AI 编程智能体生成不可维护代码的典型原因之一是上下文不足。代码库超过上下文上限后AI 只能看到局部文件看不到全局依赖于是就会做出局部正确、全局错误的选择。缓解办法包括任务描述里显式列出相关文件使用支持代码库索引的工具让 AI 先检索相关代码再生成把大型重构拆成多个小任务每个任务只处理一个模块。这些措施能显著提高生成代码与既有架构的一致性。7.3 如何观察性能日常使用中建议记录以下数据形成团队自己的基线单次生成平均耗时、平均 token 消耗、一次生成被采纳的比例、人工修正成本、回归引入率。这五项数据比任何宣传口径都更有参考价值。特别是人工修正成本这一项很多团队只看到 AI 生成快没算上人工改代码的时间。如果把修正时间也算进去AI 在一些复杂模块上的真实效率可能并不比人工高。8. 常见问题与排查方法下面是团队在引入 AI 编程智能体时最常遇到的问题和排查思路。问题现象可能原因排查方式解决方案AI 生成的代码编译不过上下文不足引用了不存在的 API查看生成的代码引用的符号是否存在于项目在任务描述中给出接口清单和文件路径测试覆盖率很高但 bug 仍然多测试过拟合实现没有测业务行为用变异测试或人工查看测试断言要求按业务场景写测试而不是按实现写测试AI 反复修改同一个问题缺少明确验收标准检查任务描述是否包含约束和接受标准补充禁止改动范围和完成定义代码风格与团队不一致没有配置代码规范检查 .editorconfig、linter 配置在质量门禁中强制 lint让不合规提交被自动拦截引用不存在的依赖版本模型幻觉版本号检查依赖文件是否可解析要求 AI 只使用已有依赖新增依赖必须人工确认接口调用超时输入过长或服务端限流查看接口日志和耗时分布拆小文件、降并发、加重试批量任务部分失败单个文件触发接口异常检查失败文件的错误码写重试逻辑和失败报告AI 修改了无关文件任务边界不清git diff 查看变更范围在任务描述中限定目录并在评审时拦截这张表的逻辑是多数问题不是 AI 能力不行而是输入约束不清晰、流程护栏缺失。把约束从人脑搬到任务描述 质量门禁 代码评审里AI 的产出质量会立刻上一个台阶。9. 最佳实践与使用建议回到本文的核心问题AI 编程智能体能不能构建可维护软件从现有实践看答案不是简单的能或不能而是在正确约束下可以在无约束下会加速不可维护。下面给出几条可以立刻落地的工程建议。9.1 架构先行AI 只做实现最稳妥的使用方式是把架构决策和 AI 生成明确分开。模块边界、接口定义、数据模型、关键技术选型由人确定AI 负责在边界内实现函数、补充测试、整理文档。架构是人给的约束实现是 AI 的效率。千万不要让 AI 一边做架构决策一边写代码这是当前风险最高的用法。架构决策一旦出错影响的是整个项目的可维护性而 AI 生成的每一段代码都会在错误架构上叠加新的复杂度。9.2 把可维护性要求写进任务描述任务描述里的完成定义必须包含可维护性要求。例如禁止新增重复逻辑必须复用现有抽象核心路径必须写单元测试新增代码必须通过 lint不允许绕过既有模块边界。AI 没有团队价值观它的行为完全由输入约束决定。你给它的约束越接近团队的架构规范它生成的代码就越接近团队标准。9.3 小步提交逐次评审AI 生成的大批量代码一次合入的风险极高。建议把需求拆成小任务每个任务生成后先跑质量门禁再由人工评审通过后再进入下一个任务。这样即使 AI 在某一步出错影响范围也可控。小步提交还有一个额外好处出问题时可以通过 git bisect 快速定位到引入问题的那个变更。9.4 用仓库级指标做长期监控单次生成效果说明不了问题真正的判断依据是长期指标。建议每迭代一次就记录测试覆盖率、圈复杂度、重复代码率、变更失败率。连续两个迭代周期这些指标明显下滑就要停下来审查 AI 的使用方式。指标不是用来考核 AI 的是用来提醒团队代码正在腐烂的。9.5 版权、隐私与安全边界使用 AI 编程智能体时必须遵守几个底线。企业代码上传前确认是否符合数据合规要求核心业务代码和敏感数据避免直接发送到外部服务。使用开源或商用工具时确认许可协议包括生成代码的归属和训练数据的使用范围。涉及他人代码、开源项目时保留原始许可证和版权声明。所有 AI 自动生成的变更必须经过人工评审生产环境的自动变更必须有审计记录和回滚方案。10. 总结与下一步这次我们把AI 能不能构建可维护软件拆成了可以验证的问题。结论是AI 编程智能体在局部代码生成、测试辅助、快速审查这些环节确实能提升效率但它本身不带可维护性这个目标。可维护性来自人设定的架构边界、任务约束、质量门禁和评审流程。没有这些约束AI 会让代码交付速度变快也会让维护成本加速膨胀。如果你所在团队准备引入或已经在用 AI 编程智能体建议从三件事开始把本文第 4 节的评估环境搭起来用真实模块做一次AI vs 人工的对比实验把任务描述模板补上约束和验收标准在 CI 里加上可维护性质量门禁。三件事做完你对AI 写代码到底行不行的判断就会从感觉变成数据。最容易踩的坑是因为 AI 第一次生成很快就把架构决策和批量合入也交给它。建议先在小模块、非核心业务上建立信任再逐步扩大范围。后续可以继续探索的方向包括用变异测试来检验 AI 生成测试的有效性把 AI 代码审查的预审结果接入内部缺陷管理系统基于仓库历史数据提炼团队的专属编码规范并固化到任务模板里。可维护软件不是一次生成的而是每一次变更都守住规则的累积结果。
返回列表