So vermeiden Sie versehentliche Komplexität beim Softwaredesign

Von Andrew Sardone
Vizepräsident für Ingenieurwesen, Nutshell

„In der Informatik gibt es zwei schwierige Probleme: die Ungültigkeit des Cache, die Benennung von Dingen und einzelne Fehler.“ - Leon Bambrick

1986 veröffentlichte der Computerarchitekt Fred Brooks eine Veröffentlichung mit dem Titel "No Silver Bullet", in der er feststellte, dass das Software-Engineering nicht die gleichen Produktivitätsgewinne erzielte wie das Hardware-Engineering.

Brooks argumentierte, dass bei der Herstellung von Software zwei Haupthindernisse zu überwinden seien: zufällige Komplexität und wesentliche Komplexität.

Zufällige Komplexität bezieht sich auf Herausforderungen, die sich Entwickler ungewollt stellen, wenn sie versuchen, ein Problem zu lösen. (Glücklicherweise kann diese Komplexität auch von Entwicklern behoben oder verbessert werden.)

Wesentliche Komplexität ist nur die Natur des Tieres, das Sie zu zähmen versuchen. Das Beispiel, das Brooks verwendet, ist, wenn Benutzer ein Programm benötigen, um 30 Dinge zu tun, dann sind diese 30 Dinge wesentlich; Sie können nicht einfach ein paar davon entfernen, um die Software weniger komplex zu machen. Wann immer Sie ein Problem lösen, gibt es nur einige Bereiche der Komplexität, die sich nicht einschränken lassen.

Während Brooks sich auf die Komplexität bezog und wie sie mit dem Erstellen und Ändern von Code zusammenhängt, gilt dies auch für das Endprodukt.

Umsatzprognosen, das Abwägen der Wahrscheinlichkeiten für das Schließen von Leads innerhalb einer Pipeline und das Analysieren des Verhaltens Ihres Trichters sind für ein CRM von entscheidender Bedeutung. Auf der anderen Seite sind schwer lesbare Diagramme, mentale Berechnungen oder Berichte, die nicht sofort in Echtzeit aktualisiert werden, Beispiele für die versehentliche Komplexität.

Wenn ich an die Software denke, die wir bei Nutshell erstellen, frage ich mich oft: Wie viel davon ist für das Problem, das wir zu lösen versuchen, wesentlich, und wie können wir zufällige Komplexität beseitigen? Wie können Hürden beim Schreiben und Verwenden der Software vermieden werden?

Ihr Code ist Ihre Organisation

Das Conway-Gesetz besagt: "Jede Organisation, die ein System entwirft, wird ein Design produzieren, dessen Struktur eine Kopie der Kommunikationsstruktur der Organisation ist." Mit anderen Worten, der von Ihnen geschriebene Software-Code spiegelt im Wesentlichen die Gestaltung Ihres Unternehmens wider.

Ich habe mich in diesem Punkt so sehr geärgert, dass mein Team es wahrscheinlich satt hat, es zu hören, aber ich glaube, dass die Schaffung der richtigen Organisationsumgebung eines der wichtigsten Dinge ist, die Sie tun können, um effektiven Code zu erstellen.

Für mich bedeutet dies, dass das Team flacher und offener wird, sodass es keine Hindernisse gibt, mit anderen Teammitgliedern zu sprechen oder den Code zu aktualisieren und zu verbessern. Letztendlich geht es darum, die Geschwindigkeit zu erhöhen, Wissenssilos zu reduzieren und das Endprodukt zu verbessern.

Die Herausforderung für große Unternehmen wie Google oder Facebook besteht darin, dass alle diese Teams - manchmal sogar im Wettbewerb um dasselbe Produkt - über unterschiedlich viel Bürokratie, Prozesse und kniffligere Kommunikationskanäle verfügen.

Jetzt kommt es zu Kompromissen, da der Wert und die Skalierbarkeit dieser Produkte konkurrenzlos sind, aber der Mehraufwand für die Komplexität seine Kosten hat und die Isolierung Ihrer Architektur ein erheblicher Kampf für die Softwareentwicklungsteams ist.

Kein Platz für Helden

