Two More Billion Dollar Mistakes
Autor
Marcus HeldHi,
Du hast bestimmt schon mal mitbekommen, dass null
von seinem Erfinder Tony Hoare als “Billion Dollar Mistake” bezeichnet wird. 2009 entschuldigte er sich auf der QCon öffentlich, dafür dass er 1965 den leichten Weg gegangen ist und null
erfunden hat:
“I call it my billion-dollar mistake. It was the invention of the null reference in 1965. At that time, I was designing the first comprehensive type system for references in an object-oriented language (ALGOL W ). My goal was to ensure that all use of references should be absolutely safe, with checking performed automatically by the compiler. But I couldn’t resist the temptation to put in a null reference, simply because it was so easy to implement. This has led to innumerable errors, vulnerabilities, and system crashes, which have probably caused a billion dollars of pain and damage in the last forty years.”
~ Tony Hoare (2009)
Doch darüber möchte ich heute gar nicht reden. Ich rede heute über zwei weitere Anti-Pattern. Sie haben mit Sicherheit auch eine Milliarde Dollar an Schmerz und Schaden verursacht:
Unit-Tests haben nichts mit TDD zu tun
Das mag dich überraschen. Wenn du TDD machst, dann schreibst du wahrscheinlich Unit-Tests. Oder zumindest nutzt du JUnit. Ist JUnit eigentlich ein Unit Test? Wir nutzen diese Begriffe im Sprachgebrauch bereits äquivalent. JUnit ist nur ein Tool zum Schreiben von Tests. Mit JUnit können wir natürlich auch Integrationstests, Systemtests oder Akzeptanztests schreiben.
Wenn wir heute über Unit-Tests sprechen, dann denken wir schnell an einen Test, der eine Klasse in Isolation testet.
Als TDD in den verschiedenen Software-Communities weltweit entstand, gab es diese Definition von Unit-Tests aber noch nicht. TDD hatte die Idee, erst die Anforderung an den Code in Form eines Tests auszudrücken und danach die Implementierung dafür zu schreiben. Und das in möglichst kleinen Iterationen.
Dabei soll der Test immer spezifischer werden und die Implementierung über die Zeit generischer.
Und genau in dieser Idee liegt der Konflikt mit der heutigen Praxis. Wenn wir einen Test semantisch an eine Klasse binden - was wir tun, wenn wir mit dem CustomerServiceTest
den CustomerService
testen - dann können wir unsere Implementierung nur zu einem gewissen Grad verändern, ohne die Tests und deren Struktur anzupassen.
Die heutige Praxis von Unit-Testing steht im Weg zum effektivem Praktizieren von TDD. Die Testklassen, deren Namen, deren Packages und dessen Architektur sollte nichts mit der Implementierung zu tun haben.
Unit-Tests haben nichts mit TDD zu tun. Es sind zwei fundamental unterschiedliche Begriffe, die sich tangieren, aber nicht gleich sind. Durch diese Fehleinschätzung sind Milliarden Zeilen Testcode entstanden, der schwer zu warten und fragil ist.
Microservices sind nicht Micro
Der Begriff Microservice impliziert, dass wir von kleinen Services sprechen. Aber wann ist ein Service klein? Wenn er nur eine Sache tut? Wenn er nur einen Endpunkt hat? Wenn er nur 100 Zeilen Code hat? Ist ein Service mit 2 Endpunkten immer noch klein? Sind 10 Endpunkte in Ordnung?
Das sieht jeder Entwickler etwas anders. Nach DDD sollte ein Service eine Domäne abbilden. Da DDD und Microservices häufig in einen Topf geworfen werden, wird also probiert, eine Domäne als einen Microservice zu designen.
Und jetzt beißt uns das “Micro” in Microservice. Durch diese Bezeichnung wird oft angenommen, eine Domäne muss klein sein. Und das sorgt für viel zu kleine Schnitte.
Das verführt uns dazu, Domänen zu sehen, wo keine sind.
Plötzlich entsteht ein Customer-Microservice. Und ein Tenant-Microservice. Und ein Payment-Microservice. Aber bei meinen Kunden - die aus dem deutschen Mittelstand kommen - gibt es meistens nur eine einzige Domäne. Diese Services sind nur entstanden, weil der Begriff uns dazu verführt.
Dieser Trugschluss hat Milliarden Dollar an unnötigem Entwickleraufwand, Performanceproblemen, Fehlern in Folge von Inkonsistenzen und Kopfschmerzen verursacht.
Microservices sind nicht micro!
ps. Seit Montag ist mein neuer Artikel “Mittelstand, Finger weg von Microservices!” auf golem plus verfügbar. Lies doch mal rein, wenn du Abonnent bist 🙂
Rule the Backend,
~ Marcus