代码质量与安全 | AI会取代程序员吗?
令软件开发人员夜不能寐的事情比比皆是。如今,他们最关心的问题不再是如何用自己喜欢的语言(C、C++、Erlang、Java 等)表达最新的算法,而是人工智能(AI)。
本文中,我们将介绍AI编写代码的过程,并回答这个问题:AI会取代程序员吗?
什么是AI代码生成?
近年来,生成式AI的应用呈爆炸式增长,这主要因为现在有足够的计算能力来运行深度学习算法,而且训练机器学习模型所需的海量数据也在增加。
AI代码生成是指使用生成式AI和机器学习编写计算机代码的过程。
生成式AI编码工具正在改变软件开发过程,但这种进步也带来了不确定性。通过AI编写代码,对软件开发人员到底意味着什么?
AI编写代码的未来
生成式AI的潜力已初露端倪。AI正在改变各行各业,并有望加速创新。OpenAI最近进行的一项研究估计,生成式AI工具可能会影响47%的任务,从而大大加快软件开发的过程。
在埃文斯数据公司(Evans Data Corp)进行的一项调查中,550名软件开发人员被问及他们职业生涯中最担心的问题。其中,29%的人担心:“我和我的开发工作被AI所取代”。
美国能源部橡树岭国家实验室(U.S. Department of Energy’s Oak Ridge National Laboratory)的一个研究小组对此表示赞同。到2040年,机器学习和自然语言处理技术将非常先进,能够编写更好的软件代码,而且它们会比最好的人类开发人员写得更快。
牛津大学的“未来就业”(The Future of Employment)研究警告说,随着机器学习的发展,软件工程师可能会变得计算机化,软件设计选择将通过算法进行优化。
软件开发,特别是在安全关键型行业,需要确保高质量的代码,以满足功能要求。
因此,如果AI正在开发代码,该代码应该是没有错误和问题的。这也包括软件测试中的AI,因为它能够“以人类难以企及的可靠性”检测编码错误。
如果您正在用AI编写代码,请务必使用静态代码分析器验证代码是否安全、可靠。
AI编写代码可能吗?
AI可以编写代码。
早在2015年,Andrej Karpathy 就运行了一个使用递归神经网络(Recurrent Neural Networks,RNN)生成代码的项目。他获取了GitHub的Linux存储库(所有源文件和头文件),将其组合成一个巨大的文档(超过400 MB的C代码),并用这些代码训练RNN。
以下是它产生的结果:
/*
* If this error is set, we will need anything right after that BSD.
*/
static void action_new_function(struct s_stat_info *wb)
{
unsigned long flags;
int lel_idx_bit = e->edd, *sys & ~((unsigned long) *FIRST_COMPAT);
buf[0] = 0xFFFFFFFF & (bit << 4);
min(inc, slist->bytes);
printk(KERN_WARNING "Memory allocated %02x/%02x, "
"original MLL instead\n"),
min(min(multi_run - s->len, max) * num_data_in),
frame_pos, sz + first_seg);
div_u64_w(val, inb_p);
spin_unlock(&disk->queue_lock);
mutex_unlock(&s->sock->mutex);
mutex_unlock(&func->mutex);
return disassemble(info->pending_bh);
}
static void num_serial_settings(struct tty_struct *tty)
{
if (tty == tty)
disable_single_st_p(dev);
pci_disable_spool(port);
return 0;
}
static void do_command(struct seq_file *m, void *v)
{
int column = 32 << (cmd[2] & 0x80);
if (state)
cmd = (int)(int_state ^ (in_8(&ch->ch_flags) & Cmd) ? 2 : 1);
else
seq = 1;
for (i = 0; i < 16; i++) {
if (k & (1 << 1))
pipe = (in_use & UMXTHREAD_UNCCA) +
((count & 0x00000000fffffff8) & 0x000000f) << 8;
if (count == 0)
sub(pid, ppc_md.kexec_handle, 0x20000000);
pipe_set_bytes(i, 0);
}
/* Free our user pages pointer to place camera if all dash */
subsystem_info = &of_changes[PAGE_SIZE];
rek_controls(offset, idx, &soffset);
/* Now we want to deliberately put it to device */
control_check_polarity(&context, val, 0);
for (i = 0; i < COUNTER; i++)
seq_puts(s, "policy ");
}
AI在一夜之间就生成了代码,包括函数和函数声明。它有参数、变量、循环和正确的缩进。括号也是完成的。甚至还有注释。
生成式AI会取代程序员吗?
AI不会取代程序员。但AI已经在帮助开发人员编写代码。像ChatGPT、Github、CoPilot和OpenAI Codex这样的AI驱动的编码助手都是可以使用的工具,可以帮助嵌入式开发人员更快地编写出更好的代码。AI代码生成器现在可以快速生成高质量的代码片段,识别问题和缺陷,并对代码片段提出改进建议。当然,AI需要时间才能创建跨越几行实际的、具有生产价值的代码,而这些代码的跨度不会超过几行。
AI在不久的将来如何影响软件开发?以下是一些可能的趋势。
▎AI将不断进步
它将有效地实现任务自动化,帮助开发人员了解他们的选择。另外,它将让人类决定如何在AI无法理解的情况下进行优化。
▎AI将成为编码伙伴
软件开发人员将使用AI作为编码伙伴来编写更好的软件。这种情况如今已经出现,而且随着AI学会一次编写多行代码,这种情况将继续普及。开发人员将在集成开发环境中加入AI配对程序员工具。与人类配对编程类似,AI工具将根据提示执行编码任务,然后开发人员将审查代码。过去,这一过程需要耗费更多的人力,但AI工具可以比人类开发人员更快地完成SDLC的某些部分,从而让开发人员能够专注于更复杂的任务。
▎但程序员依然重要
程序员的真正价值不在于知道如何构建,而在于知道要构建什么。
AI还需要更长的时间才能学会如何解释每个功能的商业价值,并向您建议首先开发哪些功能。人类程序员的作用始终存在。
如果AI编写出可靠的代码会怎样?
这是一个很大的假设。大多数人都写不出可靠的代码。而AI只是一种分析大量人类编写的代码的应用程序。因此,AI不太可能写出可靠的代码。
大多数程序员都同意这一点。在CodeSignal最近的一项调查中,全球1,000名开发人员被问及他们对AI编码助手工具的使用情况。虽然81%的开发人员表示他们使用了AI驱动的编码助手,但55%的受访软件工程师表示,他们对AI生成代码的质量感到担忧。
因此,AI并不是提高代码质量的答案。