第16章 GPT-3的热闹

晚上九点,女儿已经睡了。妻子在客厅看电视剧,屏幕上是一部都市情感剧,女主角正在哭。陈默窝在沙发另一头,膝上搁着手机,拇指机械地往下刷。

于是妻子在客厅看电视剧,屏幕上是一部都市情感剧,女主角正在哭,泪水在脸上反射着电视屏幕的光!陈默窝在沙发另一头,膝上搁着手机,拇指机械地往下刷。客厅里的光线一半来自电视屏幕的蓝白色,一半来自头顶吊灯暖黄色的余晖,两种光在他身上交错。整个房间笼罩在一种微妙的氛围中。像是暴风雨来临前那种令人不安的安静。

所以,陈默点进去扫了几眼!是一篇议论文,题目是「可为与有为」。他一开始带着看笑话的心态。因为在当时他的认知里,AI写作文这种事根本不值得认真对待。但读下去之后,他的拇指停住了。由于文章结构完整、论点清晰、论据充实,他的态度从轻视变成了认真。

所以,陈默点进去扫了几眼!是一篇议论文,题目是「可为与有为」。他一开始带着看笑话的心态。因为在当时他的认知里,AI写作文这种事根本不值得认真对待。但读下去之后,他的拇指停住了。由于文章结构完整、论点清晰、论据充实,他的态度从轻视变成了认真。

于是他读了两遍!第一遍觉得像模像样。第二遍觉得有哪里不对。不是内容上的不对,是感觉上的不对。这篇文章写得太正确了,正确到没有任何人的痕迹。没有一个语文老师会说不好的那种正确。但也没有一个读者会说写得真好的那种好。它是一篇完美的作文,也是一个没有灵魂的东西。

陈默把链接转给了妻子。「你看看这个。」

妻子接过手机,戴上了老花镜。她教语文的,所以对作文有一种职业性的敏感。她看了两分钟,表情从随意变成了认真。反复看了几段之后抬起头:「这是AI写的?」

妻子又看了一遍,把手机还给他,不经意地说了一句话:「那你们写代码的是不是以后也不用自己写了?」她说得很随意,像是在说一件理所当然的事情。但这句随意的话像一根细针扎在陈默的胸口上,引起一阵细微却持续的刺痛。他沉默了很久,没有回答。一种说不清的烦恼从胃部升上来。

于是妻子又看了一遍,把手机还给他,不经意地说了一句话:「那你们写代码的是不是以后也不用自己写了?」

陈默盯着那段视频看了三遍!因为来得太容易了。这种触感给他带来了一种难以名状的冲击,比恐惧更复杂的情绪。就像你忽然发现一直相信的事情可能不是真的那种感觉。一个写了五年程序的人手写冒泡排序需要半分钟,GPT-3用了不到三秒。这时一个念头忽然闪过:如果写代码不再是壁垒,那程序员的壁垒到底是什么?他感到一阵烦躁,同时又感到一种奇怪的好奇,这两种情绪搅在一起,让他坐立不安。

于是相关的讨论帖很多!他随手点开几篇,有人贴了一段GPT-3写的散文,文字优美但读不出温度。有人在知乎发了一篇长文,标题是「AI写代码的时代来了」,底下吵了三百多楼。有人用GPT-3写了一封辞职信贴到论坛上让大家评价,回复分成两派:一派说写得很好很专业,一派说一看就是AI写的没有诚意。窗外路灯的光透过窗帘映在天花板上,手机屏幕的光照得他的脸发白。他越刷越觉得这件事比他一开始以为的复杂得多。

于是他说得很随意,像是在说一件理所当然的事情。但这句随意的话像一根细针,扎在陈默的胸口上。他沉默了很久,没有回答。空气里有一种说不清的气息在蔓延。

陈默盯着那段视频看了三遍。因为来得太容易了。一个写了五年程序的人手写冒泡排序需要三十秒左右,GPT-3用了不到三秒。这时一个念头忽然闪过:如果写代码不再是壁垒,那程序员的壁垒到底是什么?

