共计 4079 个字符,预计需要花费 11 分钟才能阅读完成。
您是否听说过“结对编程(Pair Programming)”这一概念?根据维基百科的定义,这是一种由两名程序员共同进行软件开发的方式。在这个过程中,一名程序员被称为“驾驶员”,负责代码的编写,而另一名程序员则被称为“观察员”或“领航员”,其任务是在“驾驶员”输入每一行代码时进行审查。此外,两名程序员之间常常会互换角色。在审查过程中,“观察员”不仅会关注代码的质量,还会考虑整体工作的“战略”方向,提出改进建议及未来需解决的问题。这样的安排旨在使“驾驶员”能够在“观察员”的指导下,专注于当前任务的“战术”落实。

在过去的两周里,我与人工智能(AI)合作,采用结对编程的方式,在一个全新的开发环境中,运用对我而言陌生的语言和框架,重建了我的博客。接下来,我将分享这一重建过程中与人工智能合作的一些经历。
背景概述
为了确保人工智能在重建过程中发挥重要作用,我设定了以下两条规则:
-
通过传统搜索引擎获取信息的比例不得超过20%。
-
不向其他开发人员寻求帮助。
换句话说,在这次开发和学习过程中,人工智能成为了我最主要的信息来源、合作伙伴和助手。可以说,这种合作方式类似于我们开头提到的“结对编程”,让人工智能在其中扮演伙伴的角色。因此,在整个过程中,我使用了 GitHub Copilot、ChatGPT、Claude 和 Warp 等工具,并将它们视为我编程的“伙伴”。
技术栈的选择
在选择技术栈的阶段,我主要依赖于 ChatGPT 和 Claude。通过向它们提供我的技术背景及具体需求,我在多轮交流中逐渐明确了自己需要的编程语言、框架和编辑器。
众所周知,与人工智能的交流相当灵活且广泛。每当人工智能提供建议时,我都会深入探讨相应的方向与细节,并定期总结自己的理解以便再次与人工智能确认。相比几个月前,GPT- 4 和 Claude 2 不再只是迎合提问者,而是及时、礼貌地指出我理解中的错误,有效地避免我陷入误区。最终,我选择了 TypeScript、Astro、TailWindCSS 和 VSCode 作为博客重建的核心技术。
在这一阶段,人工智能高效地为我提供了有价值的信息,并帮助我迅速做出决策。这种高效的原因可归结为以下几点:
-
明确的需求:清晰且易于理解的需求,使与人工智能的沟通变得简单,帮助其快速抓住提问者的意图。
-
成熟的技术选择:我选择的技术堆栈由成熟的项目构成,这些项目通常拥有活跃的在线社区和丰富的官方文档,为人工智能提供了可靠的语义基础,确保其对相关技术的深入理解。
-
结合个人经验:我在其他编程语言上的经验,使我在“结对”讨论中使用熟悉的语言、框架和开发环境作为参考,帮助人工智能更好地理解我的需求。
-
多个人工智能平台的互补性:我同时在 ChatGPT 和 Claude 上进行讨论。尽管这两个平台在大多数情况下提供相似的信息,偶尔也会有不同的建议,相当于在“结对”中增加了一个伙伴。
-
人工判断的重要性:尽管与传统搜索相比,人工智能提供的信息量有所减少,但如果用户缺乏分析和判断的能力,仍可能面临“选择困难”。因此,提问者必须具备良好的分析和判断能力,否则,过于宽松的自由度可能会妨碍获得理想结果。
开发环境的设置
虽然我以前使用过 VSCode,但从未将其作为主要开发工具。同时,我在安装 Node.js 和使用 NPM 方面的经验也相对有限。在这方面,AI 详细指导我构建了开发环境。
探索开发工具与人工智能的结合
特别值得一提的是,AI 在命令行操作中的应用过程。由于 Warp 提供的 AI 助手使用起来极为便利,当我遇到错误时,只需轻触闪电(⚡️)按钮,相关命令及其输出便会自动作为上下文提交给 AI。与之相对,在 GitHub Copilot 中,我必须手动挑选需要解释的输出内容,以确保上下文完整。虽然通过右键菜单的 AI 选项或快捷命令 @workspace /explain #terminalSelection 可以完成这项任务,但总的来说,Warp 的操作更为简便。
与 Xcode 的集成测试环境不同,使用 VSCode 的开发者必须根据所选语言和框架,来选择合适的测试框架和插件。在这个过程中,我遭遇了一些挑战。起初,我尝试按照 AI 的建议安装 Jest,但因开发环境与 Astro 的兼容性问题未能成功。在与 AI 几次交流无果后,我转向了搜索引擎,仍然没有找到解决方案。最终,一篇网络文章提到了一些我从未告知 AI 的配置背景信息,经过 AI 的指导,我终于成功配置了 Jest 框架。
然而,在进行后续的单元测试时,我再次发现 Jest 无法与 Astro 的运行环境协同工作。通过查阅 Astro 的官方文档,我意识到 ViTest 实际上是更适合 Astro 的测试框架。此外,ViTest 的安装过程十分便捷,能够完美运行 Astro 代码的测试。
因此,在这个项目中,我最终配置了两个测试框架,具体而言:使用 ViTest 进行 Astro 特定测试,而 Jest 则用于其他测试。
另外,不知是否是配置问题,GitHub Copilot 生成的默认测试代码是基于 Jest 的。为了生成适合 ViTest 的测试代码,我需要通过与 AI 的对话,明确提出这一请求。
通过上述经历,我逐渐认识到:即使有人工智能和搜索引擎的辅助,最权威的信息来源依然是官方文档。尽管 AI 对这些文档有相当的了解,但有时也会遗漏一些关键信息。这说明,官方文件的重要性是无可替代的,仍然是我们获取信息的首选。
通过代码阅读掌握新语言
通过阅读 Astro 提供的官方模板,我深入理解了 Astro,并且这也是学习 TypeScript 的最佳途径。在这个阶段,人工智能发挥了至关重要的作用,大大提升了我的学习效率。在 Astro 项目中,Astro 文件可能包含 TypeScript、JavaScript、HTML、CSS 以及特定的 Astro 标记和用法等多种元素。显然,对于缺乏相关经验的我来说,若没有人工智能的帮助,几乎无法找到学习的起点。
虽然 Astro 相较于其他框架较新,但人工智能的知识库已足以对其进行有效解读,并能清楚指出代码各部分的含义。借助人工智能对具体代码的详细解析,我逐渐掌握了代码的结构和逻辑。即使对于某些我不理解的地方,AI 也能及时提供进一步的解释。
在与 AI 的讨论中,我充分利用自己对其他编程语言和框架的了解,与人工智能进行对话。同时,我定期总结自己的理解,并请 AI 纠正其中的误解。随着讨论的深入,我还会定期请求 AI 提供先前讨论的结论,以便记录。
相关的代码解读和讨论主要是在 GitHub Copilot 中进行的。尽管 GitHub Copilot 整体表现良好,但使用过程中仍需注意一些事项,例如:
若未选择特定代码,GitHub Copilot 将仅解释当前编辑窗口中可见的代码。
为向 GitHub Copilot 提供更多上下文,手动选择提交的代码是必要的,这样才能形成当前问题的完整上下文。
GitHub Copilot 不支持跨多个文档的讨论,因此用户需要自行整合不同文档的内容,以形成完整的上下文。
GitHub Copilot 的回答有长度限制,若答案过长,可能会提示已覆盖的代码。在这种情况下,可能需要借助 ChatGPT 或 Claude 的帮助。
在某些情况下,GitHub Copilot提供的答案质量可能不如ChatGPT。
编程实践
自动生成代码的提示,是开发者体验人工智能强大潜力的重要途径之一。近期在开发者圈中热议的 GitHub Copilot,不仅能够洞察开发者的意图,还能实时创造出高质量的代码。对于我正在进行的博客重构项目,我不仅仅想要搭建一个全新的博客,同时希望在这个过程中学习并掌握新的编程语言和框架。因此,启用 GitHub Copilot 后,只要我提供足够的提示和注释,它便能迅速生成相关代码。
起初,我觉得这种方式非常不错,但随着使用的深入,我意识到自己在短时间内竟然养成了依赖人工智能生成代码的习惯。这样的依赖让我过于关注注释对代码生成的作用,而忽视了具体代码实现的基本概念。这显然与我希望通过重构掌握新语言的目标相悖。面对人工智能输出的代码结果,我甚至产生了自己已经精通这门语言的错觉。
意识到这一问题后,我决定只有在无法独立实现代码时,才会借助 GitHub Copilot 的实时代码生成功能。换句话说,不论代码质量如何,我都会先尝试自己编写,然后请人工智能帮助我识别问题,从而逐步提升代码的可读性与实用性。在这一过程中,我会向人工智能询问语法细节,请它指导我使用更符合 TypeScript 的编程范式和更适合的实现方法。
由于同一功能的代码可能会被多次重复编写,因此提前进行单元测试显得尤为重要。在 VSCode 中,无论是使用 Jest 还是 ViTest,都可以启用自动化测试,以便在代码修改后立即执行测试。我希望 Xcode 也能具备类似的功能。毕竟在不断修改代码的过程中,往往会出现需要优化或修正的情况,只有通过测试,我们才能及时发现潜在的问题。
小结
经过一段时间与 人工智能产品的密切合作,我逐步认识到:在有效利用人工智能的同时,保持个人技术的成长和独立思考是至关重要的。面对飞速发展的人工智能技术,它毫无疑问将对我们未来的生活和工作产生深远的影响。
如今,人工智能已经具备了迅速编写代码的能力,许多开发者或多或少地担心自己会被取代。作为一名开发者,我认为避免被取代的关键在于:不断提升自身技能,展示人工智能无法替代的独特价值。换句话说,虽然过度依赖人工智能确实可以在某些方面提高工作效率,或实现曾经无法实现的结果,但长此以往,开发者可能会逐渐失去自身优势,最终从人工智能工具的使用者转变为其助手:人类提示生成器(Human Prompt Generators)。当然,总体而言,人工智能在我学习和重建的过程中确实带来了巨大的惊喜。未来,我计划在工作中更加充分地融入人工智能。


结对编程的方式确实很新颖,AI的角色扮演让我觉得编程不再孤单。