Recheckig, praktisch, bequem…

…sind Schwedenstühle. Die stoffbespannten, kompakt transportierbaren Sitzgelegenheiten sind genau das richtige für Pfadfinder. Daher werden wir solche morgen im „Club de los Exploradores“ konstruieren.

Der feste und farbenprächtige Stoff ist übrigens der Gleiche, der auch das typische Bild einer ein Kind im Tuch auf dem Rücken tragenden Quechuaindianerin prägt. Quechuastoff im Schwedenstuhl, einfach international.

Einen Ticken stolz

Wie soll man unter Zehntausenden die richtige finden?

Gemeint sind natürlich CPTs, bei denen es sich um standardisierte Codes zur genauen Identifizierung von diagnostischen, chirurgischen und anderen medizinischen Prozeduren handelt. Und jedes Mal, wenn ein Arzt bei uns einen Entlasssbrief schreibt, muss er dazu die richtigen CPT-Codes angeben, so will es das Ministerium.

Bis gestern gab es dazu in unserem System eine Auswahlbox die so aussah:

Zwar war eine Volltextsuche möglich, doch in der Praxis gab es einige Probleme:

  • Es gibt oft mehrere ähnliche Codes für die gleiche Behandlung. Der Arzt muss die ganze Beschreibung lesen, um den richtigen auszuwählen, was bei dem kleinen Auswahlfeld quasi unmöglich ist. Niemand möchte den weiten und beschwerlichen Weg bis zum unteren Ende der Trefferliste auf sich nehmen.
  • Es fehlt der Überblick darüber, welche Codes es überhaupt gibt.
  • Die Codes sind eigentlich hierarchisch nach Kategorien geordnet. Doch davon kann der Benutzer gar keinen Gebrauch machen. Dadurch wurden manchmal Codes ausgewählt, die zwar ähnlich anmuten, aber zu einer anderen Spezialisierung als der des Arztes gehören. Und das gab dann Ärger mit dem Ministerium.

Tatsächlich habe ich die Trefferbox, die ich gerade kritisiere vor einigen Monaten selbst eingerichtet. Das war jedoch unter der (nichtzutreffenden) Annahme, dass die Ärzte die meisten Codes ohnehin auswendig wissen und die Beschreibung eher der Kontrolle dient.

Erbeten wurde eine Verbesserung der Benutzerschnittstelle und aus dem Gespräch kristallisierten sich die folgenden Anforderungen heraus:

  • Nach wie vor muss ein dem Arzt bekannter Code schnell ausgewählt werden können.
  • Die Verortung in der hierarchischen Struktur muss dem Arzt bei der Auswahl eines Codes bewusst sein.
  • Bei der Volltextsuche muss ein besserer Überblick über die Suchergebnisse hergestellt werden.

Gemeinsam mit meiner Kollegin wurde erst mal auf dem Papier eine grobe Idee entwickelt:

Die verfügbaren Codes sollten in Form eines auf- und zuklappbaren Baumes dargestellt werden.
Ein darüber befindliches Suchfeld sollte diesen Baum filtern.
Im Falle hinreichend vorgefilterter Ergebnisse sollte der gefilterte Baum sich bereits von Anfang an komplett aufklappen.

Ich nehme für die weniger technischen Leser das Ergebnis vorweg:

Im Video wird nach dem Stichwort „Hysterektomie“ gesucht. Bei diesem Beispiel wird an der schieren Menge der Ergebnisse sofort der Vorteil der Umstellung klar. Sofort kann die einzig verfügbare Anästhesie ausgewählt werden und auch im Bereich der Chirurgie ist es durch die Anzeige der Beschreibungen in langen Zeilen nun möglich, die richtige Variante auszuwählen (die davon abhängt, welche Operationsmethode angewandt wurde, welche Organe mit entfernt wurden und wie schwer die entfernten Organe waren).

