Sonntag, 17. Januar 2021

Impftermine in Hessen


Corona (oder Covid-19) ist eine Seuche, die aktuell umgeht. Eine Impfung dagegen liegt mittlerweile vor, Impfzentren wurden auch aufgebaut, z.B. im RheinMain CongressCenter. Um den Andrang zur Impfung zu steuern musste man sich anmelden, also einen Termin beantragen. Und das ging schief: Anmeldung für Corona-Erstimpfung läuft chaotisch an.

Dazu möchte ich einige Anmerkungen machen.


Vorbemerkung

Ich komme aus der IT-Branche, ich habe als Programmierer gearbeitet. Allerdings habe ich nicht im Bereich Web-Entwicklung gearbeitet, weshalb die folgenden Argumente falsch sein können. Auch kann es sein, daß ich wichtige Aspekte übersehen habe oder sie falsch bewerte. Auch habe ich keinen Einblick in die internen Strukturen, ich schaue von aussen auf diese Probleme.


Weg zum Termin

Von der Krankheit wissen wir seit etwa einem Jahr. Im Februar wurde erstmals diese Erkrankung diagnostiziert, bei einem Mitarbeiter der Firma Webasto. Von dort aus, aber nicht nur von dort aus, verbreitete sich das Virus durch Deutschland, den heutigen Stand kennen Sie.

Seit einigen Wochen gibt es Impfstoffe gegen dieses Virus, entwickelt von unterschiedlichen Firmen. Die ersten Impfstoffe sind mittlerweile zugelassen, eine beachtliche Entwicklung für die Kürze der Zeit. Und die Produktion der Impfstoffe hat begonnen. Eine solche Produktion dauert seine Zeit. Erst einmal müssen die Produktionsstraßen bereitgestellt werden, danach beginnt man mit der Herstellung der ersten Dosen des Impfstoffes und schließlich steigert man die Produktion. Am Anfang stehen somit nur geringe Mengen des Impfstoffes zur Verfügung, es herrscht also Mangel. Und diese geringe Zahl an Dosen muß verteilt werden, d.h. der Mangel muß verwaltet werden. Und so entwickelte man Prioritäten zur Impfung, wer kommt zu erst, wer kommt danach, wer kommt als letzter. Und in Deutschland hat man entschieden, zuerst die älteren Bürger zu impfen.

Man benötigt einen Termin im Impfzentrum für diese Impfung. Und der Anspruch muß geprüft werden, es soll ja gerecht zugehen, Vordrängler gibt es immer. Das gewählte Verfahren sieht vor, daß man sich per Telefon bei einer Hotline meldet oder man meldet sich per Internet an. Und dort sieht es dann so aus1):


Nach einem Klick auf Online-Terminbuchung für Ihre beiden Impftermine geht es weiter auf diese Seite:


Am Ende dieser Seite haben Sie die Möglichkeit, die Seite zur Reservierung Ihres Impftermins aufzurufen. Und dann sehen Sie nacheinander diese zwei kleinen Dialoge, die Ihnen folgendes mitteilen:

Bitte warten ...

Auf meinem Computer, sicherlich nicht die langsamste Maschine, warte ich ca. 4 Sekunden, bis das Eingangsbild erscheint. Dort kann ich mir die Datenschutzerklärung ansehen oder auf WEITER klicken. Danach erscheint dieses Bild:


Nach einem Klick auf das entsprechende Kästchen erhalte ich dann die Seite mit der Eingabe der persönlichen Daten:



Situation

Und am ersten Tag klappte das nicht unbedingt. In Hessen sind 400.000 Menschen berechtigt, sich als erste impfen zu lassen, wobei jedoch nur für 60.000 Menschen entsprechende Impfdosen zur Verfügung standen. Ausserdem gab es Probleme mit den Telefon-Hotlines und der Anmeldung via Internet: Chaos bei Impftermin-Anmeldung. Telefone waren überlastet, Server brachen zusammen, Daten zum Abgleich standen nicht zur Verfügung, es herrschte einfach nur Chaos, nichts funktionierte richtig.


Was mir auffiel

Bei Aufruf der Einstiegsseite gehen etwa 4 MB über die Leitung vom Server zu Ihrem Computer, weshalb dies einige Sekunden dauert. Und wenn Sie keine schnelle Leitung haben, dann dauert es halt länger als die 4 Sekunden, die es bei meinen Tests gedauert hat. Aber die Leitung auf Ihrer Seite ist nur ein Teil des Problems, denn die Daten müssen vom Server zu Ihrem PC geschickt werden, werden also vom Server auf die Leitungen, die das Internet bilden, gelegt. Und dort sind das nicht nur einmal diese 4 MB.

