你是否了解“结对编程(Pair Programming)”这一术语?根据维基百科的定义,它是一种由两位程序员协同进行软件开发的工作方式。在这个过程中,其中一位程序员被称为“驾驶员”,负责编码,而另一位则是“观察员”或“领航员”,在每一行代码输入时进行审查。更有趣的是,这两位程序员常常会互换角色。观察员不仅要审查代码,还需关注整体“战略”方向,提供改进建议及未来需要解决的问题。这种方法旨在使驾驶员在观察员的指导下,专注于当前任务的“战术”执行。
在过去的两周里,我通过与人工智能(AI)进行结对编程,使用一种全新的语言和框架,在一个陌生的开发环境中重建了我的博客。接下来,我将分享一些与人工智能合作的经历。
项目背景
为了确保人工智能在重建过程中发挥关键作用,我制定了两项规则:
换句话说,在这次开发与学习的旅程中,人工智能成为了我主要的信息来源和合作伙伴。从某种程度上讲,这种合作模式类似于我们前面提到的将人工智能视为“结对编程”中的一员。因此,在整个过程中,我利用了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中,开发人员需要依据所选语言和框架来挑选适合的测试框架和插件。这一过程中,我遇到了一些挑战。一开始,我尝试根据人工智能的建议安装Jest,但由于与Astro的兼容性问题未能成功。在与AI多次交流未果后,我开始使用搜索引擎,但仍找不到有效的解决方案。最终,网上的一篇文章提到了一个我未曾告知AI的知识点以及相关的配置背景。经过人工智能的指导,我终于成功配置了Jest框架。
然而,在后续的单元测试中,我发现Jest与Astro的运行环境并不兼容。通过查阅Astro的官方文档,我了解到ViTest才是更适合Astro的测试框架。此外,ViTest的安装过程相对简单,能够顺利运行Astro代码的测试。
因此,在这个项目中,我最终配置了两个测试框架:将ViTest用于Astro的特定测试,而将Jest则用于其余的测试。
另外,关于配置的问题,GitHub Copilot通过快捷命令生成的默认测试代码是基于Jest的。为了生成适合ViTest的测试代码,我需要与AI进行对话,明确提出这个请求。
通过以上经历,我深刻认识到,即使有人工智能和搜索引擎的帮助,最权威的信息来源依旧是官方文档。虽然人工智能对这些文档有较强的理解能力,但有时也会遗漏一些关键的信息。这就凸显了官方文档无可替代的权威性,仍然是我们获取信息的首选。
通过代码阅读掌握新语言
阅读Astro提供的官方模板让我深入了解了Astro,同时也是学习TypeScript的绝佳方式。在这一过程中,人工智能发挥了关键作用,显著提升了我的学习效率。Astro项目中的文件可能包含诸如TypeScript、JavaScript、HTML、CSS及特定的Astro标记与用法等多种元素。显然,对于缺乏相关经验的我来说,若没有人工智能的帮助,很难确定从何入手。
尽管Astro相较于其他框架较新,人工智能的知识库却已经对其有了相当的了解,并能够清晰地解释代码各部分的含义。通过AI对具体代码的详细解读,我逐渐掌握了代码的结构和逻辑。即便对于那些我仍感困惑的部分,人工智能也能随时提供进一步的解释。
在与AI的讨论中,我充分利用了自己对其他编程语言和框架的理解,作为与人工智能交互的参考。同时,我会定期总结自己的理解,并请AI帮助纠正其中的错误认知。随着讨论的深入,我也会定期请求人工智能提供之前讨论的结论,以便记录。
该阶段的代码解读和讨论主要在GitHub Copilot中进行。尽管GitHub Copilot整体表现良好,但在使用过程中仍需注意一些事项,例如:
-
如果不选中特定代码,GitHub Copilot将只解释当前编辑窗口中可视的代码。
-
为了给GitHub Copilot提供更多上下文,用户需要手动选择待提交的代码,以作为当前问题的背景。
-
GitHub Copilot的回答有长度限制,若答案过长,可能会提示覆盖已提供的代码。在这种情况下,我们可能需要寻求ChatGPT或Claude的帮助。
在某些情况下,GitHub Copilot所提供的解答质量可能逊色于ChatGPT。
编程实践
自动生成代码的过程,是开发者体验人工智能强大功能的有效途径之一。最近被开发者社区广泛讨论的GitHub Copilot,不仅能够理解开发者的意图,还能实时生成优质代码。对于我正在进行的博客重构项目,我的目标不仅是创建一个全新的博客,同时也希望在这个过程中学习并掌握新的编程语言和框架。通过启用GitHub Copilot,只需我提供足够的提示和注释,Copilot就能迅速生成相应的代码。
起初,我认为这种方式相当不错,但随着使用的深入,我意识到自己竟然逐渐养成了依赖人工智能索取代码的习惯。这让我更加关注注释对生成代码的影响,而忽视了代码实现背后的概念。这显然与我通过重构来掌握新语言的初衷相悖。面对人工智能给出的代码结果,我甚至产生了自己已经掌握该语言的错觉。
意识到这一现象后,我决定在无法独立编写代码的情况下,才会启用GitHub Copilot的实时代码生成功能。换句话说,无论代码质量如何,我都会先尝试独立完成,然后让人工智能帮助我找出问题,从而逐步提升代码的可读性与实用性。在这个过程中,我会咨询人工智能语法上的细节,寻求其建议,以便更好地应用TypeScript的编程范式和适合的代码实现方法。
由于同一功能的代码往往需要多次重复构建,因此提前设置单元测试显得尤为重要。在VSCode中,无论是使用Jest还是ViTest,都可以启用自动化测试,以便在代码修改后立即运行相关测试。我希望Xcode也能够提供这样的功能。毕竟在频繁修改代码的过程中,常常会遇到需要优化或修复错误的情况,只有通过测试,才能及时发现并解决问题。
小结
经过这段时间与人工智能产品的紧密合作,我逐渐认识到:在充分利用人工智能的同时,保持个人技术发展和独立思考的重要性。面对不可逆转的人工智能快速发展趋势,其必将对我们未来的生活和工作等各个方面产生深远的影响。
目前,人工智能已经具备了迅速编写代码的能力,许多开发者或多或少地担心会被其取代。作为一名开发者,我认为避免被取代的关键在于:持续提升自身技能,展示人工智能无法替代的独特价值。也就是说,虽然过度依赖人工智能确实能在某些方面提高工作效率,或者实现以往难以实现的结果,但长期以来,开发者可能会逐渐失去自身优势,最终从工具的使用者转变为工具的助手:人类提示生成器(Human Prompt Generators)。当然,总的来说,人工智能在帮助我学习与重建的过程中,确实带来了令人惊喜的体验。未来,我计划在自己的工作中更多地融入人工智能。
Please specify source if reproduced与AI一起,提升你的编程搭档体验! | AI工具导航

