
大师好云开体育,我是刷 GitHub 停不下来的苍何。
刷了很久的 GitHub,发现个专诚义的开源神气。

看了下,这是京东开源的 joycode-agent,面前在 SWE-Bench Verified 基准测试中凭借 74.6% 的高通过率位居榜单全球 Top3。

SWE-Bench Verified 是通过使用实在天下开源神气中的 Bug 讲演和 Issue 来测试 Agent 从相识问题到自主生成、集成和考据莳植代码的好意思满端到端才智,是 AI Coding 技能走向和居品落地的行业风向标之一。
从跑分和才智上来看,JoyCode 针对的应该是企业级研发场景。
我点进去他们官网,就可以径直下载 JoyCode 这款智能编码器具。

投入后,导入 vscode 确立,作念下粗陋竖立,然后用京东账号登录。

可以看到,JoyCode 内置了好多的资源和 MCP 器具。

也内置了好多主流的大模子,齐可以径直使用,也可自界说添加模子,集成了 Git 作念代码的版块贬责,自动生成 commit message 信息。
看了 JoyCode 竖立,可以开启代码评审,针对每次提交的代码,自动进行质料、安全、编码表率、逻辑造作等多维度的扫描,并提供莳植冷漠。

稍稍追忆下它的中枢才智:
1、多智能体架构:可定制智能体,通过"先绸缪、后实行"的计谋,以团队配合方式智能拆解复杂任务。
2、维持规约编程:基于需求、假想、实施的三阶段责任进程,可终了从需求到委派的端到端隐敝。
3、CSR 陡立文引擎:通过对代码仓库的深度领悟,全面相识代码仓库陡立文等集成开辟环境信息。
4、可一键云表部署。
看了京东云官方公众号讯息,说是 JoyCode 已做事京东上万名研发东谈主员,撑持数亿级用户居品研发,生成代码取舍率超 50%,开辟周期镌汰 40%。

于是乎,我又运行了一顿测试,来望望 JoyCode 本体才智如何。
既然主打的是企业级智能编码器具,那就来几个企业级开辟最为心思的几大问题。

快速上手老神气
大部分时候,企业中并不老是在开辟新神气,而是在原有神气上作念些功能的迭代或者业务的更新。
颠倒是关于新东谈主,新加入神气团队后,要快速掌合手悉数这个词神气,绝非一件容易的事,稍稍表率点的团队会有有关文档,但好多团队神气,就真是唯有一份代码。
最让东谈主苦楚的是,这份代码,连个致密齐莫得,业务逻辑和数据结构,要东谈主肉去相识,耗尽时候极其漫长,苦楚面具 +1。
我尝试用 JoyCode 来作念这方面的责任,就拿我的实在企业级开源神气 PmHub 来测试吧。
先让 JoyCode 基于神气源码帮我生成神气架构图。

可以看到 JoyCode 自动切换到架构图假想模式,然后上来就先分析了神气中的 pom. xml 依赖文献及 Readme 文献,以及对悉数这个词神气相识就运行吭哧吭哧自动调用 draw. io 帮画神气架构图了。
这里我等了不少时候,半途以致有些念念废弃,骂一句辣鸡,然后滚去寝息。但终末出来的适度,让东谈主很惊喜。

除了归附了悉数这个词项目的技能架构,还把各个层的流转用流动箭头作念了象征。可以说,这是面前为止,我最状态的一次架构图假想试验。
JoyCode 生成 . drawio 文献后,通过插件或者 draw.io 就能翻开了。
了解了悉数这个词神气架构,还需要把柄数据结构来从数据层面了解业务。可以让它生成对应的 ER 图,来匡助了解。
prompt:基于该 sql 文献,生成实体 - 联系图,并按照业务域对数据库表进行分类
这里有个细节,由于 sql 文献颠倒大,在 Chat 界面可以看到,JoyCode 会对悉数这个词陡立文进行合理压缩,然后制定该任务的 todolist,agent 会实行任务。

先看下稍稍粗陋一些的任务,将表按照业务域作念分类,这个全齐没啥问题。

到了绘画这,由于表过多,我本就没谋略它能一次成,在一番处理后,终于生成好了。