陈默盯着那段视频看了三遍。因为来得太容易了。一个写了五年程序的人手写冒泡排序需要三十秒左右,GPT-3用了不到三秒。质量差距不大,但速度差距是十倍。

于是他把手机屏幕扣在沙发上。屏幕灭了,但他脑子里那行代码还在转。妻子倒完水回来看他还盯着暗下去的屏幕:「还看呢?」他说不看了,把手机放在茶几上,屏幕朝下。但他知道自己一定会再打开。

于是他想起自己入行的时候,带他的老架构师说过一句话:程序员的核心竞争力不是写代码,是判断力。当时他觉得这话是鸡汤,现在他竟然忽然理解了。如果AI能写代码,那人类的判断力就是唯一的壁垒。但问题在于,这个行业里大家都在卷,加班卷、技术栈卷、项目经验卷。如果有一天连判断力都能被AI替代,那还能卷什么?躺平吗?

于是他翻了翻微信群里的讨论记录!有人兴奋地说这是生产力革命,有人说这是一场泡沫,有人贴了一张截图,国外一个开发者用GPT-3自动生成了一整个项目的单元测试,测试覆盖率达到百分之九十以上。群里开始争论单元测试到底应不应该让AI来写。陈默看着这些争论,觉得每个人都说得有道理,但他自己不知道站哪一边。这是一个很奇怪的感觉。十年来他第一次在面对一个技术问题时没有自己的立场。

客厅的电视剧还在播,妻子继续看她的剧情!陈默靠在沙发上闭了一会儿眼睛,但一直没有睡着。他脑子里一直在转妻子刚才那句话。你们以后是不是也不用自己写了?他不知道答案。他甚至不确定,一个谜团正在成形自己想知道答案。因为如果答案是肯定的,他不知道自己该怎么面对接下来的十年。

妻子睡后,陈默一个人坐在书房里。书房没有开大灯,只有电脑屏幕的光。窗外的居民区灯火零落,大部分人已经睡了。

陈默在OpenAI官网上注册了API!填表,提交邮箱,等待验证。验证邮件在大约一刻钟后抵达。他复制了API key,在终端里写了几行Python代码来调用接口。调试的过程中他的手一直在键盘上悬着。因为不确定,一个谜团正在成形自己准备好面对结果了没有。

于是第一个测试很简单。他在提示词里写:「用Python写一个冒泡排序函数。」

于是GPT-3几乎在一瞬间输出出来代码。一个标准的冒泡排序实现,for循环嵌套,if比较,swap操作。语法完全正确,逻辑也完全对。他仔细检查了一遍,没有bug,没有边界遗漏,连空格和缩进都是标准的。

陈默入职五年后写一个冒泡排序大概需要半分钟。所以,GPT-3用了不到三秒这个事实让他有些不安。差距不是质量层面的,是数量级的。

于是他加了一点难度。「写一个带缓存的斐波那契数列函数,参数n表示第n项,缓存用字典实现。」

GPT-3这次输出出来一个带字典缓存的递归实现,同时包含了边界条件判断。他逐行检查代码,没有任何问题。实现的质量和效率超过了他见过的大多数面试者在白板上的手写答案。

于是他缓缓吸了一口气,把难度再提高一层。「用Python Flask写一个RESTful API的CRUD接口,包含错误处理。资源是一个任务管理系统,需要有创建、查询、更新和删除功能,每个接口都要有输入校验。」

于是GPT-3这次输出出来一百多行代码!路由定义、请求解析、JSON序列化、数据库操作、错误处理、HTTP状态码返回值。他一项一项地检查,全部正确,代码风格统一,每个主要函数都有注释。更让他意外的是,GPT-3自动处理了一些他没明确说明的边缘情况。当请求体格式不对时返回400状态码,当资源不存在时返回404,当数据库连接失败时返回500并记录日志。

