2010 年,Node.js v0.4 发布,互联网忙着争论 JavaScript 在服务端是不是个笑话。与此同时,我 22 岁,在为一个将被部署到约旦各医院的国家级 EHR 系统的药房配发模块写 MUMPS 例程。
我那个年龄的大多数工程师在做 CRUD app。我在做医疗基础设施。
那就是 HAKEEM——由 Electronic Health Solutions(EHS)运营的国家 EHR 项目,EHS 是约旦政府与一个医疗机构联合体之间的公私合营。我的角色:开发者兼系统分析员,2010 年到 2013 年。三年。四家医院。一个国家级系统。
HAKEEM 建在什么之上
HAKEEM 建在 VistA 之上——美国退伍军人事务部开发的 Veterans Information Systems and Technology Architecture。如果你没听说过:VistA 是地球上运行时间最长的 EHR 系统之一,从 1980 年代起就部署在美国退伍军人医院。它跑在 MUMPS(后来叫 M)上——一个既是语言又是层次化数据库的组合,和你见过的任何东西都不像。
把国家 EHR 建在 VistA 上这个决定不是一个奇怪的决定。VistA 经过了商业 EHR 难以匹敌的战斗测试——它有药房模块、临床决策支持、排班、计费,全部在一个连贯的数据模型下集成。它是开源的,意味着约旦不需要为国家部署购买专有软件的许可证。它跑在 GT.M 上,一个层次化 NoSQL 数据库,意味着你需要能读 MUMPS 的工程师,不怕四十年历史技术栈的工程师。
我就是那些工程师之一。
“系统分析员”在实地实际意味着什么
职称是开发者/系统分析员。这在实践中意味着:我写了 C# GUI 应用,通过 VistA 的 Remote Procedure Call(RPC)Broker 协议与 VistA 后端通信。两个主要的是患者信息管理 GUI 和排班 GUI。
这些听起来无聊。它们不是。国家级 EHR 里的患者信息管理意味着你的 GUI 是注册护士录入数据的界面,而这些数据流向每个下游系统——药房、实验室、计费、报告。把数据模型搞错,或者构建一个允许垃圾数据进入的 GUI,你就会在上线六个月后在 Prince Hamza 医院调试患者 ID 不匹配的问题。
排班 GUI 同样是承重的。安曼综合门诊的门诊排班意味着管理多个科室的预约时段,处理取消和改期,并生成门诊管理层用于人员配置决策的报告。这是当它坏掉时极其重要的无聊软件。
2011 年在 Linux 服务器上跑 MUMPS
GT.M 数据库跑在 Linux 服务器上。我的工作包括维护用于备份和任务管理的 bash 脚本——这种运营工作不会让简历看起来令人印象深刻,但绝对能让医院不丢数据。
我还在三个包里写了 MUMPS 例程:Pharmacy、Billing 和 HL7 Messaging。
MUMPS 是一门会冒犯你审美感觉然后正确运行四十年的语言。变量默认是全局的。数据库就是语言——globals(MUMPS 对持久变量的术语)直接映射到层次化数据库结构。一个例程就是一个文件。没有现代意义上的函数;有标签和 GOTO 等价物,让结构化编程的人感到不舒服。
然而:我为 HAKEEM 写的 MUMPS 药房配发逻辑,几乎可以肯定今天还在约旦的某些医院以某种形式运行着。关于 2011 年流行的大多数 JavaScript 框架,你说不了这句话。
四家医院,四个不同的问题
HAKEEM 推出到四个机构,每一个都有自己的 deploy 故事。
Prince Hamza 医院是大型综合医院——高流量、多个专科、EHR 全部功能的宽度。这是你发现患者注册和排班在每天数百次门诊量下是否可扩展的地方。
安曼综合门诊是门诊模型。住院护理较少,预约管理和慢性病随访较多。排班 GUI 在这里证明了自己的价值。
Prince Hussein 医院有它自己的临床工作流需求,没有干净地映射到默认的 VistA 配置上。在 MUMPS 层面做定制化。有意思的时光。
King Hussein 癌症中心是集成项目——它值得单独的解释,我会在另一篇关于 HL7 的文章里给出。但简短版本是:KHCC 有自己的 EHR、自己的患者记录、自己的工作流。HAKEEM 需要通过共享标准消费和贡献数据。那个标准是 HL7 v2。我构建了那个集成。
2012 年的移动端 GUI
简历里不会看到的另一件事:我用 Java 和 Objective-C 为 HAKEEM 组件写了移动端 GUI,分别针对 Android 和 iOS。
2012 年的移动医疗不是一个成熟的领域。Android 当时是 4.0 版本。iOS 6 还有几个月才发布。临床医生用移动设备访问患者记录这个概念还足够新,UX 模式还没有建立起惯例。我们在约束下边做边摸索——在移动设备上误读患者记录的患者安全影响,不是误读一条推文能比的。
这教会了我关于国家级基础设施的什么
三年 HAKEEM 教会了我一件事,我把它带进了此后的每个项目:“能工作的软件”和”一个国家依赖的基础设施”之间的差距是组织问题,不是技术问题。
代码很难。MUMPS 很难。HL7 很难。在 2012 年没有任何人有攻略的情况下写一个移动 EHR GUI 很难。
但更难的问题是那些没有调试器的。哪家医院得到下一个定制化 sprint?当两家医院需要对同一个 MUMPS 例程进行冲突的修改时,谁做决定?当你正在向明天还要接诊患者的医院进行 deploy 时,回滚意味着什么?
那三年我 22 到 25 岁。我获得的技术技能是有价值的。理解复杂系统在组织层面如何失败更有价值。结果证明在 MUMPS 里写药房逻辑是同时学这两件事的相当好的方式。
当我在 EHS 结束工作时,Node.js 生态系统还在摸索自己的方向。HAKEEM 药房模块已经在四家医院的生产环境里了。我对那几年的花法感到满意。