2010 erschien Node.js v0.4, und das Internet stritt hitzig darüber, ob JavaScript auf dem Server ein Witz sei. Ich war 22 Jahre alt und schrieb MUMPS-Routinen für das Pharmacy-Dispensing-Modul eines nationalen EHR-Systems, das in Krankenhäusern in ganz Jordanien deployed werden sollte.

Die meisten Engineers meines Alters bauten CRUD-Apps. Ich arbeitete an Healthcare-Infrastruktur.

Das war HAKEEM — das nationale EHR-Projekt, das von Electronic Health Solutions (EHS) betrieben wird, einer Public-Private-Partnership zwischen der jordanischen Regierung und einem Konsortium von Healthcare-Anbietern. Meine Rolle: Developer und System Analyst, 2010 bis 2013. Drei Jahre. Vier Krankenhäuser. Ein System auf nationalem Maßstab.

Worauf HAKEEM aufgebaut war

HAKEEM wurde auf VistA aufgebaut — die Veterans Information Systems and Technology Architecture, entwickelt vom U.S. Department of Veterans Affairs. Falls du das nie gehört hast: VistA ist eines der am längsten laufenden EHR-Systeme auf dem Planeten, seit den 1980ern in amerikanischen Veteranenkrankenhäusern deployed. Es läuft auf MUMPS (später M genannt), einer Kombination aus hierarchischer Datenbank und Sprache, die wie nichts anderes aussieht, das du je geschrieben hast.

Die Entscheidung, ein nationales EHR auf VistA zu basieren, war keine seltsame. VistA ist kampferprobt auf eine Art, mit der kommerzielle EHRs schwer mithalten können — es hat Pharmacy-Module, klinische Entscheidungsunterstützung, Scheduling, Billing, alles unter einem kohärenten Datenmodell integriert. Die Tatsache, dass es Open Source ist, bedeutete, dass Jordanien keine proprietäre Software für ein nationales Deployment lizenzieren musste. Die Tatsache, dass es auf GT.M läuft, einer hierarchischen NoSQL-Datenbank, bedeutete, man brauchte Engineers, die MUMPS lesen konnten und sich vor einem 40 Jahre alten Technologie-Stack nicht fürchteten.

Ich war einer dieser Engineers.

Was “System Analyst” in der Praxis bedeutete

Der Titel war Developer/System Analyst. Was das in der Praxis bedeutete: Ich schrieb C#-GUI-Anwendungen, die mit dem VistA-Backend über dessen Remote Procedure Call (RPC) Broker Protocol kommunizierten. Zwei der hauptsächlichen waren das Patient Information Management GUI und das Scheduling GUI.

Das klingt langweilig. Es war nicht langweilig. Patienteninformations-Management in einem nationalen EHR bedeutet: dein GUI ist die Schnittstelle, über die eine Registrierungsschwester Daten eingibt, die in jedes nachgelagerte System fließen — Pharmacy, Labore, Billing, Reporting. Das Datenmodell falsch zu machen, oder das GUI so zu bauen, dass es Garbage hineinlässt, und man debuggt sechs Monate nach dem Go-Live Patienten-ID-Mismatches am Prince Hamza Hospital.

Das Scheduling GUI war ähnlich traglastend. Ambulante Klinik-Terminplanung an der Amman Comprehensive Clinic bedeutet: Terminslots über mehrere Abteilungen verwalten, Absagen und Umbuchungen handhaben und Reports produzieren, die die Klinikleitungsebene für Personalentscheidungen nutzt. Das ist langweilige Software, die enorm wichtig ist, wenn sie bricht.

MUMPS auf einem Linux-Server 2011

Die GT.M-Datenbank lief auf Linux-Servern. Meine Aufgabe umfasste das Warten von Bash-Skripten für Backups und Task-Management — die Art operativer Arbeit, die einen Lebenslauf nicht beeindruckend klingen lässt, aber absolut verhindert, dass Krankenhäuser Daten verlieren.

Ich schrieb auch MUMPS-Routinen in drei Packages: Pharmacy, Billing und HL7 Messaging.

MUMPS ist eine Sprache, die deine ästhetischen Empfindlichkeiten verletzen und dann 40 Jahre lang korrekt laufen wird. Variablen sind standardmäßig global. Die Datenbank ist die Sprache — Globals (der MUMPS-Begriff für persistente Variablen) mappen direkt auf die hierarchische Datenbankstruktur. Eine Routine ist eine Datei. Es gibt keine Funktionen im modernen Sinne; es gibt Labels und GOTO-Äquivalente, die Menschen mit strukturiertem Programmierungshintergrund unwohl machen.