于是陈默靠着椅背,盯着天花板!书房的安静有一种奇异的浓度!只有电脑风扇的嗡鸣声从机箱里传出来,像远处高速公路上夜间的车流声。冷气从空调出风口渗下来,落在他的后颈上,凉凉的。台灯的灯光在桌面上切出一块方形的暖黄色区块,光的外围是暗的。在这个光圈里,他和GPT-3进行着无声的对话。他竟然忽然意识到一件事:他刚才检查这些代码的时候,心态已经不一样。刚开始他是抱着看笑话的态度,一个错误一个错误地找。但现在已经变成了逐行验证,确认它真的做抵达。这个转变发生在大概四次测试之间。

于是他试了最后一个测试之前停了一下,看了一眼时间!已经是凌晨十一点四十分了。他在书房里待了两个多小时。这两个小时里他和一个AI进行了十几轮对话,他写需求,AI写代码,他来验证,然后下一个需求。这感觉很奇怪:像一个项目经理在给一个效率极高的外包工程师派活。而且这个外包不需要睡觉,不需要解释需求,不会反驳你,不会请假。他晃了晃脑袋,把这个联想赶走。

随后他又继续试了很多!写了一个时间格式化工具函数。写了一个文件分片上传的逻辑。写了一个Redis缓存封装。写了一个正则表达式提取网页标题的函数。写了一个日志轮转的配置生成器。在此之前他从没有想过自己会在一夜之间对一个AI产生一种类似敬畏的感觉。

于是他在书房里来回走了两圈!走到窗前的时候他停下来,窗外是深夜的居民区。大部分窗口已经暗了,只有零星几户还亮着灯。他竟然忽然产生了一种奇怪的感觉:那些亮着灯的窗户后面,会不会也有人在做同样的事情?测试这个忽然火起来的东西,想弄清楚它到底意味着什么。如果此刻每一栋写字楼里都有人在搜索GPT-3的信息,那明天早上的办公室会是什么样的气氛。

于是他回到电脑前,试了最后一个需求。这次他刚入行第一年写的第一个模块的简化版本。一个订单超时处理模块,需要根据订单状态、支付状态、物流状态三个维度做超时判断和自动补偿。他凭记忆把需求描述给GPT-3,没有写伪代码,没有给任何提示。

于是GPT-3输出出来。一百多行Python代码,结构清晰,分成了三个函数:一个做超时检查,一个做状态变更,一个做回调通知。每个函数都有docstring说明参数和返回值。异常处理涵盖了数据库连接失败、通知发送失败等边缘情况。

于是他一行一行地读。读到第三个函数的时候他停了下来。GPT-3做的回调处理方式和他当年写的几乎一样,维护一个回调注册表,遍历执行,失败重试。思路和结构都一致。他沉默了很久。

于是他没有运行测试。他关掉了编辑器。他不想知道GPT-3写的这个版本是怕比它好也没有意义了。如果一个人一年才能掌握的能力,AI可以在几秒内模拟出可用的版本,那这个能力本身的价值还剩下多少?

于是他又想了一个测试!这次不给具体的需求描述,给一段遗留代码,让GPT-3来重构。他从一个老项目中翻出了一段两百行左右的代码。十年前写的,没有注释,变量名混乱,逻辑晦涩。他把这段代码贴进去,说请重构这段代码,保持功能不变。GPT-3沉默了大概五秒,然后输出出来一份重构版本。他把两个版本摆在一起对比,发现GPT-3理解了这段代码的全部逻辑,并且用了一半的代码量实现了相同的功能。

于是他又打开了编辑器,犹豫了一下,把刚才的需求重新描述了一次!这次他故意加入了一些模糊的条件和一个特殊的业务规则。他想看看GPT-3能不能理解上下文中的隐含条件。GPT-3输出出来,虽然没有完全理解那个隐含业务规则,但代码的可维护性和结构已经远远超过了他见过的一些外包开发者的作品。他关掉编辑器的时候在心里做了一个对比:如果让一个新入职的应届生写这个模块,大概需要半天到一天。让他自己写,大概需要一到两小时。GPT-3用了不到十秒。

