场景驱动的 AI 体验设计:如何让智能 IDE 赋能遗留系统重写

news2024/11/16 7:44:28

作为 AutoDev 的核心开发,我们不仅在不断丰富 AutoDev 的功能以满足不同公司的定制需求,还在与各种团队进行持续交流。在处理遗留系统时,我们发现程序员们日常工作中需要面对大量使用过时技术、基础设施混乱的系统。

在这个背景下,探索如何利用人工智能增强这些系统的演进成为一项极富挑战性的任务。毕竟,大佬们都说:所有的应用都要重写一遍

PS:当然了,大佬也在说:未来不会有应用~~。

为什么场景驱动

fa1fade23bf3292dff6d0e18ca3ef563.png

Thoughtworks 与其他大多数模型厂商不同,一直在探索最佳的编程实践。因此,在 AutoDev 中,我们考虑融入各种实践,而不仅仅是代码生成。我们在设计功能时一直关注不同的场景,以满足不同场景的需求。

在有了大模型加持之后,AI + IDE 有了更多的可能性:

  • 代码增强。即让 AI 来加快开发人员的日常编码速度,诸如代码补全、生成文档、生成测试等等。

  • 普通活动增强。即让 AI 来修复错误、生成提交信息、进行代码检视等等。

  • 融入其他活动。即以 IDE 为媒介,持续将其他的开发活动集成到 IDE 中,诸如文档查询、API 接入等等。

而这些都是基于能力所设计的,位于其背后其实包含了一系列的场景:编码、调试、测试、联调等等,每个场景背后都需要不同的功能来连动,以完成连贯的场景体验。

这就意味着,我们需要能够更好地:理解和适应开发者在不同场景时面临的复杂情境,并提供更智能、个性化的开发体验。诸如于,在遗留系统场景下,它通常具有复杂的代码结构和多语言混合使用,往往需要由人来分析和指令,让 AI 做一些繁琐和重复的工作。

场景:遗留系统改造

对于编码和其它场景,在我先前的《上下文工程:基于 Github Copilot 的实时能力分析与思考》 等文档,以及 NJSD 大会的《从个人到组织, AIGC技术的工程化落地》上的分享里,已经做了详细的介绍。而作为一个开发团队,我们每天不可能有大量的新增代码,大部分人还是工作在遗留系统上 —— 一个你可能不知道某个功能、某块业务是如何实现的?

生成式 AI 增强 :“遗留系统改造”

c0777c9a5a8066b82d5cd9752b5ca226.png

