从复制粘贴到Harness:Java后端AI编程的工程化之路

0 引子 一次Java服务端的AI初体验

第一天,下载好了Agent客户端,配置好了api-key。AI说"准备好了"。第二天,我迎来了满屏红色。

一个简单需求,AI自信地交付了代码。然后:编译报错------它用了项目里没有的类 ;依赖冲突------它引入的包和现有版本打架 ;代码里全是魔法数字多层if-else ;更崩溃的是,它在Windows上生成了Linux路径和换行符,构建工具当场报错。

我修了一整天。第五天,我觉得AI不如手写。第八天,我回到了网页版。

问题出在哪?AI不笨,它只是不了解上下文------不知道依赖版本、不熟悉编码规范、不清楚操作系统差异。它像一个空降的天才,第一天就试图重构公司核心库。

我要为它补上这门"入职课"。这,就是我写这篇文章的原因。👌

1 AI需要什么?

假设AI是一位新入职的员工,它需要什么?

  • 一台可接入公司办公网络的电脑(可以随便折腾的环境)
  • 一个了解项目的同事(开发环境搭建、项目规则、代码规范)
  • 一套舒适的开发工具(IDE、数据库管理软件、浏览器、办公套件)

是的,新员工需要的资源AI也同样需要。它可以描述为:

  • 环境:一个沙箱环境(Linux或Unix系统)
  • 上下文文档:一个包含项目描述、环境和代码结构、规则规范的文件(README.md
  • 工具:编译器、代码检索工具、数据库访问MCP、RedisClient

2 如何开始?

第一次启动时,在会话中输入如下指令即可:

复制代码
阅读项目根目录的README.md,按要求初始化上下文文档,并自行安装JDK、Maven等环境,确保项目能本地运行。

这里没有限定具体产品,因为他们的工作逻辑都差不多,背后模型的参数量足够,价格可以承受即可。

3 上下文文档如何管理?

如果说沙箱是AI的"身体",那么上下文文档就是它的"大脑地图"。合理的文档结构能大幅减少AI的认知负担,让它快速定位信息、遵循规则、少犯错。

3.1 核心理念

让AI的"入职指南"像代码一样可读、可维护、可迁移。目标是:任何一个新接手的Agent,只要读懂了这套文档,就能立刻了解项目的全貌和规矩。

3.2 目录结构设计

对于多子项目的复杂项目,我采用了如下结构:

text 复制代码
root\
  README.md               # 项目根描述:技术栈、目录结构、编译运行方式、通用编码规约
  doc\                    # 跨子项目的共享文档
  subproject0\            # 子项目
    README.md             # 子项目描述:启动方式、测试方式、特有规约、技术债
    doc\                  # 子项目文档
      需求1\              # 按需求归类
        api\              # 接口文档
        prd\              # 详细设计、需求拆分(可选)
        test\             # 测试用例
        resources\        # SQL脚本、配置变更
        概要设计.md

当一个需求涉及多个子项目时,就在上层的doc/目录下统一管理,避免文档散落。

3.3 设计原则

  • 父子覆盖 :子项目的README.md继承根项目的通用规约,并可覆盖或补充特有规则。这样既保持了全局一致性,又允许子项目灵活自治。
  • 简单明晰 :所有README.md都是纯文本,只陈述事实,不堆砌冗余信息。
  • DRY原则:文档不重复。同一份信息(如接口定义)只存放在一处,其他地方通过引用或索引获取。
  • 与代码同步 :文档与项目代码一起提交。尤其是技术债、特例、偏离规范的实现,必须在README.md中明确标注,避免文档"腐朽"。
  • 内容闭环 :文档中所有引用的文件(如设计文档、API定义、SQL脚本)必须使用项目内的相对文件路径,确保文档自成体系,不产生任何"外部依赖"或失效链接。

3.4 ⚠️ 关键提醒

绝对禁止在文档中放置任何生产环境的账号、密码、Token或密钥。 这些上下文文档会随代码库被Agent读取,也可能被多人共享。敏感信息应通过独立的密钥管理系统或环境变量注入,而非写在文档里。

4 工具的选型

好的工具可以提高工作效率,我遵循两个原则:

  • 工具小而精:一个工具只干一件事,如专门的代码检索、专门的数据库查询。
  • 让AI自己学 :大部分CLI工具都支持--help,AI可以自行查询用法,无需人工编写文档。

目前我们在沙箱中集成的工具包括:Python(用于快速脚本)、JDTLS(代码结构索引)、Chrome DevTools MCP(查阅在线文档)、SQL MCP Server(只读访问测试数据库)、curl(接口测试)。

这些工具不是固定的,会随着实践不断被替换或优化------只要达成"让AI高效地获取信息、执行命令"这个目的即可。

每种工具的详细配置方式,我会在后续系列文章中逐一拆解,本文只展示整体选型思路。

5 如何将其融入现有工作流程?

有了环境、文档和工具,最后一个问题也是最关键的问题:这套东西,怎么融入我每天真实的开发节奏里?

我的答案不是"全部交给AI",而是建立一套**"AI产出,人工把关"**的协作闭环。下面是我在实践中跑通的6个步骤。

5.1 第一步:把需求"翻译"成文档

接手一个需求后,第一件事不是打开IDE,而是打开一个文本文件

我把需求按项目结构整理成一个需求文档,描述背景、功能点、验收标准,然后保存到对应子项目的doc/需求名/目录下。这个动作很轻,但意义重大------它把产品经理模糊的口头需求,变成了AI能精确理解的结构化输入。

5.2 第二步:让AI输出"设计文档"

然后,我会开启一个会话,把需求文档路径"喂"给Agent,并提示它基于项目上下文(即我们维护的那份README.md)生成一份详细设计文档。

这一步的目标很明确:在写任何代码之前,先拿到一份可审查的方案。设计文档里应该包括接口设计、数据库变更、核心类设计等。

5.3 第三步:人工审查,就地纠偏

设计文档出来后,我会把它从头到尾过一遍。

如果设计跑偏了、方案选型不合适、或者需求本身就存在问题,我会直接在会话里和AI沟通,纠正方向,直到设计文档满足要求为止。所有的分歧和调整,都在"写代码之前"解决。

这是整个流程中最关键的一道关。设计对了,代码不会歪到哪里去。

5.4 第四步:开启新Agent,按图施工

上一步确认设计无误后,我会开启一个全新的Agent会话,把"确认版"的详细设计文档喂给它,让它按文档实现代码,自行编译和调试。

这里有个微妙的心理变化:我不会把原会话里的对话历史也带过去。新Agent带着设计文档重新审视代码,反而能发现一些历史对话中遗漏的细节。

5.5 第五步:让测试自动化"补位"

代码跑通后,我会把设计文档再喂给一个新Agent,让它生成自动化测试脚本或单元测试用例。

这一步的实际价值在于:AI生成的测试代码往往比开发代码更"规矩",因为它严格按照设计文档来验证边界条件------而这些边界,人类开发者有时会偷懒忽略。

5.6 第六步:人工最终审查

最后,我会审查生成的业务逻辑代码和数据库表结构。如果发现问题,通过第三步的会话反馈给AI进行修复。确认无误后,整理会话记录,把本次沉淀的经验(如特定场景的提示词、好的设计思路)更新到项目的文档或Agent的Skill中。

在这套流程里,我的角色从"写代码的人",变成了**"审查设计的人"和"验收结果的人"**。

6 沉淀和推广

一套方案如果只服务于一个人,价值就有限。真正的考验是:这套文档和流程,是否可读、可迁移、可复制?

6.1 哪些必须沉淀?

项目描述和目录结构、本地运行环境要求与启动调试方式、代码规约、技术债、非惯常的实现方案。这些是每一份README.md必须回答的问题,也是AI理解项目的基石。

6.2 哪些可以按需沉淀?

需求文档、API文档、测试用例、项目推荐使用的工具列表。这类内容随项目迭代自然积累,不必强求一步到位。

6.3 哪些不要沉淀?

与本地开发环境强相关的内容(如个人IDE配置),以及与个人偏好强相关的内容(如代码风格偏好)。文档里只写"约定",不写"习惯"。习惯属于个人,约定属于团队。

6.4 如何推广到团队?

README.mddoc/目录结构模板随代码库一起提交。团队其他成员只需拉取代码,按照相同结构初始化自己本地的Agent,就能获得一致的上下文。

这套方案的推广成本极低------因为它本质上就是一套文档规范 ,而不是一套新的工具链。只要团队愿意写几份README.md,AI就能完成剩下的大部分工作。

7 总结和展望

回到开头那个让我崩溃的场景------一个简单的需求,换来满屏的红色错误。

如果当时AI有一份完整的上下文文档,能在一个安全的沙箱里自由试错,能通过工具自主查询依赖版本和数据库结构,那一天的混乱,或许本可以避免。

Harness改造不是什么高深的理论。它只是一套**让AI"懂规矩、有工具、可试错"**的工程方法。它解决的不是AI"够不够聪明"的问题,而是AI"够不够了解你的项目"的问题。


本文只是一个开始。接下来的系列文章,我会逐一深入:

  • 环境篇:如何用Docker构建一个让AI"随便折腾"的沙箱?
  • 上下文篇 :如何让README.md真正成为AI的"入职指南"?
  • 工具篇:如何通过MCP协议让AI自主查询数据库和代码结构?
  • 流程篇:上述6步工作流中,每一步的提示词设计和踩坑记录。

如果你也在探索如何让AI融入Java服务端开发,欢迎关注后续更新,也欢迎在评论区聊聊你的实践。

相关推荐
wuminyu44 分钟前
Linux内核线程调度与虚拟线程调度机制系统级深度剖析
java·linux·c语言·jvm·c++
小溪学编程1 小时前
Java InputStream 详解:从基础到实战
java·python·php
血小板要健康1 小时前
队列 + 宽搜(BFS):二叉树层序遍历 算法总结
java·数据结构·笔记·算法·leetcode·宽度优先
A黄俊辉A2 小时前
【无标题】
java
BestHeaker2 小时前
跨企业接口对接:IQDS / CPK 数据解析与协作避坑指南(五)
java·服务器·前端
俊昭喜喜里2 小时前
C#中的func<>
java·前端·c#
highreport2 小时前
net报表工具对比:HighReport 与 FastReport
java·c#
xiaoqiMikko2 小时前
七条 advisory 各给了一个修复版,而一次修完的那个数字一条都没写
java·spring boot
vHelios2 小时前
【电商项目】短信测试遇到的问题与解决方案:InaccessibleObjectException报错、单元测试通过但未接收到验证码
java·微服务