Das Innenministerium erklärte, daß es am ersten Tag der Aktion ca. 8 Millionen Zugriffe auf diese Seite gab. Insgesamt gibt es ca. 400.000 Berechtigte, die in der jetzigen Phase einen Impftermin bekommen sollen. Das macht etwa 20 Zugriffe pro Berechtigter, im Mittel. In der FAZ waren Leserbriefe abgedruckt, in denen angegeben wurde, daß man z.T. 40 mal versucht habe, auf diese Seite zuzugreifen. Die Zahl 8 Millionen Zugriffe am ersten Tag könnte somit realistisch sein.

Rechnen wir doch mal, wenn auch stark vereinfacht: 8 Millionen Zugriffe, verteilt auf 10 Stunden, das macht 800.000 Zugriffe in einer Stunde, macht etwa 13.000 Zugriffe pro Minute, macht über 200 Zugriffe pro Sekunde. Ups, das ist schon eine Größenordnung. Bedenkt man nun, daß morgens vermutlich viele Menschen versucht haben, gleich einen Impftermin zu ergattern, denn es gab nicht genügend Termine für alle Anspruchsberechtigten, dann kommt man auf eine Zahl von vielleicht 500 versuchten Zugriffen innerhalb einer Sekunde in den ersten Stunden. Und jede Person, die auf den Server zugreift, bekommt Daten im Umfang von etwa 4 MB zugesandt. Bei 200 Zugriffsversuchen innerhalb einer Sekunde gibt es schon eine Menge Daten, die über die Leitung(en) gesendet werden müssen. Und vermutlich waren es in der Spitze auch 500 Zugriffe innerhalb einer Sekunde, vielleicht auch noch mehr.

Hat man dieses System mal ausprobiert? Ich meine, so vor Beginn der Aktion mal getestet? Was haben die Tests ergeben? Konnten die Server und die Leitungen eine solche Menge an Anfragen verarbeiten? Schaut man sich den Verlauf des ersten Tages an, dann konnten sie das offensichtlich nicht.


Projektmanagement

Software-Projekte beginnen mit der Aufstellung, was die Software leisten soll. Dazu gehört die Präsentation, die Eingaben, die Prüfung der Eingaben, die nötigen Berechnungen (in diesem Beispiel die Suche eines freien Termins, notieren dieses Termins, versenden der Mail, ....) usw. Und es gehört auch dazu, die Last, die das Computersystem verkraften soll, anzugeben. Und am Ende dieses durchaus langen Prozesses steht die Abnahme des Projekts. Zur Abnahme gehört die Prüfung, ob die geforderten Leistungen auch erbracht werden. Und natürlich kann man testen, ob die Systeme unter einer angegebenen Last auch funktionieren. Und falls nicht, dann darf man die Software nicht abnehmen und schon gar nicht, die Software zur allgemeinen Benutzung freischalten.


Starkregen

An einem Projekt der Stadt Wiesbaden habe ich die gleichen Probleme bereits einmal geschildert: Starkregen-Abflussberechnungen Wäschbach. Ein einfacher Test dieser Anwendung hätte gezeigt, daß die einzelnen Schritte nicht bis zum Ende durchgeführt werden können. Und das beschriebene Problem war bekannt, aber niemand hat Schritte unternommen, das Problem zu lösen. Es hat halt niemanden gestört.


Javascript

Über die Leitung zu Ihnen als Anwender gehen fast 4MB. Würde man diese Datenmenge einmal ausdrucken, so ergäbe dies einen Stapel von fast 1.000 Seiten.

Wozu braucht man eine solche Menge an Daten? Bilder sind dies nicht, denn davon sind nur ca. 55 KB Bilder. Weiterhin gibt es etwa 400 KB Stylesheets, also Beschreibungen des Aufbaus der Seiten. Dazu kommen noch etwa 400 KB Dateien im Format JSON, die irgendwelche Daten enthalten, z.B. die Datenschutzerklärung. Und es werden Javascript-Dateien im Umfang von 3.2 MB übertragen, die die eigentliche Anwendung realisieren.

Wofür braucht man ein Programm dieses Umfangs für einige wenige Eingaben?