Nun zum Technischen. Interessant wurde die Umsetzung aus folgenden Gründen:

  • Der gesamte Baum ist zu groß, um ihn in seiner Fülle dem Browser zuzumuten. Es werden immer nur die gerade aufgeklappten Schichten, beziehungsweise das aktuelle Suchergebnis per AJAX vom Server angefordert. Auch der gefilterte Baum wird nur dann komplett geladen, wenn die Suche hinreichend genau war.
  • Obwohl für den Benutzer der Eindruck erweckt wird, dass beim Tippen die Suche sofort verfeinert wird, stoßen die einzelnen Tastenanschläge keine aufwendigen Anfragen aus, sondern erst wenn er mit dem Tippen aufhört (debouncing), wird nach 250ms eine Suche ausgelöst. Das führt im Test beim nicht flüssigen Tippen von „Hysterektomie“ zu nur zwei statt dreizehn Anfragen.
  • Der Baum wird nicht bei jeder Anfrage erneut aus der Datenbank geladen und zusammengesetzt, sondern in einer optimierten Hash-basierten Datenstruktur im Arbeitsspeicher gecached und dann nur in Echtzeit gefiltert, der passende Teilbaum ausgewählt und dann der Baum an der maximalen Tiefe beschnitten.
  • Die Tiefe des Baumes ist technisch (weitgehend) unbegrenzt. Sollte das Ministerium eine 20 Ebenen tiefe Verschachtelung vorsehen, sind wir schon gewappnet.
  • Der Baumfilteralgorithmus ist interessant. Durch die Suchbegriffe wird die Teilmenge der anzuzeigenden Blätter festgelegt. Nun ist ein minimaler Teilbaum gesucht, der alle diese Blätter enthält (aber keine leergefilterten Unterkategorien). Das performant und richtig zu bewerkstelligen erforderte zwei Anläufe. Und ich konnte meiner Kollegin dabei Unit-Tests erklären.
  • Spezialbehandlung von Sonderzeichen: Wer ‚i‘ eingibt, möchte auch Treffer finden, die ‚í‘ (mit Akzent) enthalten. Rein technisch sind das aber erst einmal völlig verschiedene Zeichen. Dass dies nötig ist, war die Idee meiner neuen peruanischen Kollegin.
  • Die Baumalgorithmen im Backend wie auch das von Grund auf selbst entwickelte jQuery-Plugin zur dynamischen Baumanzeige im Frontend wurden als wiederverwendbare Komponenten angelegt.

Diese „Klickibunti“-Arbeit hat mir viel Freude bereitet, weil man am Ende das Ergebnis so schön sieht.
Und vielleicht hilft er auch bei der Beantwortung der folgenden Frage:

Was hat dieser Informatiker eigentlich in einem Missionskrankenhaus zu suchen?

Probier’s mal mit Gelassenheit

Eigentlich bin ich nur zu Hause, um meine Pflanzen zu gießen.
Temporär bin ich nämlich, um darauf aufzupassen, ins Haus eines Missionarsehepaars gezogen, das einen Monat in Deutschland verbringt.
Die beiden haben auch ein Klavier da gelassen, auf das passe ich ganz besonders gut auf.
(Unser Radiologe John scherzte mal, er sei viele Jahre mit einem Klavier verheiratet gewesen, bis er seine Frau kennen lernte.
In diesem Sinne habe ich gerade eine ziemlich vergnügliche Affäre, sodass mein eigenes Piano in Deutschland bestimmt die Verlobung auflöst, sobald es davon erfährt).

In der Hand ein paar wenige Dinge, die ich beim Umzug vergaß, möchte ich soeben die Tür abschließen, als mir noch der spontane Gedanke durch den Kopf fährt, einen Blick in den Kühlschrank zu werfen. Ich öffne die Tür.

Die Nase ist am nähesten am sich öffnenden Kühlschranktürschlitz und registriert daher als erste die leicht alkoholisch, leicht nach Essig riechende Sauce auf dem Kühlschrankboden. Die Augen beobachten fasziniert, wie diese aus dem Gefrierfach tropft uns sich Ebene für Ebene bis in einen See auf dem Kühlschrankboden ergießt, wie ein farbiges Wasserspiel (die Flüssigkeit ist rötlicher Färbung, mit gelben Schlieren). Die Ohren beeilen sich nun, festzustellen, dass der Kühlschrank gar nicht summt.

Keine Kälte. Zwei Ameisen spazieren am lauen Ufer des Kühlschrankbodensees entlang.

(Später komme ich zum Schluss, dass sie, nachdem die Tür ja dicht verschlossen war, sicherlich durch den Kondenswasserauslass an der Kühlschrankrückseite eingedrungen sein müssen wie Forscher in eine Tropfsteinhöhle. Durchs Öffnen der Grottenwand und das ganze Licht habe ich denen bestimmt total die Stimmung ruiniert. „So ein Lappen“, werden die beiden sich gedacht haben und damit ihr eigenes Schicksal erraten haben, bevor es sie begrub.)