说真话,这和我理念念中的 ER 图有些距离,不外用来作念神气援救相识,若干有些用。
有了廓清的数据结构,关于有些复杂的业务逻辑,可以借助 AI 来进行代码线索放哨,可以通过进程图来援救相识。
比如 PmHub 神气中的这串代码:
/**
* 任务待过时提醒
*/
@Component
@Slf4j
publicclass TaskNotifyJob {
@Autowired
private ProjectTaskMapper projectTaskMapper;
@Autowired
private ProjectTaskNotifyMapper projectTaskNotifyMapper;
@Scheduled ( cron = "0 0 9 * * ?" )
@Transactional ( rollbackFor = Exception.class )
public void taskNotify ( ) {
List tasks = projectTaskMapper.queryTaskNotifyJob ( ) ;
// 刻下时候
LocalDate localDate = LocalDate.now ( ) ;
tasks.stream ( ) .filter ( taskNotifyDTO -> StringUtils.isNotBlank ( taskNotifyDTO.getUserWxName ( ) ) && taskNotifyDTO.getCloseTime ( ) != null )
.forEach ( taskNotifyDTO -> {
if ( ProjectStatusEnum.PAUSE.getStatus ( ) .equals ( taskNotifyDTO.getStatus ( ) ) ) {
return;
}
LocalDate closeDate = taskNotifyDTO.getCloseTime ( ) .toInstant ( ) .atZone ( ZoneId.systemDefault ( ) ) .toLocalDate ( ) ;
if ( ChronoUnit.DAYS.between ( localDate, closeDate ) == taskNotifyDTO.getNotifyDay ( ) ) {
log.info ( " 待过时任务提醒运行 , 用户 id:{}, 企微 id:{}, 任务 id:{}", taskNotifyDTO.getUserId ( ) , taskNotifyDTO.getUserWxName ( ) , taskNotifyDTO.getTaskId ( ) ) ;
// 进行待过时讯息提醒
TaskOverdueRemindDTO taskOverdueRemindDTO = new TaskOverdueRemindDTO ( ) ;
// 竖立任务称呼
taskOverdueRemindDTO.setTaskName ( taskNotifyDTO.getTaskName ( ) ) ;
// 竖立奉告用户 id
taskOverdueRemindDTO.setUserIds ( Collections.singletonList ( taskNotifyDTO.getUserWxName ( ) ) ) ;
// 竖立天数
taskOverdueRemindDTO.setNum ( taskNotifyDTO.getNotifyDay ( ) ) ;
// 竖立任务细目地址
String url = SsoUrlUtils.ssoCreate ( appid, agentid, host + path + ssoPath + URLEncoder.encode ( host + "/pmhub-project/my-task/info?taskId=" + taskNotifyDTO.getTaskId ( ) ) ) ;
taskOverdueRemindDTO.setDetailUrl ( url ) ;
taskOverdueRemindDTO.setOaTitle ( " 任务行将过时提醒 " ) ;
taskOverdueRemindDTO.setOaContext ( " 您的任务【" + taskNotifyDTO.getTaskName ( ) + "】还有【" + taskNotifyDTO.getNotifyDay ( ) + "】天到期,请实时处理!" ) ;
taskOverdueRemindDTO.setUserName ( taskNotifyDTO.getUserName ( ) ) ;
taskOverdueRemindDTO.setLinkUrl ( OAUtils.ssoCreate ( host + "/pmhub-project/my-task/info?taskId=" + taskNotifyDTO.getTaskId ( ) ) ) ;
RocketMqUtils.push2Wx ( taskOverdueRemindDTO ) ;
// 进行查询 要是数据库不存在记载 则就插入记载
LambdaQueryWrapper
if ( projectTaskNotifyMapper.selectOne ( qw ) == null ) {
// 插入记载
ProjectTaskNotify projectTaskNotify = new ProjectTaskNotify ( ) ;
projectTaskNotify.setProjectId ( taskNotifyDTO.getProjectId ( ) ) ;
projectTaskNotify.setTaskId ( taskNotifyDTO.getTaskId ( ) ) ;
projectTaskNotify.setOverdue ( 0 ) ;
projectTaskNotify.setUserId ( taskNotifyDTO.getUserId ( ) ) ;
projectTaskNotify.setUserWxName ( taskNotifyDTO.getUserWxName ( ) ) ;
projectTaskNotify.setCloseTime ( taskNotifyDTO.getCloseTime ( ) ) ;
projectTaskNotify.setTaskName ( taskNotifyDTO.getTaskName ( ) ) ;
projectTaskNotifyMapper.insert ( projectTaskNotify ) ;
}
log.info ( " 待过时任务提醒斥逐 " ) ;
}
} ) ;
}
}
可以选中这段代码后,讲明该代码。

然后让 JoyCode 生成进程图。

代码评审
在团队开辟中,开辟完代码频繁需要进行代码评审,也简称为 CR,这个责任频繁会团队内交叉进行,最终上线需要技能 leader 进行最终 CR。
当今就可以把这个责任先交给 AI 来作念一轮前置评审,识别出有关风险,保证代码质料。

JoyCode 会给出一份评审讲演,并排出改造冷漠和优先级排序。

在完成开辟后,作念代码提交,JoyCode 八成自动添加 git commit 信息。

接口变坐褥代码
在本体企业级开辟中,前后端会同步开辟,往往是先界说好接口,然后前后端齐基于该接口进行开辟。
是以如何将界说好的接口(API 文档)升沉为坐褥级代码,就显得很紧迫。
我尝试在 JoyCode 中测试该功能,比如照着咱们开源的 PmHub 项目的接口文档,咱们尝试作念点专诚义的事情。
PmHub 接口文档地址:https://laigeoffer-pmhub.apifox.cn
给到如下请示词:
基于该 API 文档:https://laigeoffer-pmhub.apifox.cn 中的 " 我的神气 " 模块进行开辟,请严格罢黜开辟表率和接口界说,前后端分离,保证神气可运行。
他会先把柄 API 文档创建需求文档、假想文档和任务文档。

