Test-first Codierung
Test-first Codierung
Programming with Ease - Teil 1
Über das Buch
Clean Code bedeutet wandlungsfähiger Code. Wandlungsfähigkeit setzt voraus, dass du keine Angst hast, Code zu verändern. Du willst ihn ja nicht unwissentlich verschlimmbessern und das nicht bemerken. Stabilen Code liefern und sofort wissen, wann er reif zur Lieferung ist, sind Grundpfeiler, auf denen deine langfristig hohe Produktivität ruht.
Automatisierte Tests sind seit langem unverzichtbar, wenn es um nachweisbare und nachvollziehbare Korrektheit von Software geht. Leider haben sich automatisierte Tests trotz hervorragender Werkzeugunterstützung und methodischer Empfehlungen wie Test-Driven Development (TDD) und Behavior-Driven Development (BDD) noch nicht als Selbstverständlichkeit durchgesetzt. Die Testabdeckung ist daher in vielen Codebasen, auch frischen, nicht ausreichend, um regressionsfreiheit sicherzustellen. Das Sicherheitsnetz, das automatisierte Tests spannen sollen, damit du darüber angstfrei Codieren kannst, ist weit und/oder löchrig. Woran mag das liegen?
Die Gründe sind sicher vielfältig für dünne Testabdeckung. Einer sticht für mich jedoch heraus: mangelnde Systematik. Es fehlt eine Guideline, wie du als Entwickler, der du mit einem Programmierproblem konfrontiert bist, geradlinig zu testabgedecktem und auch noch ordentlichem Code kommst.
Der red-green-refactor Prozess in TDD ist eine gute Idee - die allerdings in der Praxis von vielen Entwicklern als zu wenig unterstützend erlebt wird. Sie versuchen sich daran zu halten, fühlen sich jedoch schnell entweder allein gelassen oder überfordert bei ihrem Praxisproblem. Aus Frustrations wird dann das Kind mit dem Bade ausgeschüttet und ganz auf automatisierte Tests verzichtet. Oder es wird in der Community nach Hilfe gesucht, die Literatur gewälzt - doch als Antwort wird vor allem "Du musst es eben nochmal und genauer nach den Regeln probieren!" gegeben. Beides ist nicht hilfreich.
Automatisierte Tests sind heute nicht mehr nice to have, sondern gehören zu fachgerechter Arbeitsweise, wenn du professioneller Softwareentwickler sein willst. Sie nicht zu schreiben, sich nicht darum zu bemühen, ist keine Option.
Und mit TDD einfach nochmal und nochmal gegen die Problemwand zu rennen, bringt auch nicht unbedingt die Lösung, sondern erzeugt Frust und Kopfschmerzen. Denn wenn es mit TDD nicht recht klappen will, dann liegt das nicht unbedingt daran, dass du als Entwickler TDD nicht begreifst. Es kann auch daran liegen, dass der TDD Prozess einfach nicht zu deinem Problem passt.
An TDD ist deshalb nichts falsch. Es greift nur schlicht in der Praxis zu kurz. Die Welt der Programmierprobleme ist größer und bunter als das, was in TDD Coding Dojos an kleinen Problemen behandelt wird.
In mehr als 10 Jahren Beschäftigung mit Clean Code Development habe ich mich daher bemüht, ein Vorgehen zu entwickeln, das umfassender und systematischer unterstützt, Probleme in der Codierung zu lösen. Das Motto ist sozusagen: "Keine Angst vor dem blinkenden Cursor in deiner IDE!"
Test-first Codierung als Teil meines Programming with Ease Konzeptes für Clean Code Development nimmt dich an die Hand bei der Bewältigung von Programmierproblemen, die es in fünf Kategorien einteilt:
- trivial
- einfach
- kompliziert
- komplex
- chaotisch
Diese Kategorisierung ist an das Cynefin Framework von IBM angelehnt, das Führungskräfte situationsgerecht bei Entscheidungen unterstützen soll.
In der test-first Codierung wird diesen Kategorien aber jeweils ein anderer Problemlösungsansatz zugeordnet. Triviale Probleme gehst du anders an als komplizierte oder komplexe. Klingt logisch, oder? TDD - genauer: classical TDD - hat darin auch seinen Anwendungsfall; doch der ist begrenzt auf nur einen der Problemschwierigkeitsgrade. Und komplexe Probleme sind das nicht.
Gemeinsam ist den Ansätzen für alle Schwierigkeitsgrade, dass du die Codierung mit mindestens einem Test beginnst: dem Akzeptanztest. Deshalb test-first im Titel. Die Begründung ist zwiefach: 1. Wenn du nicht zuerst einen Test schreibst, ist die Wahrscheinlichkeit groß, dass du keinen schreibst. 2. Wenn du dein Denken zuerst auf einen Test richtest, also auf die Außenansicht deiner Lösung, nimmst du die Perspektive eines Benutzers an. Das führt tendenziell zu einer besseren Schnittstelle für deinen Code und zu höherer Testbarkeit.
Test-first Codierung ist aber nicht alles. Es ist nur die letzte Phase eines mehrschrittigen Prozesses, in dem du Anforderungen in hochqualitativen Code umsetzt. Diesen Prozess fasse ich unter dem Titel Programming with Ease zusammen, weil die Programmierung "von Anfang bis Ende" durch mehr Systematik einfacher werden soll.
Allerdings ist Test-first Codierung der erste Band in meiner Programming with Ease Buchreihe. Codierung ist schlicht das, was dir als Softwareentwickler am nächsten liegt und jeden Tag im wahrsten Sinne des Wortes unter den Nägeln brennt. Deshalb will ich dich dabei abholen und unterstützen. Deine Motivation wird bei der Codierung am höchsten sein, etwas Neues zu lernen und deine Gewohnheiten zu verändern. Zumindest hoffe ich das.
Was erwartet dich konkret in diesem Band? Ich habe meine Vorstellung von einem test-first Vorgehen in mehrere Lektionen/Kapitel eingeteilt, die ich auch in Trainings vermittle. Schau dir einfach mal das Inhaltsverzeichnis an. Jedes Kapitel besteht aus einem Erklärungsteil und Übungsaufgaben. Der Text ist mit vielen Codebeispielen und Abbildungen aufgelockert. Insgesamt sollte das Buch dir ca. 8+ Stunden Lesespaß geben. Und zur Bearbeitung der Übungsaufgaben kannst du auch nochmal 12-16 Stunden rechnen. Das meine ich nicht zur Abschreckung, sondern will dir zeigen, dass du hier einiges Material hast, um dich als Software Craftsman solide mit der Thematik Clean Code Development auseinander zu setzen. Das Buch ist ernsthafte Lektüre für deine Weiterbildung.
Schau dir am besten einmal die Probekapitel an; oder stelle Fragen in der Community zum Buch und rund um Clean Code Development. Dann bist du hoffentlich entschlossen, es damit zu versuchen: für mehr Stabilität und Ordnung in deiner Software.
Ich wünsche dir viel Freude bei der Programmierung!
-Ralf Westphal, info@ralfw.de
PS: Wenn du Lust hast, findest du auch einen Überblick darüber, was ich mit Test-first Codierung meine, in einem Youtube-Interview, das David Tielke mit mir geführt hat. In knapp 30 Minuten reiße ich darin die wesentlichen Aspekte des Ansatzes an.
Ver. 1.3.6.20210416
Bundles that include this book
Inhaltsverzeichnis
-
- Zum Geleit
-
Motivation
- Programming with Ease
- Das Softwareuniversum
-
Einleitung
- Anforderungskategorien
- It’s the productivity, stupid!
-
Produktivitätskiller
- Fehlende Korrekheit
- Fehlender Wert
- Fehlende Ordnung
- Zusammenfassung
-
Die Methode
-
01 - Die Anforderung-Logik Lücke
-
Logik - Der Stoff aus dem Verhalten entsteht
- Funktionalität
- Effizienz I - Effizienz durch Algorithmen und Datenstrukturen
- Effizienz II - Effizienz durch Verteilung
- Zusammenfassung
-
Von den Anforderungen zur Logik
- Logik schwer definierbar
- Die Phasen der Programmierung
- Zusammenfassung
- Übungsaufgaben
-
Logik - Der Stoff aus dem Verhalten entsteht
-
02 - Vorläufig codieren im Chaos
- Das Nein der Codierung
- Prototyping to the Rescue
- Die Schwierigkeit der Umsetzung einstufen
- Zusammenfassung
-
03 - Sofort codieren in der Trivialität
- Trivialität als Gegenteil von Chaos
- Vorsicht vor Selbstüberschätzung!
-
04 - Schrittweise codieren in der Einfachheit
-
Trittsteine legen
- Pear Programming
-
Die Kunst der Problemskalierung
- Sichtbarkeit von Variationsdimensionen
- Variationen ordnen
- Am Beispiel
- Zusammenfassung
- Übungsaufgaben
-
Trittsteine legen
-
05 - Komplementär codieren in der Kompliziertheit
-
Zerlegung in komplementäre Teilprobleme
- Funktionen repräsentieren Lösungen
- Integration Operation Segregation Principle
-
Zerlegungsbeispiel I
- Leitfragen für die Zerlegung
- Analyse & Entwurf
- Codierung
- Reflexion
- Buddelschiff Programmierung
-
Zerlegungsbeispiel II
- Bottom-up Codierung
- Reflexion
- Zusammenfassung
- Übungsaufgaben
-
Zerlegung in komplementäre Teilprobleme
-
06 - Tests als Treiber der Modularisierung
-
Akzeptanztests
- Triviale Probleme
- Einfache Probleme
- Komplizierte Probleme
-
Gerüsttests
- Gerüsttestfälle erhalten I - Akzeptanztests
- Gerüsttestfälle erhalten II - Modultests
- Zusammenfassung
- Übungsaufgaben
-
Akzeptanztests
-
07 - Testbarkeit steigern mit Surrogaten
-
Logik dynamisch binden
- Statische Bindung
- Dynamische Bindung mit Funktionszeigern
- Dynamische Bindung mit Objekten
- Zusammenfassung
-
Surrogate in Tests einsetzen
- Extraktion einer Klasse und Abstraktion mit Interface
- Injektion einer Objektfabrik
- Surrogate unterschieben
- Reflexion
-
IOSP over Surrogates
- Extraktion eines Belangs
- Refactoring to Functional Core
- Schritte in die Objektorientierung
- Zusammenfassung
- Übungsaufgaben
-
Logik dynamisch binden
-
08 - Experimentell codieren in der Komplexität
-
Experimentelles Vorgehen im Testcode
- TDD as if you meant it (TDDaiymi)
-
Beispiel #1: FromRoman revisted
- Inkrement 1
- Inkrement 2
- Inkrement 3
- Inkrement 4
- Inkrement 5
- Inkrement 6
- Reflexion
-
Beispiel #2: Eine ruhige Bowlingkugel schieben
- Analyse
- Codierung
- Reflexion
- Zusammenfassung
- Übungsaufgaben
-
Experimentelles Vorgehen im Testcode
-
09 - Test-first refaktorisieren
-
Frustrierende Lektüre
- Fehlende Bedeutung
- Fehlende Zusammenhänge
- Fehlende Testbarkeit
-
Warum refaktorisieren?
- Softwarewartung erhält Ordnung proaktiv
-
Schrittweise aufräumen I
- Bestimme das System-to-Refactor (S2R)
- Refactor to Test-First
-
Schrittweise aufräumen II
- Refactor to IOSP
- Refactor to Modules
- Dokumentieren
- Reflexion
- Zusammenfassung
- Übungsaufgaben
-
Frustrierende Lektüre
- 10 - Finale mit Testmatrix
-
01 - Die Anforderung-Logik Lücke
-
Anhang - Musterlösungen
-
Musterlösung: 01 - Die Anforderung-Logik Lücke
-
Aufgabe 1 - Gründe für automatisiertes Testen
- Beispielhafte Gründe für die Testautomatisierung
- Beispielhafte Gründe für test-first Testautomatisierung
-
Aufgabe 2 - Eine Anwendung test-first entwickeln
- Analyse
- Entwurf der Persistenz
- Codierung
-
Aufgabe 1 - Gründe für automatisiertes Testen
-
Musterlösung: 04 - Schrittweise codieren in der Einfachheit
-
Aufgabe 1 - Einschätzung des Schwierigkeitsgrades
- Mathematischen Ausdruck berechnen
- Game-of-Life
- NQueen
- Binärzahlenkonvertierung
-
Aufgabe 2 - Römische Zahlen in Dezimalzahlen wandeln
- Verständnis dokumentieren
- Inkrementelle Testfälle definieren
- Test-first codieren
- Reflexion
-
Aufgabe 1 - Einschätzung des Schwierigkeitsgrades
-
Musterlösung: 05 - Komplementär codieren in der Kompliziertheit
-
Aufgabe 1 - Römische Zahlen kompliziert wandeln
- Zerlegung für Lösungsansatz 1
- Zerlegung für Lösungsansatz 2
- Reflexion
-
Aufgabe 2 - Game of Life
- Verständnis dokumentieren
- Schrittweise zerlegen
- Akzeptanztests
- Teilprobleme bottom-up lösen
- Reflexion
-
Aufgabe 1 - Römische Zahlen kompliziert wandeln
-
Musterlösung: 06 - Tests als Treiber der Modularisierung
-
Analyse
- Inkrementelle Teilprobleme
-
Zerlegung der Inkremente inkl. Codierung
- Akzeptanztest
- Inkrement I
- Inkrement II
- Inkrement III
- Inkrement IV
- Inkrement V
- Reflexion
- Refaktorisierung mit nachträglicher Modularisierung
- Zusammenfassung
-
Analyse
-
Musterlösung: 07 - Testbarkeit steigern mit Surrogaten
-
Aufgabe 1 - CSV-Daten tabellieren
- Analyse
- Planung
- Umsetzung
- Reflexion
-
Aufgabe 2 - Game-of-Life
- Analyse
- Planung
- Umsetzung
- Reflexion
- Zusammenfassung
-
Aufgabe 1 - CSV-Daten tabellieren
-
Musterlösung: 08 - Experimentell codieren in der Komplexität
- Analyse
-
Planung
- Zerlegung in Teilprobleme
- Inkrementelle Testfälle für die komplexen Probleme
-
Codierung
- Akzeptanztests
- TDDaiymi - Lange Worte zerschneiden
- TDDaiymi - Zeilen zusammensetzen
- Triviale Probleme lösen
- Integration
- Refaktorisierung in Module
-
Reflexion
- Zurückhaltung als Tugend
-
Musterlösung: 09 - Test-first refaktorisieren
- Abgrenzung des System to Refactor (S2R)
-
Characterization Test
- S2R Entry Point testbar machen
- Console kapseln
- Characterization Test aufsetzen
- Verantwortlichkeiten identifizieren
- Entwurf der neuen Codestruktur
-
Funktionen extrahieren
- Kommandozeilenanalyse
- HexDump I - Entzerrung der Logik
- HexDump II - Refactor to IOSP
- Refactor to Modules
-
Bonus Verbesserungen
- Auflösung einer logischen Abhängigkeit
- Fehlerkorrektur in der Ausgabe
- Zusammenfassung
-
Musterlösung: 01 - Die Anforderung-Logik Lücke
- Anmerkungen
Die bedingungslose Leanpub, Kein Risiko, 100% zufrieden Garantie
Innerhalb von 60 Tagen ab Kauf kannst du dein Geld zu 100% zurückverlangen, bei jedem Leanpub-Kauf, in nur zwei Klicks. Wir bearbeiten die Erstattungen manuell, daher dauert es ein paar Tage, bis der Betrag ankommt.
Lese die kompletten Bedingungen.
Do Well. Do Good.
Authors have earned$11,714,583writing, publishing and selling on Leanpub, earning 80% royalties while saving up to 25 million pounds of CO2 and up to 46,000 trees.
Learn more about writing on Leanpub
Free Updates. DRM Free.
If you buy a Leanpub book, you get free updates for as long as the author updates the book! Many authors use Leanpub to publish their books in-progress, while they are writing them. All readers get free updates, regardless of when they bought the book or how much they paid (including free).
Most Leanpub books are available in PDF (for computers), EPUB (for phones and tablets) and MOBI (for Kindle). The formats that a book includes are shown at the top right corner of this page.
Finally, Leanpub books don't have any DRM copy-protection nonsense, so you can easily read them on any supported device.
Learn more about Leanpub's ebook formats and where to read them
Top Books
Recipes for Decoupling
Matthias NobackWrite software that survives
OpenIntro Statistics
David Diez, Christopher Barr, Mine Cetinkaya-Rundel, and OpenIntroA complete foundation for Statistics, also serving as a foundation for Data Science.
Leanpub revenue supports OpenIntro (US-based nonprofit) so we can provide free desk copies to teachers interested in using OpenIntro Statistics in the classroom and expand the project to support free textbooks in other subjects.
More resources: openintro.org.
C++20 - The Complete Guide
Nicolai M. JosuttisAll new language and library features of C++20 (for those who know previous C++ versions).
The book presents all new language and library features of C++20. Learn how this impacts day-to-day programming, to benefit in practice, to combine new features, and to avoid all new traps.
Buy early, pay less, free updates.
Other books:
CQRS by Example
Carlos Buenosvinos, Christian Soronellas, and Keyvan Akbary- Leverage your Software Architecture skills by learning everything about CQRS in detail with lots of examples
- Develop faster applications by applying CQRS and fostering Read Models and Projections
- Learn how to apply CQRS into a brownfield project from a pragmatic approach
Ansible for DevOps
Jeff GeerlingAnsible is a simple, but powerful, server and configuration management tool. Learn to use Ansible effectively, whether you manage one server—or thousands.
Maîtriser Apache JMeter
Philippe Mouawad, Bruno Demion (Milamber), and Antonio Gomes RodriguesToute la puissance d'Apache JMeter expliquée par ses commiteurs et utilisateurs experts. De l'intégration continue en passant par le Cloud, vous découvrirez comment intégrer JMeter à vos processus "Agile" et Devops.
If you're looking for the newer english version of this book, go to Master JMeter : From load testing to DevOps
Jetpack Compose internals
Jorge CastilloJetpack Compose is the future of Android UI. Master how it works internally and become a more efficient developer with it. You'll also find it valuable if you are not an Android dev. This book provides all the details to understand how the Compose compiler & runtime work, and how to create a client library using them.
The PowerShell Scripting and Toolmaking Book
Don Jones and Jeff HicksLearn the patterns, practices, and details of PowerShell Scripting and Toolmaking from the industry's two most recognized experts on the subject.
Mastering STM32 - Second Edition
Carmine NovielloWith more than 1200 microcontrollers, STM32 is probably the most complete ARM Cortex-M platform on the market. This book aims to be the most complete guide around introducing the reader to this exciting MCU portfolio from ST Microelectronics and its official CubeHAL and STM32CubeIDE development environment.
Introduction to Data Science
Rafael A IrizarryThe demand for skilled data science practitioners in industry, academia, and government is rapidly growing. This book introduces concepts from probability, statistical inference, linear regression and machine learning and R programming skills. Throughout the book we demonstrate how these can help you tackle real-world data analysis challenges.
Top Bundles
- #1
Software Architecture
2 Books
"Software Architecture for Developers" is a practical and pragmatic guide to modern, lightweight software architecture, specifically aimed at developers. You'll learn:The essence of software architecture.Why the software architecture role should include coding, coaching and collaboration.The things that you really need to think about before... - #2
CCIE Service Provider Ultimate Study Bundle
2 Books
Piotr Jablonski, Lukasz Bromirski, and Nick Russo have joined forces to deliver the only CCIE Service Provider training resource you'll ever need. This bundle contains a detailed and challenging collection of workbook labs, plus an extensively detailed technical reference guide. All of us have earned the CCIE Service Provider certification... - #4
Pattern-Oriented Memory Forensics and Malware Detection
2 Books
This training bundle for security engineers and researchers, malware and memory forensics analysts includes two accelerated training courses for Windows memory dump analysis using WinDbg. It is also useful for technical support and escalation engineers who analyze memory dumps from complex software environments and need to check for possible... - #6
All the Books of The Medical Futurist
6 Books
We put together the most popular books from The Medical Futurist to provide a clear picture about the major trends shaping the future of medicine and healthcare. Digital health technologies, artificial intelligence, the future of 20 medical specialties, big pharma, data privacy, digital health investments and how technology giants such as Amazon...