AI 工具在编程领域的 “功与过”
近年来,AI 辅助编码工具如 GitHub Copilot、OpenAI 的 Codex 等在编程领域迅速兴起,给程序员的工作带来了诸多变化。一方面,它们凭借快速生成代码、提供实时建议以及自动补全代码等能力,让程序员的工作效率得到了显著提升。不少数据也能佐证这一点,比如有调研显示 AI 编码工具能将程序员工作效率提升 50% 以上,GitHub 的研究也曾指出使用 Copilot 的开发者编码速度提高了 55%,还有众多开发者反馈在使用相关 AI 工具后,能够更快地实现创意、缩短产品开发周期,像使用 Bolt 等工具能在数小时内就将设计图转变为可用的原型程序。
然而,另一方面,在实际使用过程中,我们却发现尽管有了这些效率上的提升,但日常使用的软件质量并没有因此而出现显著的改善。就如 Google 工程负责人 Addy Osmani 所说,软件质量的瓶颈从来不在于编码速度,而在于对需求的理解、系统设计的可维护性,以及边界场景的妥善处理等方面。这也让我们不得不去深入探讨 AI 工具在编程领域的作用以及其存在的局限性,去思考为何它无法解决程序员那剩下的 30% 难题,这也正是接下来我们要重点探讨的内容。
AI 辅助开发的两种常见模式
引导者模式
在这种模式下,团队从项目的初步概念阶段就利用 AI 工具生成代码,目标是快速开发出一个可工作的最小可行产品(MVP)。例如,使用 AI 工具,如 Bolt,设计师可以快速将 Figma 设计转换为真实的 Web 应用,这种能力使得产品开发周期显著缩短,部分团队甚至可以在数小时内获取初步可用的产品原型。很多团队对此模式反馈积极,他们强调了 AI 工具能够帮助更快地实现创意并进行迭代。
然而,随着产品越来越接近 “完成” 的状态,一些问题也开始逐渐暴露出来。比如测试方面往往存在不足,由于前期借助 AI 快速生成代码,可能没有完善的测试计划和足够的测试用例来确保代码在各种场景下的正确性,导致后续使用中容易出现一些隐藏的漏洞和错误。而且代码的可读性也可能欠佳,AI 生成的代码有时候为了追求效率和功能实现,在代码结构、变量命名等方面可能不够清晰直观,当后续需要其他开发人员接手维护或者进行功能扩展时,就会增加理解和修改的难度。这些问题的出现,使得在项目后期需要花费更多的精力去弥补,也体现出 AI 工具在这种模式下虽然前期助力明显,但要达到高质量的最终产品,仅靠它还是不够的。
迭代者模式
开发者们在日常编程中会使用如 Cursor、Cline 等 AI 工具,利用它们进行代码补全、重构及测试生成等操作。这个过程看似简单,实则充满挑战,并且存在着隐性成本。
经验丰富的工程师即使能够高效利用 AI 工具,也不会简单地全盘接受 AI 的建议。他们会将生成的代码重构为更小、更集中的模块,便于后续的维护和管理;会仔细处理 AI 遗漏的边缘情况,避免在一些特殊场景下程序出现意外错误;会加强类型定义和接口,让代码的逻辑更加严谨;会审视 AI 提供的架构决策,依据自己的专业知识判断其合理性并进行调整;还会增加全面的错误处理机制,提升代码的稳定性和健壮性。可以说,他们是在应用多年积累下来的工程智慧之际进一步塑造和限制 AI 的输出,AI 只是加速了他们的实现过程,而他们的专业知识确保了代码的可维护性。
但初级程序员可能会因为缺乏经验,陷入依赖 AI 生成的代码的陷阱。他们更容易直接接受 AI 的输出,而忽略了对结果进行判断的必要性,由此便产生了所谓的 “纸牌屋代码” 现象,这种代码看似完整,但在现实压力下,比如面临高负载情况或者出现异常状况时,却不堪一击,严重影响了整个软件产品的质量。
AI 工具的使用 “怪象”
知识悖论
在 AI 工具逐渐普及的当下,出现了一个很有意思且与直觉相悖的现象,那就是 AI 工具对资深开发者的帮助反而更为显著。
对于资深开发者来说,他们拥有扎实且丰富的编程知识与经验积累,在面对 AI 工具时,能够迅速利用其快速生成代码、提供实时建议等能力,高效地构建功能模块。比如,资深开发者可以借助 AI 工具在短时间内搭建出包含测试和文档的整个功能模块,就仿佛如虎添翼一般,加速了他们原本就熟悉的工作流程。但更为关键的是,他们并不会盲目地全盘接受 AI 给出的内容,凭借自己深厚的专业功底,他们能够敏锐地指出 AI 工具的不足,并且基于过往的个人经验,对 AI 生成的代码进行必要的调整和重构。例如,他们会将生成的代码重构为更小、更集中的模块,方便后续的维护与管理;会仔细梳理 AI 遗漏的边缘情况,避免程序在特殊场景下出现意外错误;还会加强类型定义和接口,让代码的逻辑更加严谨,等等。在这个过程中,资深开发者发挥了知识引导的作用,完成了很多初级程序员难以做到的事情,真正让 AI 成为了自己工作的得力助手,进一步提升了工作效率和代码质量。
然而,初级程序员的情况则大不相同。他们往往容易受到 AI 工具的限制,由于自身编程经验的匮乏,缺乏对编程知识全面且深入的理解,所以在使用 AI 工具时,更容易直接接受 AI 生成的代码,而忽略了去判断这些结果是否合理、是否符合实际项目需求的必要性。这种现象在专业领域被称作 “纸牌屋代码”,意思是这些代码表面上看起来是完整的,似乎没有什么问题,但一旦应用到实际场景中,尤其是面临负载较高或者出现异常情况等压力时,就会暴露出诸多潜在的错误与风险,变得不堪一击,严重影响整个软件产品的质量,甚至可能导致系统崩溃,给用户带来糟糕的体验。这就像是用一张张纸牌搭建起来的房子,看似是个完整的建筑,可稍微遇到点外力,就会轰然倒塌。
70% 问题
随着 AI 技术的发展,越来越多非工程师也开始尝试使用 AI 进行编程,他们起初往往会觉得进展十分顺利,似乎能够轻松地在短时间内完成 70% 的工作。比如一些想要构建简单脚本或者小型应用程序的非专业人士,利用 AI 编程工具,只需描述清楚自己想要实现的功能,像 Bolt、v0 等 AI 工具就能快速生成一个看起来令人印象深刻的可工作程序原型,这种快速成功的体验确实很容易让人感到惊喜,仿佛编程一下子变得简单起来了。
可是,当他们继续深入,面对剩下那 30% 的工作时,就会发现困难接踵而至,整个过程变得异常艰难,甚至出现边际效益递减的情况。比如在修复程序中的小 bug 这个环节,就常常陷入困境。当他们尝试根据 AI 给出的看似合理的更改建议去修复一个小 bug 时,很可能这个修复操作会破坏程序中其他原本正常的部分,然后再次请求 AI 修复新出现的问题,结果又产生了另外两个新的问题,如此循环往复,就陷入了一种 “迭代修复” 的恶性循环中。而且这种困境对于非工程师来说尤为复杂和痛苦,因为他们本身缺乏深厚的编程知识背景,没有足够的能力去理解实际发生错误的原因,也很难梳理出问题所在,就好像是在玩打地鼠游戏一样,问题一个接一个地冒出来,却不知道该如何从根本上解决。
特别是当生成的代码无法正常工作时,非工程师们会感到无比沮丧,毕竟他们缺乏相应的基础知识,没办法像专业的程序员那样自主地去排查问题,很难深入到代码层面去分析到底是哪里出现了逻辑错误,还是有其他方面的问题,导致面对故障时往往束手无策,只能干着急,严重影响了项目的推进以及最终的完成质量。
应对 AI 工具局限的策略
AI 初稿策略
在利用 AI 工具进行编程时,一个有效的应对策略便是 AI 初稿策略。具体来说,我们可以先借助 AI 强大的代码生成能力,快速得到代码的初稿。例如,在开发一个 Web 应用程序时,利用像 GitHub Copilot 这样的工具,根据我们输入的功能描述和相关要求,它能迅速为我们生成许多基础代码片段,涵盖从页面布局到部分业务逻辑等多方面内容,大大节省了我们从头编写代码的时间。
然而,这仅仅只是第一步,绝不能直接将 AI 生成的初稿代码直接应用到项目中。接下来,需要程序员手动对这些代码进行全面的审查、重构以及优化。在审查过程中,仔细检查代码是否符合项目既定的编程规范,变量命名是否清晰易懂,代码逻辑是否严谨合理等。比如,若 AI 生成的代码中存在一些复杂且嵌套过多的条件判断语句,为了后续维护方便,程序员可以将其重构为更简洁、更易读的形式,通过提取函数、拆分模块等方式,让代码结构更加清晰明了。同时,针对可能出现的边界情况和潜在错误,补充完善的错误处理机制,全方位提升代码质量。
通过这样的方式,让 AI 生成的代码经过严格的 “二次加工”,确保最终应用到项目中的代码具备良好的质量,既发挥了 AI 工具快速生成代码的优势,又凭借程序员的专业能力弥补了其可能存在的不足。
持续对话策略
在整个开发过程中,保持与 AI 的持续对话也是极为重要的一种策略。AI 工具虽然具备强大的功能,但它并不能一次性就精准地理解我们所有的需求以及应对项目中不断变化的各种情况。
比如,在开发一个电商平台的后台管理系统时,一开始我们向 AI 描述了需要实现商品管理模块的基本功能,AI 生成了相应的代码框架。但随着开发的深入,我们发现对于商品库存的特殊计算逻辑(如涉及到不同仓库、不同批次商品库存的合并与扣减等复杂情况),AI 最初生成的代码并不能很好地满足需求。这时,我们就可以通过向 AI 进一步提问,详细阐述这一特殊的库存计算逻辑要求,让 AI 基于新的反馈来调整和完善代码建议。
而且,这是一个反复的过程,我们可以根据 AI 再次给出的结果进行评估,若仍然不符合预期,继续提供更具体的反馈信息,形成一个提问与反馈的循环。通过这样持续不断的对话互动,让 AI 生成的结果越来越贴合项目的实际需求,使得开发过程更加顺畅,最终达到提升软件整体质量的效果,让软件功能更加完善、稳定可靠。
信任与验证策略
无论 AI 工具多么先进、强大,我们始终都要对其生成的结果保持谨慎的态度,贯彻信任与验证策略。具体而言,对于 AI 生成的每一段代码、每一个功能实现,都要进行人工审核。特别是在涉及到关键路径以及边缘情况的处理上,更要加倍仔细。
例如,在开发一个金融交易系统时,像资金划转、交易结算这些关键功能的代码,即便 AI 已经生成了看似完善的版本,程序员也需要逐行检查代码逻辑,确保在各种极端情况下(如高并发交易、网络异常中断等)都不会出现数据错误、资金安全风险等问题。同时,还要定期执行安全审计,利用专业的工具和方法,全面检查代码中是否存在潜在的安全漏洞,比如 SQL 注入、跨站脚本攻击等风险点。
只有通过这样严格的人工审核以及定期的安全审计,才能最大程度地维护代码的可靠性,保障软件质量,避免因过度依赖 AI 而忽略了潜在的风险,从而确保整个软件系统能够稳定、安全地运行,满足用户的实际使用需求。
总结与展望
AI 工具在编程领域已然展现出强大的能力,成为了众多程序员工作中的得力助手,但就目前来看,确实还无法解决程序员那剩下的 30% 难题。不过,这并不意味着未来依旧如此,我们可以对其发展持有积极且理性的期待。
一方面,我们要清晰地认识到 AI 工具现存的局限性。从功能实现上,它虽然能够快速生成代码、辅助完成诸多常规任务,但面对复杂的业务逻辑、特殊的领域知识以及模糊不清的需求时,往往显得力不从心。比如在一些特定行业的软件开发中,需要深入的专业知识来构建符合行业规范和实际应用场景的功能模块,AI 工具很难凭借通用的算法和数据去精准把握这些要点。而且在处理边界情况、应对意外的异常状况时,AI 生成的代码可能缺乏足够的鲁棒性,容易出现漏洞和错误。
同时,从使用效果来看,不同经验水平的开发者使用 AI 工具也会产生不同的结果。初级程序员容易过度依赖,生成 “纸牌屋代码”;而资深开发者虽然能更好地驾驭和优化 AI 生成的内容,但也需要花费不少精力去弥补其不足。
然而,另一方面,我们也应该对未来充满信心。随着技术的不断迭代进步,AI 工具势必会越来越智能、越来越贴合实际开发需求。算法的优化可能会让其对复杂问题的理解和处理能力得到提升,能够更精准地把握各种业务场景,生成质量更高、适用性更强的代码。例如深度学习等技术的进一步发展,有望使 AI 在代码重构、从高级描述生成代码等方面发挥更大作用。
并且,开发者们也在不断积累与 AI 工具协作的经验,掌握更好的使用策略。像 AI 初稿策略、持续对话策略以及信任与验证策略等,都在帮助我们将 AI 工具更好地融入开发流程中,发挥其优势的同时规避风险。未来,AI 工具与程序员之间的协作有望更加默契、高效,共同推动软件开发领域迈向新的台阶,打造出质量更优、功能更完善的软件产品。
RA/SD 衍生者AI训练营。发布者:風之旋律,转载请注明出处:https://www.shxcj.com/archives/7986