前言
2023年生成式AI掀起了一股巨大的浪潮。不管现在你身边是否已经有人应用了AI技术,你身边一定有很多人整天都在谈论AI,并且有些人已经全身心地投入到学习和研究AI的领域。
作为一名程序员,无论是那些帮助提升效率的各种工具,还是各种热门讨论的话题,生成式AI正深刻地影响着我们这个角色。也许你已经成为AI应用的高手,将AI工具真正变成了你的助手;或者,你可能还没接触过任何一款AI工具,只是偶尔听到别人说未来程序员可能会被AI取代;再或者,你可能已经对AI做了一些研究,但认为它还不够成熟,想再观望一下。
不管怎样,AI正在以非常快的速度改变着世界。作为最早接触AI的一批人,程序员们正在将AI应用到日常开发工作中,培养AI成为自己的助手,实现一些“偷懒”的小目标。
虽然AI在许多业务场景中也可以发挥作用,但大家依然对AI如何提升软件开发效率的话题非常感兴趣,希望AI能成为提升工程效能的一个突破口。作为软件行业的从业者,我们一直专注于端到端的软件研发。面对生成式AI的兴起,我们也做了很多尝试和思考,结合当下AI的能力和软件开发的现状,和大家分享一下我的个人想法。
生成式AI辅助的软件研发效能提升
不得不说,生成式AI确实在智能方面有了巨大提升,下面从生成式AI的几个优势入手,谈谈对软件研发效能积极的影响:
超强的语义理解能力和长期记忆,解决复杂问题
与传统的程序员编程利器 —— 搜索引擎相比,生成式AI带来的一个关键突破是其极大增强的理解能力。AI可以通过理解我们输入的文字,理解我们真正的意图,并给出满足需求的答复。相对于搜索引擎提供的大量内容,需要一篇一篇点进去筛选信息,生成式AI在效率上已经做出了很大的提升。
此外,生成式AI还拥有记忆能力。在一定的上下文中,凭借强大的理解能力,它可以回答一系列提出的新问题。这无疑是一种极大的体验提升。
这相当于AI具备了思考的能力,并且结合其长期记忆,如果我们提供足够的上下文,AI可以帮助我们解决更复杂的任务。例如,将整个代码库的上下文输入AI,它可以利用强大的计算能力,通过理解代码来完成人类需要花费大量时间才能完成的任务,例如整理所有的API、业务逻辑,甚至生成测试用例和对未来架构演进的建议等。
让知识传递更加高效
在软件研发过程中,知识传递始终是个非常复杂的问题。随着软件产品的功能逐渐复杂,一方面是很多知识都存在于参与到其中的人员头脑记忆里,很难都事无巨细地沉淀为非常规范的文档,另一方面多年来沉淀下来的文档标准也在不断演进,文档的粒度,内容,格式等也随着团队变化而变化,即便文档都存在,当某个团队成员想要找到某些文档,如果没有很好的索引,也是非常难的一件事情。
而构建基于AI的知识库,借助RAG技术,AI的理解能力以及生成能力,可以快速将复杂多样的业务文档,快速准确地传递给团队中需要的人,大大提升知识的传递效率。
基于个性化需求生成全新内容
网络上有许多使用生成式AI辅助生成文章或文案的案例,甚至有很多培训课程教人们如何通过AI生成推广软文,以快速获取流量。在这篇文章中,我不对这种现象进行评价,但生成式AI生成个性化全新内容的能力是无可置疑的。
相比于搜索引擎只能返回网络上已经发布的内容,生成式AI可以根据使用者的需求有针对性地生成特定的内容。在软件开发过程中,程序员可以通过优化提示信息(Prompts),从AI工具中获得解决当前问题的详尽方案,甚至是可运行的代码。
这对于程序员的开发效率非常有帮助,尤其是在需要进行调研的场景或者对某个技术栈不太熟悉的领域。AI能给出解决方案甚至直接生成可运行的代码,可以避免在开发过程中经常遇到的语法问题、编译问题和调试等。
生成式AI带来的问题
如前所述,生成式AI确实可以在软件研发过程的很多场景中辅助提效。但是,生成式AI作为一个新兴事物,即便抛开使用层面的法律合规问题,知识产权问题等,仍然有些挑战需要面对:
AI带来的代码质量问题和安全问题
生成式AI给出的答案是基于网络中的海量数据训练而来的,在很大程度上依赖于用于训练的数据的质量和多样性,所以生成的代码有些符合当前的软件设计规范,也有些不符合。在庞大的开发团队中,如果没有适当的判断和修正,只追求完成功能,长期来看,软件代码的可维护性将面临严峻挑战,甚至可能存在一些安全漏洞甚至隐藏的系统问题。
被忽视的软件复杂性
软件研发过程,有人觉得简单,有人觉得复杂。的确,在某些场景下,软件研发的解决方案是非常直接的,比如:
添加一个列表页面,展示订单列表,并在列表中增加过滤功能。 用已有模版创建一个报表页面。
开发一个小工具取代人工的数据导入工作。
这些工作并不涉及到软件架构的调整,通常是我们日常工作中需要处理的事情。从认知的角度来看,这些工作都有一些最佳实践,即使是经验不太丰富的团队,也能应对地游刃有余。针对这样的场景,生成式AI通过大量的学习和训练,确实可以帮助程序员提升效率。
然而,一旦涉及到软件架构设计和原则,考虑到领域知识的边界,以及未来业务发展的方向和架构的可扩展性,很多时候我们会选择更加复杂的方案,而不是最直接最简单的方案。这就是软件研发的复杂之处。有些软件系统在上线后不久就无法适应新的需求变更,代码难以理解和修改;而有些系统虽然支持复杂的业务,却能运行十数年,且保持高度的适应能力。关键在于软件架构设计者在开发过程中做出的每一个技术决策是否考虑了更长远的发展视角。
然而,生成式AI在软件架构设计上并没有太多成功的案例,而相应的,代码生成带来的收益会让人放松警惕,从某种程度上忽视软件设计的重要性,忽视从长远发展视角决策的重要性。
程序员如何与AI合作
就像在交通事故责任认定中,对于L4级别以下的自动驾驶系统来说,在行驶过程中如果车辆违法或发生事故,第一责任人仍然是驾驶员。在当前生成式AI辅助软件开发的模式下,程序员无疑仍然是代码的第一责任人。
现阶段,AI只是程序员在软件研发过程中的辅助工具,无法替代程序员进行技术决策,也不会承担相应的责任。程序员在软件研发过程中的角色并没有改变,尽管我们一直认为程序员是软件的设计者,但真正承担软件设计责任的程序员可能在项目中只占少数。AI工具会逐渐承担代码编写的工作,因此,如何有效地利用AI的能力,快速完成软件产品研发,并保持良好的设计,仍然是程序员最的责任。
所以,除了不断学习和积累软件架构设计及代码设计的经验外,善于利用AI工具也是程序员必备的能力。我们需要持开放的心态,努力探索AI能够为我们提供哪些帮助。只有这样,我们才能更好地利用AI的能力,使软件研发变得更加高效。