编译 | 苏宓
出品 | CSDN(ID:CSDNnews)
自去年 11 月,马斯克接任美国政府效率部门(DOGE)负责人以来,他以一种类似接管 Twitter 时的风格,对很多机构进行了一系列大刀阔斧的改革,最终目标是减少政府开支。近日,他将审查的目光转向了社会保障部门(SSA)。
结果令人震惊——DOGE 揭露了社会保障系统中居然有 150 岁的人仍在领取福利,这无疑属于大规模欺诈行为。马斯克指出,“我们粗略检查了一下社会保障系统,结果发现其中有 150 岁的人。你认识有 150 岁的人吗?反正我不认识。按理说,这些人应该被载入吉尼斯世界纪录,但显然并没有。所以,我猜测他们可能已经死了。”
然而,马斯克并未详细说明这一点,但他的言论立即引发了广泛关注——为什么会有 150 岁的人?背后隐藏的是”欺诈“还是另有什么原因?
争议之下,有业界专家认为,这很可能与政府支付系统中使用的几十年历史的编程语言 COBOL 有关,而非 DOGE 口中的”150 岁的人欺诈“。
一场欺诈指控变成了”乌龙“事件
COBOL,这门语言是 1959 年通过公私合作伙伴关系开发的,旨在为商业应用提供一种类似英语的编程语言,许多“互联网老人”对它并不陌生。
随着时间的推移,尽管由于维护成本高昂且与现代系统不兼容,大多数私营企业已经放弃了 COBOL,但它依然在政府和受监管行业中广泛使用。
政府机构依赖基于 COBOL 的大型机来处理关键财务交易,包括税务支付、社会保障和医保。在适当维护的情况下,这些系统非常可靠,具备内建冗余和容错功能。截至目前,COBOL 仍在金融、电信和医疗等领域发挥着重要作用。
目前,社会保障局(SSA)使用的正是 COBOL 编程语言。几年前,疫情期间,美国政府各机构曾被曝高薪争抢 COBOL 程序员,因为年轻程序员对这门语言并不熟悉。
针对当前 SSA 系统的问题,有程序员指出,社会保障局的计算机系统以 1875 年 5 月 20 日为日期基准。至于为什么是这个时间?
据悉,1875 年 5 月 20 日,国际度量衡局(International Bureau of Weights and Measures)建立了统一的质量和长度标准。后来,它还为日期制定了标准。这一日期标准的起始日定为 1875 年 5 月 20 日,以纪念度量衡局的创建。
SSA 的计算机使用的是较旧版本的 COBOL,并以此日期作为基准。日期存储为自 1875 年 5 月 20 日以来的天数。如果社会保障局无法得知某人的出生日期,该字段在记录中将为空。这些人看起来像是在 1875 年 5 月 20 日出生的,也就是 150 年前。
至此,关于”150 岁还在领取社会福利“的欺诈事件似乎演变成为一场程序员不懂 COBOL 语言的”乌龙“事件,而这个说法是否准确,很多程序员展开了讨论。
在 COBOL 中,缺失或损坏的日期是否默认设置为 1875 年 5 月 20 日?
为了求证,也有开发者在问答社区 StackExchange 发帖求证——”在 COBOL 中,缺失或损坏的日期是否默认设置为 1875 年 5 月 20 日?“
有一种说法在流传,比如在 Mastodon 上有人说:
[……] 在 COBOL 中,如果一个日期缺失[或“损坏”],程序默认设为 1875 年……
这个说法有时会被“放大”,比如说它默认设为具体的 1875 年 5 月 20 日——即米制公约签署的那一天,或者说这是某种“老程序员”才知道的”秘密“,当然它也试图解释某些现象。
遗憾的是,我找不到任何技术依据来支持这个说法。例如,这个技术标准中根本没有提到 1875 年。而且似乎我并不是唯一一个无法提供技术依据的人。
因此,我作为一名“年轻程序员”的问题是:有没有确凿证据表明某个 COBOL 的规范或实现确实如此运作?
如果没有,是否可能有一些与 COBOL 相关的软件(比如数据库管理系统)能够解释这种默认行为?
如果答案仍然是否定的,那么是否有一些强有力的论据支持或反驳这个说法的可信度?
有网友表示:「我是一名老程序员,也就是今天大家口中的”Coder“。许多老程序员都知道 COBOL,而年轻的编程人员则不太了解。当有人称社会保障部门正在支付数千名 150 岁老人时,我认为应该有人告诉马斯克,在 COBOL 中,如果缺少日期,程序会默认使用 1875 年。例如,2025 - 1875 = 150。」
随即不少人赞同道,”正确。如果出生日期字段包含损坏或不匹配的数据,则默认为 1875-05-20,这起到了标记的作用。1875 年 5 月 20 日是签署国际标准和度量衡条约的日子。当你不知道技术是如何运作的时候,这就带来了一场阴谋。“
不过,也有开发者反驳道,这并非是通用的做法。
COBOL 甚至没有日期类型。在我从事 COBOL 工作的 1996 到 2000 年期间,日期只是用六个数字表示,我们需要自己进行日期计算(或者使用需要剪切和粘贴的预定义例程)。
由于千年虫问题以及数据库文件转换的困难,地方性惯例开始使用一个截止日期来决定一个日期属于 1900 年还是 2000 年。这取决于使用场景,例如,出生日期和订单日期之间会有区别。
因此,程序之所以使用这种方法,仅仅是出于某种地方性编程惯例,并不是 COBOL 的通用做法。
还有一位名为 Raffzahn 的网友深度分析称:曾经,数据结构是为了适应目的而设计的,而不是为了编译器。仔细看看这个问题,能清楚看到有效日期的限制:
社会保障在 1935 年推出。
要有资格领取福利,必须至少缴纳 40 个季度,也就是 10 年。
年龄至少要 65 岁。
这意味着社会保障的第一批常规受益人是在 1945 年 65 岁的人,即 1880 年出生的群体。而在 1880 年之前出生的人不会参与该系统。任何比这个年纪大的人也不太可能是受益人,而比这个年纪小(还在缴纳的人)的人自然会更年轻。
所以,加上 5 年的容错余地,最早的出生年份就定在了 1875 年,成为记录生日的合理起始年。一个完美的日期起点,不是吗?
不过,Raffzahn 觉得,「严格来说,这不是 COBOL 的问题,而是数据适应任务的问题。当然,这样的细节很难和公众沟通。因为这些通常是用 COBOL(或者更常见的是汇编语言)完成的,将责任归咎于 COBOL 对公众传播效果很好。这也不算错,因为那时使用这种编程方式是 COBOL 中的好做法,因为那时就是这样。」
所以针对上述开发者提出的几个问题,整体来看,Raffzahn 剖析道:
1. COBOL 是否将日期缺失或损坏时默认设置为 1875 年 5 月 20 日?
不,COBOL 并不会。这件事实际上是关于优化数据存储的问题。
这是一个今天几乎失传的艺术,程序员现在通常使用最合适的数据类型(例如,用 float 存储 bool)。当时,我们不仅关注处理逻辑,还关注代码和数据的最佳实现。
2. 有时该说法还被“增强”,认为 COBOL 默认设置为 1875 年 5 月 20 日——国际度量衡局签署米制公约的那一天,或称这是某些“老程序员”的智慧,当然,它也能解释它试图解释的现象。
不,绝对不是针对某个特定日期。这样做不仅非常不寻常,而且会增加编程工作量,需要在存储和显示之间进行转换。
米制公约这一年只是个巧合。
3. 我很遗憾没有找到任何技术依据来支持这个说法。
不需要技术细节。根据常识,日期通常基于某些固定点。毕竟,所有的日历系统都是基于某个固定点的——比如公元 1 年,或者像 Unix,使用 1970 年作为基准。
4 . 例如,这个技术标准中没有提到 1875 年。而且我似乎并不孤单,无法找到相关依据。
因为 1875 年对社会保障来说很有意义。
5. 所以我的问题是:“年轻程序员”:有任何硬证据表明 COBOL 规范或实现是这样的吗?
这与 COBOL 或其他数据无关,而是关于常识的数据结构。
6. 如果答案仍然是否定的,是否有强有力的论点支持或反对这一说法的合理性?
完全相反。任何对数据结构有基本了解的人都会看到这种方式是如何工作的。像这种方法是常识。
那么到底是什么?
请记住,我们讨论的是一个在上世纪 30-50 年代设计的系统。那时是打孔卡片时代,每个字符都非常宝贵。把日期存储为 8 个字符是极其浪费的。所以当时大多数商业应用都将日期存储为 5 个字符:3 个字符表示日期,2 个字符表示年份。他们甚至使用更糟糕的编码方式来节省空间。
现在,社会保障需要覆盖超过 100 岁以上的年龄,因此定义一个合理的截止年份作为“零年”,可以节省后续字符的需求量。这样,出生日期就可以用 6 个字符编码,而不是 8 个字符。3 个字符表示日期,再加上 3 个字符表示年份减去 1875。
相反,如果没有填写日期——例如出生日期不明——这个字段会为空。按照这种逻辑,空白字段就会输出 1875 年——至少在没有处理这个例外的报告中会这样显示。
就是这么简单。
“DOGE 团队可能需要 COBOL 速成课”
归根究底,这并非一起“欺诈”事件,而是编码理解错误所导致的误会。
有网友提出疑问,为什么马斯克和他的团队没有深入调查那些被认为是 150 岁的人为什么会有相同的出生日期——即 1875 年 5 月 20 日,而是直接将其视为欺诈行为?
很多人将其归咎为马斯克组建的 DOGE 核心团队成员过于年轻。
本月初,外媒《连线》曝光了马斯克 DOGE 部分核心人员,其中所依赖的 6 名年轻 AI 工程师,他们也被称为“娃娃兵”。这些成员的年龄普遍在 19 至 25 岁之间,有的刚刚大学毕业,有的甚至可能还在上大学。具体成员包括:
Akash Bobba,21 岁:曾就读于加州大学伯克利分校,并参与该校的管理、创业与技术项目。去年春天,他曾在桥水基金担任投资工程实习生,之前也曾在 Meta 和 Palantir 实习。
Edward Coristine,19 岁:刚从高中毕业,并已被东北大学录取。根据《连线》获得的简历副本,他曾在去年夏天在马斯克的脑机接口公司 Neuralink 工作三个月。
Luke Farritor,23 岁:知情人士透露,法里托曾在马斯克旗下的 SpaceX 实习,并获得泰尔奖学金资助。
Gautier Cole Killian,25 岁:曾在加州大学伯克利分校就读,直到 2020 年。他最近为人工智能公司 Databricks 工作。
Gavin Kliger,24 岁:外媒报道称,据一个已存档并已删除的个人网站信息,克莱格尔曾在 Jump Trading 担任工程师,该公司专注于算法和高频金融交易。内部记录显示,他拥有与 DOGE 相关的工作邮箱,并在 DOGE 担任志愿者。
Ethan Shaotran,22 岁:去年 9 月,绍特兰在接受《商业内幕》采访时表示,他是哈佛大学计算机科学专业的高级学生,并且是 OpenAI 支持的创业公司 Energize AI 的创始人。
这些年轻成员的加入使得马斯克的 DOGE 团队在处理复杂数据和技术问题时,可能缺乏必要的经验和对历史编码问题的深入理解。
早些时候,更有外媒直接发文,喊话“马斯克的 DOGE 团队可能需要 COBOL 速成课”,毕竟团队都太年轻了,没有接触过太多的关于 COBOL 的内容,而 COBOL 又是管理各种政府财务交易的政府大型机系统中广泛使用的语言。
正如一位专家所说,COBOL 充当着将大型机各个组件“粘合”在一起的“胶水”,它是与应用程序和数据库协同工作的代码。大型机本身则加载了冗余和容错功能,因此它们从不崩溃。
有些人担心,马斯克的年轻工程师们可能会在接触 COBOL 代码库时,不了解其完整的影响就进行更改。通常,对政府系统底层代码的任何更改都必须遵循由其他机构工作人员撰写的详细业务需求。任何系统的延迟或停机都会对真实的人们生活产生直接影响。如果 DOGE 的工作人员试图重写部分 COBOL 代码,可能会导致意想不到的后果,包括对关键政府服务的重大干扰。而且,这些意外后果很可能发生,甚至是不可避免的。
因此,有人建议,DOGE 团队应三思而后行:要么让年轻工程师学习 COBOL,要么聘请一些精通 COBOL 且了解系统“潜规则”的资深专家。这样可以避免将 COBOL 的复杂性和脆弱性误解为缺陷,而忽略它可能是系统特性的一部分,也防止上述“乌龙”事件再次发生。
来源:
https://retrocomputing.stackexchange.com/questions/31288/did-missing-corrupt-dates-in-cobol-default-to-1875-05-20
https://www.fastcompany.com/91278597/elon-musk-doge-cobol-language
https://www.wired.com/story/elon-musk-doge-social-security-150-year-old-benefits/
推荐阅读:
▶离职5个月,OpenAI前CTO“自立门户”,疯狂挖角老东家:29人团队中,2/3是ChatGPT骨干!
▶20万张GPU!号称“地球上最聪明的AI”Grok-3来了,斩获多个Top1,网友:算力消耗是DeepSeek V3的263倍
▶“3000万行C代码暂时不会消失,新内核驱动可用Rust写写看”,Linux二把手表态支持Rust!