≡ Menu

Warum Darwin ein idealer Softwareentwickler gewesen wäre

Charles Darwin im Alter von 71 Jahren (Lizenz: gemeinfrei)

Charles Darwin im Alter von 71 Jahren (Lizenz: gemeinfrei)

„Es ist wie einen Mord zu gestehen“, schrieb Darwin in einem Brief, als er langsam zu der Überzeugung kam: Arten sind nicht unveränderlich.

Das war 1844, eineinhalb Jahrzehnte vor der Veröffentlichung seines Hauptwerks Die Entstehung der Arten. Er war dabei, mit seinen Beiträgen zur Evolutionstheorie alles auf den Kopf zu stellen.

Heute erscheint die These weit weniger radikal als noch bei der Veröffentlichung: Arten verändern sich, um sich besser an die Umwelt anzupassen.

Dabei bleiben vorteilhafte Variationen erhalten.

Evolution in der Softwareentwicklung

Genau diese Grundannahmen der Evolution machen sich Softwareentwickler heute zunutze.

Bei der evolutionären Entwicklung wird zunächst nur eine Anwendung mit den Grundfunktionalitäten bereitgestellt. Dann wird nach und nach erweitert — entsprechend des Feedbacks vom Kunden.

Natürlich ist dabei der Entwickler die treibende Kraft, im Gegensatz zu Darwins natürlicher Selektion. Software entwickelt sich nicht von allein weiter.

Deshalb ist auch das Prinzip des Gradualismus, also Änderungen in vielen Zwischenschritten, nicht gegeben. Es ist aber Voraussetzung für eine erfolgreiche Evolution des Systems und sollte Ziel der Weiterentwicklung sein.

Paradebeispiel Open Source Software

Open Source Software wird ja praktisch nur evolutionär entwickelt.

Linus Torvalds hat sich vor 20 Jahren nicht hingesetzt und geplant, Linux in einem guten Jahrzehnt auf den Großteil der Server zu bringen und es zu einer wirtschaftlichen Größe zu etablieren.

Typischerweise entstehen ja Open-Source-Projekte so, dass jemand ein ganz spezielles Problem für sich selbst löst. Mit ein bisschen Glück findet man Mitstreiter, die neue Funktionalität dazu- oder vorhandene entsprechend ihrer eigenen Wünsche umbauen.

Die Software evolviert über die Zeit.

Gern wird auch mal zu drastischen Mitteln gegriffen, um ein Projekt voranzutreiben. Aus der durchaus lesenswerten Erklärung, warum einige Entwickler aus der Community um das Projektmanagement-Tool Redmine es für sinnvoll erachteten, das ChiliProject abzuspalten:

However, in the view of some of Redmine’s leading developers, the maintenance and evolution of Redmine has not been as predictable and responsive as its developer community is capable of […] A group of developers from the Redmine community has therefore concluded that the only way to ensure continued, sustained and stable development of our favorite project management solution is to fork it.

In Darwins Augen ist hier also eine neue Art entstanden.

Flexibilität und Wartbarkeit sichern: Evolution statt Sackgasse

Um evolutionäre Entwicklung zu fördern und Software später an veränderte Bedingungen anpassen zu können, müssen Programme flexibel gehalten werden. Sonst drohen irgendwann teure Neuentwicklungen.

Das schafft man nur, wenn regelmäßig aufgeräumt und dem Verfall rechtzeitig vorgebeugt wird.

Dann ist man auch in der Lage, agil zu entwickeln.

Vorbei die Zeit, in der Softwareprodukte in jahrelangen Prozessen am Kunden vorbei spezifiziert und umgesetzt wurden. Die Vorstellung, heute schon wissen zu können, welche Detailfunktion der Kunde in ein paar Jahren braucht, muss einem da zwangsläufig wie Schöpfungsbiologie vorkommen.

Zusammenfassung

Darwin zögerte damals, die Theorie zu veröffentlichen. Seine ursprüngliche Auffassung war die Unveränderlichkeit der Arten gewesen, aber seine und die Recherchen anderer widerlegten die These. Und er war sich der Tragweite seiner Entdeckungen bewusst.

Sein Hauptwerk schloss er mit dem Satz:

Es ist wahrlich etwas Erhabenes um die Auffassung, [dass] aus einem so schlichten Anfang eine unendliche Zahl der schönsten und wunderbarsten Formen entstand und noch weiter entsteht.

Diese Feststellung lässt sich so sogar auf Software übertragen.

Hast du schon Erfahrung mit evolutionärer Entwicklung gesammelt? Sag’s uns in den Kommentaren!

Comments on this entry are closed.

  • Fronx 8. Juni 2011, 10:00

    Darwin-Analogien sind toll. Was den Gradualismus angeht, würde ich den auch in der Software-Entwicklung repräsentiert sehen, nämlich als die kleinschrittige Ansammlung von Inkrementen bei der testgetriebenen Entwicklung (TDD). Das sind zum großen Teil zufällige (Lösungs-Raten) Änderungen, die mehr oder weniger vorgefiltert sind (Großhirne haben eingebaute Prädiktion und Selektion) und sich an der (unmittelbaren) Realität der Tests (im Gegensatz zur Realität des Produktiveinsatzes) beweisen müssen und entweder scheitern (rot) oder nicht (grün). Die Codezeilen, die diese Schranke passieren, geben ihre Information an die nächste Generation weiter (Git-Commit). Die anderen sterben entweder ohne Spur aus (kein Commit) oder hinterlassen Fossilien in Form von brachliegenden Git-Branches, die aber prinzipiell wiederbelebbar sind, solange die aktive Codebasis sich nicht so weit verändert, dass ein Merge unmöglich ist (das wäre dann Speziation).

  • André 8. Juni 2011, 10:25

    Haha, natürlich sind Darwin-Analogien toll!

    Über deinen einleitenden Gradualismus-Satz hab ich mich erst gewundert. Natürlich sehe ich das Prinzip auch in der Software-Entwicklung — im Nachhinein liest sich der Artikel aber anders. Was ich meinte: Gradualismus kriegt man nicht geschenkt, sondern muss sich selbst drum kümmern. Ob nun im Form von Test-Driven Development und Versionierung wie von dir beschrieben oder bei architekturellen Änderungen.

    Ich werd den Artikel an dieser Stelle überarbeiten, damit das klarer wird.

  • Fronx 8. Juni 2011, 11:04

    Klar, “man” bekommt die graduellen Inkrementversuche nicht geschenkt, aber aus Sicht der Software macht das keinen Unterschied. Sie bekommt diese Änderungen geschenkt, da es Menschen gibt, die Code ändern können, genauso wie lebende Organismen ihre Mutationen durch verschiedene Kopierfehler-verursachende Elemente ihrer Umgebung geschenkt bekommen. Aus Sicht des Codes sind wir nur ein existierender externer Mechanismus, der es ihm ermöglicht, in einer Welt zu überleben, deren Anforderungen an Software sich ständig ändern (Selektionsdruck).

  • André 11. Juni 2011, 21:00

    Nach dieser Definition wäre jede Software evolutionär entwickelt. Das stimmt aber nicht: Evolutionäre Softwareentwicklung ist eine bewusste Entscheidung des Entwicklers. Meiner Ansicht nach reicht es also nicht, die “Sicht des Codes” zu berücksichtigen.