AI 日报

这个“搭子”不赖!用AI实现结对编程

  • By 51ITO
  • Jan 12, 2024 - 2 min read



译者 | 陈峻

审校 | 重楼

您听说过“结对编程(Pair Programming)”的概念吗?根据维基百科,它是由两名程序员共同开展软件开发的一种方式。其中的一名程序员(或称“驾驶员”)负责编写代码,另一名程序员(或称“观察员”或“领航员”)需要在对方输入每一行代码时,对其进行审查。而且,两名程序员经常会互换角色。在审查的过程中,“观察员”还会考虑工作的“战略”方向,提出改进意见,以及有待未来解决的问题。此举的目的在于基于“观察员”的指导,“驾驶员”能够将注意力全部集中在完成当前任务的“战术”方面。

在过去的两周里,我与人工智能(AI)一起,以结对编程的方式,在一个陌生的开发环境中,使用了对自己来说全新的语言和框架,重建了过往的博客。下面,我将分享该重建过程的一些与人工智能结对合作的经历。

背景介绍

为了确保人工智能在此次重建中发挥关键性作用,我制定了以下两项规则:

  1. 使用传统搜索引擎获取信息的比例不超过20%
  2. 不寻求其他开发人员的帮助。

换句话说,在这次开发和学习过程中,人工智能成为了我的主要信息来源、合作伙伴和助手。从某种意义上说,这种合作类似于我们在开篇提到的、通过让人工智能在其中扮演伙伴的角色,与之开展“结对编程”。因此,在整个过程中,我使用到了GitHub CopilotChatGPTClaudeWarp(一种人工智能助手)等服务,并且将它们视为重要的编程“伙伴”。

选择技术栈

在选择技术栈的阶段,我主要依靠的是ChatGPTClaude。通过向他们提供我的技术背景和具体要求等详细信息,我在多轮沟通中逐渐明确了自己需要的编程语言、框架和编辑器。

如您所知,与人工智能的对话可谓既自由又发散。每当人工智能给出建议或提示时,我都会深入研究其对应的方向和细节,并定期总结自己的理解,以便再次与人工智能进行确认。与几个月前相比,GPT-4Claude 2已不再一味地去迎合提问者,而是及时、礼貌地指出了我的理解总结中的错误,并有效地避免了我在错误的道路上越走越远。最终,我选择了TypeScriptAstroTailWindCSSVSCode作为博客重构的必要技术。

在此阶段,人工智能为我高效地提供了有价值的信息,而且帮助我快速地做出了决策。究其原因,我归结为如下方面:

  1. 明确的要求:清晰且通俗易懂的需求,能够简化与人工智能沟通的整个过程,并使之快速明白提问者的意图。
  2. 成熟的技术选择:我所选择的技术堆栈是由成熟的项目组成。这些项目通常拥有活跃的在线社区和丰富的官方文档。这些信息为人工智能提供了可靠的语义资源,并确保了人工智能够对其涉及到的技术有深入理解。
  3. 结合个人经验:利用自己在其他编程语言方面的经验,我在“结对”讨论中,使用了熟悉的语言、框架、以及开发环境作为参考,以帮助人工智能更好地理解我的需求。
  4. 多个人工智能平台的互补性:我同时在ChatGPTClaude上开展了讨论。虽然在大多数情况下,两个平台提供的信息整体相似,但是偶尔也出现不同的方向,这就相当于您的“结对”中多了一个伙伴。
  5. 人工判断不可或缺:尽管与传统搜索相比,人工智能提供的信息总量有所减少,但是如果用户缺乏分析能力和决策能力的话,他们可能仍然会犯“选择困难症”。因此,提问者必须具备较强的分析和判断能力。否则,过度的自由可能会阻碍我们获得令人满意的结果。

设置开发环境

虽然我曾用过VSCode,但是从未将其作为我的主要开发工具。同时,我在安装Node.js和使用NPM方面的经验也相对有限。对此,AI详尽地协助我构建出了开发环境。

值得一提的是AI回答命令行操作的过程。鉴于由Warp提供的AI助手使用起来非常便捷,因此在遇到错误时,我只需点击闪电()按钮,AI助手便会自动将相关命令和输出作为上下文,提交给人工智能。相比之下,在GitHub Copilot中,我得需要手动选择有待解释的输出内容,以确保上下文的完整性。虽然我可以使用右键菜单中的人工智能选项、或快捷命令@workspace /explain #terminalSelection来完成这项工作,但总归不如Warp便捷。

Xcode的集成测试环境不同,在VSCode中,开发人员需要根据所使用的语言和框架,来选择合适的测试框架和插件。在此过程中,我曾遇到了一些困难。起初,我试图根据人工智能的建议安装Jest,但由于开发环境与Astro的兼容性问题,而未能成功。在与人工智能讨论了几次未果后,我转而使用了搜索引擎,不过仍然找不到解决方案。最终,网上的一篇文章提及了一个我从未告知AI的知识点,及其有关配置的背景信息。据此,在人工智能的指导下,我成功实现了对Jest框架的配置。

不过,在随后的单元测试中,我又发现Jest无法与Astro的运行环境协同工作。通过查阅Astro的官方文档,我发现其实ViTest是更适合Astro的测试框架。而且,ViTest的安装过程非常便利,可以完美地运行Astro代码的测试。

因此,在该项目中,我最终配置了两个测试框架,即:将ViTest用于Astro特定测试,并将Jest用于其他测试。

