AI在软件开发中的角色:辅助而非替代
扫描二维码
随时随地手机看文章
事实表明,AI无法替代开发者,但更适用于优秀的开发者。而识别大型语言模型(LLM)生成的代码什么时候会出错,需要开发人员具有丰富的知识和经验。
软件工程师David Showalter在谈到AI编程时表示:“目前,AI模型在帮助编程人员提高工作效率方面表现出色。”那么,这一观点是否站得住脚?Showalter的言论实则是对AI专家Santiago Valdarrama的回应——他认为大型语言模型(LLM)作为编码助手目前还不完全可靠。Valdarrama说:“除非LLM给我们同样的保证(就像编程语言一样让计算机始终响应命令),否则它们只能被视为华而不实的‘炫技’, 对多数应用程序的开发来说并无实际价值。”他的观点颇具见地,LLM在如何回应提示方面显然是不一致的,即使是同一提示可能会得到截然不同的回应。因此,Showalter的看法可能过于乐观:虽然AI模型在辅助开发人员编写更多代码方面有不俗的表现,但这并不等同于能够生成高质量的可用代码。
AI和软件开发成功的关键在于敏锐地识别那些潜在的不完善之处。许多开发人员并没有意识到这一点,他们过于依赖LLM的输出结果。正如计算机科学网站HackerNews的一位评论员所说,“我想知道的是,用户对于ChatGPT的信任有多少是建立在那些看似完美无缺的示例之上的……尤其是对于特定类型的用户来说。”为了能够在软件开发中有效地使用AI,开发人员需要足够的经验判断LLM的输出什么时候可能不够准确或存在误导。
并没有简单的解决方案
关于LLM在软件开发中的应用和表现存在不同的看法。正如HackerNews网站的一些评论所展示的那样,许多开发人员并不赞同过度依赖LLM的输出。他们反驳的理由通常归结为:“当然,开发人员不能盲目地信任LLM的输出,就像他们不会无条件地信任在Stack Overflow上找到的代码,或者完全依赖集成开发环境(IDE)等工具一样。”
就目前而言,这种看法是正确的,但现实往往并不尽如人意。例如,虽然开发人员不应该完全相信他们使用的集成开发环境(IDE),但IDE在处理基本编程任务时具备一定程度的准确性和稳定性,例如不会随意“破坏”程序或弄乱Lisp括号。ChatGPT很可能会出错,但是IDE很少出现这种情况。
对于堆栈溢出(Stack Overflow)上的代码来说,可能有不同的使用方式。有些开发人员可能会直接复制粘贴代码,而不进行检查。但明智的开发人员则会采取更为审慎的态度。他们会首先查看有关代码的评论,以评估其质量和适用性。
LLM的输出并不包含这样的信号。正如一位开发人员所建议的那样,“将Stack Overflow和LLM的输出都视为可能是错误的结果,并且可能是由经验不足的开发人员编写的代码。”这是一种明智的做法。即使存在错误,这些代码片段或建议也可能为提供有价值的启示,帮助开发人员朝着正确的方向前进。
同样,这需要开发人员具备足够的经验以识别Stack Overflow的代码示例或LLM生成的代码是否存在错误。或者开发人员足够明智,只将这些代码用在“200行样板文件”或“React页面中的大表”等常见的场景中。在这些场景中,可以不必完全信任这些代码,只需在完成之后进行测试即可。
总之,正如一位开发人员所总结的那样,“我对LLM的信任程度就像我对初级开发人员或实习生的信任一样。我会给它分配一些我知道如何完成的任务,以此验证其准确性,但不会在这些任务上花费过多的时间。这无疑是最佳的策略。从AI中获益最大的开发人员是那些明智的人,他们知道LLM什么时候可能会出错,但同时也能从中得到一些好处。”
寻求正确使用的方法
开源Python工具Datasette创始人Simon Wilison曾经提出这样的观点,“从AI中获得最佳结果实际上需要大量的知识和经验,因为很多都归结于直觉。”他建议经验丰富的开发人员测试不同LLM的局限性,以衡量它们的相对优势和劣势,即便一些LLM模型表现不尽如人意,仍然可以利用其价值。
初级开发人员如何有效利用AI进行编程?AWS AI开发者体验主管Doug Seven表示,像Amazon Q Developer(前身为CodeWhisperer)这样的编码助手,对经验不足的开发人员同样可以提供帮助。这些工具能够为他们提供有价值的建议,帮助他们明确编程思路,从而减少编程过程中频繁向他人求助的需求。
也许正确的答案是:取决于具体情况!
而且重要的是,软件开发的理念通常不是“更快、更多地编写代码”。实际上,优秀的开发人员编写代码的时间很少,而花费更多的时间思考需要解决的问题以及如何找到最佳解决方案。LLM可以在这方面提供帮助,正如Willison所指出的那样:“ChatGPT(以及GitHub Copilot)为我节省了大量的‘深思熟虑’的时间。从在Bash中编写For循环到记住如何在Javascript中进行跨域CORS请求,我甚至不需要再查找其他资料。”