{"id":88,"date":"2015-04-26T14:00:39","date_gmt":"2015-04-26T12:00:39","guid":{"rendered":"http:\/\/ccd.ralfw.domainfactory-kunde.de\/?page_id=88"},"modified":"2024-10-18T11:28:08","modified_gmt":"2024-10-18T09:28:08","slug":"blue-degree","status":"publish","type":"page","link":"https:\/\/clean-code-developer.de\/en\/die-grade\/blauer-grad\/","title":{"rendered":"Blue degree"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"88\" class=\"elementor elementor-88\" data-elementor-post-type=\"page\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-91697c6 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"91697c6\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-6035a4d\" data-id=\"6035a4d\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-7a8bff3 elementor-toc--minimized-on-tablet elementor-widget elementor-widget-table-of-contents\" data-id=\"7a8bff3\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;exclude_headings_by_selector&quot;:[],&quot;headings_by_tags&quot;:[&quot;h2&quot;,&quot;h3&quot;,&quot;h4&quot;,&quot;h5&quot;,&quot;h6&quot;],&quot;marker_view&quot;:&quot;numbers&quot;,&quot;no_headings_message&quot;:&quot;Es wurden keine \\u00dcberschriften auf dieser Seite gefunden.&quot;,&quot;minimize_box&quot;:&quot;yes&quot;,&quot;minimized_on&quot;:&quot;tablet&quot;,&quot;hierarchical_view&quot;:&quot;yes&quot;,&quot;min_height&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;min_height_tablet&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;min_height_mobile&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"table-of-contents.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-toc__header\">\n\t\t\t\t\t\t<h4 class=\"elementor-toc__header-title\">\n\t\t\t\tInhaltsverzeichnis\t\t\t<\/h4>\n\t\t\t\t\t\t\t\t\t\t<div class=\"elementor-toc__toggle-button elementor-toc__toggle-button--expand\" role=\"button\" tabindex=\"0\" aria-controls=\"elementor-toc__7a8bff3\" aria-expanded=\"true\" aria-label=\"Inhaltsverzeichnis \u00f6ffnen\"><i aria-hidden=\"true\" class=\"fas fa-chevron-down\"><\/i><\/div>\n\t\t\t\t<div class=\"elementor-toc__toggle-button elementor-toc__toggle-button--collapse\" role=\"button\" tabindex=\"0\" aria-controls=\"elementor-toc__7a8bff3\" aria-expanded=\"true\" aria-label=\"Inhaltsverzeichnis schlie\u00dfen\"><i aria-hidden=\"true\" class=\"fas fa-chevron-up\"><\/i><\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<div id=\"elementor-toc__7a8bff3\" class=\"elementor-toc__body\">\n\t\t\t<div class=\"elementor-toc__spinner-container\">\n\t\t\t\t<i class=\"elementor-toc__spinner eicon-animation-spin eicon-loading\" aria-hidden=\"true\"><\/i>\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a8dc07c elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"a8dc07c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-320ef9c elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"320ef9c\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-e391c70\" data-id=\"e391c70\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-538839f elementor-view-default elementor-widget elementor-widget-icon\" data-id=\"538839f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-icon-wrapper\">\n\t\t\t<div class=\"elementor-icon\">\n\t\t\t<i aria-hidden=\"true\" class=\"icon icon-Prinzip\"><\/i>\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-66 elementor-top-column elementor-element elementor-element-d1c845a\" data-id=\"d1c845a\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-c5693b8 elementor-widget elementor-widget-heading\" data-id=\"c5693b8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Prinzipien<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-df3bddc elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"df3bddc\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-6e4fb4f\" data-id=\"6e4fb4f\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-4f33d3d elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"4f33d3d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-525717d elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"525717d\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-45842b3\" data-id=\"45842b3\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-dcdd13e elementor-widget elementor-widget-image\" data-id=\"dcdd13e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" src=\"https:\/\/clean-code-developer.de\/wp-content\/uploads\/elementor\/thumbs\/icon_12_design-and-implementation-dont-overlap-qvqf03qmgpqiyczgzagtkygqb5vv5tg8wby8bsus8w.png\" title=\"Design and Implementation Don&#8217;t Overlapp\" alt=\"Design and Implementation Don&#039;t Overlapp\" loading=\"lazy\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-66 elementor-top-column elementor-element elementor-element-e084ce2\" data-id=\"e084ce2\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-064ad18 elementor-widget elementor-widget-heading\" data-id=\"064ad18\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Design and Implementation Don't Overlapp<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-f6eb3ed elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"f6eb3ed\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-02afae8\" data-id=\"02afae8\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-84d7901 elementor-widget elementor-widget-text-editor\" data-id=\"84d7901\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"box\"><strong>Warum?<\/strong><br \/>Planungsunterlagen, die mit der Umsetzung nichts mehr gemein haben, schaden mehr, als dass sie n\u00fctzen. Deshalb nicht die Planung aufgeben, sondern die Chance auf Inkonsistenz minimieren.<\/div><div class=\"core-points\"><table><tbody><tr><th>Wandelbarkeit<\/th><td><i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Korrektheit<\/th><td><i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Produktionseffizienz<\/th><td><i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Kontinuierliche Verbesserung<\/th><td><i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Team<\/th><\/tr><\/tbody><\/table><\/div><p>Eines der grundlegenden Probleme der Softwareentwicklung sind Implementationen, denen eine vorausgegangene Planung nicht mehr anzusehen ist. Da h\u00e4ngen dann Entwurfsdiagramme an der Wand, die kaum noch etwas mit der Coderealit\u00e4t zu tun haben. Die Ursache daf\u00fcr ist eine Verletzung des fundamentalen DRY-Prinzips: Entwurf und Implementation sind Wiederholungen desselben, der Struktur einer Software. Da Implementation auf Entwurf folgt und den L\u00f6wenanteil der Arbeit ausmacht, geraten beide schnell aus dem Tritt, wenn Struktur\u00e4nderungen w\u00e4hrend der Implementation nicht immer wieder in den Entwurf eingearbeitet werden. Entwurfsdiagramme sind nach Beginn der Implementation sonst bald nichts mehr wert.<\/p><p>Wie kann die Situation verbessert werden? Sollte vielleicht auf Entwurf verzichtet werden, wenn letztlich in der Implementation die &#8222;Strukturwahrheit&#8220; liegt? Nein, sicher nicht. Entwurf muss sein. Ohne Planung gibt es keine Zielvorstellung. Aber Entwurf und Implementation m\u00fcssen dem DRY-Prinzip gerecht werden. Deshalb sollten Entwurf und Implementation sich so wenig \u00fcberlappen wie m\u00f6glich. Ihre Schnittstelle sollte d\u00fcnn sein. Wenn das der Fall ist, stellen sie keine Wiederholungen mehr dar, sondern beschreiben unterschiedliches. Das bedeutet: Entwurf\/Architektur k\u00fcmmert sich nicht um die Implementation und Implementation k\u00fcmmert sich nicht um Architektur.<\/p><p>Und wo verl\u00e4uft diese Trennlinie? Bei den so genannten Komponenten (s.u. Praktiken). Architekten k\u00fcmmern sich nicht um den internen Aufbau von Komponenten. F\u00fcr sie sind es Black Boxes, deren Klassenstruktur nicht architekturrelevant ist. Umgekehrt ist f\u00fcr einen Komponentenimplementierer die Architektur irrelevant. Was er zu implementieren hat, ergibt sich aus den Komponentenkontrakten, die seine Komponente importiert und exportiert. Einen gr\u00f6\u00dferen Zusammenhang muss er nicht kennen.<\/p><p>Die Aufgabe der Architektur ist es mithin, Software in Komponenten zu zerlegen, deren Abh\u00e4ngigkeiten zu definieren und Leistungen in Kontrakten zu beschreiben. Diese Strukturen werden dann auch einzig durch Architekten gepflegt. Und die Aufgabe der Implementation ist es, die von der Architektur definierten Komponenten zu realisieren. Wie sie das tun, ist nicht architekturrelevant. Ihre innere Struktur ist f\u00fcr die Architektur unsichtbar.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-61c6d39 elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"61c6d39\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-2dab256 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"2dab256\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-9f5d4ef\" data-id=\"9f5d4ef\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-ff1277c elementor-widget elementor-widget-image\" data-id=\"ff1277c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" src=\"https:\/\/clean-code-developer.de\/wp-content\/uploads\/elementor\/thumbs\/icon_17_implementation-reflects-design-qvqf2ap2esqm1lss68lheejg7j2p4e5p76r0n1lpq8.png\" title=\"Implementation Reflects Design\" alt=\"Implementation Reflects Design\" loading=\"lazy\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-66 elementor-top-column elementor-element elementor-element-76d5e80\" data-id=\"76d5e80\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-aecd365 elementor-widget elementor-widget-heading\" data-id=\"aecd365\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Implementation Reflects Design<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-6516a8b elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"6516a8b\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-b971bec\" data-id=\"b971bec\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-ed9d5d6 elementor-widget elementor-widget-text-editor\" data-id=\"ed9d5d6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"box\"><strong>Warum?<\/strong><br \/>Umsetzung, die von der Planung beliebig abweichen kann, f\u00fchrt direkt in die Unwartbarkeit. Umsetzung braucht daher einen durch die Planung vorgegebenen physischen Rahmen.<\/div><div class=\"core-points\"><table><tbody><tr><th>Wandelbarkeit<\/th><td><i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Korrektheit<\/th><td><i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Produktionseffizienz<\/th><td><i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Kontinuierliche Verbesserung<\/th><td><i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Team<\/th><\/tr><\/tbody><\/table><\/div><p>Architektur und Implementation sollen nicht \u00fcberlappen, damit sie das DRY-Prinzip nicht verletzten. So werden Inkonsistenzen vermieden, die dadurch entstehen k\u00f6nnen, dass auf der einen Seite etwas ge\u00e4ndert wird, ohne diese \u00c4nderung auf der anderen Seite nachzuf\u00fchren.<\/p><p>Nichtsdestotrotz macht die Architektur aber ja Aussagen \u00fcber die Implementation. Nicht ihre Details, aber ihre grunds\u00e4tzliche Form. Architektur definiert die Strukturelemente und deren Beziehungen innerhalb eines Codesystems. Implementation existiert also auch bei Abwesenheit von \u00dcberlappungen nicht unabh\u00e4ngig von Architektur, sondern sozusagen in ihr.<\/p><p>Genau das sollte sich dann aber auch in der Implementation ausdr\u00fccken. So wird die leichter verst\u00e4ndlich, so kann besser sichergestellt werden, dass die Implementation tats\u00e4chlich der Architektur folgt. Die von der Architektur auf verschiedenen Abstraktionsebenen definierten Strukturelemente sollten deshalb nicht in einem gro\u00dfen &#8222;Codetopf&#8220; (z.b. eine gro\u00dfe Visual Studio Solution) &#8222;zusammenger\u00fchrt werden&#8220;. Viel besser auch im Sinne hoher Produktivit\u00e4t und einfacher Testbarkeit ist es, die logischen Strukturen der Architektur so physisch wie m\u00f6glich zu manifestieren.<\/p><ol><li>Die von der Architektur geplanten Strukturen auf verschiedenen Abstraktionsebenen sollten sich so weitgehend wie m\u00f6glich in der Codeorganisation widerspiegeln. Das bedeutet zum einen, dass die Architektur als Strukturelemente vor allem physische Codeeinheiten benutzt. Und zum anderen sollen diese Strukturelemente dann aber auch im Quellcode bzw. in der Codeorganisation im Repository klar sichtbar sein.<\/li><li>Bei der Arbeit an der Implementation der Strukturelemente und insbesondere innerhalb von Komponenten sollen Architektur\u00e4nderungen &#8222;im Vorbeigehen&#8220; unm\u00f6glich sein. Wer in bzw. an einem Strukturelement arbeitet, also an einem Teil, darf nicht ad hoc die umliegende Struktur, d.h. das Ganze, \u00e4ndern k\u00f6nnen. Nur wenn das gew\u00e4hrleistet ist, w\u00e4chst die Entropie einer Software nicht unkontrolliert. Das ist wichtig, da das Hauptziel von Architektur ist, die Entropie und damit die Komplexit\u00e4t von Software zu minimieren.<\/li><\/ol><p>Planung muss sein. Implementation darf Planung nicht torpedieren. (Wenn auch Erkenntnisse w\u00e4hrend der Implementation nat\u00fcrlich auf die Planung zur\u00fcckwirken d\u00fcrfen.) Deshalb sind Planung und Implementation zu entkoppeln. Und wo das nicht m\u00f6glich ist, da sollte die Planung mit Mitteln der Implementation arbeiten und die Implementation physisch die Planung widerspiegeln.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-619031e elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"619031e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-5c12bab elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"5c12bab\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-905cc47\" data-id=\"905cc47\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-a0bbb68 elementor-widget elementor-widget-image\" data-id=\"a0bbb68\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" src=\"https:\/\/clean-code-developer.de\/wp-content\/uploads\/elementor\/thumbs\/icon_45_you-aint-gonna-need-it-qvqf4frtz7o4hmoto5ww2v38x4isnknots8tzqffk0.png\" title=\"You Ain\u00b4t Gonna Need It (YAGNI)\" alt=\"You Ain\u00b4t Gonna Need It (YAGNI)\" loading=\"lazy\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-66 elementor-top-column elementor-element elementor-element-7778090\" data-id=\"7778090\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-bc11820 elementor-widget elementor-widget-heading\" data-id=\"bc11820\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">You Ain\u00b4t Gonna Need It (YAGNI)<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-c20f380 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"c20f380\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-a6b9820\" data-id=\"a6b9820\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-7e743a0 elementor-widget elementor-widget-text-editor\" data-id=\"7e743a0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"box\"><strong>Warum?<\/strong><br \/>Dinge die niemand braucht, haben keinen Wert. Verschwende an sie also keine Zeit.<\/div><div class=\"core-points\"><table><tbody><tr><th>Wandelbarkeit<\/th><td><i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Korrektheit<\/th><td><i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Produktionseffizienz<\/th><td><i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Kontinuierliche Verbesserung<\/th><td><i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Single Developer<\/th><\/tr><\/tbody><\/table><\/div><p>Das YAGNI-Prinzip (<i>You Ain\u00b4t Gonna Need It<\/i>) ist eines der einfachsten in der Softwareentwicklung &#8211; und doch wohl das nach dem DRY-Prinzip am h\u00e4ufigsten verletzte Prinzip. Deshalb steht YAGNI nicht nur am Anfang des <a title=\"Roter Grad\" href=\"http:\/\/clean-code-developer.de\/die-grade\/roter-grad\/\">roten Grads<\/a>, sondern auch hier gegen Ende des Weges durch das <a title=\"Wertesystem\" href=\"http:\/\/clean-code-developer.de\/das-wertesystem\/\">Wertesystem<\/a>.<\/p><p>Geschuldet ist das YAGNI-Prinzip dem in der Softwareentwicklung besonderen Verh\u00e4ltnis von Anforderungsgenauigkeit und Produktmaterialit\u00e4t. Anforderungen sind notorisch ungenau oder wechselnd und das Produkt, in dem sie umgesetzt werden sollen, immateriell. Im Vergleich zum Maschinen- oder Geb\u00e4udebau ist das Material also unendlich flexibel und kann sich prinzipiell mit vergleichsweise wenig Aufwand an quasi jede Anforderung anpassen lassen. Hohe Volatili\u00e4t bzw. Ungenauigkeit trifft also auf hohe Flexibilit\u00e4t. Das scheint zun\u00e4chst einmal ideal.<\/p><p>Die Praxis zeigt jedoch, dass gerade in diesem Verh\u00e4ltnis der Keim des Misserfolges vieler Projekte liegt. Kurzfristig betrachtet, versuchen die Projekte mit dem Naheliegenden auch das Richtige zu tun:<\/p><ul><li>Ungenaue Anforderungen werden oft kompensiert durch Produkte, die versuchen, die Ungenauigkeit zu kompensieren. Die Immaterialit\u00e4t von Software wird dazu genutzt, so breit und flexibel zu implementieren, dass auch noch unbekannte oder schwammige Anforderungen quasi schon im vorauseilenden Gehorsam erf\u00fcllt werden.<\/li><li>St\u00e4ndig wechselnde Anforderungen werden im Produkt m\u00f6glichst schnell nachgef\u00fchrt, weil das dank seiner Immaterialit\u00e4t m\u00f6glich ist.<\/li><\/ul><p>Langfristig ist solches Verhalten allerdings kontraproduktiv:<\/p><ul><li>Der vorauseilende Gehorsam f\u00fchrt zu Breite und Flexibilit\u00e4t, die nicht wirklich gebraucht werden. Er realisiert Features, die keine Anwendung finden.<\/li><li>Schnelle Umbauten an Software aufgrund wechselnder Anforderungen f\u00fchren zu Qualit\u00e4tserosionen im Code. Software ist zwar immateriell und flexibel &#8211; aber nicht jede Softwarestruktur ist evolvierbar oder auch nur verst\u00e4ndlich.<\/li><\/ul><p>Unklare und wechselnde Anforderungssituationen vor dem Hintergrund der hohen grunds\u00e4tzlichen Flexibilit\u00e4t von Software f\u00fchren schnell zu unn\u00f6tigen Aufw\u00e4nden und spr\u00f6dem Code. Eine gro\u00dfe Anzahl von Projekten, die ihre Budgetgrenzen gesprengt haben, und eine noch gr\u00f6\u00dfere Zahl von Projekten, die schon nach wenigen Jahren unwartbar geworden sind, sind daf\u00fcr beredtes Zeugnis.<\/p><p>CCD als professionelle Softwareentwickler sehen es als ihre Pflicht, sich solcher Entwicklung jeden Tag entgegen zu stemmen. Angesichts der nicht zu leugnenden Natur von Software &#8211; sie ist und bleibt immateriell -, liegt der Ansatz daf\u00fcr beim Umgang mit den Anforderungen. Das ist der Ursprung des YAGNI-Prinzips.<\/p><p>Das YAGNI-Prinzip ist wie ein scharfes Messer: Wer sie anwendet, schneidet ein Problem in kleine W\u00fcrfel des unmittelbar N\u00f6tigen. Nach dem YAGNI-Prinzip wird nur das unzweifelhaft und unmittelbar Nutzbringende implementiert. Alles andere&#8230; nun, das kommt sp\u00e4ter. Insofern geht YAGNI Hand in Hand mit der Regel &#8222;Entscheide so sp\u00e4t wie m\u00f6glich&#8220; des <a title=\"Lean Software Development\" href=\"http:\/\/en.wikipedia.org\/wiki\/Lean_software_development#Decide_as_late_as_possible\" target=\"_blank\" rel=\"noopener noreferrer\">Lean Software Development<\/a>.<\/p><p>Das YAGNI-Prinzip ist relevant auf allen Ebenen der Softwareentwicklung und in allen Phasen. Wann immer Sie sich Fragen &#8222;Sollte ich diesen Aufwand wirklich treiben?&#8220; oder &#8222;Brauchen wir das wirklich?&#8220; &#8211; und sei es auch nur ganz versch\u00e4mt und leise im Hinterkopf -, dann ist das ein Anwendungsfall f\u00fcr das YAGNI-Prinzip. Es besagt: Wenn im Zweifel, entscheide dich gegen den Aufwand.<\/p><p>Das klingt leicht, ist aber schwer. Daher auch die h\u00e4ufigen Zuwiderhandlungen. Es gibt viele Kr\u00e4fte, die der Entscheidung gegen einen Aufwand widersprechen. &#8222;Ach, das ist doch gar nicht soviel Aufwand&#8220; oder &#8222;Wenn wir jetzt nicht vorausschauen, dann k\u00f6nnen wir in Zukunft nicht mehr anders&#8220; sind nur zwei naheliegende Begr\u00fcndungen f\u00fcr Aufwand, auch wenn Zweifel an seinem Nutzen bestehen. Das betrifft architektonische Entscheidungen (z.B. Soll schon mit einer verteilten Architektur begonnen werden, auch wenn die heutige Last sie noch nicht br\u00e4uchte?) wie lokale Entscheidungen (z.B. Soll der Algorithmus schon jetzt optimiert werden, auch wenn er im Augenblick noch keine Performanceprobleme macht?).<\/p><p>Der Kunde bezahlt nur f\u00fcr unmittelbaren Nutzen. Was er heute nicht klar spezifizieren kann, nutzt ihm nicht. Es in der Implementation voraussehen zu wollen, investiert also Aufwand ohne Nutzen zu generieren. Wenn der Kunde sp\u00e4ter einmal genauer wei\u00df, was er will, dann &#8211; und nicht fr\u00fcher! &#8211; ist es Zeit, seinem Willen nachzukommen. Wo immer aber ein Projekt versucht, diesen Willen vorwegzunehmen riskiert es, von der morgigen Willensrealit\u00e4t des Kunden widerlegt zu werden. Ein Feature &#8211; funktional oder nicht-funktional -, das heute ohne klare Anforderung implementiert wird, interessiert den Kunden morgen vielleicht schon nicht mehr. Oder es ist ihm nicht mehr so wichtig wie ein anderes Feature.<\/p><p>Das bedeutet f\u00fcr die Softwareentwicklung:<\/p><ul><li>Ausschlie\u00dflich klare Anforderungen implementieren.<\/li><li>Der Kunde priorisiert seine klaren Anforderungen.<\/li><li>Die klaren Anforderungen in der Reihenfolge ihrer Priorisierung umsetzen.<\/li><li>Entwicklungsprozess und Codestruktur im Gro\u00dfen und Kleinen so aufsetzen, dass keine Angst aufkommt, sich \u00e4ndernde und neue Anforderungen zu realisieren.<\/li><\/ul><p>CCD als professionelle Entwickler kommunizieren diese Vorgehensweise unmissverst\u00e4ndlich dem Kunden gegen\u00fcber. Dadurch werden sie:<\/p><ul><li>servicewillig, denn sie m\u00fcssen dem Kunden keine klare Anforderung abschlagen<\/li><li>verantwortungsbewusst, weil sie das Budget nur f\u00fcr klar formulierten Nutzen einsetzen<\/li><li>besch\u00fctzend dem Code gegen\u00fcber, weil sie ihn gegen \u00dcberladung mit letztlich Unn\u00f6tigem bewahren<\/li><\/ul><p>YAGNI ist deshalb nicht nur ein Prinzip, das jeder Entwickler befolgen soll, sondern auch ein Prinzip f\u00fcr Projekte und Teams, also auf Organisationsebene. YAGNI ist immer in Anschlag zu bringen, genauso wie DRY. Wenn im Zweifel, dann verschiebe die Entscheidung falls m\u00f6glich. Ansonsten entscheide dich gegen den Aufwand. Das entspannt und entschlackt und f\u00fchrt schneller zum Erfolg.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-224c928 elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"224c928\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-3bea3be elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"3bea3be\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-94c4965\" data-id=\"94c4965\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-ab95082 elementor-view-default elementor-widget elementor-widget-icon\" data-id=\"ab95082\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-icon-wrapper\">\n\t\t\t<div class=\"elementor-icon\">\n\t\t\t<i aria-hidden=\"true\" class=\"icon icon-Praktik\"><\/i>\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-66 elementor-top-column elementor-element elementor-element-932edbb\" data-id=\"932edbb\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-d5a5182 elementor-widget elementor-widget-heading\" data-id=\"d5a5182\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Praktiken<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-32b5871 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"32b5871\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-d7194c2\" data-id=\"d7194c2\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-e03707b elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"e03707b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-cc22038 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"cc22038\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-4af9666\" data-id=\"4af9666\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-ea905b3 elementor-widget elementor-widget-image\" data-id=\"ea905b3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" src=\"https:\/\/clean-code-developer.de\/wp-content\/uploads\/elementor\/thumbs\/icon_13_design-before-implementation-qvqf81hk6cloztgempzemycuwarg5synbm9u7x33pc.png\" title=\"Design before Implementation\" alt=\"Design before Implementation\" loading=\"lazy\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-66 elementor-top-column elementor-element elementor-element-7e4b815\" data-id=\"7e4b815\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-27ac397 elementor-widget elementor-widget-heading\" data-id=\"27ac397\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Design before Implementation<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-75d4ab0 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"75d4ab0\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-14233d0\" data-id=\"14233d0\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-bda55b7 elementor-widget elementor-widget-text-editor\" data-id=\"bda55b7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"box\"><strong>Warum?<\/strong><br \/>Vor der Umsetzung muss eine L\u00f6sung entworfen werden. Andernfalls findet kein konsequentes Nachdenken \u00fcber die L\u00f6sung statt.<\/div><div class=\"core-points\"><table><tbody><tr><th>Wandelbarkeit<\/th><td><i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Korrektheit<\/th><td><i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Produktionseffizienz<\/th><td><i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Kontinuierliche Verbesserung<\/th><td><i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Team<\/th><\/tr><\/tbody><\/table><\/div><p>Die Aufgabe eines Entwicklers besteht darin, Anforderungen in Code zu \u00fcbersetzen. Dazu ist es erforderlich, eine L\u00f6sung f\u00fcr die Anforderungen zu entwickeln. Es muss nachgedacht werden. Wie kann das aber auf gute Weise geschehen, wenn Entwickler direkt ins Codieren springen?<\/p><p>In trivialen F\u00e4llen mag es m\u00f6glich sein, direkt Code zu schreiben. Dennoch wird auch beim unmittelbaren Sprung ins Codieren \u00fcber die L\u00f6sung nachgedacht. Allerdings geschieht dies eher unbewusst, vor allem aber <em>w\u00e4hrend<\/em> der Umsetzung. Der Entwickler denkt ein wenig nach, codiert, denk nach, codiert, usw. Es fehlt hier ein konsequentes Durchdenken der L\u00f6sung, getrennt von der Umsetzung.<\/p><p>Sp\u00e4testens, wenn eine Gruppe von Entwicklern gemeinsam als Team arbeiten m\u00f6chte, muss der Entwurf zeitlich getrennt von der Umsetzung stattfinden. Andernfalls ist keine fl\u00fcssige arbeitsteilige Vorgehensweise m\u00f6glich.<\/p><p>Der Entwurf erm\u00f6glicht es dem Team bzw. einem einzelnen Entwickler, bereits vor der Codierung \u00fcber wichtige Prinzipien nachzudenken. Es entstehen bspw. erst gar keine Methoden oder Klassen mit mehreren Verantwortlichkeiten, da schon auf der Ebene des Entwurfs \u00fcber das <a href=\"https:\/\/clean-code-developer.de\/die-grade\/orangener-grad\/#Single_Responsibility_Principle_SRP\">Single Responsibility Principle (SRP)<\/a> nachgedacht werden kann. Damit erspart sich das Team den Refaktorisierungsaufwand der entsteht, wenn &#8222;drauf los&#8220; codiert wird.<\/p><p>Siehe auch <a href=\"https:\/\/flow-design.info\">https:\/\/flow-design.info<\/a>.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1b87f99 elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"1b87f99\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-f1f2448 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"f1f2448\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-85ee045\" data-id=\"85ee045\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-dc69700 elementor-widget elementor-widget-image\" data-id=\"dc69700\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" src=\"https:\/\/clean-code-developer.de\/wp-content\/uploads\/elementor\/thumbs\/icon_8_continuous-delivery-qvqfa9dub9n2eo8co6ip0w71e1tnc2rtylq40fsn0g.png\" title=\"Continuous Delivery (CD)\" alt=\"Continuous Delivery (CD)\" loading=\"lazy\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-66 elementor-top-column elementor-element elementor-element-09d2298\" data-id=\"09d2298\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-cfc4090 elementor-widget elementor-widget-heading\" data-id=\"cfc4090\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Continuous Delivery (CD)<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-299e3d3 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"299e3d3\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-8779127\" data-id=\"8779127\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-751960e elementor-widget elementor-widget-text-editor\" data-id=\"751960e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"box\"><strong>Warum?<\/strong><br \/>Als Clean Code Developer m\u00f6chte ich sicher sein, dass ein Setup das Produkt korrekt installiert. Wenn ich das erst beim Kunden herausfinde, ist es zu sp\u00e4t.<\/div><div class=\"core-points\"><table><tbody><tr><th>Wandelbarkeit<\/th><td><i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Korrektheit<\/th><td><i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Produktionseffizienz<\/th><td><i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Kontinuierliche Verbesserung<\/th><td><i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Team<\/th><\/tr><\/tbody><\/table><\/div><p>Im <a title=\"Gr\u00fcner Grad\" href=\"http:\/\/clean-code-developer.de\/die-grade\/gruener-grad\/\">gr\u00fcnen Grad<\/a> haben wir den Continuous Integration Prozess f\u00fcr Build und Test aufgesetzt. Damit sorgt der Continuous Integration Prozess daf\u00fcr, dass Fehler w\u00e4hrend der Build- und Testphase schnell entdeckt werden. Wenn z.B. eine \u00c4nderung am Code dazu f\u00fchrt, dass eine andere Komponente nicht mehr \u00fcbersetzt werden kann, weist der Continuous Integration Prozess kurze Zeit nach dem Commit der \u00c4nderung auf den Fehler hin. Wenn am Ende jedoch ein Setup Programm produziert wird, welches sich aufgrund von Fehlern nicht installieren l\u00e4sst, haben wir unser Ziel trotzdem nicht erreicht: funktionierende Software die bei unseren Kunden installiert werden kann.<\/p><p>Folglich m\u00fcssen wir auch die Phasen Setup und Deployment automatisieren, um sie per Knopfdruck ausf\u00fchren zu k\u00f6nnen. Nur so k\u00f6nnen wir sicher sein, dass wir installierbare Software produzieren. Und durch die Automatisierung ist sichergestellt, dass niemand einen wichtigen Schritt, der &#8222;zu Fu\u00df&#8220; ausgef\u00fchrt werden muss, vergisst. So kann jeder im Team zu jedem Zeitpunkt den aktuellen Stand des Produktes installationsfertig produzieren und installieren.<\/p><p>Siehe auch unter <a title=\"Tools\" href=\"http:\/\/clean-code-developer.de\/weitere-infos\/werkzeuge\/\">Tools<\/a>.<\/p><p>Das wichtigste Buch in diesem Zusammenhang d\u00fcrfte wohl <a href=\"https:\/\/amzn.to\/3NsqLvj\" target=\"_blank\" rel=\"noopener\">Accelerate<\/a> sein.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-418d950 elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"418d950\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-55ad88d elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"55ad88d\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-8bac468\" data-id=\"8bac468\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-78e19b4 elementor-widget elementor-widget-image\" data-id=\"78e19b4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" src=\"https:\/\/clean-code-developer.de\/wp-content\/uploads\/elementor\/thumbs\/icon_24_iterative-development-qvqff47tmgaee56eba3awo2rvpvx3s1wmn2f9wlev4.png\" title=\"Iterative Development\" alt=\"Iterative Development\" loading=\"lazy\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-66 elementor-top-column elementor-element elementor-element-ed36cc2\" data-id=\"ed36cc2\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-c2225cd elementor-widget elementor-widget-heading\" data-id=\"c2225cd\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Iterative Development<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-c09154b elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"c09154b\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-01d28e4\" data-id=\"01d28e4\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-a2390f3 elementor-widget elementor-widget-text-editor\" data-id=\"a2390f3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"box\"><strong>Warum?<\/strong><br \/>Frei nach von Clausewitz: Kein Entwurf, keine Implementation \u00fcberlebt den Kontakt mit dem Kunden. Softwareentwicklung tut daher gut daran, ihren Kurs korrigieren zu k\u00f6nnen.<\/div><div class=\"core-points\"><table><tbody><tr><th>Wandelbarkeit<\/th><td><i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Korrektheit<\/th><td><i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Produktionseffizienz<\/th><td><i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Kontinuierliche Verbesserung<\/th><td><i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Team<\/th><\/tr><\/tbody><\/table><\/div><p>Nat\u00fcrlich schreitet Softwareentwicklung immer von einer Planung \u00fcber die Implementation zu einem Test durch den Kunden voran. Irrig ist allerdings die Annahme, ein Projekt k\u00e4me mit einer Planungsphase und einer Implementationsphase und einer Kundentestphase aus. Das funktioniert &#8211; wenn \u00fcberhaupt &#8211; nur in trivialen Szenarien, wo in der Planungsphase alle Anforderungen bekannt sind. In realen Projekten jedoch liefert jede Phase Erkenntnisse f\u00fcr vorhergehende Phasen. Allemal durch den Kundentest ergeben sich Konsequenzen f\u00fcr die Planung und Implementation.<\/p><p>Solche Erkenntnisse k\u00f6nnen allerdings nur Einfluss auf ein Projekt nehmen, wenn das Vorgehen nicht linear ist. Wenn es von einer sp\u00e4teren Phase keinen Weg zur\u00fcck zu einer fr\u00fcheren Phase gibt, ist Feedback nutzlos.<\/p><p>Um Feedback in ein Softwareprodukt einflie\u00dfen lassen zu k\u00f6nnen, muss der Entwicklungsprozess Schleifen enthalten. Allemal die Schleife von der Kundentestphase zur\u00fcck zur Planung ist n\u00f6tig. Das hei\u00dft, Softwareentwicklung kann nur iterativ, also in mehreren Durchl\u00e4ufen, \u00fcber den Anforderungskatalog des Kunden stattfinden. Wer versucht, &#8222;mit einem Mal&#8220; (big bang) auszuliefern, handelt dieser Erkenntnis zuwider. Der Softwareentwicklungsprozes ist vielmehr so zu planen, dass er sich durch die Anforderungen &#8222;in kleinen Happen durchbei\u00dft&#8220;. Jeder dieser Happen sollte nicht gr\u00f6\u00dfer sein, als dass der Durchlauf von Planung bis Kundentest mehr als 2-4 Wochen dauert. Nur dann kommt das Feedback vom Kunden h\u00e4ufig genug, um nicht allzu lange in der Umsetzung in die Irre zu laufen.<\/p><p>Softwareentwicklung ist damit ein Lernprozess. In seinem Verlauf lernt das Projektteam etwas \u00fcber die Anforderungen des Kunden. Es h\u00f6rt ihm zu, plant, implementiert, und h\u00e4ndigt eine Softwareversion aus, die das Verst\u00e4ndnis des Geh\u00f6rten widerspiegelt. Dann h\u00f6rt das Team wieder zu, plant weiter\/erneut nach den aktuellen Erkenntnissen usw. usf. immer im Kreis. Iteration f\u00fcr Iteration. Manchmal wird etwas aus einer fr\u00fcheren Iteration verfeinert, manchmal Neues hinzugef\u00fcgt.<\/p><p>Doch nicht nur die Entwicklung einer Software ist ein Lernprozess. Lernen sollte auch auf organisatorischer Ebene stattfinden. Das Team sollte nicht nur \u00fcber den Kunden etwas lernen, sondern auch \u00fcber sich selbst. Deshalb sollte es auch immer wieder &#8222;Haltepunkte&#8220; geben, an denen das Team \u00fcber sein Vorgehen reflektiert. Die Erkenntnisse aus solcher Retrospektive flie\u00dfen dann ein in die n\u00e4chste Iteration der organisatorischen Entwicklung. Hier schlie\u00dft der blaue Grad an den roten Grad an, zu dem die t\u00e4gliche pers\u00f6nliche Reflexion geh\u00f6rt.<\/p><p>Nat\u00fcrlich muss jede Iteration auch ein Ende haben. Und damit man wei\u00df ob man fertig ist, muss vorher klar definiert sein, was in der Iteration erreicht werden soll. Die Erreichbarkeit von Zielen kann immer nur gesch\u00e4tzt werden, auch dabei hilft die Reflexion, um die Sch\u00e4tzungen schrittweise soweit zu verbessern, dass sie f\u00fcr die Planung ausreichend genau sind. Doch wann ist das vorher definierte Ziel erreicht? <a title=\"'What is done?'\" href=\"http:\/\/www.hanselminutes.com\/119\/what-is-done-a-conversation-with-scrum-co-creator-ken-schwaber\" target=\"_blank\" rel=\"noopener noreferrer\">&#8218;What is done?&#8216;<\/a> Oberstes Ziel ist die Lieferung funktionsf\u00e4higer Software an unsere Kunden. Folglich kann das Ziel nur erreicht sein wenn wir auslieferungsfertige Software produziert haben. Das bedeutet insbesondere, dass die Software getestet ist und dass sie per Setup installiert werden kann. Durch Continuous Integration stellen wir dies kontinuierlich sicher. Keinesfalls d\u00fcrfen wir kurz vor Ende einer Iteration entscheiden, dass ein Ziel erreicht ist, obwohl noch nicht alle Tests abgeschlossen sind.<\/p><p>Siehe auch unter <a title=\"Tools\" href=\"http:\/\/clean-code-developer.de\/weitere-infos\/werkzeuge\/\">Tools<\/a>.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e8570a8 elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"e8570a8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-cd4a003 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"cd4a003\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-cc95ab8\" data-id=\"cc95ab8\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-14dd259 elementor-widget elementor-widget-image\" data-id=\"14dd259\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" src=\"https:\/\/clean-code-developer.de\/wp-content\/uploads\/elementor\/thumbs\/icon_18_incremental-development-qvqfi1hqvwaiigxh8jlinxieevh11vnud44t0w9bi8.png\" title=\"Incremental Development\" alt=\"Incremental Development\" loading=\"lazy\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-66 elementor-top-column elementor-element elementor-element-77131d6\" data-id=\"77131d6\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-f967d9a elementor-widget elementor-widget-heading\" data-id=\"f967d9a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Incremental Development<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-55a7cab elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"55a7cab\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-765f61f\" data-id=\"765f61f\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-72a3b85 elementor-widget elementor-widget-text-editor\" data-id=\"72a3b85\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"box\"><strong>Warum?<\/strong><br \/>Nur die Arbeit in Inkrementen erm\u00f6glicht es dem Product Owner, Feedback zu geben.<\/div><div class=\"core-points\"><table><tbody><tr><th>Wandelbarkeit<\/th><td><i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Korrektheit<\/th><td><i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Produktionseffizienz<\/th><td><i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Kontinuierliche Verbesserung<\/th><td><i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Team<\/th><\/tr><\/tbody><\/table><\/div><p>Ein Inkrement stellt einen vertikalen Schnitt durch die verschiedenen Aspekte eines Softwaresystems dar. Somit ist ein Inkrement ein St\u00fcck ausf\u00fchrbare Software. Das Inkrement kann einem Product Owner auf einer Testmaschine zur Verf\u00fcgung gestellt werden, um Feedback einzuholen.<\/p><p>Regelm\u00e4\u00dfiges Feedback in kurzen Abst\u00e4nden, jeweils am Ende einer Iteration, ist die Definition von Agilit\u00e4t.<\/p><p>Wird dagegen horizontal statt vertikal vorgegangen, entstehen Module, die nicht eigenst\u00e4ndig ausf\u00fchrbar sind. Zu solchen Modulen kann ein Product Owner kein Feedback geben. Somit ist kein echtes agiles Vorgehen m\u00f6glich.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1864c04 elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"1864c04\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-3591fa5 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"3591fa5\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-84702a5\" data-id=\"84702a5\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-a4bab40 elementor-widget elementor-widget-image\" data-id=\"a4bab40\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" src=\"https:\/\/clean-code-developer.de\/wp-content\/uploads\/elementor\/thumbs\/icon_7_component-orientation-qvqfk7icn59ba3s5kzbjwvtnpushsr9kbua3uv1n5s.png\" title=\"Component Orientation\" alt=\"Component Orientation\" loading=\"lazy\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-66 elementor-top-column elementor-element elementor-element-4f1e877\" data-id=\"4f1e877\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-2a8489e elementor-widget elementor-widget-heading\" data-id=\"2a8489e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Component Orientation<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-4ab0a6e elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"4ab0a6e\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-ccd4093\" data-id=\"ccd4093\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-1ae10ed elementor-widget elementor-widget-text-editor\" data-id=\"1ae10ed\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"box\"><strong>Warum?<\/strong><br \/>Software braucht Black-Box-Bausteine, die sich parallel entwickeln und testen lassen. Das f\u00f6rdert Wandelbarkeit, Produktivit\u00e4t und Korrektheit.<\/div><div class=\"core-points\"><table><tbody><tr><th>Wandelbarkeit<\/th><td><i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Korrektheit<\/th><td><i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Produktionseffizienz<\/th><td><i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Kontinuierliche Verbesserung<\/th><td><i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Team<\/th><\/tr><\/tbody><\/table><\/div><p>Die Prinzipien des <a title=\"Wertesystem\" href=\"http:\/\/clean-code-developer.de\/das-wertesystem\/\">CCD-Wertesystems<\/a> haben sich bisher vor allem auf kleinere Codeausschnitte bezogen. Was sollte in einer Methode stehen, was sollte \u00fcber mehrere verteilt werden? Welche Methoden sollte eine Klasse ver\u00f6ffentlichen? Woher sollte ein Client-Objekt zu einem Service-Objekt kommen? Bisher ging es um Prinzipien f\u00fcr die Softwareentwicklung im Kleinen.<\/p><p>Hat das CCD-Wertesystem denn aber nichts zu gr\u00f6\u00dferen Strukturen, zur Softwareentwicklung im Gro\u00dfen zu sagen? Wie steht es mit der Softwarearchitektur? Genau hier setzt das Prinzip der Komponentenorientierung an. Bisher haben wir zwar auch schon das Wort &#8222;Komponente&#8220; gebraucht, doch eher lax und in einem umgangssprachlichen Sinn. Von nun an jedoch soll <i>Komponente<\/i> etwas sehr spezifisches beschreiben, das wir f\u00fcr grundlegend f\u00fcr evolvierbare Software halten.<\/p><p>Solange wir Software letztlich nur aus Klassen mit Methoden aufgebaut denken, versuchen wir sozusagen Computer auf Transistorebene zu beschreiben. Das funktioniert letztlich aber nicht, weil wir im Detailreichtum ersticken. Selbst die Klassen in Schichten zusammenzufassen hilft da nicht viel. Wir brauchen vielmehr sowohl ein Beschreibungsmittel f\u00fcr gr\u00f6\u00dfere Softwarestrukturen. Aber nicht nur das: das Beschreibungsmittel sollte auch ein Implementationsmittel sein &#8211; so wie Klassen -, damit das Modell, der Plan, die Beschreibung sich im Code widerspiegelt.<\/p><p>Betriebssystemprozesse sind zwar solche architektonischen Mittel, letztlich sind auch sie jedoch zu gro\u00df. Solange die EXE eines Prozesses einer Applikation aus mehreren Hundert oder Tausend Klassen besteht, gewinnen wir nichts.<\/p><p>Hilfe bringt allerdings das Prinzip der Komponentenorientierung. Es besagt, dass ein Anwendungsprozess zun\u00e4chst einmal aus Komponenten besteht und nicht aus Klassen. Erst die Bausteine der Komponenten sind dann Klassen. Und was ist eine Komponente? Es gibt einige Definitionen f\u00fcr Komponenten, von denen im Kern zwei Kriterien unverbr\u00fcchlich erscheinen:<\/p><ul><li>Komponenten sind bin\u00e4re Funktionseinheiten. (Eine Klasse hingegen ist eine Funktionseinheit auf Quellcodeebene.)<\/li><li>Die Leistung von Komponenten wird durch einen separaten (!) Kontrakt beschrieben. (Die Leistungsbeschreibung einer Klasse liegt hingegen in ihr. Es ist die Summe ihrer Methodensignaturen.)<\/li><\/ul><p>Ein CCD sucht beim Entwurf einer Software nach der Definition der Prozesse also zun\u00e4chst nach den Komponenten, aus denen die Prozesse bestehen sollten. Er fragt sich, welche &#8222;Dienstleistungsbl\u00f6cke&#8220; machen die Anwendung aus? Und diese Bl\u00f6cke sieht der CCD als Black Boxes in Bezug auf ihren Aufbau aus Klassen an. Diese Bl\u00f6cke sind Assemblies mit wohldefinierter Dienstleistung, aber unbekannter Struktur.<\/p><p>Eine Client-Komponente C wei\u00df daher nichts \u00fcber die Klassenstruktur ihrer Service-Komponente S. C kennt nur den Kontrakt von S, der unabh\u00e4ngig von der Implementation von S ist. Kontrakte sind insofern f\u00fcr Komponenten das, was Interfaces f\u00fcr Klassen sind. Nicht zuf\u00e4llig bestehen Kontrakte zu einem guten Teil oder gar vollst\u00e4ndig aus Interfaces.<\/p><p>Komponenten sind also Elemente der Planung wie auch der Implementation. Um das zu unterstreichen, werden Komponenten physisch unabh\u00e4ngig voneinander implementiert; ein probates Mittel daf\u00fcr sind <i>Komponentenwerkb\u00e4nke<\/i>, d.h. separate Visual Studio Solutions je Komponentenimplementation. Das f\u00f6rdert nicht nur die Konzentration auf eine Aufgabe, weil man w\u00e4hrend der Arbeit an einer Komponente in der IDE nur deren Code sieht. Dar\u00fcber hinaus f\u00f6rdert es auch konsequente Unit Tests unter Einsatz von Attrappen, da Quellcode anderer Komponenten nicht sichtbar ist. Au\u00dferdem steigert solche Codeorganisation die Produktivit\u00e4t, weil Komponenten dank ihrer separaten Kontrakte parallel implementiert werden k\u00f6nnen. Und schlie\u00dflich stellt sich eine physische Isolation gegen den schleichenden Zuwachs an Entropie im Code. Denn wo Bindungen zwischen Komponenten nur via Kontrakt aufgebaut werden k\u00f6nnen, ist die Kopplung lose und kontrolliert.<\/p><p>Zur Komponentenorientierung geh\u00f6ren deshalb nicht nur bin\u00e4re, gr\u00f6\u00dfere Codeeinheiten mit separaten Kontrakten, sondern auch die Entwicklung der Kontrakte vor der Implementation (<i>Contract-first Design<\/i>). Denn sobald die Kontrakte definiert sind, die eine Komponente importiert und exportiert, kann die Arbeit an der Komponente unabh\u00e4ngig von allen anderen beginnen.<\/p><p>Siehe auch unter <a title=\"Tools\" href=\"http:\/\/clean-code-developer.de\/weitere-infos\/werkzeuge\/\">Tools<\/a>.<\/p><p>Zum Begriff Komponente siehe auch diesen <a href=\"https:\/\/ccd-akademie.de\/die-modulhierarchie\/\" target=\"_blank\" rel=\"noopener\">Blogbeitrag \u00fcber die Modulhierarchie<\/a>.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ece398d elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"ece398d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-dd58e72 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"dd58e72\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-9c3a9e4\" data-id=\"9c3a9e4\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-b068b3b elementor-widget elementor-widget-image\" data-id=\"b068b3b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" src=\"https:\/\/clean-code-developer.de\/wp-content\/uploads\/elementor\/thumbs\/icon_43_test-first-qvqfob30g4vbwvtsn93zacl0zcl4d8jf84pc7ayu0w.png\" title=\"Test First\" alt=\"Test First\" loading=\"lazy\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-66 elementor-top-column elementor-element elementor-element-f6b7c4e\" data-id=\"f6b7c4e\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-abb6e09 elementor-widget elementor-widget-heading\" data-id=\"abb6e09\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Test First<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-63c43658 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"63c43658\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-70ed46bf\" data-id=\"70ed46bf\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-3ba4568f elementor-widget elementor-widget-text-editor\" data-id=\"3ba4568f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"box\"><strong>Warum?<\/strong><br \/>Der Kunde ist K\u00f6nig und bestimmt die Form einer Dienstleistung. Service-Implementationen sind also nur passgenau, wenn sie durch einen Client getrieben werden.<\/div><div class=\"core-points\"><table><tbody><tr><th>Wandelbarkeit<\/th><td><i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Korrektheit<\/th><td><i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Produktionseffizienz<\/th><td><i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Kontinuierliche Verbesserung<\/th><td><i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Single Developer<\/th><\/tr><\/tbody><\/table><\/div><p>Wenn Komponentenorientierung fordert, die Kontrakte f\u00fcr Komponenten unabh\u00e4ngig von ihrer Implementation zu definieren, stellt sich die Frage, wie das denn geschehen soll. Durch Diskussion am runden Tisch? Das ist sicherlich ein Weg. Ein besserer ist jedoch, Kontrakte nicht erst lange an einer Tafel zu entwerfen, sondern sie sofort in Code zu gie\u00dfen. Komponentenkontrakte &#8211; oder allgemeiner: jede Codeschnittstelle &#8211; dient letztlich anderem Code als API. Es ist daher konsequent und effektiv, von diesem Code ausgehend Schnittstellen zu spezifizieren.<\/p><p>Das ist das Anliegen von <i>Test first<\/i>. Test first basiert auf dem Gedanken, dass Funktionseinheiten (Methoden, Klassen, usw.) durch Client-Service-Verh\u00e4ltnisse charakterisiert sind. Diese Verh\u00e4ltnisse drehen sich um die Schnittstelle zwischen Client und Service. Und diese Schnittstelle sollte durch den Client bestimmt werden. Der Client ist als Kunde des Service K\u00f6nig. Ihm soll der Service dienen, nach ihm soll sich deshalb die Schnittstelle des Service richten.<\/p><p>Die Definition der Schnittstellen der Codeeinheiten einer Software erfolgt aus diesem Grund von au\u00dfen nach innen. Au\u00dfen, an der Benutzeroberfl\u00e4che, sitzt der ultimative Client, der Anwender. Er definiert die visuelle\/haptische Schnittstelle der UI-Codeeinheiten. Die wiederum sind die Clients von darunterliegenden Codeschichten. Die sind dann Clients von tieferliegenden Schichten usw. Die Leistungen und Schnittstellen der tiefsten Codeschichten kann somit nur bestimmt werden, wenn die der dar\u00fcberliegenden schon bestimmt sind usw.<\/p><p>Das widerspricht dem h\u00e4ufigen Ansatz der bottom-up Definition von Codeeinheiten. Gern fangen Projekte an, eine Datenzugriffsschicht zu definieren und zu implementieren. Das ist verst\u00e4ndlich, weil solch fundamentale Funktionalit\u00e4t doch scheinbar die Voraussetzung f\u00fcr alles weitere ist. Aber dieses Vorgehen ist problematisch, wie viele gescheiterte Projekte zeigen:<\/p><ul><li>Wer von unten nach oben, von innen nach au\u00dfen spezifiziert und implementiert, bietet dem Kunden erst sehr sp\u00e4t einen Wert an. Das ist zumindest frustrierend, wenn nicht gar kontraproduktiv.<\/li><li>Wer bottom-up in der Spezifikation vorgeht, der spezifiziert ohne genaue Anforderungen des ultimativen Clients, des Benutzers. Was er also spezifiziert l\u00e4uft Gefahr, am Ende zu allgemein und damit unhandlich zu sein &#8211; oder schlicht nicht gebraucht zu werden (eine Verletzung des YAGNI-Prinzips, s.o. und im <a href=\"http:\/\/clean-code-developer.de\/die-grade\/roter-grad\/\">roten Grad<\/a>).<\/li><li>Wer von unten nach oben implementiert, l\u00e4uft Gefahr, nicht wirklich zu entkoppeln. Denn wenn tiefere Schichten n\u00f6tig sind, um dar\u00fcberliegende zu implementieren, dann werden wahrscheinlich keine wirklich isolierten Unit Tests mit Attrappen eingesetzt und auch keine Inversion of Control.<\/li><\/ul><p>Clean Code Developer vermeiden diese Probleme jedoch. Sie spezifizieren Schnittstelle nicht nur vor den Implementationen (Contract-first, s.o. Komponentenorientierung), sondern auch von au\u00dfen nach innen und ganz praktisch durch Codierung. Mit den Mitteln des automatisierten Testens ist es n\u00e4mlich sehr einfach, Schnittstellen in kleinen Schritten in Form von Tests zu definieren.<\/p><p>Test first f\u00fcgt dadurch syntaktischen Kontrakten (z.B. Interfaces) eine semantische Seite hinzu. In Ermangelung anderer, formaler Methoden, um Semantik zu spezifizieren, sind Tests der einzige Weg, um Anforderungen zu formalisieren. Wer einem Entwickler eine Komponente zur Implementierung zuweisen will, der tut daher gut daran, nicht nur ihre &#8222;Oberfl\u00e4che&#8220; (API) syntaktisch vorzugeben, sondern auch das gew\u00fcnschte Verhalten in Form von Tests.<\/p><p>Das hat viele Vorteile:<\/p><ul><li>Die Form einer Schnittstelle ist unmittelbar Client-getrieben und damit maximal relevant. YAGNI hat keine Chance.<\/li><li>Die Tests sind nicht nur Tests, sondern auch Spezifikationsdokumentation. Nutzer einer Schnittstelle und Implementierer k\u00f6nnen sie gleicherma\u00dfen studieren. Eine separate Dokumentation er\u00fcbrigt sich weitgehend. Das tut dem DRY-Prinzip gen\u00fcge.<\/li><li>Die Spezifikationen sind nicht nur passive Texte, sondern ausf\u00fchrbarer Code. Wenn dann eine Implementation vorliegt, kann sie gegen diese Tests gepr\u00fcft werden. Spezifikation und Test sind damit nicht zeitraubend aufeinanderfolgende Phasen. Das erh\u00f6ht die Produktivit\u00e4t. Qualit\u00e4tssicherung ist so der Implementation schon vorgeschaltet.<\/li><\/ul><p>Siehe auch unter <a title=\"Tools\" href=\"http:\/\/clean-code-developer.de\/weitere-infos\/werkzeuge\/\">Tools<\/a>.<\/p><p>Weiter geht&#8217;s mit dem <a title=\"Wei\u00dfer Grad\" href=\"http:\/\/clean-code-developer.de\/die-grade\/weisser-grad\/\">wei\u00dfen Grad<\/a><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Inhaltsverzeichnis Prinzipien Design and Implementation Don&#8217;t Overlapp Warum?Planungsunterlagen, die mit der Umsetzung nichts mehr gemein haben, schaden mehr, als dass sie n\u00fctzen. Deshalb nicht die Planung aufgeben, sondern die Chance auf Inkonsistenz minimieren. Wandelbarkeit \u00a0\u00a0 Korrektheit \u00a0\u00a0 Produktionseffizienz \u00a0\u00a0 Kontinuierliche Verbesserung \u00a0\u00a0 Team Eines der grundlegenden Probleme der Softwareentwicklung sind Implementationen, denen eine vorausgegangene Planung [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"parent":17,"menu_order":6,"comment_status":"closed","ping_status":"closed","template":"","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-88","page","type-page","status-publish","hentry"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/clean-code-developer.de\/en\/wp-json\/wp\/v2\/pages\/88","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/clean-code-developer.de\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/clean-code-developer.de\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/clean-code-developer.de\/en\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/clean-code-developer.de\/en\/wp-json\/wp\/v2\/comments?post=88"}],"version-history":[{"count":5,"href":"https:\/\/clean-code-developer.de\/en\/wp-json\/wp\/v2\/pages\/88\/revisions"}],"predecessor-version":[{"id":1010,"href":"https:\/\/clean-code-developer.de\/en\/wp-json\/wp\/v2\/pages\/88\/revisions\/1010"}],"up":[{"embeddable":true,"href":"https:\/\/clean-code-developer.de\/en\/wp-json\/wp\/v2\/pages\/17"}],"wp:attachment":[{"href":"https:\/\/clean-code-developer.de\/en\/wp-json\/wp\/v2\/media?parent=88"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}