利用AI和Dagger,自愈工作流有望通过自动化错误检测、生成测试覆盖率和迭代优化代码来提高代码质量。
译自 Use These AI Workflows To Reduce Your Technical Debt,作者 Kambui Nurse。
技术债务通常是许多软件开发组织中,尤其是在构建和测试过程中创新的主要阻碍。随着代码库的增长和复杂性的提高,快速的修复和遗留系统不断累积,从而导致效率低下,减慢构建速度,增加测试时间,并引入脆弱的依赖关系。
最初为了满足眼前的目标而做出的微小权衡可能会演变成严重的瓶颈,从而使扩展和迭代变得更加困难。对于旨在保持敏捷性的软件组织而言,解决这一债务至关重要,以确保其CI/CD管道保持快速、可靠并能够支持快速的功能交付。
然而,与此同时,它往往似乎是一个棘手的问题。我们知道我们应该投资,我们也试图取得进展,但感觉就像逆流而上。尽管我们进行了投资,但技术债务仍在不断累积。
一些人提出将AI作为一种解决方法。将AI指向你的基础设施,它就能神奇地开始变得更好,这难道不是很好吗?作为一个拥有超过20年经验的冷静工程师,我已经学会忽略供应商的炒作和灵丹妙药的白日梦。但事实证明,在这种情况下,可能确实有一些东西。
你听说过自主式工作流吗?这种新的AI方法具有令人难以置信的潜力,也是我在过去几个月里大力投资的一个领域,因为它可能是我们解决我们所有人积累的大量技术债务的最佳机会。
自主式工作流是指自主软件代理承担传统上需要人工决策或干预的任务。
关键期望特性:
- 自主性: 代理应该独立于人工指导运行,根据预定义规则或AI驱动的算法执行任务,无需来自人类的提示或指示
- 主动性: 代理需要能够根据不断变化的条件或模式来预测需求、启动行动或提出建议
- 适应性: 与僵化的脚本或手动流程不同,我们希望代理能够适应实时数据、意外变化或新需求,根据需要重新配置工作流
- 决策能力: 代理应该能够通过分析数据、权衡选择和确定工作流环境中最佳行动方案来做出复杂的决策
- 目标导向: 自主式工作流应该专注于实现特定结果,而不仅仅是完成预定义的步骤。
自主式工作流有望改变我们测试和构建软件的方式,但我们必须从某个地方开始。我决定选择一个困扰我组织的简单问题,以展示AI在软件开发管道中的潜在能力。
在许多组织中,确保完整的代码覆盖率可能是一项艰巨的任务。我们的代码库有多少应该由自动单元测试进行测试?开发人员经常必须在截止日期和质量之间取得平衡,导致代码仓促完成且测试不足。这种缺乏测试覆盖率会带来风险,因为未经测试的代码部分可能包含错误或不兼容性。
AI可以在哪里提供帮助?
- 生成单元测试: 使用AI自动为代码的未测试部分生成单元测试
- 覆盖率报告: 使用覆盖率报告来识别测试不足的区域,然后提示AI为这些区域生成测试
传统的构建工具、CI平台和像Docker这样的容器引擎有其作用,但它们无法提供我们自己实现所需目标的必要功能。几年前,我开始使用Dagger,这是Solomon Hykes和Docker早期技术团队正在开发的新的面向管道的容器引擎。我花在Dagger上的时间越多,就越能看到它改变我们从根本上管理软件管道的潜力。
为什么我喜欢 Dagger?因为它通过提供一个对复杂管道系统的抽象层,简化了工作流的创建和部署。Dagger 允许开发人员自动化并在使用容器的环境中分配任务。它在管理依赖项、容器化和 CI/CD 管道方面发挥着重要作用,同时也允许开发人员通过模块化设计定制其工作流。在这种情况下,Dagger 在管理代理工作流背后的基础设施方面至关重要。该系统使用 Dagger 创建、运行和管理封装 AI 生成的代码的 Docker 容器。这确保了代码在一致的环境中执行。
但是 Docker 呢?我们仍然使用它,但用于其设计目的。生成的代码在 Docker 容器中运行,允许一致且隔离的测试环境。Dagger 与 Docker 无缝集成,使管理容器化工作流更容易,无需人工监督。
如果没有 Dagger,我能做到吗?当然可以,但是 Dagger 大大简化了处理依赖项的过程。在我的初始设计中,管理 AI 代码生成工具的各种依赖项非常繁琐。Dagger 通过在运行时自动处理依赖项来帮助降低复杂性。
我首先构建了一个试点项目,该项目使用 AI 创建工作流来生成单元测试。AI 分析覆盖率报告并根据未覆盖的代码生成测试用例。以下是流程的工作方式:
- AI 生成: AI 根据覆盖率报告中确定的差距生成代码。
- 执行和错误处理: 生成的代码在容器中执行,并在其中检测错误。
- 反馈循环: 如果发现错误,AI 会接收该反馈并改进其生成的代码,从而创建一个持续改进循环。
将工作流集成到 CI 管道中,允许在每次将新代码推送到存储库时自动测试生成的单元测试。这确保了每个代码提交都经过质量和正确性验证,从而降低了将错误引入生产环境的风险。
这里的关键创新是创建一个自纠正循环,其中 AI 生成的代码在每次迭代中都会得到改进。循环的工作方式如下:
- AI 根据输入数据生成初始解决方案。
- 执行代码,并返回错误(如有)。
- 将这些错误反馈到 AI 模型中,使其能够改进下一次迭代。
- 重复此过程,直到代码成功运行或达到预定义的迭代次数。
此循环使系统随着时间的推移越来越准确,解决了代码生成不完整或不正确的常见问题。该试点的循环用于改进 AI 生成功能单元测试的能力。
最初,我将其构建为一个可以生成单元测试的 VS Code 扩展。但是,我很快发现这会使扩展难以跨不同的开发环境进行扩展。由于大型组织中的开发人员使用许多编辑器,我需要创建多个版本的扩展才能支持我的所有开发人员。
更优雅的版本是利用 Dagger 创建一个分布式 CLI,它可以在不依赖特定编辑器的情况下运行 AI 模型并生成测试。这允许更灵活的解决方案,可以在不同的工具中使用,无需构建特定于编辑器的扩展。
这种代理工作流的潜在应用非常广泛。除了生成单元测试之外,我还看到了将系统扩展到执行其他与代码相关的任务的潜力,例如:
- 重构代码: AI 可以建议重构以使代码更高效或更容易测试。
- 持续代码审查: AI 可以通过自动生成评论或改进建议来参与拉取请求。
- 自愈工作流: 系统可以自动生成针对测试期间检测到的问题的修复程序,允许 AI 建议更改并实施更改。
计划开发 Python 和其他编程语言的插件,以支持多种编程语言,从而在不同项目中更广泛地使用工作流。
将AI集成到软件开发中,有可能显著减少编写单元测试和执行代码审查等手动任务所需的时间和精力。我的早期探索已经证明了如何利用现成的AI工具以及新兴的Dagger开源框架来创建可扩展的分布式工作流,这些工作流使用AI来自动化和改进这些流程。实现具有自我纠正循环的系统应该能够提高代码质量,同时减轻开发人员的测试负担。
这种自主工作流是当今开发团队的强大工具,也是AI增强型开发未来的缩影。我们正处于一个令人兴奋的时代。我预计AI将改变我们工作场所中的许多常见任务。看到AI可能如何显著改进对我们公司和生活至关重要的软件的构建和测试,这令人兴奋。
如果您有兴趣查看此项目的运行实例,可以在这里查看我的试点项目的演示: