专栏名称: 程序猿
本微信公众号:imkuqin,为程序员提供最新最全的编程学习资料的查询。目前已经开通PHP、C/C++函数库、.NET Framework类库、J2SE API查询功能。
目录
相关文章推荐
程序员的那些事  ·  趣图:AI 大模型厂商之间的近况 ·  23 小时前  
程序员小灰  ·  部署DeepSeek ... ·  2 天前  
程序猿  ·  突发!百度出手,152亿元大收购 ·  3 天前  
51好读  ›  专栏  ›  程序猿

马斯克“查美国社保”后怒批150岁领保障金,竟是年轻程序员不懂COBOL惹了祸!

程序猿  · 公众号  · 程序员  · 2025-02-28 12:18

正文

编译 | 苏宓
出品 | CSDN(ID:CSDNnews)
本文经授权转自公众号CSDN(ID:CSDNnews)

自去年 11 月,马斯克对很多机构进行了一系列大刀阔斧的改革,近日,他将审查的目光转向了社会保障部门(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 年——至少在没有处理这个例外的报告中会这样显示。

就是这么简单。







请到「今天看啥」查看全文