之前有个朋友问我,以后人工智能发展起来,是不是码农都要被取代了。他问这个问题,很可能是因为看了关于 ChatGPT 的文章。前一阵子,ChatGPT 实在太火了。
为此,我特意注册体验了一把 ChatGPT 写代码、读代码的能力,确实惊人。它可以做程序员的很多工作。
可以让它实现某个算法,用任意的编程语言。比如,用 Haskell 实现一个拓扑排序算法。
看着很像那么一回事,但这个版本的时间复杂度明显不是 O(V + E),它搞错了。
第一次尝试翻了船。我问它“有没有更高效的实现”,它的第二次回答,倒是很靠谱,认识到了错误,给了一个新的版本。
也可以让它写 UI 代码,把项目里的数据类型定义发给它,让它以此为基础,用 Typescript 写 React 组件。
很不错。有代码,有解释,还有使用方式。
甚至可以进一步让它完善它自己的代码, 比如让它给前面代码中的订单标题加上特殊的样式:
已经很有迭代开发的味道了。
还可以给它一段代码,让它解释代码的意思。我随手用 OCaml 写了一段翻转列表的函数,用了个没意义的函数名字,问它这个函数做了什么。
它的这个回答,很准确。
还可以让它帮你 debug。我找了一段用 Python 写的快速排序代码,在其中加入了一点 bug,交给了它。
这次又翻车了。虽然它解释得很好,但没有找到 bug。
这样的例子可以一直举下去。在我看来,ChatGPT 这些例子中的表现,就像是一个略有点马虎、有时候不是那么严谨、但极其博学的程序员。
因此我觉得我朋友确实问了个好问题。
个人认为,尽管实力强劲,ChatGPT 是不能取代程序员的,原因有三。
1.
ChatGPT 的确能给出解决某个细节问题的代码,但这些代码不是完整的软件,用户不能直接使用。
要让这些代码生效,成为用户使用的软件的一部分,需要专业程序员的工作,需要他们把这些代码片段放到适合的地方。
2.
ChatGPT 在回答我们问题时,并不是经过推理后得出“它相信是准确”的答案,而是从大量数据样本中组合出一个在概率上是最可能满足要求的“文本”。
这就意味着,不管它的回答多详尽、不管回答的内容整体上看起来多像那么一回事,它在某些细节上出错的概率并不低。
这些细节上的错误,在其他 AI 生成内容 —— 比如诗歌、画作中,没什么影响,甚至可能是闪光点,但要作为源代码的一部分放进要日夜运行的业务系统里,就不能被接受了。
因此,即使我们要使用 ChatGPT 给的代码,这些代码也要经过专业程序员的检查、测试和修订才行。
3.
我在前面的例子中提给 ChatGPT 的问题,都是非常明确的指令。
这些指令,不是产品经理(或者业务人员、需求分析师、老板)给程序员的功能需求。他们给的功能需求,可能很详细、也可能很粗略,可能很严谨、也可能充满矛盾。把这些需求直接给 ChatGPT,是得不到什么代码的。
需要专业的程序员投入很多工作,才能把这些功能需求转换成能让 ChatGPT 写代码的那些明确指令。
所以目前来看,ChatGPT 这样的 AI 还不能取代程序员。
随着版本的升级迭代,ChatGPT 可能会越来越好,错误率越来越低,但短期内不会有本质变化,能让上面三个理由不再适用。
当然,未来一切皆有可能,说不定以后有 AI 可以在我提出要做某种很酷的软件后,主动地向我提问,一步一步引导我说出所有思路,然后咣一声,就把整个成品端出来,没有半点瑕疵。
从现状到那一步还有非常远的距离。
相比能不能取代程序员,我更关心的其实是 ChatGPT 能怎么样帮助程序员。显而易见,现在的 ChatGPT 已经能大大地改善程序员的工作效率了。
不用再去搜索引擎找那些函数库调用示例、API 使用方法了,可以直接问 ChatGPT 要;
面对棘手任务,没有头绪时,可以问问 ChatGPT ,从它的方案中找灵感;
开发软件时,程序员大部分时间都花在读代码上。现在就可以把那些祖传、晦涩的代码扔给 ChatGPT,让它先解读一番。这个我觉得最有用,因为跟前面两个不一样,ChatGPT 的这个优点是搜索引擎不能提供的。
最后,我还是用同样的问题问了 ChatGPT。