Samstag, 25. Mai 2013

Zur Kategorisierung der Prinzipien

Bis heute hat sich kein einheitliches System zur Kategorisierung von Prinzipien der Softwaretechnik etabliert. In verschiedenen wissenschaftlichen Arbeiten werden unterschiedliche Ansätze präsentiert. Einige dieser Ansätze sollen im Folgenden kurz geschildert werden. Schließlich schlage ich eine differenziertere Einteilung für eine bestimmte Teilmenge der Prinzipien (nämlich produktbezogene) vor.

Einteilung nach Entwicklungsphase

[Davis1995] teilt seine Prinzipiendarstellung nach Entwicklungsphasen ein. Er unterscheidet die folgenden Kategorien:
Diese Einteilung basiert allerdings weniger auf den Eigenschaften der Prinzipien selbst, sondern ordnet die Prinzipien lediglich bestimmten Tätigkeitstypen zu. Um Ordnung in die Vielzahl der Prinzipien zu bringen, erscheint dies unzureichend.

Granularität

[Simon2006] klassifiziert Qualitätsindikatoren nach Granularität. Ließe sich diese Unterscheidung auf Prinzipien anwenden?
  • Code: Prinzipien, die sich auf Eigenschaften des Quellcodes beziehen.
  • Entwurf: Prinzipien, die sich auf nichtglobale Entwurfseigenschaften beziehen.
  • Architektur: Prinzipien, die sich auf globale Entwurfseigenschaften beziehen.
  • Technologie: Prinzipien, die für das System als Ganzes gelten.

Die Anwendung dieser Unterscheidung erscheint verlockend. Tatsächlich lassen sich zahlreiche Prinzipien im Bereich der Objektorientierung der Entwurfs-Ebene zuordnen. Andererseits existieren zahlreiche Prinzipien, die keiner der genannten Ebenen zuzuordnen sind - sie gelten entweder in allen Granularitäts-Ebenen oder eine Zuordnung zu einer dieser Ebenen ist nicht sinnvoll. Eine Einteilung der Prinzipien entlang der Granularität ist daher nicht zielführend.

Sinnvolle Grobeinteilung

In ihrer Untersuchung von insgesamt 313 unterschiedlichen Prinzipien gelangen [Séguin 2010] zu einer groben Einteilung in drei Kategorien:
Diese grobe Einteilung basiert auf einer breiten empirischen Basis und erscheint insgesamt sinnvoll. Insbesondere die Unterscheidung zwischen produktverbessernden und prozessverbessernden Maßnahmen wird im Kontext des Qualitätsmanagements häufig getroffen. [Simon2006] unterscheidet beispielsweise Prozess-, Produkt- und Ressourcenmetriken.

Bei den bisher von mir ausgewählten Prinzipien handelt es sich durchweg um produktbezogene Prinzipien. Für diese möchte ich eine differenziertere Einteilung vorschlagen.

Differenzierung der produktbezogenen Prinzipien

Technologiebezug

Prinzipien lassen sich grob in technologiespezifische, technologieübergreifende und allgemeingültige Prinzipien einteilen. Als technologiespezifisch sind dabei alle Prinzipien zu verstehen, die ausschließlich innerhalb der engen Rahmenbedingungen einer Technologie gelten. Als technologieübergreifend sollen hingegen solche Prinzipien eingestuft werden, die über eine einzelne Technologie hinaus angewandt werden können. Allgemeingültige Prinzipien haben für alle relevanten Technologien Gültigkeit. Unter einer Technologie ist dabei ein Entwicklungs- oder Entwurfs-Paradigma im weitesten Sinne zu verstehen.

So ist beispielsweise das Liskovsche Substitutionsprinzip ein technologiespezifisches Prinzip, das nur im Bereich der Objektorientierung angewendet werden kann. Das [Prinzip der losen Kopplung] ist ein technologieübergreifendes Prinzip, da es für zahlreiche (wenn auch nicht alle) Technologien gilt. Das Lokalitätsprinzip kann für alle Technologien Gültigkeit beanspruchen. Die folgende Abbildung veranschaulicht die Unterscheidung:

Der Bezug zum Menschen: Mit Software umgehen und Software verstehen

Im meinem Post zur Nichttrivialität der Softwaretechnik habe ich die grundlegenden Schwierigkeiten bei der Software-Konstruktion beschrieben und als Motivation für das Aufstellen von Prinzipien herangezogen. Gäbe es bei der Software-Konstruktion keine Schwierigkeiten, so wäre auch die Formulierung von Prinzipien überflüssig.

Daraus ergibt sich, dass Prinzipien immer etwas damit zu tun haben, welchen Problemen wir im Umgang und beim Verständnis von Software begegnen. Prinzipien lassen sich demnach typischen Handlungen oder Tätigkeiten einerseits sowie kognitiven Mustern zuordnen. Die folgende Abbildung soll dies veranschaulichen.
Ich werde im Rahmen der Katalogeinträge jeweils den Handlungsbezug und den Kognitionsbezug angeben.

Entwurfsbezug

Zahlreiche Prinzipien dienen der Entwurfsgüte auf verschiedenen Granularitätsebenen - von der Code-Ebene bis hin zur Architektur. Eine grobe Unterteilung dieser Prinzipien könnte wie folgt aussehen:
  • Zerlegungskriterium: Wie soll modularisiert werden? Wann ist Zerlegung, wann Zusammenfassung zu einem Modul empfehlenswert?
  • Bausteinkriterium: Welche Eigenschaften sollte ein einzelnes Software-Element aufweisen? In einigen Fällen dienen solche Eigenschaften auch als Zerlegungskriterium.
  • Strukturprinzip: Welche Strukturen sollte man vermeiden? Welche sollten bevorzugt werden? Dabei geht es eher um grundsätzliche Struktureigenschaften als um konkrete Strukturen. Letzterer werden eher durch Patterns oder Antipatterns behandelt.

Übersicht

Zusammenfassend ergibt sich das folgende Kategorienschema, wobei eine Differenzierung der prozess- oder ressourcenbezogenen Prinzipien noch auszuarbeiten ist:

Quellen

[Davis1995] - 201 Principles of Software Development, Alan M. Davis, 1995

[Séguin 2010] - Software Engineering Principles - A Survey and an AnalysisNormand Séguin, Alain Abran, and Robert Dupuis. C3S2E, page 59-65. ACM, (2010)

[Simon2006] - Code-Quality-Management, S. 113, Frank Simon, Olaf Seng, Thomas Mohaupt, 2006