Ich forsche jetzt auch, und zwar nach der Ursache. Fast fühle ich mich wie bei der Arbeit. Dass Fehler im Programmcode zu finden als Debugging („Entkäfern“), bezeichnet wird, also auch hierbei bildlich Insekten auf die Spur gegangen wird, trägt dazu sicher bei.

Auch die Vorgehensweise ist ähnlich, sie orientiert sich am Abklappern von Annahmen. Ein Kühlschrank muss an sein, wenn er Strom hat. Er hat doch Strom? Sein Stecker steckt in einem Gerät, das vor Spannungsspitzen schützen soll. Die Kontrolleuchte am Spannungsspitzenschutzgerät sollte an sein, wenn es Strom hat. Doch sie ist aus. Es ist aber kein Stromausfall. Beim Überprüfen der Sicherung des Spannungsspitzenschutzgeräts stelle ich fest, dass es ganz nass ist.

Wasser und Strom haben den Ruf, gemeinsam Unfug anzustellen. Sicherheitshalber entferne ich also die Stromzufuhr aus der Wandsteckdose, bevor ich es genauer diagnostiziere. Die Nase ist wieder am schnellsten und vermeldet den ihr aus meiner experimentierfreudigen Kindheit bekannten Geruch von verschmurgelter Elektronik.

Damit steht fest: Es wurde wohl, jenseits aller Hoffnung auf Wiederbelebung durch Beatmung und Herzdruckmassagen, ertränkt.
Aber woher kommt das Wasser? Wer hätte ein Motiv,…?

Da. Ein Tropfen fällt direkt auf die Stelle, auf der bis vor Kurzem das nun ausgediente Gerät diente. Auf heißer Tat überführt. Ich habe genau gesehen, dass er vom kleinen Küchenregal, von Regaletage zwei kam. Regaletage zwei ist bis zur abgesetzten Regalkannte überflutet. Doch Regaletage zwei könnte so viel Wasser niemals selbst aufbringen, sie ist nur ein kleiner Fisch (und ähnlich nass wie ein solcher) in diesem schmutzigen Geschäft. Die Ermittlungen führen schnell zu Regaletage drei, die ähnlich überflutet ist. Zwei Besteckkörbe haben überlebt und werden evakuiert. Die Regaletage drei zu Grunde liegende Spanplatte hat tapfer versucht, Widerstand zu leisten, indem sie möglichst viel Wasser aufgesaugt hat. Sie ist so aufgequollen wie ein überfahrener Hund nach einer Woche in der Sonne (das ist an der Panamericana kein allzu weit hergeholter Vergleich).

Auf Regaletage drei befindet sich natürlich auch die Quelle des Wassers. Noch immer tröpfelt es aus einer Dichtung am Austrittshahn des großen Wasserfilters.

Auf die Aufklärung folgt die Tatortreinigung. Es ist ja gut, einen Kühlschrank hin und wieder abzutauen, aber empfehlenswert, den Inhalt vorher zu entfernen, nicht nachher. Es finden sich dabei letzte Hinweise auf den Tathergang. Die Sauce war das Produkt aufgetauter und zersetzter Ciruelas (das sind kirschenähnliche Früchte). Sie hat den ebenfalls im Gefrierfach gelagerten Teig in Mitleidenschaft gezogen, ist aus der offenbar nicht ganz dichten Gefrierfachtür entwichen und hat dann Etage für Etage den Kühlschrank benetzt. Faszinierend, dass ein Wasserspiel das andere ausgelöst hat.

Auf die Tatortreinigung folt die Ursachenbehebung. Dafür muss einfach die Dichtung um den Auslasshahn des Filters etwas fester gezogen werden.
Eine hervorragende Gelegenheit, den Filter gleich mal zu entalgen.

Schließlich der Prozess. Die Urteile fallen jetzt viel milder aus als früher.

Früher hätte ich mich dazu hinreißen lassen, dem gesamten Tag eine zwei-Sterne-Bewertung reinzudrücken.
Doch der Tag ist, ebenso wie alle anderen Tage des gleichen Herstellers(Schöpfers) frei von Produktionsmängeln.
Und heute war sogar noch besonders gutes Wetter.