Und dennoch: Die Pharmacy-Dispensing-Logik, die ich in MUMPS für HAKEEM schrieb, läuft mit ziemlicher Sicherheit noch heute in irgendeiner Form in jordanischen Krankenhäusern. Das ist nichts, das man über die meisten JavaScript-Frameworks sagen kann, die 2011 populär waren.

Vier Krankenhäuser, vier verschiedene Probleme

HAKEEM wurde in vier Einrichtungen ausgerollt, und jede war ihre eigene Deployment-Geschichte.

Prince Hamza Hospital war das große Allgemeinkrankenhaus — hohes Volumen, mehrere Fachrichtungen, die volle Bandbreite der EHR-Fähigkeiten. Hier stellt man fest, ob Patient-Registrierung und Scheduling skalieren, wenn man hunderte ambulante Besuche pro Tag hat.

Amman Comprehensive Clinic war das ambulante Modell. Weniger stationäre Versorgung, mehr Terminverwaltung und Nachverfolgung chronischer Erkrankungen. Das Scheduling GUI verdiente sich hier seinen Platz.

Prince Hussein Hospital hatte eigene klinische Workflow-Anforderungen, die nicht sauber auf die Standard-VistA-Konfiguration gemappt wurden. Anpassung auf der MUMPS-Schicht. Sehr vergnüglich.

King Hussein Cancer Centre war das Integrationsprojekt — und das verdient seine eigene Erklärung, die ich in einem separaten Post über HL7 gebe. Aber die Kurzversion: KHCC hatte sein eigenes EHR, seine eigenen Patientenakten und seine eigenen Workflows. HAKEEM musste Daten über einen gemeinsamen Standard austauschen. Dieser Standard war HL7 v2. Ich baute die Integration.

Mobile GUIs 2012

Das andere Ding, das in den Stichpunkten nicht auftaucht, wenn man nicht genau hinschaut: Ich schrieb Mobile GUIs für HAKEEM-Komponenten in Java und Objective-C, für Android und iOS.

Mobile Healthcare im Jahr 2012 war kein ausgereifter Bereich. Android war bei Version 4.0. iOS 6 war Monate entfernt. Das Konzept, dass ein Arzt ein Mobilgerät für den Zugriff auf Patientenakten nutzt, war neu genug, dass die UX-Muster keine etablierten Konventionen hatten. Wir figuring it out on the fly, unter der Nebenbedingung, dass ein falsch gelesener Patienteneintrag auf einem Mobilgerät Patientensicherheits-Implikationen hat, die ein falsch gelesener Tweet nicht hat.

Was mich das über nationale Infrastruktur gelehrt hat

Drei Jahre mit HAKEEM lehrten mich etwas, das ich seitdem in jedes Projekt mitgetragen habe: die Lücke zwischen “funktionierender Software” und “Infrastruktur, von der ein Land abhängt” ist ein organisatorisches Problem, kein technisches.

Der Code war schwer. MUMPS ist schwer. HL7 ist schwer. Ein mobiles EHR-GUI im Jahr 2012 zu schreiben, bevor irgendjemand ein Playbook dafür hatte, war schwer.

Aber die schwereren Probleme hatten keinen Debugger. Welches Krankenhaus bekommt den nächsten Anpassungs-Sprint? Wer trifft die Entscheidung, wenn zwei Krankenhäuser widersprüchliche Modifikationen an derselben MUMPS-Routine brauchen? Was bedeutet Rollback, wenn man mitten im Deployment an einem Krankenhaus ist, das morgen früh Patienten sieht?

Ich war 22 bis 25 in diesen drei Jahren. Die technischen Skills, die ich aufnahm, waren wertvoll. Das Verständnis davon, wie komplexe Systeme auf der Organisationsschicht versagen, war wertvoller. Es stellte sich heraus, dass Pharmacy-Logik in MUMPS zu schreiben eine recht gute Art war, beides gleichzeitig zu lernen.

Das Node.js-Ökosystem sortierte sich noch, als ich bei EHS fertig war. Das HAKEEM-Pharmacy-Modul war schon in Produktion in vier Krankenhäusern. Ich bin zufrieden damit, wie ich diese Jahre verbracht habe.