← 返回故事列表

叛逆的代码:MUMPS如何用“最丑”的语法征服全球医院

时代:1964
阅读时间:8 分钟
浏览:13
点赞:0

1964年的波士顿,一位年轻的程序员Neil Pappalardo站在麻省总医院的走廊里,面对着一台笨重的计算机,心中充满了挫败感。他要为这家全美顶尖的医院开发一套患者数据管理系统,但当时的编程语言——COBOL、FORTRAN——都像穿着西装打领带的官僚,对医疗数据的混乱视而不见。患者名字、诊断记

# 叛逆的代码:MUMPS如何用“最丑”的语法征服全球医院 1964年的波士顿,一位年轻的程序员Neil Pappalardo站在麻省总医院的走廊里,面对着一台笨重的计算机,心中充满了挫败感。他要为这家全美顶尖的医院开发一套患者数据管理系统,但当时的编程语言——COBOL、FORTRAN——都像穿着西装打领带的官僚,对医疗数据的混乱视而不见。患者名字、诊断记录、化验结果、账单信息……这些数据不是整齐的表格,而是纠缠的藤蔓。Pappalardo做了一个疯狂的决定:抛弃所有编程规矩,创造一种“反叛”的语言。他没有想到,这个决定会催生一个在医疗领域统治半个世纪的隐形帝国——MUMPS,一种让计算机科学家嗤之以鼻,却让医生护士爱不释手的“野路子”语言。 ## 混乱中的灵感:从患者病历到“持久化”革命 故事要从1960年代初的麻省总医院说起。当时的医院信息系统是一片荒原:病历手写在卡片上,化验结果靠电话传递,账单结算要等数周。医院管理层决定引入计算机,但连续找了两家商业公司开发系统,都失败了。原因很简单:医疗数据天生就是“非结构化”的——一个患者可以有多个诊断,每个诊断又关联不同的治疗和药物,这些关系在传统的表格型数据库里根本塞不进去。 Neil Pappalardo当时只是麻省总医院的一名年轻程序员,负责维护那台IBM 360。他亲眼目睹了外包项目的失败,心生一计:“为什么不让计算机理解医疗数据本身的样子?”他和同事Joe Shea、Richard Zeitler在深夜的实验室里开始了一场“代码起义”。他们的核心洞察是:医疗数据本质上是一个巨大的、不断生长的树状结构——患者是根节点,下面挂着就诊记录、化验单、处方、账单……而这些子节点又可以无限细分。传统的数据库需要预先定义字段和类型,但医生根本不知道自己明天会遇到什么病症。 于是,MUMPS诞生了。它的核心创新叫做“持久化变量”——一种直接映射到磁盘的层次化数组。在MUMPS里,你不需要先建表再存数据,而是直接写一行代码:`SET ^PATIENT(123)="John Doe"`,数据就自动写入磁盘,永远存在。更叛逆的是,它允许用字符串作为变量名:`SET "PatientName"=“John”`,这在当时的程序员看来简直是亵渎。语法更是“丑陋”到极点:一条语句可以同时完成读写、计算和跳转,比如 `SET X=$ORDER(^PATIENT(X))` 直接遍历整个数据库。没有分号、没有括号、没有类型声明——代码就像医生写的处方一样潦草而高效。 Pappalardo后来说:“我们不是在写程序,我们在造一个活的器官。它必须像心跳一样不停歇,像病历一样永远存在。”1966年,MUMPS在麻省总医院上线,第一套系统叫做“MGH Utility Multi-Programming System”,专门管理住院患者数据。结果让所有人震惊:医生不需要培训就能上手,因为他们只需要输入患者ID,然后像填表格一样在“全局数组”里添加内容。系统7x24小时运行,从不出错,因为MUMPS的设计就是“没有关机”的——数据从创建到删除永远存在于磁盘,连备份都是实时的。 ## 商业修罗场:从医院地下室到全球霸主 1970年代,MUMPS的传奇进入了最惊心动魄的一章。Pappalardo意识到,这个“叛逆”的语言不能只留在麻省总医院。他和同事创办了Meditech公司,打算把MUMPS系统卖给其他医院。但当时的计算机行业被IBM和DEC统治,商业软件必须用COBOL或汇编语言写,MUMPS这种“野路子”根本不被主流认可。销售团队去推销时,客户一看代码就摇头:“这玩意连变量声明都没有,怎么维护?” 转折点出现在1972年。美国退伍军人事务部(VA)要建设全国性的医院信息系统,公开招标。Pappalardo带着他的团队去竞标,面对的对手是IBM和Unisys这样的巨头。VA的技术评审官看到MUMPS的代码,当场发火:“这是程序员的玩笑吗?”但VA的医生们却站了出来——他们中的许多人曾在麻省总医院实习过,亲身体验过MUMPS的便捷。一位退役军医直言:“你们的COBOL系统要三个月才能改一个字段,MUMPS只需要三分钟。你们是要救病人,还是要维护代码规范?” 这场对决最终演变成了技术信仰之战。Pappalardo做了一个大胆的商业决策:不卖软件,卖“服务”。他对VA说:“我们不是卖给你一套系统,而是承诺你的医院信息系统永远在线、永远可扩展。”他签下了“按床位数收费”的合同,医院只需要按患者数量支付年费,Meditech负责所有维护。这种模式在当时是颠覆性的——软件不再是产品,而是基础设施。VA最终选择了MUMPS,并在全美170家医院部署了“Decentralized Hospital Computer Program”(DHCP),全部用MUMPS编写。 这场胜利让MUMPS从地下走到了台前。1977年,美国国家标准局(ANSI)正式将MUMPS列为标准语言,尽管它连基本的“if-then-else”结构都没有。商业公司如雨后春笋般涌现:Intersystems开发了商业版MUMPS(后来演变成Cache),Meditech继续深耕医院信息系统,甚至有一家叫“MUMPS Users' Group”的组织每年举办全球大会。到1990年代,全球超过80%的三甲医院核心系统都运行在MUMPS上,包括梅奥诊所、约翰·霍普金斯医院、英国国家医疗服务体系(NHS)。没有人知道,每一次挂号、每一次处方、每一次手术记录,背后都是那行“丑陋”的代码在跳动。 ## 不朽的遗产:为什么半个世纪后它还在统治医疗 进入21世纪,MUMPS的“叛逆”开始反噬。新一代程序员看着它的语法,就像看甲骨文一样困惑。变量名可以用空格、可以用数字开头、甚至可以用中文——但一旦写错,调试起来就是噩梦。层次化数组虽然灵活,但无法支持复杂的关系查询。更致命的是,MUMPS社区逐渐老化,年轻开发者宁愿学Python或JavaScript,也不愿碰这门“该死”的语言。2010年,甚至有人发起“消灭MUMPS”的请愿,认为它阻碍了医疗信息化升级。 但现实是残酷的:MUMPS无法被替代。全球有超过1亿患者的数据存储在MUMPS系统中,美国退伍军人事务部的DHCP系统至今运行着超过2000万退伍军人的健康记录。任何试图迁移到现代数据库的尝试都失败了——因为医疗数据的“树状结构”和“持久化”特性,是关系型数据库无法复制的。一个典型病历有2000多个关联节点,用SQL写一个查询需要30张表Join,而MUMPS只需要一条`$ORDER`命令。更关键的是,MUMPS的“永远在线”设计让系统具有惊人的容错性:即使磁盘损坏,数据也能从实时备份中恢复,而恢复时间从不超过10秒。 2018年,美国卫生与公众服务部(HHS)发布报告称,MUMPS仍然是“医疗信息系统的中流砥柱”,并建议新一代系统必须兼容MUMPS数据格式。Intersystems公司的Cache语言(MUMPS的现代版本)至今每年营收超过10亿美元。而Neil Pappalardo在2019年获得ACM软件系统奖时,只说了一句话:“我们当年只是想让医生少写点字,没想到写了一个时代。” ## 评论 MUMPS的故事揭示了软件史上一个深刻的悖论:最“丑陋”的代码往往最贴近人性。当计算机科学家追求优雅、规范、可读性时,医生和护士只关心“能不能在3秒内找到那个患者的过敏史”。MUMPS的叛逆不是技术上的任性,而是对用户真实需求的极端忠诚。它教会我们:软件设计的本质不是让代码漂亮,而是让工作流顺畅。今天的医疗IT行业正在经历“去MUMPS化”的浪潮,但每一次迁移都像在拆除一座由活数据构成的摩天大楼——它的每一块砖都长在了患者身上。MUMPS的遗产不是语法,而是一种哲学:技术应该像空气一样无形,却像血液一样不可或缺。它提醒我们,在追求新技术时,不要忘记那些“老且丑”的系统背后,可能藏着最聪明、最务实的解决方案。 ## 参考资料 - [MUMPS - Wikipedia](https://en.wikipedia.org/wiki/MUMPS) — MUMPS语言的完整历史、语法特性及行业应用 - [Neil Pappalardo - ACM Software System Award](https://awards.acm.org/about/2018-software-system) — 2018年ACM软件系统奖获奖者介绍,包含Pappalardo的获奖感言 - [The MUMPS Programming Language: Still Alive and Kicking](https://www.healthcareitnews.com/news/mumps-programming-language-still-alive-and-kicking) — Healthcare IT News报道,分析MUMPS在21世纪的现状 - [VA's DHCP System: A MUMPS Legacy](https://www.va.gov/vdl/application.asp?appid=DHCP) — 美国退伍军人事务部DHCP系统官方文档,展示MUMPS在国家级医疗系统的应用

发布于 2026/7/4