在软件开发领域,生成式人工智能不再是一个新鲜事物:它越来越多地被用作编写在现实生产中运行的代码的助手。但是每个开发人员都知道从头开始编写新代码只是他们日常工作的一小部分。开发人员的大部分时间都花在维护现有代码库和重构其他人编写的代码上。
当这些手不是人类的,或者由人工智能副驾驶生成的时候,做维修工作是什么感觉?像GitHub Copilot,Vercel的v0或CursorIDE这样的人工智能工具可以用来减轻负载吗?以下了解人工智能革命的下一阶段是如何进行的。
人工智能编写代码:有用,有时也很奇怪
很多开发者都对生成式人工智能作为开发过程一部分的有用性表达了不同程度的热情。他们也承认人工智能生成的代码有其怪癖,而这些怪癖可能会使其难以维护和重构。
DevNag多年来一直在人工智能编码工具领域工作,他是Query Pal的首席执行官,这是一家专注于人工智能票证生成的软件公司。他将重构和维护人工智能生成代码的过程描述为令人惊讶的挑战。他说:“代码通常在风格和命名约定上缺乏一致性,这会使代码库感觉脱节。”“我花了很多时间清理和标准化人工智能生成的代码,以适应项目的惯例。”
IT服务和咨询公司Pranshtech Solutions的首席执行官、SaaS开发公司Textdrip的首席技术官、经验丰富的软件开发人员Dhaval Gajjar对此表示赞同。他说:“基于人工智能的代码通常在语法上是正确的,但往往缺乏人类开发人员对最佳实践的理解所带来的清晰度或润色。”开发人员经常需要清理变量名、简化逻辑或重构代码以获得更好的可读性。
Innovative Solutions公司的首席技术官Travis Rehl致力于在云端迁移、现代化和构建下一代系统,对于他来说,使用人工智能编写的代码来重构或维护它的奇怪之处可能会更深入。他说:“当人工智能使用了不熟悉的模式或库时,如果没有对这些选择的深刻理解,重构可能会很有挑战性。”“还存在打破人工智能可能创造的复杂依赖关系的风险。这绝对是一种不同的体验。您经常使用既熟悉又陌生的代码。人工智能可能会使用对人类开发者来说似乎不寻常的方法。”
Nag和Gajjar都注意到,人工智能生成的代码可能比实现相同结果的人类编写的代码更复杂。根据Gajjar的说法,“众所周知,人工智能工具会过度设计解决方案,因此生成的代码比用于简单任务的实际代码更庞大。开发人员必须删减一些多余的步骤,或者为了效率和可维护性,必须实现一个简化的结构。人工智能可以抛出一些并不总是必要的错误处理和边缘情况。就好像它试图炫耀它所知道的一切,即使一个更简单的解决方案就足够了。”
创新解决方案公司的Rehl很欣赏这种炫耀方式。“人工智能还会做一些事情,比如围绕功能添加大量评论。这是一把双刃剑。它对人类很有用,但它也给代码库增加了很多膨胀。但想想下次你使用人工智能的时候:你想要一些关于该功能目的的描述,以便人工智能稍后可以再次阅读,以理解围绕它的业务环境。”
人工智能克服自己的缺陷
尽管存在这些怪癖,但与我交谈过的开发人员认为人工智能生成的代码在软件开发生命周期中占有一席之地。事实上,他们说人工智能工具在代码维护和重构过程中可能会有所帮助。具有讽刺意味的是,人工智能工具甚至可以用来克服人工智能代码中的一些缺陷。
例如,Rehl在Innovative Solutions部署了用于代码分析和自动重构的人工智能工具。他说:“人工智能可以快速分析大型代码库,并识别需要重构、潜在bug或优化机会的区域。“对于更简单的重构任务,比如重命名变量或提取方法,人工智能工具可以在整个代码库中以高精度执行这些操作。”Query Pal的Nag指出,他在代码库的变化中使用了人工智能,比如更新过时的API调用。
因为商业上可用的人工智能工具是根据他们从大量代码库中学到的最佳实践和模式进行培训的,所以它们也可以被部署来提出对人眼来说可能不太明显的改进建议。Nag说:“人工智能工具在识别模式和提出改进建议方面非常出色,这可以显著加快重构过程。”
Pranshtech的Gajjar补充说:“像GitHub Copilot这样的工具可以简化代码,纠正效率低下的问题,甚至可以在从某些模式中识别出逻辑后重新构建逻辑。它可以帮助完成自动重复的任务,清理样板代码,甚至提示那些需要重构的部分。”
Rehl描述了一个他能够使用人工智能工具重构人工智能辅助代码的实际情况。他解释说:“人工智能创建了一个复杂的React组件结构,但它与我在后端设置的数据模型并不完全一致。”
重构这一过程需要谨慎地保持人工智能的有效组件设计,同时调整它以适应我们的特定数据流。我发现特别有用的是使用人工智能(在本例中是CursorIDE)来辅助重构过程本身。我可以用自然语言描述我需要的改变,人工智能会建议修改代码。这创造了一个有趣的循环,即人工智能生成的代码在人工智能的帮助下被重构,而人类监督指导着这一过程。
仍然需要人类参与其中
很多开发者没有人认为人工智能已经准备好在代码库中释放出来了——至少现在还没有。品牌开发公司Emerald OceanLtd.的开发人员兼首席执行官Jason Wingate表示,人工智能工具使他能够加速重构,但人类的监督仍然是关键。他说:“总是审查和完善人工智能生成的代码更改。
Wingate描述了在人工智能帮助下进行编码的基本迭代过程。他说,“最基本的方法是请求重构建议,并给它一大块代码。包括关于语言、编码标准和约定的基本信息。根据你真正想要的东西,你可以深入研究更多你真正想要实现的问题。你可以自己执行这些建议,也可以让人工智能来执行。然后回顾一下,有可能再做一次。”
Wingate还提醒开发人员注意幻觉,并运行测试以确保工具正确地遵循提示。
QueryPal的Nag还指出,有必要仔细审查人工智能生成的代码。他说,“根据我的经验,在初始开发和重构中成功使用人工智能的关键是将其视为知识渊博但有时不可靠的初级团队成员。你不会让新员工在没有审查的情况下直接将代码推送到产品中,人工智能生成的代码也是如此。我总是确保团队中有经验的开发者审查并调整人工智能的输出。”
Rehl也不认为这种人类监督是暂时的。他说:“我相信重构过程确实需要人在循环中的体验。在人工智能模型中,系统设计的商业背景可能会丢失,因此,人类将需要引导它。我开始相信QA工程师可能是未来的‘重构工程师’,他们负责验证需求,比较输出,并将内容反馈给人工智能。”
未来还没有完全确定
与我交谈过的每个开发人员和IT领导者都强调,人们仍处于生成式人工智能的早期阶段。对于大多数商店来说,其代码库中人工智能辅助(或完全人工智能编写)的代码数量相对较少。但随着人工智能辅助重构的雪球般滚雪球,它将不可避免地增长。
Rehl引用了绞藤的模式来解释他是如何看待这个过程的:
当人们喜欢旧技术并想要创造新技术时,可以在旧系统的基础上构建一个全新的系统,或者你可以在旧系统的基础上构建新系统的组件。你开始交换组件树和它的绞藤。他们进来掐死那棵树。认为随着时间的推移,这将会发生,因为人工智能。当人工智能作为副驾驶员暴露在现有系统中时,它将开始自动记录树周围的情况。然后在一年后,它将有足够的评论来理解它试图实现的业务环境,然后它就可以接管了。
但对大多数商店来说,这一天还没有到来。QueryPal的Nag表示:“总的来说,虽然人工智能编码工具确实提高了我们在许多领域的生产力,但它们也在代码一致性和维护方面带来了新的挑战。”它们并不是某些人所希望的灵丹妙药,而是一种强大的工具,如果使用得当,可以显著提高开发人员的能力。关键是找到适当的平衡,并始终在代码库中保持人情味。