Die Software wurde geschrieben unter Verwendung der Bibliothek Google Web Toolkit in der Version 2.9. Die Software wurde vermutlich geschrieben in der Sprache Java und danach vom Compiler in JavaScript umgewandelt. Dabei wurde sie verwurstet, um anderen Personen den Einblick zu verwehren oder wenigstens zu erschweren. Schauen wir trotzdem in die übertragene Software hinein, dann finden wir Konstrukte wie:

ion zGb(){}\nfunction UGb(){}\nfunction YGb(){}\nfunction cHb(){}\nfunction eHb(){}\nfunction kHb(){}\nfunction eIb(){}\nfunction KKb(){}\nfunction OK
b(){}\nfunction ALb(){}\nfunction LLb(){}\nfunction PLb(){}\nfunction _Lb(){}\nfunction dMb(){}\nfunction iMb(){}\nfunction tMb(){}\nfunction vMb(){}\
nfunction vNb(){}\nfunction nNb(){}\nfunction rNb(){}\nfunction zNb(){}\nfunction BNb(){}\nfunction DNb(){}\nfunction FNb(){}\nfunction PNb(){}\nfunct
ion YNb(){}\nfunction $Nb(){}\nfunction aOb(){}\nfunction cOb(){}\nfunction eOb(){}\nfunction gOb(){}\nfunction iOb(){}\nfunction kOb(){}\nfunction sO
b(){}\nfunction BOb(){}\nfunction KOb(){}\nfunction MOb(){}\nfunction QOb(){}\nfunction XQb(){}\nfunction bRb(){}\nfunction fRb(){}\nfunction jRb(){}\
nfunction nRb(){}\nfunction rRb(){}\nfunction wRb(){}\nfunction ZRb(){}\nfunction uSb(){}\nfunction wSb(){}\nfunction ySb(){}\nfunction ASb(){}\nfunct
ion GSb(){}\nfunction KSb(){}\nfunction OSb(){}\nfunction SSb(){}\nfunction WSb(){}\nfunction YSb(){}\nfunction $Sb(){}\nfunction aTb(){}\nfunction kT
b(){}\nfunction zTb(){}\nfunction BTb(){}\nfunction FTb(){}\nfunction JTb(){}\nfunction LTb(){}\nfunction NTb(){}\nfunction PTb(){}\nfunction TTb(){}\
nfunction XTb(){}\nfunction _Tb(){}\nfunction dUb(){}\nfunction lUb(){}\nfunction nVb(){}\nfunction rVb(){}\nfunction vVb(){}\nfunction zVb(){}\nfunct
ion DVb(){}\nfunction HVb(){}\nfunction NVb(){}\nfunction RVb(){}\nfunction VVb(){}\nfunction ZVb(){}\nfunction bWb(){}\nfunction fWb(){}\nfunction hW
b(){}\nfunction lWb(){}\nfunction pWb(){}\nfunction tWb(){}\nfunction xWb(){}\nfunction DWb(){}\nfunction HWb(){}\nfunction LWb(){}\nfunction PWb(){}\
nfunction LYb(){}\nfunction nZb(){}\nfunction pZb(){}\nfunction rZb(){}\nfunction tZb(){}\nfunction vZb(){}\nfunction xZb(){}\nfunction zZb(){}\nfunct
ion BZb(){}\nfunction DZb(){}\nfunction HZb(){}\nfunction JZb(){}\nfunction LZb(){}\nfunction NZb(){}\nfunction PZb(){}\nfunction RZb(){}\nfunction TZ
b(){}\nfunction XZb(){}\nfunction b$b(){}\nfunction f$b(){}\nfunction h$b(){}\nfunction n$b(){}\nfunction p$b(){}\nfunction r$b(){}\nfunction K$b(){}\
nfunction Q$b(){}\nfunction U$b(){}\nfunction W$b(){}\nfunction Y$b(){}\nfunction $$b(){}\nfunction a_b(){}\nfunction e_b(){}\nfunction Q_b(){}\nfunct
ion U_b(){}\nfunction Y_b(){}\nfunction a0b(){}\nfunction g0b(){}\nfunction i0b(){}\nfunction k0b(){}\nfunction m0b(){}\nfunction q0b(){}\nfunction u0
b(){}\nfunction y0b(){}\nfunction s1b(){}\nfunction w1b(){}\nfunction C1b(){}\nfunction E1b(){}\nfunction G1b(){}\nfunction I1b(){}\nfunction K1b(){}\
nfunction Q1b(){}\nfunction S1b(){}\nfunction U1b(){}\nfunction c2b(){}\nfunction g2b(){}\nfunction H2b(){}\nfunction b3b(){}\nfunction A3b(){}\nfunct
ion X3b(){}\nfunction _3b(){}\nfunction b4b(){}\nfunction n4b(){}\nfunction C4b(){}\nfunction K4b(){}\nfunction M4b(){}\nfunction h5b(){}\nfunction j5