Allerdings hätte das ganze Schlamassel verhindert werden können, wenn ich den Filter etwas früher gereinigt und dabei gleich die Dichtung am Hahn festgezogen hätte.
Auf diese Fahrlässigkeit steht als Strafe schlechte Laune.
Ich setze die Strafe zur Bewährung an.

Einfach mal ein paar Bilder

Spaziergänge tun gut zum Durchatmen. Auch wenn die Luft mit zunehmender Höhe natürlich noch dünner wird.

Weil der Blog ohne Bilder leblos wird, möchte ich vom letzten ein paar Teilen:

Zur rechten Zeit

Ich bin nun seit über 22 Monaten in Peru.
Und über 21 Monate sind vergangen, seitdem ich meine Arbeit am Krankenhaus Diospi Suyana in Curahuasi aufgenommen habe.

Man kann leicht ausrechnen, wie wenig von meinen 2 Jahren Einsatzdauer damit noch übrig ist.

Die Frage ist: Was passiert hier, wenn ich weg bin?
„Nach mir die Sintflut“ wäre die allereinfachste Antwort. Zu einfach, denn eine „Sintflut Teil 2“ wurde vom Urheber explizit ausgeschlossen.

Deswegen hoffe ich schon länger auf einen Nachfolger.

Eine am 17. November vergangenen Jahres verfasste Suchmail an Karlsruher Freunde in der SMD verhallte ergebnislos.
Wir haben immer wieder Peruaner zu Vorstellungsgesprächen eingeladen. Die Vielversprechenden unter den Bewerbern wollten aber nie zu uns kommen, sondern haben gut bezahlte Jobs in den Großstädten Lima und Arequipa vorgezogen. Wohin es auch meinen einzigen Entwickler-Kollegen verschlagen hat.
Ein Australier, der Interesse gezeigt hat, hat leider nicht aufs Profil gepasst.
Das war etwa ein halbes Jahr vor dem Ende meiner Einsatzzeit. Unter einem halben Jahr kann es ein ausländischer Missionar kaum schaffen, einen Spenderkreis aufzubauen, Spanisch zu lernen und nach Peru zu kommen. Die Hoffnung auf einen direkten ehrenamtlichen Nachfolger war damit ziemlich sicher gestorben.

Und so habe ich die Hoffnung aufgegeben, einen Nachfolger noch mit eigenen Augen zu sehen und mich damit abgefunden, dass diese Frage außerhalb meines Verantwortungs- und Einflussbereichs liegt.

Wie lange bräuchte man, um einen Peruaner in diesen Job einzuarbeiten? Weil hier in Peru vor allem Microsoft-Technologien gelehrt werden (.NET-Framework) und wir quelloffene, geeignetere, Alternativtechnologien einsetzen, und weil Softwareentwicklung hier eher als Handwerk (mit bestimmten Werkzeugen) als eine (von Werkzeugen unabhängige) Wissenschaft gelehrt wird, sodass wir auch die Verwendung der anderen Werkzeuge/Sprachen/Technologien vermitteln müssen, hätte ich hier immer einen absoluten Mindestzeitraum von drei Monaten angesetzt.

Der letztmögliche sinnvolle Ankunftszeitpunkt für einen peruanischen Kandidaten wäre damit Anfang August.

Es ist kaum zu glauben, dass in der letzten Juliwoche eine Kandidatin, die erst kurze Zeit zuvor von Diospi Suyana erfahren hat, bei uns spontan zum Vorstellungsgespräch erschien. Entgegen aller Wahrscheinlichkeiten brachte sie Programmierkenntnisse mit, was hier nicht Standard ist, und uns viel sofort ihre schnelle Auffassungsgabe auf. Ihre Familie wohnt in der nächsten Stadt (Abancay), weswegen sie wohl nicht beim ersten Jobangebot fluchtartik in eine Metropole entschwinden wird. Und sie war bereit, am übernächsten Tag anzufangen. Ich bin seit letzter Woche dabei, sie einzuarbeiten. Die ideale Kandidatin, zum exakten Zeitpunkt.

Wie gerne wollen wir Menschen auf Sicht navigieren, und wie machtlos sind wir dabei im Nebel der Ungewissheit.
Und: Wie gut, dass Gott Radar hat.

Hier noch ein Foto, mit den beim Nationalfeiertag (wir mussten wieder marschieren, die restlichen Vier verreisten rechtzeitig und hatten damit eine Ausrede) anwesenden Kollegen.
Links die neue Mitarbeiterin, rechts mein Chef.