此外,不知道是否配置问题,GitHub Copilot通过快捷命令所生成的默认测试代码是基于Jest的。而为了生成适合ViTest的测试代码,我需要通过与AI对话,明确提出该请求方可。

通过上述经历,我意识到:即使有人工智能和搜索引擎的帮助,最权威的信息来源仍然是官方文件。也就是说,虽然人工智能对这些文件有相当的了解,但有时也会遗漏一些关键信息。可见,官方文件具有无可替代的权威性,仍然是我们首选的信息来源。

通过代码阅读学习新的语言

通过阅读由Astro提供的官方模板,我了解了Astro,也是学习TypeScript的最佳途径。同样,在此阶段,人工智能起到了决定性的辅助作用。它大幅提高了我的学习效率。在Astro项目中,Astro文件可能包含诸如:TypeScriptJavaScriptHTMLCSS、以及特定的Astro标记与用法等各种元素。显然,对于像我这样没有相关经验的人来说,如果没有人工智能的帮助,将很难知晓该从何处开始。

虽然Astro相比其他框架来说更新,但是人工智能的知识库已经能够对其拥有足够的了解,并可以清楚地指出代码不同部分的含义。通过人工智能对于具体代码的详细解释,我逐渐理解了代码的结构和逻辑。甚至,对于那些我不理解的地方,它也能按需给出进一步的解释。

在与AI讨论的过程中,我充分利用了自己对于其他编程语言和框架的了解,作为与人工智能对话的参考。同时,我还会定期总结自己的理解,并请人工智能帮助纠正其中的错误认识。此外,随着讨论的深入,我也会定期要求人工智能提供之前讨论过的结论,以作记录之用。

该阶段有关的代码解读和讨论,主要是在GitHub Copilot中进行的。虽然GitHub Copilot的总体表现良好,但我们在使用过程中仍有一些事项需要注意,例如:

  1. 如果没有选择特定的代码,GitHub Copilot只会解释当前编辑窗口中可见的代码。
  2. 为了向GitHub Copilot提供更多的上下文,我们有必要手动选择要提交的代码,以作为当前问题的上下文。
  3. GitHub Copilot不支持跨多个文档的讨论,因此用户需要自己整合不同文档的内容,才能形成完整的上下文。
  4. GitHub Copilot的答案有长度限制。如果答案太长,它可能会提示涵盖掉了已提供的代码。在这种情况下,我们可能需要ChatGPTClaude的帮助。
  5. 在某些情况下,GitHub Copilot提供的答案质量可能不如ChatGPT

编程实践

根据提示自动生成代码,是开发人员体验人工智能强大功能的最佳方式之一。最近在开发者社区中热议的、前文已提到的GitHub Copilot,既有能力理解开发者的意图,又能够实时生成高质量的代码。对于我的博客重构项目而言,我不仅想创建一个新的博客,而且希望在此过程中学习和掌握新的语言和框架。对此,在启用了GitHub Copilot后,只要我提供了足够多的提示和注释,Copilot就能够快速地生成相应的代码。

起初我认为这样挺好,但是随着使用的深入,我发现自己在短时间内,居然养成了向人工智能索取程序代码的习惯。它让我更关注的是注释对代码生成的影响,而不是具体代码的实现概念。这显然与我想通过重构来掌握一门新的语言的愿望是相矛盾的。面对人工智能给出的代码结果,我甚至产生一种以为自己已经掌握了这门语言的错觉。

意识到这种情况后,我只有在无法独立实现代码的时候,才会启用GitHub Copilot的实时代码生成功能。也就是说,不管写得好不好,我都会先尝试着先自己写,然后让人工智能帮我发现问题,进而逐步提高代码的可读性和可用性。在这个过程中,我会向人工智能请教语法上的细节,让人工智能指导我使用更符合TypeScript的编程范式、以及更合适的代码实现方法。

由于同一功能的代码会被多次重复创建,因此提前创建单元测试是非常重要的。在VSCode中,无论是Jest还是ViTest,都可以启用自动化测试,以便代码在被修改后,立即运行测试。我希望Xcode也能提供类似的功能。毕竟在不断修改代码的过程中,经常会出现需要优化或纠正错误的情况。我们只有通过测试,才能及时发现问题。

小结

经过这段时间与人工智能产品的密切合作,我逐渐认识到:在有效利用人工智能的同时,保持个人技术成长和独立思考的重要性。面对势不可挡的人工智能的飞速发展趋势,它将毫无疑问地对我们未来的生活和工作等方方面面产生深远的影响。

目前,人工智能已经具备了快速编写代码的能力,许多开发人员或多或少地担心会被它所取代。作为一名开发人员,我认为避免被取代的关键在于:不断提高自身技能,展现人工智能无法取代的独特价值。也就是说,过度地依赖人工智能确实可以在某些方面提高工作效率,或者实现以前不可能实现的结果。但是长此以往,开发者可能会逐渐丧失自身优势,最终从人工智能工具的使用者,很可能会转变为人工智能工具的助手:人类提示生成器(Human Prompt Generators)。当然,总的来说,人工智能在帮助我的学习和重建过程中,确实给我带来了巨大的惊喜。将来,我计划将人工智能更多地融入自己的工作。

译者介绍

陈峻(Julian Chen),51CTO社区编辑,具有十多年的IT项目实施经验,善于对内外部资源与风险实施管控,专注传播网络与信息安全知识与经验。

原文标题:Pair Programming with AI,作者:fatbobman