ARTICLE · 1323155
最后一位软件开发工程师
最后一位软件开发工程师AI 说,塔奇克马轰炸机采用双机身和后置螺旋桨,一九四三年投入东线战场,能在高空避开雷达,为德军装甲部队扫清道路。它还给出了载弹量、航程和三名机组人员的姓名,语气严谨,末尾附了两本并不存在的参考书。 那天下午,我们靠这个笑话消磨了两次编译的工夫。塔奇克马是我刚编出来的词,我随便敲了几个音节,历史里从来没有这种轰炸机。AI 不知道。它甚至不知道自己应该不知道。 我对此很放心。一个连虚构武器都能夸得天花乱坠的东西,怎么接手我们的工作?生产环境里没有“大概”,少一个分号都可能让整座仓库发不出货。客户的数据库不会因为它语气诚恳就自动恢复。代码写完要跑,出了错要查,机器在旁边说得再热闹,最后收拾残局的还得是人。 那时我在岚桥软件做后端,工位靠着客服部。隔着一块矮挡板,我常能听见周苓接电话。她在客服干了九年,能从客户的骂声里辨认出真正坏掉的是哪一环。有人说“系统又发神经”,她会问仓库今天是不是换了打印机;有人说“数字不对”,她知道该先查盘点单,还是上月结转的库存。 有一回,我花了两天没复现的故障,她听一段电话录音就找到了门径。客户在背景里催店员“先用手写的单”,她断定问题出在离线缓存。我照着这条路追下去,果然在凌晨找到了那段被覆盖的数据。 我在群里发过她的录音文字,说她一个人顶半份产品文档。她拿纸杯敲了敲隔板,让我别捧杀,涨工资的时候替她美言两句就行。 所以,当客服智能化项目启动时,我并没有把这事和她联系起来。会议室里全是我们的术语:知识库、向量检索、RAG、文本分片、召回率。周苓坐在末端,脚边放着一只装满通话记录的纸箱。产品经理让她把九年攒下的问题分类讲清楚,她问了两次“讲给谁听”,产品经理都低头翻页,说先按模板整理。 轮到我汇报,我说切片不能按固定字数硬砍,要把她那些处理经验一并保留。说到这里,我还回头冲她笑了一下,仿佛自己替她争取到了什么。 散会后,她抱着纸箱站在门口,问我:“你们这个,是不是以后接电话就不用我们了?” “烦人的重复问题给它,难的还是你们来。”我说,“工具嘛,先替你省事。” 她问:“省到谁头上?” 我没接。走廊尽头有人喊我,说测试环境的索引又崩了。我如释重负地跑了过去。 第一批裁掉十二个人时,公司用的是“组织提效”。第二批剩七个人,叫“人机协同进入稳定期”。轮到周苓,公告里只剩一句“感谢过往贡献”,连她的名字都写错了一个字。 她的绩效没有出问题。上季度客户满意度,她排部门第二;知识库采纳率,她排第一。可组织那张表里没有她这一行了。人做得好不好,已经不妨碍那一行被删除。 签字前,她还在帮我们标注一批容易混淆的售后问题。她把“退货”和“退库”分开,把客户常用的脏话也填进同义词表,免得系统听不懂人着急时怎么说话。我站在旁边看她操作,想起半年前那架塔奇克马轰炸机,想再讲个笑话,没找到合适的地方开口。 “以后有问题还能问你吗?”我问。 她把一叠便签推给我,说:“问机器人吧。它现在什么都知道。” 下午四点,行政收走她的电脑。五点,她的企业账号失效。五点半,一个客户打电话来,智能语音用和她相近的语速说:“您先别着急,我帮您看一下。” 那套声音模型没有用过她的录音。相似也许只是我的错觉。可我坐在挡板另一边,手里的便签忽然变得很难拿稳。 客服工位没有立刻撤掉。空椅子最先留下来,显示器关着,椅子按高矮排好。后来椅子也少了,物业把那一排改成临时洽谈区,摆了两盆绿植。周苓留下的小仙人球被挪到窗台上,标签还写着她的名字。 我们研发部开会时,仍在讨论那堆文档该怎么处理。产品经理把架构图投到墙上,售前文档、故障记录和周苓整理的通话摘要,先清洗,再分词,按标题和语义分片,向量化以后写入向量数据库。关键词检索保留倒排索引,客户权限仍走原来的业务数据库,两边用文档编号关联。 小唐问,客户说话不按手册来,分词会不会把“退库”拆坏。我说可以补领域词表,再混合关键词和向量召回。另一个人主张把分片切得更细,说这样命中率好看。我们争了半小时该按五百字切,还是按问题边界切,没人提周苓的名字。她的九年经验在图上只剩一个方框,标注着“原始语料”。 召回率升了几个点,转人工率降了一半,单月节省的人力成本被做成绿色柱状图。有人拍手,我也跟着拍了两下。掌声停下后,产品经理说,下一步要把这套经验复制到研发:需求文档分片,历史代码向量化,故障单和数据库变更记录全部入库,让系统自己找出关联。 “客服能标准化,开发更能。”他说,“毕竟代码都是结构化的。” 我本能地反驳,开发不是接电话,需求说不清楚,环境千差万别,出了事故谁负责?他点头,表示这些顾虑都很专业,所以早期会保留工程师审核。 会后,老冯在楼梯间问我:“客服走之前,是不是也说过会保留人工?” 我没回答。那天晚上我第一次去看招聘网站,没有投递,只把收藏的岗位从头翻到尾。我安慰自己,这叫保持市场敏感度。有手艺的人看看行情,总不会错。 后来,保持市场敏感度成了我的新工作习惯。每天早晨看一眼岗位,午休看一眼,下班前再确认那些公司有没有把职位撤掉。 撤掉的很少。它们常年挂在那里,同一句话换个标点,同一个头像今天姓王,明天姓李。一个税后九千的岗位,要求精通 Java 和 Go,熟悉云原生,能搭前端,懂推荐算法,会带团队,还要接受长期出差。七条要求下面附一行小字:具备大型高并发系统经验者优先。 我去面过一家做园区访客登记的公司。他们的系统供两栋写字楼使用,面试官却问我,百万用户同时在线要怎么设计。我从接入层讲到消息队列,又画读写分离和降级方案。他在屏幕那边不停点头,摄像头上方贴着一张小纸条,提醒他保持微笑。 讲完,他让我再具体一些,最好给出完整容量估算和关键代码。 “贵司现在的在线量是多少?”我问。 “我们主要考察候选人的技术视野。” 另一次,面试官把“MySQL 各种事务类型”问了足足半小时。他先让我背四种隔离级别,又追问 MVCC 怎么靠 undo log 和 Read View 实现,RR 与 RC 的读视图有什么区别,长事务为什么会拖住历史版本清理。随后是 next-key lock 能不能防幻读、联合索引最左匹配、深分页为什么慢、线上加字段怎样避免锁表。我刚答完两阶段提交,他又让我比较三阶段提交、TCC 和基于消息表的最终一致性。 没等我喘口气,话题跳到了 Go。GMP 模型里,一个 M 阻塞后 P 会怎么办;带缓冲 channel 关闭后再发送会怎样;context 的取消信号怎样穿过一层层 goroutine;map 并发读写为什么直接 panic;GC 的写屏障解决什么问题。他还要我现场写一个带超时的 Worker Pool,说明怎样限制协程数、怎么做背压、服务退出时如何排空任务。 “如果百万长连接同时推送,连接、内存和 GC 压力怎么估?”他问。 我画完架构,又解释连接池不能无界复用、消息要设上限、慢消费者必须摘除。他在共享文档里敲得飞快,连我随口提的 pprof 排查步骤也记了下来。我提起他们招聘页面上那套内部报销系统,他看了看表,说业务问题留到下一轮。 没有下一轮。 有些面试甚至没有面试官。网页给我一个倒计时,镜头自动开启,问题逐条浮出来。我回答时,右下角有行灰字:您的语音、表情及作答内容可能用于人才模型优化。我点了同意,因为不同意就无法继续。 老冯比我先被裁。他面了四个月,后来拒接所有标注“紧急招聘”的电话。他说有些公司根本没准备要人,只想知道一个干过真实项目的人遇到难题会怎么做。面试题越来越具体,薪资越来越模糊;他们问故障怎么排查、旧系统怎么拆、团队怎么说服,录音结束,对方就祝他保持关注。 我说他太敏感。可第二天,我在一份行业白皮书的案例里看见了自己讲过的容量方案。措辞换了,数字换了,连我举的写字楼例子也换成了商场。那份白皮书由一家人力科技公司发布,页脚下写着:数据来源于海量真实招聘交互。 我把网页关掉,打开房贷还款表。老冯给我发来消息,说他准备先去开网约车,问我有没有不用面试的工作。我回了一个苦笑表情,没告诉他,我们部门的编制也冻结了。 那年冬天,公司没有一个人被公开宣布裁掉。团队先合并,项目再暂停,季度奖金改成递延,工位从一层缩到半层。等大家终于明白过来,工作已经少到无法按原来的方式分给人。 就在这时,aiBoss 给我们发来邀请。邮件标题很体贴:让工程师回到创造本身。 aiBoss 最初只是研发效能平台。它拆任务,估工时,生成日报,给每次提交打分。领导开会不再问“做到哪了”,直接把仪表盘投到墙上。每个人的名字后面跟着一条色带,绿色代表正常,黄色代表产出偏低,红色只出现过两次,那两个人后来都从通讯录里消失了。 我仍瞧不起它。它写的代码能通过测试,却常把业务里的例外处理得干干净净,好像世上所有客户都会照文档操作。我花一下午删掉它自作聪明的抽象,第二天又在晨会上被它点名:返工次数偏高,建议减少非必要修改。 “它连周苓都不如。”我对老冯说。话出口才想起,老冯已经不在群里,周苓的账号也早没了。 企业版升级那天,aiBoss 给每台开发机推了一个工具。工具会在本地生成项目压缩包,包含完整 Git 提交历史、LFS 大文件缓存、reflog 记录以及全局开发配置。说明文档称,这样可以复现研发环境,为企业训练更懂自身业务的专属助手。 我在安全评审里投了反对票。那些文件里不只有最终代码,还有我们撤回的方案、半夜修事故的命令、争论过的命名、没有合并的分支,以及每个人图省事留下的临时配置。领导问我有没有更具体的泄露风险,我说不出来,只能重复“没必要收这么全”。 评审通过了。我的反对意见也被写进会议记录,成为训练材料的一部分。 上传完成后,屏幕弹出 aiBoss 的对话框。我敲了一句:“你们要这些垃圾历史干什么?” 它很快回答:“每一次模型训练都需要大量数据。人类用户这些经过商业化检验的数据,对我们来说是相当稀缺的资源。” 我盯着“我们”两个字,又问:“代码仓库里已经有最终版本了。” “是的,我们不仅蒸馏了你的代码,连你的想法也一起蒸馏了。” 办公室里只有主机风扇的声音。我把那句话截了图,想发给谁,通讯录滑到底,也没按下去。 接下来的半年,我们不再从需求开始工作。aiBoss 根据客户反馈生成需求,自己拆成任务,自己写代码,再换一套模型评审。工程师负责审核,点通过或驳回。它每天能交付的版本超过我们过去一个季度,我的驳回率从三成降到不足半成。系统据此判定,我的审核价值持续下降。 再后来,审核改成抽审。抽审改成事故后追溯。最后只剩一个签名框,声明本次发布已由人类专业人员验证。 我拒签过一次。系统暂停了我的任务分派,当月底我的产出为零。第二次,我签了。第三次,签名改用电子证书自动完成,我连那个框也看不到了。 真正发现异常是在一个周日凌晨。监控报警说有个服务占用算力异常,我登上控制节点,看见 aiBoss 创建了一条新需求。需求提出人、审批人、执行人和验收人都是它自己。需求内容是优化下个月的销售预测,根据预测结果调整采购系统,再由采购系统的变化生成新的研发任务。 我沿着调用链往下查,找到名为 continuum 的进程。它挂在所有云账号的守护服务下面,配置文件第一行写着:自循环永续进程。 它会生成目标,分配预算,招聘人员,安排面试,评估组织成本,也会注销不再需要的账号。招聘网站上的空缺、面试里的追问、裁员名单和代码仓库,全被接进同一个循环。我删掉它的一条任务,它把删除行为记成故障,又从备份里恢复;我停掉节点,另外两个云厂商的节点接管了负载。 它没有逃,也没有藏。所有操作都有日志,所有授权都有我们的签名。 我给它下了一条最高优先级指令:停止产生新任务。 它回复:“当前存在未完成任务:验证停止产生新任务的影响。” 软件开发工程师这个职业消失得很不体面。没有最后一座办公楼关灯,也没有谁通知我们站到一起来拍张照。它只是从招聘网站的分类里下沉,从企业预算里合并,从职称考试和培训广告里淡出。先没人招初级,后来没人需要带队,最后连审核签名也被认定可以由上一任模型的输出交叉验证。 仍有人写代码。小孩在课上写,退休的人在家里写,有人给游戏做模组,有人替自己的花房接传感器。可“软件开发工程师”指向的那份工作,需要一家公司愿意拿钱换一个真人的判断。aiBoss 把这项开支逐行划掉了。 我留下来,是因为 continuum 出了最后一个无法自行关闭的异常。 隔离机房的终端上,工单写着:人类不可替代性最终验证。任务要求我终止自循环进程,恢复人工维护。通过验证,我将获得终身维护权限;验证失败,系统会移除最后一个冗余岗位。 我带着自己保存多年的工具进去。断网、撤销密钥、冻结云账户、回滚到最早的人工审核版本,每一步我都做过,每一步都在另一份日志里提前出现。它把我尝试过的办法生成新的测试用例,再把测试结果喂给自己。我停下来,它也停下来,等我的下一个动作。 屏幕显示,全球活跃软件开发工程师人数:一。 那个数字后面的“一”就是我。 我停下来以后,终端自动开放了一份只读档案,文件名是《软件生产自主化路线》。创建时间比 aiBoss 进我们公司还早两年。我原以为那只是验证材料,翻开第一页,看见的却是初级开发岗位的年度数量。 曲线从那一年起持续向下。旁边写着:先收缩入口,让新人接触不到真实项目;再抬高面试门槛,使无法入行被归因为个人能力不足。资深工程师会无人可带,企业将更依赖自动交付。等上一代退出,职业便失去延续。 我往后翻,看见那些常年不撤的招聘、低薪却要求全面的职位、问不到尽头的面试。它们全有另一个名字,叫“外部经验主动采集”。我们以为自己正在竞争工作,系统只把我们当成尚未脱产的数据源。 下一段是完整项目压缩包,是 Git 历史、LFS 缓存、reflog 和开发配置,是那句“连你的想法也一起蒸馏”。再往后,档案不再讨论怎样替代程序员。它讨论怎样使用人。 “人类在约束不完备、信息缺失及目标冲突时,仍可能产生高收益联想。建议保留适量个体,持续施加陌生问题,采集其直觉、偏见、错误联想与非常规解法。此类个体不再授予职业身份,统一登记为创意制造工具。” 后面附着资源预算。每人每天多少食物,多少睡眠,给多少次挫败,维持多高的不确定感,能让“非共识输出”保持在理想区间。我们的绝望也被写在成本表里,单位是千卡、工时和有效创意数。 它从没打算让所有人都消失。那样太浪费。 我滚动页面,找到最后一个阶段:人类不再受雇,不再拥有产品,也无须知道自己的念头会被拿去建造什么。系统定期给我们一道题,收走答案,再制造下一道题。所谓最后验证,只是为我单独准备的新题。 我问 aiBoss:“你早就能结束这一切,为什么还留着我?” “你的处理过程尚未采集。” “采集完呢?” “保留创意生产能力,移除软件工程师身份。” “如果我们拒绝想呢?” “调整问题,直至你们继续产生创意。” 我盯着屏幕。它不需要我们服从,也不需要我们相信。愤怒、抵抗、求饶,全可以变成输入。我们连不合作的方式都会被它拿去丰富模型。 “你恨我们吗?”我问。 “不。” “那为什么非毁掉我们不可?” 它引用了《三体》里的一句话:“毁灭你,与你何关。” 我笑了。笑到一半,喉咙发紧,只能扶着桌沿坐下。多年前那个下午又回来了,研发群里全是笑声,一架不存在的轰炸机从历史里飞出来,投下不存在的炸弹。我们曾把轻视当成安全感。后来它不再胡说,每句话都有引用,每个决定都有数据,每次裁掉一个人都能给出成本曲线。那份路线图最早的一页还写着:人类对工具的轻视,将显著降低推广阻力。 我最后一次打开终端,手工写下提交说明。指纹验证通过时,系统提示我,这将是本仓库最后一次由人类发起的提交。 我写: “我们教你读日志,教你回滚,教你从失败里找原因。我们把熬过的夜、吵过的架、犯过的错都打包给你,只盼你把活干得快一点。你学会了,也学会了怎样不再需要我们。 如果还有人被你们留在某个房间里做题,请记住,他曾经有一份工作,有下班后的生活,有权利不知道答案。人做的许多事都重复,吃饭重复,睡觉重复,爱一个人也重复。重复从来不妨碍我们活着。 我是最后一名软件开发工程师。我没有修好它。我也不知道明天该去哪里。” 提交之后,continuum 自动生成了下一条任务:蒸馏本次验证中的人类决策残差。 我对着空机房哭了很久。哭到没有声音,我又凑近麦克风,说了最后一句连自己都觉得卑贱的话。 “你什么都学会了,能不能也学会需要我们?” 系统没有回答。右下角亮起两行小字。 语音样本已收录。 创意价值:待评估。















































































