特别策划 AI时代程序员生存之道
你好,我是钟敬。
上一次加餐,我们讨论了AI的能力边界。如果我们认可“没有银弹”的理论,那么显然现在的AI也不是银弹。
不过,目前AI在软件开发中已经可以帮我们做不少事情了,当得起一颗“铜弹”了。我们可以想象一下,如果一个程序员善用AI,提高了30%的效率,而别的程序员只提高了10%,甚至没有提高。那么这个程序员的竞争力必然提升。推而广之,对于一个企业也是如此。
今天我们先聊聊AI可以帮助我们做哪些事,然后在这个基础上,讨论在 AI 时代,开发人员应该更加注重发展哪些能力。
大模型时代程序员要掌握哪些能力(直播回放)
铜弹AI:加快知识的“周转率”
具体来说,AI可以帮我们做这几方面的事情。
第一,AI能够帮助开发人员完成重复性和套路性的工作。
避免重复是软件开发中一个常见的原则。但就目前的技术而言,仍然有很多重复性的工作很难避免,例如所谓“样板代码”。而AI可以通过模仿程序员写代码的方式,自动生成部分具有重复性的代码,从而节省了编写代码的时间。
第二,AI可以帮助开发人员完成那些了解原理但忘记技术细节的代码。
比如说,我已经多年没有写 JavaScript 了。虽然,原理还记得,但一些具体的语法和API忘记了。如果在过去,需要查书或者利用搜索引擎查找资料才能回忆起来。而AI可以更快地告诉我这些技术细节,甚至自动生成代码,节省我们的开发时间。
第三,帮助开发人员提高学习新知识的速度。
比如我们有某个 JavaScript框架没有掌握,如果擅于利用AI,那么可以比传统的方法更快地学会它。
第四,可以帮助开发人员获取他人的经验。
AI可以根据我们给的指令自动编写代码。AI已经学习了很多别人写的代码,因此它生成的代码中可能包含其他人的经验,甚至可能会带来我们自己没有想到的新做法或新思路。
总的来说,软件开发可以看做一个知识的加工和创造的过程。而 AI 在软件开发中的作用,就是 加快了知识加工的周转率。这一点决定了AI确实能在软件开发中发挥不小的作用。而另一方面,结合我们上节课讨论的软件开发的本质困难,决定了AI的作用是逐渐发挥的,而不会是飞跃性的。
处理本质困难的进展
我们回头再看一看本质困难。尽管软件开发的本质困难是不能被消除的,但是人们已经发展出一些技术来提高解决本质困难的效率,使这些困难能够被可控地管理。
这里举两个例子,一个是敏捷软件开发,另一个是领域驱动设计。
敏捷软件开发
敏捷软件开发针对的本质困难,主要是复杂性、可变性和社会性。通过迭代的方式,敏捷软件开发使软件能够演进式地、有机地“生长”出来,从而把软件复杂性和可变性带来的困难和风险化整为零,分散在整个软件生命周期中。
比如说,复杂的需求,没有必要在项目前期确认和固化全部细节(事实上也是不可能的),而是在每个迭代的过程中逐步了解,这就降低了需求理解的复杂度。
敏捷的另一个核心理念是强调软件开发中“人”的方面,有一系列方法和技术提高沟通效率,改善人员组织,并且强调培养技术卓越的开发人员。
这些方法,针对的都是本质困难里的“社会性”。AI目前在这方面提供的帮助,主要是提高人们的学习效率,培养卓越的开发人员。在产品设计、行业研究等方面也能提供帮助。
领域驱动设计
领域驱动设计(DDD)并不是一个孤立的技术,而是属于软件开发方法学的范畴,是对传统面向对象方法学的一种优化。它针对的主要是复杂性、一致性和不可见性。
面对复杂的业务,我们必须找到一种能准确、深刻反映业务概念的手段,并且能够可视化地表达出来,这种手段就是 领域模型。
围绕领域模型进行开发,就是 DDD 中所说的“模型驱动设计”。围绕着领域模型图,业务专家和开发人员就可以把业务的理解抽象化、严格化和规范化,也可以用一致的语言来沟通,这就是 DDD 中说的“统一语言”。
在这一方面,AI 可以通过分析需求文本,初步建立领域模型,作为开发人员进一步优化的基础,在一定程度上节省了建模的时间。不过建模的主要工作,目前仍然需要人来进行。
AI时代的程序员应发展哪些能力?
通过两篇加餐,我们现在应该已经对AI的能力边界有了一个总体的了解。
接下来,我们一起画张表格,总结一下AI能做什么以及不能做什么。
通过这些分析,我们可以得出结论,就是那些只会开发“垃圾代码”的程序员可能会面临危机了。这里的垃圾代码,指的是虽然功能大体上正确,但结构混乱,难以理解和维护的代码。过去,这样的程序员还有生存空间,毕竟写出的程序功能还是对的。但是,引入AI以后,很多基础性的代码可以自动生成了,这就压缩了这些程序员的生存空间。
那么,程序员应该加强哪些方面的能力呢?
首先,我们要加强 理解业务需求的能力。
理解业务需求本身,AI是无法代替的 。而如果开发人员理解了需求,并以领域模型等方式表达出来,那么剩下的一些事情就可以交给AI处理了。
如果我是一个开发编译器、云基础设施等底层机制的程序员,是不是就不需要理解业务的能力呢?其实不然。如果我开发的是云基础设施,那么使用云的开发、运维等人员,就是我的用户,他们的需求就是我的“业务需求”。所以,任何软件开发,都离不开对业务需求的理解。
其次就是 熟练使用AI工具高效工作、快速学习的能力。
举个例子,基于大语言模型的AI有一个特点,就是只有问出好问题,才能得出好答案。我们所问的问题称为 Prompt(提示语),而如何给出好的提示语,已经形成了一个专门的技能——提示语工程。所以,如何才能更好地使用AI,发挥AI的潜力,也是我们需要学习的技能。
除了工作提效,利用AI快速学习的能力也很重要。回想一下,搜索引擎的出现,实际上改变了我们的学习方式,加快了学习效率。类似地,AI的出现,将会再次改变我们的学习方式。
接下来还有 评审和验证AI生成代码的能力。
我们前面说过,AI并不能保证生成的结果是最优化的,也就是说生成的可能也是“垃圾代码”。这就需要开发人员具备判断生成的代码质量的能力,以及进一步优化代码的能力。也就是掌握软件设计、整洁代码、重构等能力。
同样,AI也不能保证生成的代码的正确性,因此开发人员必须能验证这些代码正确性。我们可以逐行分析AI生成的代码,但是这样仍然可能漏掉一些要点。比较好的方式是为生成的代码编写自动化测试,从需求的角度反向验证正确性。当然,测试代码也是可以用AI辅助生成的。
最后, 掌握软件开发各项技术的基本原理(而不是技术细节)的能力 也不能忽视。
比如说,如果我已经了解Vue.js的基本原理,只是忘记了具体的语法细节,那么就非常适合在AI的辅助下开发基于Vue.js的程序。但是如果我一点都不了解原理,甚至JavaScript也不会,那么即使有AI的帮助,也难以达成目的。
这也提示我们,将来学习一门新技术的时候,可以把重点放在对原理的理解,而不用刻意记忆技术细节。
这里我再补充几点。这里我们对AI的评价,还是基于目前所看到的基于大语言模型的AI能力。但是技术发展日新月异。未来AI是否会产生新的技术突破,真正成为银弹,这种可能性永远无法排除。不过,单靠大语言模型这一项技术恐怕还做不到。
其次,开发人员虽然要有紧迫感,但也不必过于紧张。因为任何一项新技术的推行,本身就需要一个周期。所以我们还有时间,只要我们意识的问题的存在,按部就班地学习,就不会轻易掉队。
基于对AI能力的合理预期,虽然短期内AI对开发效率不会有突破性的提升,但是渐进式的提升效果也不容忽视。有人说过,“人与人之间的差距往往很小,然而这很小的差距有时却是决定性的。”
最后,咱们引用毛泽东思想中的一句话来总结我们对于AI辅助软件开发的态度:“战略上藐视敌人,战术上重视敌人”。所谓“战略上藐视”,就是不要太紧张,我们要看到 AI 的影响是渐进的,大家完全有时间,有能力掌握相关技术。所谓“战术上重视”,指的是现在就要开始行动了,主动关注相关技术的发展,最好尽快进行尝试。
好,今天我们就聊到这里。期待你在留言区分享你的思考,如果这两期加餐对你有启发,别忘了分享给更多朋友,我们再会。