• 作者:老汪软件技巧
  • 发表时间: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)篇。 欢迎关注公众号“ 隐墨星辰 ”,和我一起深入解码支付系统设计与实现的方方面面。