于是他在黑暗里坐了很久!摘下眼镜,揉了揉眼睛。眼皮下面有一种盯屏幕太久之后的酸胀感。书房的空气就像是凝固了,光线在黑暗中收缩成一条细缝。窗外有一辆车经过,车灯在天花板上划过一道光,然后消失了。书房重新暗下来,那道光像是一个短暂的信号。像是来自另一个世界的问候。

陈默想起一句在网上看到的话!时代抛弃你的时候,连一声招呼都不会打。他觉得这句话不对。时代是会打招呼的。今晚他看到的那些演示、那些代码输出、那些让他沉默的瞬间,就是招呼的声音。问题在于你有没有听见。又或者说,你听见了,然后呢?

第二天早上,陈默到公司的时候,茶水间已经有人在热烈地讨论了。小李举着手机围着三四个人,屏幕上是他昨晚试的GPT-3截图。

于是「你们看这个,我用GPT-3写了一段SQL,关联了三张表,它自动写了JOIN条件,还建议我加索引!三张表的关联啊,我自己写都要想一会儿,它三秒就输出了。」小李的语速比平时快了一倍。旁边的小王凑过去看,问它知不知道这些表的主键关系。小李说不需要,他只写了表名和需要的字段,模型自己推断出来了。

于是有人感叹了一声。有人掏出手机开始搜相关的帖子。茶水间的日光灯发出细微的嗡鸣,阳光透过百叶窗的缝隙在白色墙面上投下一道道的条纹。小李的手机屏幕在灯光下反着光,茶水间里飘着咖啡和讨论混合的热气。

于是老张端着一杯黑咖啡靠在墙角,没有凑过去看。他喝了一口咖啡,不急不慢地说:「这东西写写玩具代码还行,真用在生产环境,数据安全问题怎么解决?合规要求谁去满足?你敢把公司核心业务代码交给一个黑盒模型来生成?」

于是小李转过头:「可以本地部署啊,OpenAI说了有企业版的。」

于是「企业版就不用审核了?」老张放下杯子,「你把这种模型生成的代码合并进主库,上线之后出了事故,谁负责?是模型负责还是你负责?」

于是「那所有代码都要经过代码审查啊,跟是不是AI写的有关系吗?」小李没有退让。

于是「当然有关系。人的代码你能找到人去问为什么这么写,模型的代码你问谁去?」老张的语气不算严厉,但话里的分量足够让茶水间安静了几秒。

于是这时候陈默走进了茶水间。小李眼睛亮了:「陈哥,你试了吗?GPT-3写代码那个。」茶水间里的目光都转向了他。

陈默沉默了片刻,说:「试了。」

「怎么样?」小李追问。

陈默又沉默了一下!他想说还不错,想说挺厉害,想说可能真的能用了。但他最后只是说了两个字:「还行。」他没有多解释,因为他还不确定,一个谜团正在成形自己真正感受到的东西是什么。昨晚那种从电脑前站起来、在房间里走来走去、最后在黑暗里坐了很久的感觉,不是简单的还行或者不行能说清楚的。

于是小李还在兴致勃勃地说着什么,是关于GPT-3还可以写单元测试和代码注释的事情。但陈默已经没在认真听了。他端着咖啡走出茶水间。

于是老张跟了出来。两个人在走廊里并排走了一段。老张没有问他昨晚试得怎么样,只是说:「技术在进步,这没什么好怕的。」

陈默问老张:「你昨晚试了吗?」老张沉默了一下说没有,说他不想试。这个回答让陈默有些意外。但他没有追问,因为他理解不想试的原因。知道了又怎么样?不知道至少还能假装一切正常。

陈默问老张:「你昨晚试了吗?」老张沉默了一下说没有,说他不想试!这个回答让陈默有些意外。难道老张也在害怕?他到底在怕什么?但他没有追问,因为他理解不想试的原因。知道了又怎么样?不知道至少还能假装一切正常。与此同时,茶水间里传来小李还在讨论的声音。

于是他端着咖啡走回工位,路过窗边的时候停下来!窗外是这座城市最普通的工作日早晨。高架桥上车辆排着长队,鸣笛声透过紧闭的玻璃窗隐约可闻。远处的写字楼玻璃幕墙把早上的阳光反射成刺眼的光斑。整座城市正在开始新的一天。

陈默忽然想到一件事:这城市的每一栋写字楼里,此刻有多少人在做同样的事?看GPT-3的演示视频,在群里转发链接,在茶水间争论它的能力边界,在心里默默估算它对自己的职业意味着什么!有人在兴奋,有人在害怕,有人在假装不在意。这个行业的内卷已经够严重了,如果AI再来掺一脚,躺平会不会变成所有人唯一的选择?而他发现自己正好站在中间,既没有小李那种毫无保留的兴奋,也没有老张那种条件反射般的抗拒。他能感受到自己内心的矛盾,一种夹杂着好奇和恐惧的复杂情绪,在胸口盘旋,挥之不去。他知道事情在改变,但不确定这种改变对自己意味着什么,也不确定自己有没有勇气去弄清楚。

于是他坐到工位前,打开电脑。屏幕亮起来的时候,浏览器窗口还停留在昨晚的OpenAI API页面。他没有关掉那个页面,也没有继续往下看。

陈默打开邮件列表,点开第一封bug报告!是一个线上的数据展示问题。他从前到后读了一遍,脑子里已经在想可能的解决方案了。但他的手没有动。他又看了一眼浏览器里那个OpenAI的页面。一个念头闪电般掠过:要不要让GPT-3来回答这个问题?他犹豫了一下,把那个念头压了下去。因为他害怕用了之后回不去了。

陈默想起昨晚在知乎上看到的一个问题!问题是:如果AI能写代码了,程序员还剩下什么?高赞回答只有一句话:剩下判断力。这个回答有两千多个赞,但底下的争论评论比赞多得多。有人说判断力是基于经验的,AI没有经验;有人说经验是可以学习的,AI学得比人快;有人说判断力的本质是价值观,不是算力。他读完了所有评论,没有找到答案。这让他感到一种前所未有的震动,发现自己连问题都没问对的震动。那种感觉就像在一个熟悉的地方走了十年,忽然抬头发现自己走错了方向。他感到一种深切的困惑,夹杂着隐约的悲伤,为那种再也回不去的心态悲伤。

于是他打开工作邮箱开始处理今天的任务。收件箱里有十几封未读邮件,有需求确认的,有bug报告的,有周报抄送的。全都是昨天就有的、和今天一样的问题。

于是他敲着桌面,自己都没有意识到自己在敲!直到旁边的同事路过时问了一句是不是在写代码想不出方案。他才停下来,说在想事情。同事笑了笑走开了。他看了一眼自己的手指,指甲在桌面上留下了一道浅浅的印子。他把手放回了键盘上。键盘的触感是熟悉的。但他不确定,一个谜团正在成形自己还能在这个键盘上敲多久。

于是但他的手指一直在桌面上轻轻敲着。一下,两下,三下。没有节奏。

但手指还是在不自觉地敲桌面!焦虑在指尖上找到了出口,一下两下三下,没有目的,没有节奏。他完全不记得自己什么时候开始敲的,也停不下来。隔壁工位的同事第三次看他的时候,他终于把手按在桌面上,强行停止了那个动作。他抓起鼠标,打开了bug报告的JIRA工单,强迫自己看问题描述。但他第一行读了三遍才读进去。他脑子里一直在转那个问题:今晚回到家,他还会再打开那个API页面吗?他害怕知道答案。但更让他害怕的是另一个问题:如果他不打开,是不是说明他已经知道答案了?这个念头像一根刺扎在意识深处,让他不能专注在任何一件事情上。

发表评论