然后就运行吭哧吭哧的由前端到后端的开辟。我这里选的是 JoyCode 的规约编程模式。
一句话讲明规约编程:你毋庸手把手教 AI 怎么作念,你只管用章程(规约)把"要什么"和"法式是什么"界说明晰,AI 就能我方写出 100% 自豪你条目的代码。
在职务列表中可以领悟了 22 个任务,恭候实行,咱们点击说明一谈实行。

在职务部队中就可看到悉数任务,JoyCode 会按照任务轨则顺次实行。

这里我发现了一处小细节,在 JoyCode 中多个任务是可以并行的,比如这个敕令:
cd pmhub-ui && npm install
它就能在结尾我方并行实行,在 Chat 中的代码任务也在同步实行。
在生成前端代码这个任务中,可以看到无论是使用的框架照旧文献类定名的作风齐特等的和表率保持一致,以致还学习了定名作风,环境确立。
我列了一张对比图:

特等的相似。前端页面也全齐可用。

登录进来后就可以看到神气贬责功能模块了。

这是一个基于 API 文档哄骗 JoyCode 生成的神气贬责系统,全程我惟一要作念的是把 API 丢给 JoyCode,然后让他绸缪任务,按照指定的规约进行编程。
JoyCode 的阐发还可以� �,在严肃的企业级场景中,不会瞎搞,像是个憨实的门径员。
一句话需求到 PRD
我从 GitHub 了解到,JoyCode 内置了一些器具,能将一句话需求快速调度为专科产研翻译,生成 PRD 文档。
来测试下效用。
请示词:帮我生成专科的 PRD 文档,我需要开辟一个神气贬责系统,维持新建神气、神气中新建任务。

可以看到将白话的一句话需求升沉为了专科的业务话语。
全栈开辟
我也蛮念念试试在 JoyCode 中进行全栈开辟,
这里我径直哄骗原先 PmHub 的 PRD 文档和假想原型文档,进行全栈开辟。
ps:这亦然规约编程的实行法式,不冷漠径直上手开辟,在开辟前界说好相应需乞降假想,才能让 AI 更好的完成任务。
我的目的很粗陋,帮我一比一复刻一个 PmHub 出来。
但由于 PmHub 功能好多,全齐复刻需要时候,这里我就以基础的才智来作念了复刻。底下是我全体的终了进程。

第一步,PRD 分析。
PmHub 的需求分析长这么:

请示词:你是又名全栈架构师,以上是神气贬责系统的 prd,帮我把柄这个 prd,
生成一个关节假想说明。并生成系统全体交互进程 UML 时序图

生成的时序图,经过调养和样式粗陋优化获得如下:

这里的 UML 逻辑需要屡次查对,Chat 修改,最终能获得安妥的效用,稍稍有些花时候。
第二步,假想原型文档分析。
这是 PmHub 的原型假想图,径直将它丢给 JoyCode。

以上是神气贬责系统的原型假想文档「URL 荟萃」,请基于此进行技能决议假想。
可以看到适度会更偏向假想需求:

第三步、生成 API 接口文档
接口先行,并行开辟,是敏捷开辟的必重心,这里我改革性的让 JoyCode 先把柄以上信息生成 API 接口文档,然后把柄上头的格局再顺次生成前后端代码及数据库代码。
由于模块好多,冷漠分裂单个模块生成。
基于以上信息及文档,帮我生成神气贬责模块中的神气列表和添加项目的 api 接口文档,我要能径直导入到 apifox 中。

然后还生成了 api 文档说明。

这里需要导入到 Apifox 中进行 check,确保安妥后不绝接下来的操作。
第四步,生成代码。
这里我的教导是把柄 api 文档以及原型假想稿会有很好的效用,AI 不会瞎搞,样式和接口齐是按照预定的来。
包括技能假想、架构假想,这些在规约中也曾指定,这便是规约编程的魔力吧。
和之前相通,JoyCode 会把柄条目,老诚笃实写代码。
由于时候联系,我就只闪开辟了登录页面、神气列表页和新建神气,包括悉数这个词框架此次我也让生成好了,这么下次单模块开辟就能径直使用。
登录页:

这是神气列表页:

这是添加神气页面:

可以说,98% 以上归附了我 PmHub,包括页面组件样式和功能。
天然,过程中会有一些问题需要调养,但在 JoyCode 中也能浮浅的处理。
我体验下来,JoyCode 关于复杂任务的相识和处理效用是很好的,要是给的有余详备,比如原型假想,基于 API 接口开辟等。
更能阐发出好的效用。
还可以在 JoyCode 中一键部署,不外我的功能还没开辟全齐,就先不部署了,到时再多调调,看下能否全齐复刻出一个 PmHub 出来。
呼,当今真浮浅了。有了 AI 规约编程,你毋庸手把手教 AI 怎么作念,你只管用章程(规约)把"要什么"和"法式是什么"界说明晰,AI 就能我方写出自豪你条目的代码。
以后接办莫得致密和文档的屎山神气时云开体育,也许咱们终于毋庸再戴上苦楚面具了。
