最近半年里,Chat GPT的存在完全改变了我的学习、开发习惯。
曾经,如果需要对一个完全不了解的库进行调用,那么我需要花费大量的时间阅读文档,以及利用搜索引擎解决疑问。而现在,很多问题可以直接用自然语言向GPT提出,它能给出比较可靠的回答—至少比我自己用搜索引擎高效得多。
这当然是好事一桩,不论是开发、debug还是学习,chat GPT都几乎能担任我的主力工具。然而,随着我越来越依赖于它,一种危机感也油然而生。因为工具越强大,相应地,我自己在开发中的发挥空间与重要性也被压缩了。
在编程学习与实际开发中,究竟什么是人不可被替代的呢?究竟什么是值得学习的,而什么是应该放权给越来越先进的工具的呢?
一个简单的例子是,在Java实体类中,对get put方法的implement是完全可以交给工具生成的。因为由开发者一个字符一个字符地敲出这些代码,与由编译器生成的,其质量毫无区别。而区别仅在于效率。所以我们都知道,前者是毫无意义的。
那么再进一步,我们自己通过文档与搜索引擎来确定实现需求用到的API,与由GPT直接为我们指出需要用到的API供我们调用,应该如何选择呢?似乎GPT要高效得多,节省了我们漫无目的地浏览海量信息的时间。那么我在学习中,还有必要对各种库的调用进行记忆吗?这样似乎也显得没有价值了。
如果我们考虑更极端的情况,不局限于算法的实现,而是考虑算法本身。假如一个大模型已经可以利用人类的现有知识,来为我们的需求给出较优的解决方案了,轻轻按下回车就能得到我想要的结果。那么我们再通过自己学习的数据结构与算法知识,以及在计组,操作系统等基础理论课中学习到的工程设计思想,自主地设计算法,除了加深自己对知识的理解,对实际解决问题还有意义吗?
生成式AI用我的prompts,产生了我的需求需要的代码,这能算是我的一次开发吗?
当然,工具逐渐把人们从底层的工作中解放出来,这是趋势,否则我们还在编写机器语言。高级语言把开发者从机器底层的实现中解放,让我们能把更多精力专注于对问题本身的解决方案的设计。如果AI能代替我们设计解决方案,那我们再一次被“解放”的精力又应该放到哪里呢?
长远地考虑,这个问题让我对未来实现自己价值的方式产生了不解。短期地考虑,这个问题让我对眼下的学习应该侧重于什么产生了困惑。
一天后收到的部分朋友的宝贵观点:
wsz:“在编程学习与实际开发中,究竟什么是人不可被替代的呢?究竟什么是值得学习的,而什么是应该放权给越来越先进的工具的呢?对于业务的理解。实际去厂里上班就会发现, 80%的时间都不在写代码,都在理解业务。技术只是一种媒介,一个程序员真正重要的是要明白自己做的东西的逻辑是什么。说白了就是一个实现,你要知道优点是什么缺点是什么,这么做对什么东西做了妥协,什么东西还得需要改进,用户需要的东西真的是做出来的东西吗?反正挺多的。怎么实现只是方法论的不同罢了。还有必要对各种库的调用进行记忆吗?草要是能记住真的就是api仙人了。”
me:“一个极端的例子,如果一个程序,它的代码完全由生成式AI产生,开发者阅读并且理解了源码,对它的开销,复杂度,在不同场景下的性能区别之类的特点进行了充分的分析,并且能在不同场景下维护和修改(即使修改也是AI生成)这个程序,那这也是一个成功的开发者?”
wsz:“我觉得没问题,你把生成式ai换成上一个离职的同事,一切就顺理成章了🤭”
wsz:“如果你是不知道ai时代人类程序员应该摆在什么位置的话,基本就相当于各种复杂模型的最后一个全连接层。”
“我觉得人还是要对这些东西进行思考,可能更多的是转移到了如何改进大模型上,我们可能以后不太用储存数据,但是我们仍要记忆对数据处理的函数(或者说知道如何推理和演绎),这样才能对AI给出的内容进行判断,在日常情境中我能感觉到,它始终应该是一个辅助工具,是你了解了全部的pipeline和其相应实现后因为你想提高效率而去使用它的代码,或者纯粹是想早点把活干完能跑就行而用。”—ZH
“我觉得ai 解决的是抽象的单一开发问题,但是产品上线后在特定的环境下,会有各种奇奇怪怪的问题,这种问题ai 是解决不了的,而这种问题又是产品开发花费的大部分时间的地方。举个例子我们要开发一个功能,ai 可以给你抽象的表述功能如何实现,帮你直接实现功能。但是功能上线后,到了生产环境,该功能又多了很多维度的环境,比如机器型号,时间,地区,流量,网络,使用人数,使用时间,等等维度,所有的维度在一起的一个综合体构成了产品。而产品功能一旦出问题,ai 一般是定位不到的,定位到了再去修改。还有一方面,我感觉现在接触到的Java 开发技术,主流的基本都是开放的,但是你像是公司的一些技术资料,他都是不开放的。比如不同的手机厂商,他们的定制Android 系统都是不同的,你在他们上面 ai 帮你开发了 App,同样的功能在一个手机上好使,另一个手机就不好使,这种问题肯定关乎于不同的芯片平台,内存等等。这种问题肯定是人们自己解决 的,而现在开发 App 功能不是问题,解决各种奇奇怪怪的问题才是最占用时间的。”—MLB
结合朋友们的再经过一轮思考,我目前是这么看待这个问题的。
编码实现业务这件事,只是程序开发中的一小部分。
开发工作归根结底是人与人的交互,而不是抽象的纯技术讨论。所以,就算AI在生成代码的能力上再强大,它能解决的也只是满足我们开发需要的一小部分。而理解需求,设计模块,以及产品的维护,优化等等问题,都是要根据具体情况具体分析的,AI无法帮到我们。
我因为暂时并没有真正的企业级开发经验,单纯从象牙塔中学习的角度,过分夸大了编码的重要性,才产生了这种恐慌。
在今后的学习中,也要适当地降低对形式化知识的关注。
比如,我本科的一位任课老师提到,他们当年在学习Java时,会被要求强制背过JDBC的源码。当时的我就觉得,这在网络资源丰富、MyBatis等持久层框架成熟的今天来看是相当可笑的。但是很可惜,我虽然不至于那么极端,但是在本科的学习中也受到了了类似观念的影响,会将“能熟练地调用一个库”或者“对语法相当熟练”理解为自己拥有了比较强的代码能力。所以在面临GPT的强势的时候,发现可以高效地使用不熟悉的库和语言,就出现不安全感。本质上,这是因为我对编程的理解层次还是太浅的缘故。
应该抛弃对语法、API等形式化内容的强迫症似的学习,而是将精力用在去理解各种实现方案的特点,优劣,在不同环境中的表现差异,以及对一个需求如何展开设计这些内容。而如果仅仅会无脑地敲代码,那很快就要被AI淘汰了。
在心态上要将AI当作搜索引擎,不能将其过分夸大为开发者。
本质上,使用AI来获得我需要使用的知识,与使用搜索引擎查找没有区别。直接使用AI生成的代码,与直接复制粘贴在Github、Stack Owerflow CSDN的代码没有区别。为什么后几种行为我就认为是没有问题的,换成前者就出现负罪感了呢?这应该是我本身心态上存在的双标问题。
毕竟AI大部分情况下仍然无法给出可靠的代码,最终对其进行调试还是人的工作,要善于利用AI,充分利用其价值,我们自身的价值没有必要体现在对每行代码亲历亲为上。
当然,对于AI生成的代码,不能直接拿来就用,对其正确性、复杂度、健壮性等要负起责任,在这个过程中也是会获得提升的。