让AI替代50%的工作 —— AI 辅助 Debug 与智能修复

176 阅读6分钟

本文以及本专栏正在参加豆包 Marscode 专栏征文活动,如何喜欢欢迎投票支持,这将对我们意义非凡,每天都可以投一次
投票链接
以下实战案例均使用豆包 MarsCode AI 工具,欢迎大家尝试!

想要提升编程效率,释放创造力?快来体验 豆包 MarsCode 编程助手!作为一款由豆包打造的智能编程工具,MarsCode 提供智能代码补全、单测生成、代码解释等强大功能,全面覆盖编程的各个环节,让你从写代码到调试的每一步都更加高效。

无论是快速生成代码片段、优化注释、发现并修复代码问题,还是通过 AI 问答解决开发中的疑惑,MarsCode 都能帮你轻松搞定!支持 Python、JavaScript、TypeScript 等超过 100 种语言,兼容主流 IDE,如 VSCode 和 JetBrains,让开发无缝衔接。

数据安全更是无忧:Marscode 采用加密传输,严格保护用户隐私,确保数据不被用于二次训练。

立即安装 MarsCode,登录即可享受 AI 助力编程的全新体验! 开启效率新篇章,从 MarsCode 开始!
www.marscode.cn/


这一章主要讨论使用 AI 辅助 Debug,这是我个人最常用的 AI 场景。

Debug 过程是非常痛苦的,很多时候的流程是:

阅读大量的错误信息、日志和代码 ⇒ 思考可能的出错位置 ⇒ 思考可能的解决方式并尝试 ⇒ 再回到查看错误信息、日志和代码。很多 bug 会在这个过程中循环很久。

并且,有些 bug 是由于自己没注意到的细节,毕竟我们很难认真阅读每个细节;或者是因为一些未知的代码机制和表现,因为我们可能没有踩过类似的坑,对某些代码机制的细节不了解,如果没有新知识的输入,我们可能很难意识到如何去解决这个 bug;或者是一些我们知道但忽略了的代码机制。

也就是说,调试代码之所以比较痛苦,是因为:

  • 阅读量大:包括错误信息、日志、代码、文档、网上的解决方案。
  • 知识储备要求高:语言和库有太多机制和细节,很多细节需要踩过坑才知道。
  • 精力消耗大:如果是细节问题,我们需要认真阅读和斟酌大量代码和配置。
  • 分析能力要求高:这依赖于调试经验,我们需要根据一些现象去分析可能的错误根源。

所以程序员都谈 debug 色变,但就我个人体验来说,恰当使用 AI 能极大程度地改善这个问题。这一章节我们就来介绍在调试时使用 AI 的一些技巧。

AI 解析代码

由于代码和第三方库的细节机制和逻辑非常多,如果遇到我们不熟悉的部分,就很容易卡在奇怪的地方。

这里我们假设自己是一个刚入门的程序员,用 Node.js 写了一个简单的读取文件内容,然后拼接并输出的代码:

const fs = require("fs");

function readFiles(files) {
  let contents = [];
  files.forEach((file) => {
    // 读取文件内容
    fs.readFile(file, "utf8", (_, data) => {
      // 将文件内容添加到数组中
      contents.push(data);
    });
  });
  // 返回所有文件内容
  return contents;
}

const files = ["data/file1.txt", "data/file2.txt", "data/file3.txt"];
const allContents = readFiles(files);
console.log(allContents);

这段代码看起来很正常,也是很多初学者会写出来的代码,但运行后会发现输出是 [],也就是没有读取到任何文件的内容。

对于新手来说,这是学习编程时非常容易遇到的一个坎。当你不知道某个知识点的情况下,无论看这段代码多少遍,都觉得没什么问题,甚至不知道该如何搜索来解决这个问题。

在这种情况下,我们可以直接询问 AI,不需要特别的 prompt 技巧,用非常直接的描述来询问:

Code 2024-10-09 11.52.31.png

这意味着,当我们是编程的新手,或者学习一门新的语言时,即使没有解决 bug 所需要的知识,也能通过 AI 丰富的知识库,来帮我们找到解决这个问题的方法。

更进一步,如果你对异步完全不了解,你也可以询问 AI,让它一步步讲解:

Code 2024-10-09 11.57.33.png

这里常用的提示关键词有:详细解释、举例说明、举常见用法、用贴近某个业务的例子解释,等等,让 AI 用你习惯的方式来解答问题。

报错解读

现代的工具链在出错时都会输出详细的错误信息,但由于多种原因,导致大家很难仔细阅读这些报错。首先是语言,大多数报错是纯英文的,阅读起来有难度。在阅读中文时,我们可以速读找到关键词,而阅读英文时,就很难速读,需要逐行解读;并且很多报错的长度较长,阅读起来费时费力;错误信息和真实的根本原因(root cause)有一定距离,从中提取有价值的信息需要丰富的经验。

这些都困扰着程序员根据报错来解决问题,而有效利用 AI 可以辅助我们解决这个问题。在这里,我们需要提供合适的上下文,例如原始代码、想要实现的功能等辅助信息。

一般使用的提示:

在这段代码中:<your-code>
我想实现 xxx 功能,现在遇到报错,帮我解读这个报错:
<error>
在这段代码中:<your-code>
运行报错:<error>
帮我提取报错中值得关注的点,并分析其对应的原因和可能的知识点。

让 AI 分析可能的报错原因:

分析可能的报错原因,给我十个可能的原因和理由。

我们可以从这些可能的原因中得到一些灵感,之后有了自己的思路,再让 AI 帮助继续思考:

我认为可能是 xxx 原因导致的报错,基于此,帮我进一步分析。

在发现了可能的报错原因后:

我认为导致 <error> 报错的根本原因是 <reason>,现在的代码是 <code>,给我提供三个解决方案,并解释原因和对比优劣。

从中挑选合适的解决方案,然后修改代码,再次运行,根据新的报错进行进一步交互:

为了解决 <error-1> 报错,我将代码修改成了 <code-2>,现在报错 <error-2>,帮我解读可能的原因。

然后继续循环这个流程。

回顾使用 AI 辅助调试的过程,AI 解决的问题是:

  • 代码解读:代替人类分析代码中可能出错的细节,这对 AI 来说是简单的任务,但人类做起来比较费时费力。
  • 报错解析:AI 可以一次性阅读大量的错误信息,从中提取出值得关注的细节,供人类进一步解读。
  • 头脑风暴:对错误的解读需要联想能力,从报错中想到可能的原因。由于 AI 的思考成本低,我们可以让 AI 提供数十个可能的报错原因,供人类参考。

以上就是在调试过程中使用 AI 的一些技巧,合理利用 AI,可以极大地提升调试效率,减轻调试的痛苦。