在我开源的那本《系统重构与迁移指南》(https://github.com/phodal/migration,stars:3.3k)电子里,详细介绍了如何分析、评估现有系统、制定重构策略、探索可行重构方案等一系列的遗留系统重写与重构模式。

基于经典的遗留系统重构范式,在代码层面我们要做这么一些事情:

  • 建立评估与度量

  • 搭建测试防护网

  • 重新设计系统架构。诸如于 DDD 用于改善模块化架构

  • 业务提取与服务重构。

  • 进行细粒度的重构。诸如于代码等等

而在有了生成式 AI 之后,在我们做完了顶层设计之后,它可以大大加速我们的落地实践。

创意阶段:增强环节分析

基于这个场景之下,我们就需要思考哪些功能可以借助生成式 AI 来辅助。如下我们是会在头脑风暴时产生的一些想法:

  • 改造方案设计。即通过聊天的方式,获得一些创意式的输入,以帮助我们更好地编写解决方案。

  • 测试防护网搭建。根据系统的复杂度,需要创建不同维度的测试数据、测试用例等。

  • 系统架构设计。即通过聊天的方式,获得一些创意式的输入,以知道什么是更好的架构。

  • 业务信息提取。即通过文档生成、调用链分析等方式,分析某一个 API 的业务与实现逻辑。

  • 基础设施重写。诸如 Maven 迁移到 Gradle,上云基础设施改造(Dockerfile 生成 等)。

  • 代码重写。适用于语言翻译(如 js 转换 ts)、逻辑优化等场景。

  • 文档重新生成。即针对于现有的旧文档,重新生成一份新的文档。

  • ……

除了,这些通用的功能之后,事实上还存在大量的复杂场景,诸如于:

  • 存储过程代码的分析与迁移。

  • 复杂构建脚本的迁移。

  • 领域特定语言的重写。

根据不同的场景,我们都需要有选择地进行设计和强化。但是,显然我们可以看到生成式 AI 可以大大加速这一过程。

端到端定制方案

18d139c6e2ff7f439feccefad7d571d6.png

而对于更复杂的场景而言,我们则需要构建专有的工具来实现这个过程。诸如于 IBM 在设计针对于 COBOL 语言迁移时,将重构过程分为了三大阶段:

  • 理解。即理解 COBOL 代码中的代码、数据、依赖部分,采用诸如可视化等方式设计。

  • 重构。将已有的 COBOL 代码解耦,并重构为模块化的方式。

  • 转换。将模块化的代码翻译为 Java 代码。

而过程中,还需要针对于已有的业务编写对应的 Java 测试代码,以方便进行手动和自动化的验证。

AI 如何增强遗留系统改造?

在对遗留系统进行改造时,智能 IDE 的升级将是一个关键因素。然而,如何将新功能转化为易于操作和高效的组件,以及如何在不同场景中提供最佳的用户体验,是一项具有挑战性的任务。

在功能与场景的设计中,我们需要回答一些关键问题:

  1. 何时开发新功能? 确定新功能的开发时机,使其与遗留系统的改造需求相匹配。

  2. 何时开放定制化能力? 确定定制化的灵活性在哪些场景下是必要的,以满足用户的个性化需求。

  3. 何时交由开发人员决定? 确定哪些场景下,完全交由开发人员决定,以保持系统的灵活性。

并且,我们还应该确保这些功能应该是方便使用的。当然了,最简单的方式就是完全开放这种定制能力。基于这些思考,以我们开源 AutoDev 插件为例来介绍。

如何验证生成的代码?

a12a7a99ec485e3f78ea3af87ffbef48.png

在引入 AIGC 来生成代码时,都需要考虑的一个点是:如何验证生成代码的准确性?。这是一个复杂的问题,通常来说,应该是再由人去验证一遍的,但是有各种取巧的方式。诸如:

  1. 结合人工智能进行检查: 利用人工智能辅助验证生成的代码,提高验证效率。

  2. 生成测试以验证业务代码: 通过生成测试用例,确保生成的代码在业务场景中的正确性。

  3. 基于测试用例文档生成单元测试: 利用测试用例文档生成单元测试,使验证过程更加规范化。

当然了,这些都是规范化的团队所做的事情,实在不行就如我们在 Unit Mesh 架构所说的,由人来验证 AI 生成的代码。而在进行遗留系统改造时,有时这个问题就显得比较简单了 —— 只需要验证输入和输出,诸如于 Http API 的输入和输出。

所以,对应到功能上,只需要一键生成测试或者生成测试的方式,也就可以分为专有和自定义能力。

完成自定义:自定义语言转换    

e75b0795d9f3f06fde1a0fb0e8d37a5a.png

自定义是三种模式里最懒的方案,然而也是在实现上最复杂的,采用何种的交互方式,如何提供这一类灵活的接口。

作为工具的设计者,其实我们是无法枚举语言间的转换,常用的语言都有十几个,他们之间可以随意转换。这也就是最开始的是一个自定义 Action(https://ide.unitmesh.cc/custom/action),让开发人员可以通过 JSON 来配置这种转换:

{
"title": " Translate to Kotlin",
"autoInvoke": false,
"matchRegex": ".*",
"priority": 0,
"template": "将如下的代码翻译为 Kotlin.\n${SIMILAR_CHUNK}\nCompare these snippets:\n${METHOD_INPUT_OUTPUT}\n原始代码如下:\n${SELECTION}"
}

并将相似的代码块 ${SIMILAR_CHUNK} 和函数的输入和输出 {METHOD_INPUT_OUTPUT} 作为上下文的一部分。

部分定制:活文档生成

b27627ae6a01e708c23b7a363d1ff837.png

开放定制是三种模式最复杂的,如何去平衡应该由程序的某一部分来完成,这并不是一件容易的事情。并且也有可能,它会变成一种不三不四的方案。

对于复杂的遗留系统来说,我们还需要理解现有的业务,需要了解业务的各种信息。而我们所推荐的一种方式就是活文档。活文档的方式有多种多样的,在代码中一种比较简单的实现方式就是通过注解。

而由于注释本身就是文档,所以活文档的功能在实现时是与注释生成一起的,其自定义方式如下:

{
"title": "Living Documentation",
"prompt": "编写 Living Documentation。按如下的格式返回:",
"start": "",
"end": "",
"type": "annotated",
"example": {
"question": "public BookMeetingRoomResponse bookMeetingRoom(@RequestBody BookMeetingRoomRequest request) {\n        MeetingRoom meetingRoom = meetingRoomService.bookMeetingRoom(request.getMeetingRoomId());\n        BookMeetingRoomResponse response = new BookMeetingRoomResponse();\n        BeanUtils.copyProperties(meetingRoom, response);\n        return response;\n    }",
"answer": "    @ScenarioDescription(\n        given = \"there is a meeting room available with ID 123\",\n        when = \"a user books the meeting room with ID 123\",\n        then = \"the booking response should contain the details of the booked meeting room\"\n    )"
}
}

这里的 example 是为 LLM 提供一个示例,以更符合生成的结果。从实现上,远比先前的完成自定义复杂得多。

专有的新特性:API 测试数据生成

专有特性是三种模式中最简单的,也是最不对用户负责的。我们直接将功能放入到了系统中,用户的系统菜单和交互变得异常臃肿。

在实现上,也只需要根据这些场景做一些简单的接口和实现即可。

总结

开发一个 AI 原生应用并不是一件简单的事。我们应该思考:如何将生成式 AI 应用对更有价值的日常活动中?我们应该思考:如何将更多的自主性和决定权交由用户?

如果你也有兴趣来探索,欢迎来 AutoDev 探索:https://github.com/unit-mesh/auto-dev 。


AutoDev 功能全景

76415c939d6a6f5c8d41ee984c6529b6.png

Unit Mesh 开源项目全景(https://github.com/unit-mesh/)

a6b073db220c60448f646a41bdf2c883.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1235773.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

云计算:开辟数字时代的无限可能

云计算是一项革命性的技术,为企业和个人提供了灵活、可扩展和高效的计算资源。本文将介绍云计算的概念、架构和优势,并探讨其在数字化时代的重要性和未来发展趋势。 引言 随着信息技术的日新月异和数字化转型的浪潮席卷全球,云计算作为一种颠…

OpenLDAP配置web管理界面PhpLDAPAdmin服务-centos9stream

之前已经发了一篇关于centos9下面配置openldap多主高可用集群的内容,不会配置ldap集群的请参考:服务器集群配置LDAP统一认证高可用集群(配置tsl安全链接)-centos9stream-openldap2.6.2-CSDN博客 这里跟着前篇文章详细说明如何配置…

【教程】cpp转python Nanobind 实践 加速轻量版 pythonbind11

主要是尝试一下把c这边的函数封装打包给python用,选择nanobind的原因是:1. 优化速度快,2. 生成二进制包小,不过pythonbind11是更为广泛知道的,nanobind也是pythonbind11作者后续做的,可以查看作者写的 why …

重生之我是一名程序员 37

哈喽啊大家晚上好! 今天呢给大家带来一个烧脑的知识——C语言中的栈溢出问题。那什么是栈溢出呢?栈溢出指的是当程序在执行函数调用时,为了保护函数的局部变量和返回地址,将这些数据存储在栈中。如果函数在函数调用时使用了过多的…

基于SSM的进销存管理系统设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

letcode::最小栈

最小栈 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void pop() 删除堆栈顶部的元素。int top() 获取堆栈顶部的元素。…

Mybatis系列之 parameterMap 弃用了

我 | 在这里 🕵️ 读书 | 长沙 ⭐软件工程 ⭐ 本科 🏠 工作 | 广州 ⭐ Java 全栈开发(软件工程师) 🎃 爱好 | 研究技术、旅游、阅读、运动、喜欢流行歌曲 🏷️ 标签 | 男 自律狂人 目标明确 责任心强 ✈️公…

nginx-编译安装-基础指令-信号

nginx 的编译与安装 nginx目录介绍 如果我们需要整合第三方模块,需要自己编译然此模块编译到nginx里面。apt和yum的安装只具有常用的基础功能。 下载nginx wget http://nginx.org/download/nginx-1.14.0.tar.gz/auto 目录 Changes 描述了一每个版本提供了那些特…

leetcode:环形链表

题目描述 题目链接:141. 环形链表 - 力扣(LeetCode) 题目分析 我们先了解一个知识:循环链表 尾结点不指向NULL,指向头就是循环链表 那么带环链表就意味着尾结点的next可以指向链表的任意一个结点,甚至可…

2024年测试工程师必看系列之Requests_模块_知识点总结

【文章末尾给大家留下大量的福利喔】 1,导入requests模块 get请求: url host https://www.baidu.com/s headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.…

Java --- JVM之垃圾回收相关知识概念

目录 一、System.gc() 二、内存溢出与内存泄漏 2.1、内存溢出 2.2、内存泄漏 三、Stop the world 四、垃圾回收的并行与并发 4.1、并发 4.2、并行 4.3、并行 vs 并发 4.4、垃圾回收的并发与并行 五、安全点与安全区域 5.1、安全点 5.2、安全区域 六、引用 6.1…

开发上门洗衣洗鞋小程序都需要考虑哪些经营场景

互联网的高速发展让很多行业都转变了传统的服务模式,很多需要到店的服务都提供了上门的服务方式,洗护行业也是如此,越来越多的城市都开始流行上门洗衣洗鞋,要做上门的服务模式的话,就需要有一个小程序为载体&#xff0…

点击这里,获取数据治理加速器!

数据管理员:又双叒叕…盘一遍数据,这种工作究竟还要重复多少次?! • 上上个月,发现数据有些问题,我把数据盘了一遍,梳理完数据的关联表才定位到问题; • 上个月,进行数据…

redis之高可用

(一)redis之高可用 1、在集群当中有一个非常重要的指标,提供正常服务的时间的百分比(365天)99.9% 2、redis的高可用的含义更加广泛,正常服务是指标之一,数据容量的扩展、数据的安全性 3、在r…

ueditor整合到thinkPHP里

<?phpnamespace app\ueditor\controller;use think\Controller;class Ueditor extends Controller {//首页public function upload(){//header(Access-Control-Allow-Origin: http://www.baidu.com); //设置http://www.baidu.com允许跨域访问//header(Access-Control-Allow…

2023亚太杯数学建模思路 - 案例:最短时间生产计划安排

文章目录 0 赛题思路1 模型描述2 实例2.1 问题描述2.2 数学模型2.2.1 模型流程2.2.2 符号约定2.2.3 求解模型 2.3 相关代码2.4 模型求解结果 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 最短时…

使用JMX监控ZooKeeper和Kafka

JVM 默认会通过 JMX 的方式暴露基础指标,很多中间件也会通过 JMX 的方式暴露业务指标,比如 Kafka、Zookeeper、ActiveMQ、Cassandra、Spark、Tomcat、Flink 等等。掌握了 JMX 监控方式,就掌握了一批程序的监控方式。本节介绍 JMX-Exporter 的使用,利用 JMX-Exporter 把 JMX…

ODBC配置数据源及相关问题(“找不到工程和库”“实时错误91对象变量或with块变量未设置”等)

目录 背景遇到的问题及解决步骤1、找不到工程和库问题分析问题解决 2、 实时错误91&#xff0c;对象变量或with块变量未设置问题分析问题解决 3、文件dsn配置问题什么是dsn文件&#xff0c;内容是什么&#xff0c;作用是什么ODBC配置dsn文件配置文件dsn默认路径ODBC 32位和64位…

股票统计信息(七)

7-统计信息 文章目录 7-统计信息一. 股票周级别统计信息二. 查询可支持的所有的股票资金类型三. 股票图形统计信息四. 查询当前用户自选表里面最近十天的交易信息五. 查看天/星期范围统计的历史记录六. 查看最近多少天某个属性的涨跌幅度值 一. 股票周级别统计信息 接口描述: …