Eine andere Möglichkeit, die Komplexität zu verringern, besteht darin, die Anzahl der „Teamhelden“ so weit wie möglich zu begrenzen.

Manchmal hat man einen Rockstar im Team, der sagt, wenn etwas kaputt geht: „Was auch immer, ich werde es einfach reparieren.“ Das ist eine gängige Dynamik in vielen Softwareteams, hat aber diese Taschen voll Heldenverehrung kann für den Wissensaustausch sehr schädlich sein.

Vielleicht haben Sie schon von dem "Busfaktor" gehört - wie groß wären die Auswirkungen auf unser Unternehmen, wenn dieser Typ von einem Bus angefahren würde? Dies kann für jede Abteilung eines Unternehmens gelten, ist jedoch besonders in der Softwareentwicklung zu spüren. Aufgrund der Anzahl der sich bewegenden Teile in der Softwareentwicklung kann dieser Held mit hohem Busfaktor unentdeckt bleiben, und plötzlich haben Sie eine versteckte Abhängigkeit, die bei Verlust unglückliche Überraschungen hervorruft. Das ist eine zufällige Komplexität!

Zum Glück sind wir nicht so riskant wie bei Nutshell, aber ich versuche, mir dessen bewusst zu sein. Wir führen Code-Reviews durch, halten Mittagspause und lernen und bauen auf bewährten Techniken auf, um den Tech-Stack zugänglich zu halten. Denn bei der Reduzierung dieses „Busfaktors“ geht es nicht nur um eine sofortige Risikominderung, sondern auch um die Verbesserung unseres kollektiven Teamwissens, was zu einem besseren Produkt führt.

Die Kraft des Fokus

Es gibt eine Menge taktischer Dinge, die Sie tun können, um die Einfachheit voranzutreiben und die Komplexität zu reduzieren, von der Art, wie Sie Code schreiben, bis zur Art, wie Sie ihn versenden. Zum Beispiel möchten wir Dinge in kleinen, inkrementellen, iterativen Abschnitten veröffentlichen, damit es nicht zu dieser großen Umstellung kommt, die viele Probleme verursachen kann, auf die wir reagieren müssen.

Aber das, was wir tun, hat den größten Einfluss, indem wir uns auf das Wesentliche beschränken.

Wie Fred Brooks bemerkte, entsteht eine wesentliche Komplexität, wenn der Benutzer sagt, dass die Software 30 Dinge zu tun hat und es keinen Ausweg gibt. Aber ich würde sagen, wie können wir die Liste auf die 30 Funktionen reduzieren, die tatsächlich notwendig sind?

Einer der Kernwerte von Nutshell ist der Fokus. In meiner Rolle bedeutet dies, die größte Überlappung der wesentlichen Aufgaben der Software zu finden und die Aufgaben, die außerhalb der Software liegen, abzulehnen.

Wir können nicht versuchen, jede einzelne eingehende Featureanforderung auszuführen, da jede marginale Eingabe möglicherweise einen exponentiellen Bereich von Komplexität aufweist. Sie müssen die Kühnheit haben zu sagen: "Nun, wir werden das für das Produkt einfach nicht tun."

Überlegen Sie, wie Sie ein Unternehmen vermarkten würden: Ihre Nachrichten sollten nicht bei jedem Menschen auf der Welt Anklang finden. Sie müssen die Zielmärkte und -persönlichkeiten auswählen, die Ihr Produkt am wahrscheinlichsten nutzen und davon profitieren.

Ich sehe die Produktentwicklung genauso. Sie müssen einige Personas für jede Funktion auswählen. Dies bedeutet von Natur aus, dass Sie andere ausschließen.

Eingrenzen, was Sie versuchen zu tun, ermöglicht es Ihnen, die wichtigen Dinge zu verbessern und die Komplexität mit den richtigen Anstrengungen zu reduzieren. Es ist nicht nur ein "nice to have" in guter Software, es ist von wesentlicher Bedeutung.

Diese Geschichte wurde in The Startup veröffentlicht, der größten Veröffentlichung zu Unternehmertum von Medium, gefolgt von über 271.813 Personen.

Abonnieren Sie hier unsere Top Stories.