Quelle: Datei CF08AA5E5FD1DFAF89E03EE6FA494AC0.cache.js

Solche Konstrukte machen keinen Sinn, sollen sie auch nicht. Sie sollen nur Sie und mich daran hindern, in diese Datei hineinzuschauen, genannt obfuscation:

In software development, obfuscation is the deliberate act of creating source or machine code that is difficult for humans to understand.

Quelle: Obfuscation (software)

Aber es macht die Datei größer, in diesem Fall geschätzt um ca. 1 MB. Und dieser Unsinn muß natürlich über die Leitungen auf Ihren PC geschickt werden, was die Leitungen belastet. D.h. man hätte mehr Anfragen bearbeiten können, wenn man dies weggelassen hätte. Und man muß diese Möglichkeit der Verwurstung des Programms aktiv einschalten. Es ist also Absicht, die Datei entsprechend aufzublähen.


Toilettenpapier

Zu Beginn dieser Pandemie wurde das Toilettenpapier knapp. Haben Sie auch einen Vorrat gekauft, obwohl sie eigentlich noch genügend Toilettenpapier hatten? Herdenverhalten.

Für die erste Runde der Impfungen gegen dieses Coronavirus gibt es etwa 400.000 Menschen, die auf Platz 1 in der Prioritätenliste stehen. Im ersten Schritt gibt es aber nur 60.000 Impfdosen, wir reden also von einem Mangel. Und in diesem Fall ist es ein echter Mangel, während es im Frühjahr bei Toilettenpapier ein eingebildeter Mangel war. Deshalb muß man mit einem Ansturm auf das Anmeldungsverfahren rechnen, zumindest einmal an dem Tag, an dem die Anmeldung startet. Offensichtlich hat man dies nicht getan oder man hat sich massiv verschätzt.


Fazit

Viele Projekte dieses Staates scheitern, und dieses Verfahren ist ein weiteres Beispiel dafür.

Hat man diese Anwendung einmal getestet? Ich meine, nicht nur geprüft, daß eine Terminreservierung möglich ist sondern die Anwendung einem Lasttest unterworfen? Wieviele Anfragen innerhalb einer Sekunde sollte das System verarbeiten können? Und wie sah das dann bei einem Test aus? Ein solcher Lasttest ist übrigens nicht allzu schwierig und wird bei Software-Projekten in der Industrie durchaus auch gemacht....

Und warum muß man die Software mit dieser Bibliothek entwickeln? Und sie dann noch künstlich aufblähen, damit sie garantiert unter Last zusammenbricht. So etwas nennt man Bloatware:

The term "bloatware" may be applied to software that has become bloated through inefficiency or accretion of features ...

Quelle: Bloatware im Wikipedia-Eintrag zu Software bloat


Nachtrag

Mittlerweile sind alle Termine für die ersten 60.000 Impfungen vergeben. Ruft man trotzdem die Internetseite auf, so erscheint erst einmal folgender Hinweis:


Wissen Sie, was Sie jetzt zu tun haben? Also auf OK klicken ändert nichts an dieser Situation, diese Meldung erscheint erneut. Man kann den Browser-Cache leeren, aber das beschreibe ich jetzt nicht. Tut man dies, dann erscheint dieses Bild:


Klicken Sie jetzt auf "Derzeit keine weiteren Impfstofftermine buchbar", dann erscheint folgendes Bild:


Eigentlich stand dies schon auf der Einstiegsseite, aber wer will denn so pingelig sein. Danach können Sie auf Weiter klicken und Sie landen bei der normalen Erfassung der Daten. Ich habe allerdings nicht weiterverfolgt, welche Möglichkeiten man mit dieser Erfassung noch hat.

Und übrigens, wieder wurden ca. 4 MB an Daten auf den PC gesandt, obwohl doch keine Termine mehr frei sind.


Weiter geht es hier: Monty Python (oder Impftermine in Hessen, Teil 2).


Anmerkungen: