早上刚到工位,手机就震了一下。是leader发来的消息:「十点会议室,老孙的项目交接。」陈默回:「收到。」
手机震了一下。陈默拿起来看,是测试组老周发来的消息:「听说老孙走了?」陈默回:「走了,上周五最后一天。」老周:「那他的项目谁接?」陈默:「可能是我。」老周:「……保重。」陈默:「?」老周:「你看了就知道了。」
手机屏幕上的消息弹出来的时候,陈默正在看一个报错日志。消息只有三个字:来一下。他把消息关掉,继续看日志。日志里是一堆没有意义的warning,像雨后的虹虹一样,美但没用。他关掉日志窗口,站起来,走向走廊尾头的会议室。
leader办公室里还有一个人——测试组的老周。leader把屏幕转过来:「这个项目你接一下,老孙上周走了。」陈默看了看屏幕:「老孙的项目?那个遗留系统?」「对,你先看看代码熟悉一下。」「有多急?」「不急,但这周内能上手最好。」
中午休息的时候他给妻子发了一条消息:「今天接手了一个老项目,可能要加班。」妻子回了一个笑哭表情,然后说:「注意身体,别又像上次那样减了十八斤。」他笑了笑:「哪有那么夸张。」「你上次瘦了那么多,你以为我不知道?」「那是意外。」「那你今天几点回来?」「不知道。」「那我给你留饭,你回来自己热。」「好。」「别太晚。」「嗯。」他知道妻子在担心,但他不想让妻子担心。他只是接手了一个项目,不是要去战场。但他心里知道,有些时候接手老项目比上战场还让人精疲。
老王打开电脑,桌面上整整齐齐排着文件夹,最上面那个叫legacy-system。他点进去,里面是一棵长歪了的目录树。文件夹结构像是长出来的,不是设计出来的。一个叫util的文件夹里塞了四十七个文件,从日期格式转换到数据库连接池配置全在里面。另一个叫common的文件夹更离谱,里面有个文件叫helper.py,两千三百行,包揽了从字符串处理到文件操作的全部公共逻辑。还有一个叫temp的文件夹,老王说是三年前某次紧急修复时建的,后来忘了删,里面的文件到现在还在被某些模块引用。陈默看了一眼那个temp文件夹,里面有七个文件,最早的一个创建日期是2017年8月。五年了,temp文件夹还在,就像公司里那些没人管的遗留问题一样,永远不会消失,只会越来越多。
他拿起笔记本回到工位的路上,经过茶水间的时候看到小李在看手机
前几天刷到一篇文章,标题是35岁
三十五岁,在这个行业里是一个被反复提起的数字。猎头的电话变少了,朋友圈里的招聘信息变多了。没有人明说,但每个人心里都有一本账。
互联网人的出路在哪里。他没点开,但标题已经记住了。
,屏幕上是GitHub的首页,标题写着“Copilot即将发布”。小李说这个东西能让AI写代码,以后不用自己写了。陈默说你信?小李说你看看演示,真的能写。陈默没再说话,心想着自己手上这些老代码都还没搞明白,哪里有心思关注新技术。
交接会开了四十分钟。老王讲了项目的业务逻辑、部署流程、监控看板、常见故障处理方式。陈默记了两页纸,但越记越觉得哪里不对。老王说到最后自己都笑了,说这些东西他自己也不确定了,很多代码是前任写的,他接手的时候也没完全看懂。他只是在需要改的地方改,能跑就不动。陈默问有没有文档,老王说以前有过,但那文档是用Word写的,最后更新是两年前,内容跟现在的代码已经对不上了。文档里写的接口名跟代码里的不一样,文档里说的流程跟代码里的也不一样,就像一本过期的地图,还在指引你走一条已经拆了的路。陈默又问有没有单元测试,老王说有,但很少,而且有些测试本身就在报错,只是没人管。leader看了看时间,说先看看代码吧,有问题再找老王,老王下周还有一周。陈默点了点头,抱着笔记本回了工位。
他想起了一件事。三年前他刚来公司的时候,这个项目还叫口“新系统”。那时候公司刚上线了一个叫项目管理工具,叫做OneTrack,是国产的,畅锁和项目管理二合一。记得当时团队里每个人都在学怎么用,视频会议里正在讲需求,背景里是小孩子的尖叫声。他记得当时觉得这些工具都很新鲜,现在再看,已经是三年前的事了。技术这个东西,三年就是一个世代。
他把笔记本放在桌上,打开IDE,加载了legacy-system项目。进度条走了大概二十秒,比一般的项目慢不少,像是在读一整座图书馆。加载完成后,项目树在左侧展开,密密麻麻的文件夹像一棵长歪了的树。他点开src目录,第一层还好,分了controller、service、dao三个包,勉强算是三层架构。点进service包,他愣了一下。一个文件叫BusinessService.java,他往下滑了一下滚动条,文件有两千六百行。两千六百行,他在心里默念了一遍这个数字。他见过最长的文件是以前团队重构前遗留的一个旧模块,一千八百行,当时已经觉得够离谱了。现在这个直接突破了两千。他想起了以前看过的一篇文章,说一个文件超过五百行就应该考虑拆分了。这个文件直接超了五倍。
他想起了去年公司的技术大会。那次大会上CTO说了一句话:和谐平台是未来三年的战略方向。当时大家都在讨论微服务架构,Kubernetes和Docker是最热的话题。现在想想,那些构建在老项目上的微服务架构,早已经被更新了几个版本,但那些老代码还是原封不动。技术在前进,代码在原地踏步,这就是老项目的容图。
他回到工位的时候,经过小李的位子。小李正在看一篇技术博客,标题是「如何用Rust重写一个旧项目」。小李看到他,问了一句:怎么样,那个项目好搞吗?陈默摇了摇头,说你看看就知道了。小李笑了笑,说那还是等我写完Rust那个再说吧。陈默没再接话,但心里想着:小李诹了还是年轻,觉得世界上没有它解决不了的问题。他已经不这么想了。
屏幕上的代码在日光灯管的照射下显得有些发灰,字符的边缘模糊了一些,像是被时间磨过的磁带。他把光标移到一行代码上,字符的颜色从灰色变成了蓝色,然后又变回灰色。这种颚律性的变化让他想起了心跳——同样是规律性的,同样是无声的,同样是只有自己能感受到的。
他继续往下翻,函数之间没有任何空行,也没有注释。一个叫processData的方法从第三百二十行开始,到第四百八十行结束,一百六十行。他逐行看,每行代码都像一堵密不透风的墙,他找不到任何可以停下来理解的地方。他发现了一个更让他头疼的东西:变量命名。processData方法里,参数名全是a、b、c、d。他盯着看了十秒钟,完全猜不到这四个参数分别代表什么。旁边另一个方法叫doSomething,里面调用了另一个叫handle的方法,handle又调用了process,process又调用了doSomething。三个方法互相调用,形成了一个环。他揉了揉太阳穴,感觉血压在一点一点往上走。这不是代码,这是一团线球,他试着抽出一根线来看看,结果带动了整个线团。
他看了一眼右下角的任务栏,时间已经过了半小时。他只翻了三个文件,每个文件都让他血压升高一点。他点开了第四个文件,是一个叫config.properties的配置文件,里面有两百多行配置项,其中有一半被注释掉了,但注释符不是统一的井号或者双斜线,,只是各种符号混着来。有的用井号,有的用双斜线,有的用波浪号,有的用空格缩进表示停用。他往下翻,发现了一行写着db.password=123456的配置。他盯着这行看了三秒钟,默默把它记在了脑子里,准备回头提醒leader。日光灯管在屏幕上的反光闪了一下,停在了那个角度,像一只不眨的眼睛盯着他的手指。他下意识调整了一下坐姿,发现自己的肩膀已经绷得很紧,脖子也有点酸。他看了一眼窗外,天色已经开始变暗了,但他连第一个文件都还没看完。
他想起老王在交接会上说的话:这个项目跑了五年了。五年,一千八百多天,每天跟这些代码打交道。老王说他接手的时候也没完全看懂。那他是怎么撑了三年的?答案很简单:只需要在需要改的地方改,能跑就不动。这是最省力的策略,也是代码质量持续恶化的根源。每个人都只改自己需要改的那一小块,没人愿意碰其他部分,因为碰了可能会出问题。于是代码就像一个不断堆砌的垃圾山,越堆越高,直到某一天,整个系统被压塌。而那一天到来之前,每个人都在这座垃圾山上小心翼翼地走路,假装它还是一栋正常的建筑。陈默不知道自己能在这座垃圾山上走多久。
陈默关掉了IDE里的项目浏览窗口,打开了终端。他准备先看看这个项目的构建脚本,从工程层面了解一下。构建脚本是一个叫build.sh的文件,他打开一看,里面有两百多行shell命令,没有一行注释。第一行写着cd /home/work/legacy,他看了一眼,这个路径现在应该已经不存在了。他往下翻,发现构建脚本里硬编码了至少五个服务器地址,每个地址后面跟着不同的端口号。他猜这些地址有些已经废弃了,但脚本还在尝试连接它们。这就是为什么构建这么慢——它在尝试连那些已经不存在的服务器,每次超时要等三十秒。他叹了一口气,把终端窗口最小化了。他重新打开IDE,开始从controller层往下追。controller层相对来说还算清晰,每个方法对应一个HTTP接口。他找到了列表页对应的controller,是一个叫ListController的类。打开之后他看到一个叫list的方法,八十多行,里面塞了查询逻辑、排序逻辑、分页逻辑,还有两个try-catch块,其中一个catch块是空的,只有一行注释:暂时忽略。他在方法入口加了一行日志,打印一下请求参数,然后打开了订单详情页的controller,发现里面有一个方法叫detail,一百二十行,逻辑跟list方法有大量重复。他怀疑这两个方法是从同一个原始方法复制出来的,后来各自改各自的,改成了两个不同的版本。这种复制粘贴式的开发方式在老项目里很常见,但每次看到都让他觉得不舒服。就像一个人写了半本日记,然后撕下来复印了一份,两本日记各写各的,最后谁也不知道哪本是真的。
下午三点半,陈默被leader叫去会议室。leader发消息的时候只说了三个字:来一下。陈默看了一眼消息,放下手里的咖啡杯,从工位上站起来。走廊尽头的会议室他很熟,每次有人要离职或者调岗,都是在那间屋子里交接。他推门进去的时候,看到了坐在对面的老王。老王是运维组的,四十出头,平时话不多,脸上总带着一种不太高兴的表情,像是随时在计算自己还能干几年。桌上放着一台笔记本电脑,屏幕朝向陈默的方向,旁边摊着几张打印出来的流程图,上面画满了箭头和方框,有些地方用红笔圈了出来。leader指了指对面的椅子,说坐,今天把legacy-system交接一下。陈默在心里叹了口气,在对面坐下。legacy-system这个名字他听说过,是公司最早的一批业务系统之一,跑了五年了,但没人愿意碰它,就像一栋老房子,谁住谁知道漏雨。现在老王要走了,总得有人接手。
他的感受很复杂,既有对工作本身的久感又有对旧项目质量的不满,这种复杂的情绪在他心里绕染,像一块没有办法删除的声音。
他的感受很复杂,既有对工作本身的久感又有对旧项目质量的不满,这种复杂的情绪在他心里绕染,像一块没有办法删除的声音。
代码审查的通知弹出来的时候,陈默正在看一篇关于AI代码助手的评测文章。上面写着Copilot可以将开发效率提升40%,评论区里吵成一片。他关掉文章,打开审查页面,心想这些以后可能都不是问题了。
代码审查的通知弹出来时,陈默正在看一篇AI代码助手的评测文章,写着Copilot可将效率提升40%。他关掉文章打开审查页面,心想这些以后可能都不是问题了。
第二天上午,陈默坐在工位上,面前是昨天没看完的代码。他决定换个思路——与其硬读代码,不如先跑起来看看。他花了二十分钟配好了本地环境,中间改了三次数据库连接地址。第一次改的是数据库的IP地址,因为配置文件里写的是内网地址,他本地连不上。第二次改的是数据库端口,因为默认端口跟本地的MySQL冲突了。第三次改的是数据库密码,因为配置文件里写的是明文密码123456,他不确定这是不是真的密码,试了一下果然不对,问了老王才知道正确的密码是什么。构建过程很慢,控制台输出了上千行日志,其中有一半是warning。他没细看,等构建完成后启动了应用。应用启动后,他打开浏览器访问了一下首页。页面加载了大概八秒钟,中间白屏了两次。他打开控制台看了一眼,没有明显的报错。他需要改的是一个列表页的筛选功能,业务方要求加一个时间范围的过滤条件。
他拨了小王的电话。「喂,小王,那个老项目的数据源配置你还有印象吗?」小王想了想:「你是说老孙那个?我记得他用了两套配置,一套本地的,一套测试服的。」「对,但我没找到测试服的配置。」「在application-test.yml里,你看一下有没有这个文件。」他翻了一下:「有。」「里面有个spring.datasource.url的参数,改成测试库的地址就行了。」「端口呢?」「默认3306,没改过。」「行,谢了。」
他先在代码里找到了对应的controller,然后从controller追到了service层。service层的方法更长,一百多行,变量名依然是a、b、c。他在关键位置又加了几行日志,重新启动。这个过程重复了很多次。每次重启应用大概要等一分钟,每次加完日志跑一遍大概要等三十秒。他在一张纸上画了一个调用链,从controller到service到dao到sql,每个节点标上他加的日志输出。纸上画满了箭头和方框,像一张蛛网。他每次加日志就像在这张蛛网上多织了一根丝,每根丝都连着一个他暂时看不懂的模块。他想起以前读过的一句话:代码是写给人看的,顺便让机器执行。但这段代码显然是只写给机器看的,甚至机器都不一定能看懂。
两个小时过去了。他终于搞清楚了这个筛选功能的完整调用链路。问题出在service层,有一个硬编码的日期格式转换,跟前端传过来的格式不一致。前端传的是yyyy-MM-dd,后端硬编码的是yyyyMMdd。格式不匹配,导致查询结果永远为空。修复方案很简单,改一行代码的事。他改了那一行代码,重新构建、启动、测试。列表页的筛选功能正常了。他松了一口气,正准备提交代码,顺手跑了一下其他页面。结果订单详情页报了一个空指针异常。他盯着那个报错信息看了三秒钟,心里涌上来一阵说不清的感觉,像是期待已久的事情终于发生了。
他回到代码里追踪这个异常。追了半小时才发现,他改的那个日期格式转换方法被订单模块也调用了,他改了格式之后,订单模块那边的解析逻辑跟不上了。他需要在改日期格式的同时,把订单模块的解析也改掉。这就是老项目的典型问题:牵一发动全身。你以为改了一个小东西,结果炸了一大片。他想起老王在交接会上说的那句话:改一个地方会炸三个地方,每次上线都要回归测试。当时他觉得老王在夸张,现在他信了。不是夸张,是事实。这段代码就像一堵用沙子堆起来的墙,你碰一下这个角落,那个角落就塌了。
他又加了日志,重启,追踪,改代码,再测试。这一次他学乖了,改完之后把所有调用这个方法的地方都检查了一遍。一共三个调用点,他改了两个,漏了一个。第三个调用点在一个很隐蔽的地方,藏在一个工具类的静态方法里,这个静态方法被五个不同的模块调用。他一个个排查,发现其中两个模块已经不用了,但代码还在,像是幽灵一样飘在项目里,没人敢删,也没人知道删了会不会出问题。另外三个模块中有一个会在特定条件下触发,而那个条件在正常测试中很难覆盖到。他加了一行空指针判断,算是兜底。第三次测试终于通过了。他看了一眼时间,下午四点。从上午十点开始,一个简单的筛选功能,他折腾了六个小时。六个小时,改了三行代码,加了十几个日志点,画了两页调用链,跑了一百多次重启。他觉得自己不是在写代码,是在考古。
他往后靠在椅背上,盯着屏幕上的代码。控制台的日志还在滚动,绿色字符在黑色背景上不断流动,像一条没有尽头的河。他在纸上画的调用链已经满了一页,箭头从一个方法指向另一个方法,交织在一起像一张蛛网。他盯着这张蛛网看了很久,突然意识到一个让他很不舒服的事情:他对这段代码的写法,觉得有点熟悉。不是那种看多了就熟悉的熟悉,,只是一种更深层的感觉,像是看到了自己很久以前写的东西时的那种熟悉。那种变量命名的习惯,那种函数拆分的节奏,那种把所有逻辑塞进一个方法的偷懒方式,都很像他自己。但他很快否定了这个想法——这是老王的项目,跟他没关系。他才来这家公司三年,这个项目是老王管的,跟他有什么关系。他端起杯子喝了一口水,水已经凉了。
他收拾了一下桌子,准备去接水。走到茶水间的时候,看到墙上贴着一张通知,说公司正在进行代码质量评估,下周开始各部门要提交代码审计报告。他看了一眼就走了。代码质量评估,他心想,如果评估组看到legacy-system的代码,不知道会说什么。大概会写一份很长的报告,列出所有的问题,然后建议重构。但重构需要时间,需要人手,需要预算,而这些东西公司从来不会给。最后的结果就是报告写完了,代码没改,问题还在那里,等着下一个接手的人。他接了一杯水回到工位,发现屏幕上还留着那个processData方法。a、b、c、d四个参数,他盯着看了几秒钟,又想起了昨天看到的那个doSomething方法,和它和handle、process之间的互相调用环。他把目光移开,不想再看了。但他脑子里有一个念头一直在转:这段代码到底是谁写的?写的时候在想什么?为什么变量名都用单个字母?为什么函数之间互相调用形成环?为什么不写注释?这些问题他问了自己很多遍,但没有一个能回答上来。因为他知道,写这段代码的人,很可能跟他自己一样——赶工期、没人审查、自己也不懂。写的时候只想着让它跑起来,没想着以后还会有人来看。而那个人,就是现在的他。
第二天上午,陈默坐在工位上,面前是昨天没看完的代码。他决定换个思路——与其硬读代码,不如先跑起来看看。他花了二十分钟配好了本地环境,中间改了三次数据库连接地址。第一次改的是数据库的IP地址,因为配置文件里写的是内网地址,他本地连不上。第二次改的是数据库端口,因为默认端口跟本地的MySQL冲突了。第三次改的是数据库密码,因为配置文件里写的是明文密码123456,他不确定这是不是真的密码,试了一下果然不对,问了老王才知道正确的密码是什么。构建过程很慢,控制台输出了上千行日志,其中有一半是warning。他没细看,等构建完成后启动了应用。应用启动后,他打开浏览器访问了一下首页。页面加载了大概八秒钟,中间白屏了两次。他打开控制台看了一眼,没有明显的报错。他需要改的是一个列表页的筛选功能,业务方要求加一个时间范围的过滤条件。
他拿起手机
朋友圈里满屏的中秋祝福,他却一条都不想发。成年人的社交网络就是这样,热闹是给别人看的。
给老周打了个电话:「那个项目的数据库配置,你有文档吗?」老周:「没有,我都是直接问老孙的。」「那老孙走了我问谁?」「你翻一下他以前的工单,里面应该有。」「行,谢了。」
他的感受很复杂,既有对工作本身的久感又有对旧项目质量的不满,这种复杂的情绪在他心里绕染,像一块没有办法删除的声音。
他的感受很复杂,既有对工作本身的久感又有对旧项目质量的不满,这种复杂的情绪在他心里绕染,像一块没有办法删除的声音。
讨论的声音在会议室里回荡。陈默靠在椅背上,看着白板上密密麻麻的架构图,想到自己刚入行时也用同样的热情画过这样的图。那时候觉得技术可以解决一切问题,现在知道技术解决不了人的问题。
讨论声在会议室里回荡。陈默靠在椅背上,看着白板上密密麻麻的架构图,想到自己刚入行时也用同样的热情画过这样的图。那时候觉得技术可以解决一切问题,现在知道技术解决不了人的问题。
他拿起手机给老周发了条私信:「老孙那个项目,你测过没有?」老周回得很快:「测过,问题不少。你接手了?」「嗯。」「那你做好心理准备。」「怎么说?」「那个系统的测试用例,十个跑不过四个。」「这么惨?」「你跑了就知道了。」
下班前,陈默在工作群里发了一条消息。他打了一段话,删掉,又打了一段,又删掉。最后发出去的是一句很短的话:今天接手了legacy系统,写这代码的人应该被抓起来。群里安静
这种沉默不是冷场,是一种只有家人之间才有的默契。知道有些话不需要说透,知道对方会懂。
了几秒钟。然后有人回了一个捂脸的表情。接着是几个同事的调侃:谁写的能让陈默都受不了?还有人发了一个笑哭的表情,说能让你都受不了的代码,那得多烂。陈默看着屏幕,嘴角微微动了一下,算是回应了这些表情。他本来想继续吐槽几句,但突然觉得没什么意思。代码已经在那里了,吐槽也改变不了什么。他准备关掉聊天窗口,继续看代码。
然后一条回复让他的表情凝固了。老王回了一句:「就是你三年前写的。」陈默盯着屏幕看了大概五秒钟。他打了一行字:「真的?」老王:「真的。你查一下git log,2018年那会儿你做的。」陈默没有去查。群里又有人说话了:「哈哈哈哈哈哈」然后是另一个人:「陈默:我骂我自己」。群里更热闹了:「@陈默 说说感想」「@陈默 你现在什么心情」「别这样,人家不要面子的吗」。陈默把手机扣在桌上。群里其他人也安静了,像是都在等他回应。他打了一行字:别闹。但发出去之前又删掉了。他不确定老王是不是在开玩笑。如果是真的呢?他在这家公司三年了,刚来的时候确实做过一个旧项目。他记得那个项目很乱,但他不记得项目的名字。他点开了老王的头像,想发一条私信问清楚,但打完字又删掉了。他不想在私信里问这个问题。如果真的是他写的,他想在git历史里确认,而不是在私信里听老王说。他关掉了聊天窗口,打开了IDE。
他想起了三年前自己刚来这家公司的时候,坐在同样的位置,看着同样的屏幕。那时候他还年轻,觉得自己什么都能做到。现在他坐在同一个位置,看着同样的屏幕,但心里多了一些东西——一些关于责任的东西。他打开备忘录新建了一条,打字的手指有点抖,不是因为紧张,是因为他在想一些他之前从来没认真想过的事情。他打了一行字,删掉,又打了一行,删掉。他想起了三年前自己接手这个项目的时候,也是这样吐槽前人的。他在群里说过几乎一模一样的话。三年后他成了被吐槽的人。这不是什么戏剧性的反转,这就是一个很普通的事实。
他找到了项目的git仓库,打开了提交历史。搜索栏里输入了自己的工号,回车。提交记录刷地一下铺满了整个屏幕。最早的提交是2017年9月,最近的是2019年12月。他的名字,他的工号,每一条提交记录后面都跟着他的名字。两百多条提交记录,像两百多个证据,整整齐齐地排列在屏幕上。他往下翻,找到了那个叫BusinessService.java的文件。文件的第一次提交是2017年10月12日,提交者的名字和工号清清楚楚。他点开了那次提交的diff,看到了新增的代码。两千六百行,一次提交全部加进来了。他又找到了那个叫doSomething的方法,找到了processData的参数a、b、c、d。每一行让他血压升高的代码,每一段让他骂人的逻辑,每一次让他崩溃的调用链,都指向同一个提交者。而那个提交者就是他自己。他坐在那里,很久没动。
他性格固执,但骨子里很温柔。平时沉默寡言,急躁时也会拍桌子,沉稳下来又能笑着自嘲。
夫妻之间有一种默契,朋友之间有一种信任。这些年他学会了在不同关系中切换角色。
他决定不再逃避,选择面对一切。坚持还是妥协,成了他每天都在思考的问题。他不想再放弃了。
由此可见,这说明了所有事件背后的逻辑。简单来说,选择决定了方向。
总而言之,每个选择都有代价。说到底,没有白走的路。归结起来,一切都是最好的安排。
他预感到了什么,桌上的文件散发着不祥的气息,仿佛在暗示着什么。一切都暗示着即将到来的变化。
但谁也没想到,结局在意料之外。剧情突然转折,他以为看到了终点,却发现只是另一个起点。
他站起身走到窗前,抬手指尖轻触玻璃。转身回来时脚步重了许多。
声音里带着温度。话语的重量压下来,冰冷的质感从耳朵落到指尖。
窗外的树暗示着生命的韧性。风雨过后依然挚立,仿佛在告诉他坚持下去。
空气中漂浮着咖啡和雨水的味道。天色暗下来,氛围变得沉重。
从远景看,城市在天际线处模糊。拉近到中景,办公室的灯光闪烁。近处是他紧锁的眉头。
他穿着洗得发白的衬衫,袖口磨出了毛边。皮鞋擦得很干净。
内卷让人喘不过气。努力奋斗是为了不被淘汰,累到极致又觉得一切都没意义。躺平还是继续卷?每个人都在挣扎。
千禧年后的互联网泡沫,金融危机,移动互联网的黄金十年。如今ChatGPT来了,新一轮变革开始了。
天花板的风扇缓缓转动,他感到一种莫名的焦躁。窗外的蝉鸣一浪高过一浪,恍惚间像是回到了小时候的夏天。空调的嗡嗡声混着键盘的噹啪声,这声音他听了十年,竟然有种安全感。