马斯克的DOGE再想奇招:数月内重写完美国社保系统6000万行COBOL代码
这一消息引发了技术圈的热议。要知道,作为一门“上古”编程语言,COBOL虽然并非不可替代,但是其在银行、保险、政府机构等大型业务系统中依然广泛使用。如今DOGE计划在短短几个月内完成迁移遗留代码,这也让众人好奇它究竟如何能完成?莫不是想要靠着Grok这样的AI大模型?
超6000万行代码,外媒:DOGE计划几个月内迁移完成
众所周知,COBOL 诞生于20世纪50年代末,它的起源可以追溯到美国国防部主导的一个项目,旨在开发一种通用的、高度可读的编程语言,以用于政府和企业的数据处理任务。彼时,随着美国国防部和大型企业的推广,COBOL迅速成为商业计算的标准语言之一。
时至今日,这门语言依然活跃在上述提及的多个应用中,甚至在本月它还闯进了TIOBETOP20之列,位居第20位。
《连线》报道称,截至2016年,SSA的软件系统中包含超过6000万行COBOL代码,并且还有数百万行其他遗留编程语言编写的代码。
此外,SSA软件的“核心逻辑”部分也是用COBOL编写的,这部分代码负责颁发社会保障号码、管理支付、计算受益人应获得的总金额等关键任务。
对于政府机构使用的系统及软件,其实鲜少会升级,以防影响日常业务处理,SSA内部亦是如此。回看 SSA代码库上一次重大迭代升级还要追溯到20世纪80年代,当时该机构引入了一个名为MADAM的数据库。该数据库不仅采用COBOL编写,还使用了汇编语言。
多年来,随着现代编程语言的崛起,COBOL程序员日渐稀缺,且COBOL程序多为单体架构,难以适应云计算、微服务、API等现代技术趋势,不少人也想过尽早替换掉COBOL这样的过时语言,然而,实际实施的难度极高,毕竟如今已有的COBOL系统运行数十年,代码庞大、文档缺失,原开发人员大多已退休,导致维护和升级极具挑战性。此外,不少COBOL应用依赖专有数据库。
一位曾在SSA首席信息官办公室工作的前高级技术专家表示,即便是对这些代码的微小调整,也可能引发系统级的连锁故障。
话虽如此,2017年,SSA还是做了一份97页的PDF文档(https://www.ssa.gov/open/materials/IT-Modernization-Plan.pdf),想要将内部系统进行现代IT升级改造,其中就提到过要将用数亿美元的资金来更换其核心系统,包括一些COBOL旧代码的改造。彼时该机构预测,这些系统的现代化大约需要五年时间。只不过,由于2020年“黑天鹅”事件的影响,该机构放弃了这项工作,转而专注于更多面向公众的项目。
可是随着DOGE对SSA调查的深入,他们也发现COBOL旧代码带来的遗留问题似乎到了不得不解决的时刻。
此前,我们曾报道过,DOGE团队就掉入过COBOL代码的“坑”中。其中,马斯克自去年11月接手DOGE部门后,大刀阔斧地改革政府机构,目标是削减开支。而在一次检查中,DOGE团队竟然发现社会保障系统里居然还有“150岁”的人在领福利。马斯克调侃道:“你认识150岁的人吗?反正我没见过。如果他们真活着,早就该进吉尼斯世界纪录了。”
然而,技术专家很快指出,这可能并不是什么惊天骗局,而是COBOL这门“上古编程语言”惹的祸。不少技术人认为,早期COBOL版本在处理缺失的出生日期时,默认会填上1875年5月20日,并用这个日期作为计算基准。换句话说,如果某人的出生日期缺失,系统就会自动认定他“出生于1875年”,也就是“150岁”。
由此被DOGE误以为“150岁的人还在领取保障金”。而之所以会产生这场闹剧,很多人将其归咎于DOGE年轻的技术团队对COBOL语言不够了解导致。或许也是眼看着COBOL旧代码已经成了政府效率的绊脚石,DOGE这才有了“急着换掉社保系统”的心思。
借助AI来完成?
据《连线》透露,DOGE已经开始组建团队,该项目由埃隆·马斯克的亲信史蒂夫·戴维斯(SteveDavis)组织。他曾是SpaceX的早期员工,近期被《纽约时报》称其为DOGE的实际负责人。目前,据说至少有10名DOGE员工在SSA工作。
不过,具体的迁移计划何时启动还不清楚。据报道,SSA最近给员工发了一份内部文件,列出了5月前的重点任务,但里面并没有提到这次迁移,而是更关注削减“非必要合同”,以及引入AI来优化行政和技术文档处理等。
有消息人士透露,DOGE的首要任务是改进社保福利的在线身份验证系统。SSA内部人士预计,一旦他们完成身份核查,并把分散的政府数据库整合起来,迁移项目就会正式启动。
事实上,项目启动倒也没什么,真正让人担心的是DOGE计划在几个月时间内完成项目迁移。
SSA前技术专家指出,仅DOGE计划的COBOL重写项目的测试阶段就需要数年时间。而如果在几个月内完成整个迁移,DOGE的开发人员可能会跳过关键的质量保证环节,从而增加技术风险。
也有技术专家警告说,即使在最理想的情况下,完成如此大规模的系统迁移也极具挑战。而现在匆忙推进,可能会导致超过6500万人的社保福利发放出现问题。
“一旦系统出错,不仅仅是有人收到的钱不对,更可怕的是,可能有人根本收不到款项,而我们甚至意识不到。”一位SSA技术专家说道。
《连线》报道称,知情人士透露,如果想在几个月内完成COBOL代码的迁移,DOGE可能要依赖生成式AI,把数百万行代码自动翻译成现代语言。一位SSA技术专家表示:“DOGE的想法是,如果他们能在几个月内清理掉所有COBOL代码,那就说明他们是对的,而我们这些没敢‘乱搞’的人就是废物。”
“SSA的IT系统就像是用铁丝和胶带拼起来的。”一位曾在SSA首席信息官办公室工作的前技术专家告诉《连线》,“领导层得明白,他们面对的是一座‘纸牌屋’或者一局‘叠叠乐’。如果他们开始随便抽掉某些关键部分——而他们已经打算这么做了——整个系统可能会崩盘。”
重写COBOL代码难度如何,多位开发者现身说法
这样的担忧并非空穴来风,不少技术专家在听闻此消息后纷纷现身分享自己编写和维护COBOL代码的经历,其中@Skytooeen表示:
我曾在多年前担任项目经理,为我的雇主——一家财富50强公司——负责一个迁移项目,目标是摆脱我们的主机系统。当时的COBOL代码规模与这次的差不多。我可以告诉你,这绝对不可能在三个月内完成,不管有没有AI。
从集中式系统迁移到分布式系统,会遇到各种问题和复杂情况,比如竞态条件(raceconditions)、批处理与流处理的差异、完全不同的应用间通信方式等。而COBOL本身也是一门难搞的语言,里面有许多其他语言没有的“坑”。
最理想的情况是,他们在尝试折腾新系统的同时,仍然保持旧系统的正常运行。最糟糕的情况则是,他们在没有彻底测试新系统的情况下,就开始关闭旧系统的部分(甚至整个系统),然后直接“在生产环境中测试”。考虑到马斯克的风格,我实在不抱太大希望。
另一位开发者walnutclose现身评论道:
我在企业平台迁移方面有30年的经验,既从系统供应商的角度参与过,也曾作为企业IT架构师和高管负责相关工作。我可以毫不夸张地说,从服务交付、一致性、安全性和业务连续性的角度来看,这次迁移注定会失败。
系统和编程语言的选择确实重要,但它们本身并不是决定成败的关键,甚至通常都不是最主要的因素。架构设计、项目管理、测试、范围和质量控制、过渡与上线规划……这些才是影响成败的核心。而现在这些家伙谈论的那些技术问题,远远没有这些因素重要。选错技术确实会毁掉一个项目,但光是选对技术,绝对无法保证项目成功。
还有——这一点我必须强调——即使他们在技术、架构和项目管理上做得滴水不漏,也不会因此减少欺诈和错误,除非他们真正理解欺诈和错误的来源,并在项目需求中明确设计出检测和纠正机制。COBOL既不是欺诈的根源,也不会天然导致系统性错误。而DOGE至今没有拿出任何有说服力的欺诈证据,甚至连系统性错误的实际问题都几乎没找到,所以在这方面,他们注定也要失败。
这让我想起过去那些由大型咨询公司主导的企业级系统迁移灾难——只是这次的规模被无限放大了。唯一的区别是,这次涉及的金额高达数万亿美元,影响范围遍及整个国家,而负责这个项目的“专家”对他们要替换的系统几乎一无所知,这种错配的程度,比以往任何一次大型企业咨询灾难都要严重几个数量级。
不仅如此,开发者Lemon640此前在深入研究COBOL后尝试升级自家的旧项目,但现实却给了他当头一棒。他直言:“我遇到了难以逾越的障碍。”以下是他列举的一些严重问题:
1.真实COBOL代码的复杂性远超预期
Lemon640称,自己最初接触的COBOL代码仅限于入门级教材中的“玩具”版本,而实际应用中的COBOL代码与任何标准(包括1985/2002版本)都存在巨大差异。这些差异并非源于对新标准的遵循或现代编程实践的引入,而是由于长期积累的各种自定义扩展。统一不同版本的COBOL代码到一个通用转换目标语言,几乎是不可能完成的任务,尤其是当关键字、语法结构(如PICTURE句法)被广泛修改,甚至引入了全新的关键字和数据类型时。
2.COBOL生态系统鼓励通过修改语言本身来扩展功能
与现代编程语言主要依赖库或模块来扩展能力不同,COBOL生态更倾向于直接修改语言,引入新的动词或PICTURE类型。这种做法导致在构建兼容的目标语言时,必须考虑如何处理大量的自定义扩展,而相比之下,现代语言通常通过库、函数和内置数据类型实现类似功能,以确保更好的可维护性。
3.函数和子程序调用机制极其混乱
在COBOL中,变量是按值传递或按引用传递并非由函数定义决定,而是由调用位置决定。这意味着,一个接受4个参数的函数,实际上可能有16种不同的调用方式。
函数调用时没有类型检查,甚至连参数大小都不验证。这就好比JavaScript或PHP的弱类型机制,但实际上更类似于FORTH——调用者只是将数据填充到一段原始内存中,而被调用的函数则随意解释这段内存内容。如果调用者和被调用者的理解不一致,程序就会崩溃。
默认情况下,局部变量是持久化的,除非手动使用CLEAR语句清除状态,这意味着所有函数默认都是有状态的,并且数据全局可见。
4.程序的控制流设计极其落后
GOTO仍然广泛存在,令人堪忧。
PERFORMTHRU语句的存在,使得程序逻辑混乱不堪。
ALTER语句允许动态修改代码逻辑,导致代码的可维护性极差。
5.COBOL语言的动词设计极为复杂
COBOL的核心动词(如UNSTRING)的行为可能根据使用方式的不同而发生变化,且返回结果会直接修改变量,而不是通过返回值的方式处理。
由于COBOL语言本身缺乏良好的函数调用机制,因此大量复杂功能被塞进了动词系统中,导致解析和转换难度陡增。
6.COBOL的数据结构设计混乱
尽管PICTURE句法的基本设计勉强可以接受(尤其是对十进制数的支持),但字符串处理方式已完全过时。
由于COBOL早期是基于字符串存储所有数据的,其复合类型(Group数据项)非常原始,远远无法与现代编程语言的结构体或对象系统相比。
正因此,Lemon640认为,“这一切仍然是一个巨大的技术债务问题——COBOL代码本身的问题只是表象,真正最大的技术债务,是那些深埋在COBOL代码中的业务逻辑和知识体系,它们仍然难以访问、难以理解、难以变更。”
最后,尽管不少人推荐IBM早前推出的 watsonxCodeAssistantforZ,这一生成式AI工具能够将COBOL代码重构为Java,以加速COBOL应用现代化,但它仍只是整体解决方案的一部分。
同时,也有人设想马斯克可能会对AI说:“Grok,我需要你非常努力,为我编写一个新的SSA系统。”然而,现实是这样的任务远非几个月内能够完成,重写代码也绝非“发射火箭”那么快。
真正的现代化进程,仍依赖于技术积累、系统设计与长期优化的协同推进。
参考:
https://www.reddit.com/r/programminghorror/comments/1jlwbyj/doge_moving_ssa_from_cobol_to_java/
https://www.reddit.com/r/cobol/comments/10kqonw/i_tried_upgrading_cobol_heres_what_happened/
https://www.wired.com/story/doge-rebuild-social-security-administration-cobol-benefits/
https://arstechnica.com/tech-policy/2025/03/what-could-possibly-go-wrong-doge-to-rapidly-rebuild-social-security-codebase/
踩一下[0]
顶一下[0]