- 作者:老汪软件技巧
- 发表时间:2024-10-17 00:02
- 浏览量:
1. 背景与结论
自从ChatGPT o1-preview放出来,在网上时不时看到介绍说这模型会思考,武力值爆棚。于是就试试。
结论:武力值的确是爆棚,起码理解设计意图,写代码,快速定位并解决问题的能力,远超一般程序员,起码超过我身边90%以上的中高级程序员。之所以限定中高级程序员,因为再往上还有架构能力我还无法测试验证,无法给出答案。
这个流程引擎适合处理支付业务,驱动完成类似下面这样的配置:
whenOrderState(CommonOrderState.INIT) // 初始条件:主单状态INIT
.onEvent(CommonEvent.CREATE) // 触发事件:创建
.transitionOrderStateTo(CommonOrderState.PROCESS) // 推进到:支付中
.request(CommonOperation.PAY) // 操作:外发银行
.when("subOrder.currentState == SubOrderState.S") // 银行返回成功推进主单成功
.transitionOrderStateTo(CommonOrderState.SUCCESS)
.when("subOrder.currentState == SubOrderState.F") // 银行返回失败推进主单失败
.transitionOrderStateTo(CommonOrderState.FAIL)
.when("subOrder.currentState == SubOrderState.U && subOrder.webForm != null") // 推进发消息
.notifyNode();
在知名的测试Mock框架Mockito中,我们这样使用:
when(mockedList.get(0)).thenReturn("first element");
在java的流式代码中,我们这样使用:
names.stream().filter(name -> name.startsWith("A"))
.collect(Collectors.toList());
在jQuery中,我们这样使用(很多年前我也写JQuery):
$('#element').css('color', 'red').show()
.click(function() { alert('Clicked!'); });
所有以上这些都有一个共同的特点:链式调用。
链式调用有个好处:非常接近自然语言,容易理解。如果扩展一下,专门针对支付领域定制几个专用的语法,既可减少出错可能性,又能提高效率。
为什么不使用像Activiti、jBPM、liteflow这样成熟的流程引擎框架?原因在后面有详细说明。
2. 效果
核心代码99%都是ChatGPT生成,基本没有动。运行报错就把错误信息扔给GPT,都是秒定位,秒修复。
如果需要生成的源代码,请参考“结束语”部分。
支付成功测试:
支付失败测试:
自动生成的JAVA代码:
自动生成的测试用例:
其中一个测试方法示例:
3. 提示词
提供一篇提示词,可直接用于ChatGPT生成所有流程引擎代码,生成内容包括:可直接运行的核心代码,测试代码,常用配置等。生成的代码规范性和可读性都非常高。
这篇文章最有价值的就是这篇提示词。我先做了N轮对话,在生成了完整的可运行代码并验证通过后,再让ChatGPT根据我和它的交互,由它生成一份提示词给我,再做了几次调整后,发起多轮新的独立对话(没有使用以前的上下文)验证基本可行。
需要留意一点:AI每次生成的都不一样,所以仍然可能需要调整,如何调整参考后面的调优说明。
完整提示词如下,有点长,基本就是用自然语言写一篇设计。
=============提示词开始=============
提示:
角色:你是一位支付领域的java技术专家,同时精通java,架构设计知识,领域驱动设计知识,设计模式知识,代码简洁之道知识,DSL,支付业务,与外部银行渠道的交互流程。
任务:请帮助我根据以下详细要求,生成一个流程引擎项目的完整Java代码。
任务概述:
详细要求:
流程引擎采用DSL设计思路。比如java的流式处理,或者Mockitor的测试条件处理等。
流程引擎脚本涉及的关键字:
流程引擎脚本配置:
groovy脚本支持:包、类、导入和代码规范:模型:枚举:FlowContext 和GatewayCallbackContext:AbstractConfig 和 配置实现类:处理节点:处理器和服务:日志:测试:代码质量:
注意: 请提供所有类的完整代码,包括包声明、导入语句、类定义、方法,以及任何必要的辅助类或接口。确保代码是自包含的,不依赖于标准Java库和常用框架(如Spring)之外的外部依赖,如果有,需要给出maven配置,比如groovy,junit等。
示例结构:
指示:
=============提示词结束=============
4. 调优
因为AI每次生成的东西都或多或少有一些不一样,所以需要调优,直到满足自己的设计意图为止。
好在调优不需要自己写代码,直接把想做的,想优化的,或者出错信息给ChatGPT,基本都是秒定位,秒解决。
还会给出思考过程,比如:
5. 为何重复造流程引擎的轮子
一是我乐意,可以学点新东西。二是这个轮子核心代码只有几百行,极其轻量级。三是在支付系统中,流程编排随处可见,比如调用外部的渠道进行支付。而市场上的流程引擎因为考虑通用性,配置都较为复杂。像Activiti、jBPM、liteflow都试用过。
Activiti和jBPM:配置文件非常繁琐。
liteflow:配置文件很简单,但是配置上只知道节点的流转,核心业务逻辑在代码里面,比如什么条件下推进到成功。
下面是一个支付流程编排图:
想要这样的配置:
whenOrderState(CommonOrderState.INIT) // 初始条件:主单状态INIT
.onEvent(CommonEvent.CREATE) // 触发事件:创建
.transitionOrderStateTo(CommonOrderState.PROCESS) // 推进到:支付中
.request(CommonOperation.PAY) // 操作:外发银行
.when("subOrder.currentState == SubOrderState.S") // 银行返回成功推进主单成功
.transitionOrderStateTo(CommonOrderState.SUCCESS)
.when("subOrder.currentState == SubOrderState.F") // 银行返回失败推进主单失败
.transitionOrderStateTo(CommonOrderState.FAIL)
.when("subOrder.currentState == SubOrderState.U && subOrder.webForm != null") // 推进发消息
.notifyNode();
通过这个配置,知道初始状态,触发条件,如何推进。
Activiti和jBPM类似,配置差不多长这样:
liteflow大概长这样:
配置简单,但是需要配合代码才知道怎么做了推进。无法在配置上看清楚,如何怎么推进到成功。
6. 结束语
如果要我说说感想,我只能说,AI的发展是“日新月异”。
我不知道AI后面会不会让我丢了工作,起码目前为止,我们需要好好利用AI来提高工作效率,多一些工作产出,倒是更现实一点。
最后想重复提一句,ChatGPT的o1-preview真是强到离谱,文章中涉及的代码99%都是AI生成的,我基本只描述需求,ChatGPT生成代码,我拿到代码去跑一下,跑不过就把错误信息抛给GPT,如果跑得过但是觉得设计不好,也再提需求。基本都是秒解决,还给出详细分析。
如果对GPT生成的源代码有兴趣,请留言或私信我。
这是《图解支付系统设计与实现》专栏系列文章中的番外第(2)篇。 欢迎关注公众号“ 隐墨星辰 ”,和我一起深入解码支付系统设计与实现的方方面面。