Softwareentwickler können programmieren, aber können Programmierer auch Software entwickeln? Was unterscheidet einen Softwareentwickler vom Software Engineer? Und sind ein Software Engineer und ein Softwareingenieur das Gleiche?

Wortwolke Entwickler

Inhalt

Hintergrund

Mit Entwicklung des ersten Compilers durch Grace Hopper blicken wir auf nahezu 70 Jahre Programmierung und mit der NATO-Konferenz 1968 auf 50 Jahre Software Engineering zurück. Der Wikipedia-Eintrag zum Softwareentwickler ist dafür am 18. Januar 2018 noch erstaunlich dürftig gewesen, bestätigt aber eine bislang nicht vorhandene Abgrenzung zwischen Programmierer und Softwareentwickler:

Ein Softwareentwickler ist eine Person, die an der Erstellung von Software mitwirkt. Der Begriff ist nicht scharf definiert. […] Umgangssprachlich wird zwischen den Begriffen „Programmierer“ und „Softwareentwickler“ oft nicht unterschieden. […] Die Berufsbezeichnung Softwareentwickler ist in Deutschland und Österreich keine geschützte Berufsbezeichnung.

Eine Suche auf der Spezialistenplattform Gulp brachte zum Abfragezeitpunkt interessanterweise nur 498 Programmierer, dafür 3.576 Softwareentwickler und 3.495 Software Engineers hervor. Demnach scheint der Programmierer doch etwas anderes als ein Softwareentwickler zu sein, der wiederum ähnlich häufig vertreten zu sein scheint, wie der Software Engineer. Wobei der Softwareingenieur dann nur ganze 57 Mal vertreten ist. Stepstone ergibt diesbezüglich noch ein anderes Bild, sowohl hinsichtlich der absoluten Anzahl als auch hinsichtlich der Verteilung. Es scheint sich also noch kein Konsens in der entsprechenden Begrifflichkeit gebildet zu haben.

Die Verwendung unterschiedlicher Interpretationen eines Begriffs führt in Diskussionen häufig zu Konflikten, weshalb wir im Folgenden unsere Definition von Programmierer, Softwareentwickler, Softwareingenieur und Software Engineer ausführen.

Programmierer

Jeder kann (heute) programmieren. Programmieren bedeutet, dem Computer mittels für ihn verständlicher Anweisungen, in der Regel Quellcode, mitzuteilen, was er machen soll. Dieses »Was« wird auch Softwareentwurf genannt. Ein einfaches Beispiel für einen Softwareentwurf wäre, fünfmal den Text »Hallo!« auf dem Bildschirm auszugeben. Der vom Programmierer zu erstellende Quellcode, das »Wie«, kann heute je nach Programmierumgebung entsprechend einfach aussehen:

5.times { puts "Hallo!" }

Was in diesem Beispiel nach Übergabe an den Interpreter der Programmiersprache Ruby zum gewünschten Ergebnis führt:

Bildschirmfoto Hallo!

Musste man sich früher um Speicherbereiche, Pointer, Garbage Collection, etc. beim Programmieren Gedanken machen, so abstrahieren die modernen Programmiersprachen, Frameworks und Entwicklungsumgebungen dies heute weitestgehend weg. Mit einem Buch bewaffnet an den Computer setzen und losprogrammieren; da mit Stand 2017 in 90% der Haushalte ein Computer vorhanden ist, sind die Einstiegshürden ähnlich niedrig wie beim Spazierengehen oder Walken.

Die voran genannten »Feinheiten« des Programmierens ergänzt um Algorithmen, Datenstrukturen, Netzwerke, Programmierparadigmen und unterschiedliche Programmiersprachen lernt man zum Beispiel auch im Rahmen eines Informatikstudiums. Ein Programmierer hat aber nicht zwangsläufig studiert.

Ein Programmierer überführt eine klar umrissene Problemstellung in ein auf (s)einem Computer ausführbares Programm. Nicht mehr und nicht weniger.

Wir wollen den Programmierer damit allerdings auch nicht trivialisieren: Donald Knuth schreibt nicht umsonst seit den 1960er Jahren an seinem bislang zwar schon auf 4 Bände angewachsenen, aber immer noch nicht vollendeten Werk »The Art of Computer Programming«, in dem er sich ausführlich mit den oben weiter genannten »Feinheiten« effizienter Programmierung auseinandersetzt. Man kommt heute aber auch relativ weit in der Programmierung, ohne sich damit selbst auseinander gesetzt zu haben.

Mehrere Benutzer sollen das Programm gleichzeitig bedienen? Millionen Transaktionen parallel verarbeitet werden? Dauerhaft große Datenmengen archiviert und wiederauffindbar sein? Das Programm soll zukünftig einfach um neue Anforderungen erweitert werden können? Natürlich kostengünstig und das auch noch von einem anderen Programmierer? Bei diesen Fragestellungen verlassen wir dann langsam aber sicher die Domäne des Programmierers nach unserer Definiton.

Softwareentwickler

Software wird nicht programmiert, sondern entwickelt, denn die meisten Probleme sind nicht trivial und die Lösungen dazu komplex mit einer Vielzahl von Abhängigkeiten, die kaum jemand auf einen Blick erfassen kann. Mit dem Wort »entwickeln« ist ein Lebenszyklus oder auch Prozess, eben eine Entwicklung verbunden. Aus einem Problem entwickelt man eine Lösung, sie ist nicht einfach da. Zunächst einmal muss das Problem dafür verstanden werden und zwar sowohl auf Seite dessen, der das Problem hat, als auch auf der Seite des potentiellen Lösers des Problem, also des Softwareentwicklers. Dieser »Schritt« – nein, es ist nicht einer, sondern es sind tatsächlich viele – der Problem- oder Anforderungsklärung ist elementar für einen Softwareentwickler und unterscheidet ihn für uns wesentlich vom Programmierer. Gerade auch, da hierzu zusätzliche Fähigkeiten notwendig sind, als für die »reine« Programmierung.

Um die sogenannte Problemdomäne zu verstehen, sind neben analytischen in der Regel auch kommunikative Fähigkeiten gefragt, da dies in den meisten Fällen gemeinsam mit dem Anforderer erfolgt. Erschwerend kann selbiger sein Problem häufig nicht genau beziehungsweise nicht in einer mit der Lösungsdomäne konformen Art und Weise beschreiben, so dass Fingerspitzengefühl beim Softwareentwickler gefordert ist. So etwas Alltägliches wie Haare schneiden verdeutlicht die Diskrepanz zwischen Problem- und Lösungsdomäne sehr schön. Ich weiß zwar vielleicht beim Frisörbesuch, dass ich die Haare hinten etwas kürzer als vorne geschnitten haben möchte, da sie mir hinten zu lang geworden sind (die Problemdomäne). Ich kann dem Frisör aber nicht sagen, wie er Schere und Kamm führen muss (die Lösungsdomäne), damit das gewünschte Ergebnis heraus kommt. Und Software ist dann meist doch erheblich komplexer als ein Haarschnitt.

Ein Programmierer kennt die Lösungsdomäne, also die Programmierung. Ein Softwareentwickler hingegen muss sowohl die Problem- als auch die Lösungsdomäne kennen und sich erstere mit dem Anforderer gemeinsam erarbeiten können. Wer beispielsweise eine Buchhaltungssoftware entwickelt hat, kann also sowohl programmieren als auch den Buchhalter und die Buchhaltung verstehen.

Der Lebenszyklus einer Software und damit auch die Aufgabe eines Softwareentwicklers geht aber noch weiter. Die Anforderungen verändern sich, neue kommen im Laufe der Zeit hinzu und somit muss die Software angepasst werden. Was bedeutet, dass sie auch anpassbar, also flexibel sein muss. Und diese Flexibilität bezieht sich nicht nur auf neue Funktionen, sondern meist auch auf nicht-funktionale Aspekte, wie zum Beispiel mehr Benutzer, Daten und so weiter. Ein Softwareentwickler ist sich auch dieser häufig nicht ausgesprochenen Anforderungen bewusst und versucht sie entsprechend zu berücksichtigen, also Code zu schreiben, der anpassbar ist. Da dies durchaus auch gegenläufige Anforderungen sein können – eine sehr sichere Software ist eventuell langsamer als eine nicht ganz so sichere Lösung – muss ein Softwareentwickler auch in der Lage sein, entsprechende Entscheidungen im Sinne des Anforderers zu treffen: An welcher Stelle ist beispielsweise mehr Sicherheit geboten und wo ist die Geschwindigkeit für den Anwender relevanter?

Programmierern kann jeder, aber nicht jeder Programmierer kann Software entwickeln, da dies zusätzliche Fähigkeiten erfordert. Diese Fähigkeiten lernt man in der Regel dadurch, dass man langlebig wartbare Software im professionellen Umfeld entwickelt; Softwareentwickler ist also ein Beruf. Ein Softwareentwickler kann Informatik studiert haben, muss aber nicht, gerade da der Fokus eines entsprechenden Studiums häufig auf der Lösungsdomäne der Programmierung liegt und der Umgang mit der Problemdomäne der Praxis obliegt.

Softwareingenieur

Programmierer und Softwareentwickler lassen sich also noch relativ gut abgrenzen, was zeichnet nun aber einen Softwareingenieur aus? Die Orientierung am deutschen Ingenieursbegriff ist hier hilfreich. Die Berufsbezeichnung »Ingenieur« darf in Deutschland seit den 1970er Jahren nur führen, wer ein technisches oder naturwissenschaftliches Studium an einer deutschen Hochschule mit einer Regelstudienzeit von mindestens sechs Semestern Vollzeit erfolgreich abgeschlossen hat. Ein Softwareingenieur verfügt also zwingend über ein technisches Studium, aber nicht zwangsläufig über ein Informatikstudium.

Die Diskussion, ob Softwareentwicklung eher Kunst (»Art«), Handwerk (»Craft«) oder Ingenieursleistung (»Engineering«) ist, werden wir in einem separaten Beitrag detaillieren. Für uns ist es zumindest nicht direkt mit den klassischen Ingenieursdisziplinen wie zum Beispiel Automobilbau vergleichbar, auch wenn diese Metaphern der Softwarekrise geschuldet immer gerne herangezogen werden. Wie wir oben weiter aufgezeigt haben, ist auch ein Informatikstudium noch nicht zwangsläufig ausreichend, um gute Software entwicklen zu können. Ein beliebiges anderes technisches Studium ist aufgrund der mit einem Studium verbundenen akademischen Arbeitsweise sicherlich für einen Softwareentwickler hilfreich, ein Ingenieur ist aber nicht auch automatisch ein guter Programmierer, geschweige denn ein guter Softwareentwickler.

Ein Softwareingenieur ist ein Ingenieur, der auch programmiert oder Software entwickelt.

Man findet ihn üblicherweise im system-, konstruktions- oder ingenieursnahen Umfeld, also beispielsweise wenn es sich um SPS-Programmierung dreht, bei der Embedded-Entwicklung oder in der Automobilbranche.

Software Engineer

Insbesondere aufgrund der internationalen Vergleichbarkeit taucht aber auch in Deutschland immer häufiger der Software Engineer auf. Die Abgrenzung zum Softwareentwickler ist hier schon schwieriger. Oder ist ein Software Engineer nur ein ins Deutsche übersetzter Softwareingenieur?

Der Begriff des »Engineers« unterliegt auch als Übersetzung des Ingenieursbegriffs in Deutschland nicht den entsprechenden Vorgaben des Ingenieurs als Berufsbezeichnung. Ein Software Engineer kann also ein übersetzter »Softwareingenieur« sein, muss aber nicht. Die in der Einleitung erwähnte, unterschiedliche Verteilung der beiden Begriffe deutet hier auch schon eine andere Verwendung an.

In den USA muss man sich registrieren lassen und unterliegt weiteren formalen Anforderungen, wie zum Beispiel einem abgeschlossenen Studium und einer Prüfung, wenn man Engineering-Leistungen anbietet. Mit dem »Engineer« als Berufsbezeichnung sind hingegen weniger Anforderungen verbunden, weshalb häufig die alleinige Tätigkeit in einem technischen Beruf dort schon dazu führt, sich auch als Engineer zu bezeichnen. Wer in den USA als Softwareentwickler arbeitet, ist also in der Regel auch ein Software Engineer.

Vor der Regelung der Berufsbezeichnung des Ingenieurs in den 1970er Jahren durften in Deutschland auch Personen ohne eine Ingenieurausbildung, aber mit langjähriger einschlägiger Berufspraxis die Standesbezeichnung »Ingenieur« führen. Es war also eine Standesbezeichnung und die einschlägige Berufserfahrung war wichtig.

Unsere Definition des Software Engineers fasst die praktischen Aspekte des voran Genannten zusammen, ergänzt um eine wissenschaftliche Herangehensweise; Software Engineering ist dann eher Berufung als Beruf.

Ein Software Engineer versteht Softwareentwicklung als eine eigenständige Ingenieursdisziplin. Er kann dabei über ein Studium der Informatik oder ähnliches verfügen, muss aber nicht. Er hat praktische Erfahrung mit der Entwicklung langlebig wartbarer und performanter Software. »Standing on the shoulders of giants« bedeutet für ihn nicht blind das neueste Javascript-Framework einzusetzen, sondern auch das Wissen um klassische, aber genauso relevante Ansätze, Erkenntnisse und Konzepte wie zum Beispiel Programming Pearls, Systemtheorie oder auch Conway’s Law. Dazu verfolgt er auch entsprechende aktuelle wissenschaftliche Publikationen, wie zum Beispiel IEEE oder ACM. Ein Software Engineer geht empirisch an seine Arbeit heran: Softwareentwicklung ist eine Hypothese, deren Erfolg durch entsprechende Tests überprüft wird.

»Testing is the engineering rigor of software development.« –Neal Ford, The Productive Programmer

Test-driven Development, Refactoring und beispielsweise Clean Code sind für den Software Engineer Standardwerke und er weiß darum, diese und ähnliche praktische Konzepte genauso gezielt einzusetzen, wie wissenschaftliche Erkenntnisse. Er ist also Ingenieur und Handwerker.

Fazit

Ein Programmierer überführt eine klar umrissene Problemstellung in ein ausführbares Programm. Ein Softwareentwickler programmiert, kennt sich in der jeweiligen Problemdomäne aus, kann sich diese mit dem Anforderer gemeinsam erarbeiten und hat praktische Erfahrung mit der Entwicklung von langlebig wartbarer Software. Ein Softwareingenieur ist ein Ingenieur, der auch programmiert oder Software entwickelt. Ein Software Engineer ist ein Softwareentwickler, der Softwareentwicklung als eine eigenständige Ingenieursdisziplin versteht.

Einordnung Entwickler & Co.

Auch wenn die Grenzen nicht ganz trennscharf sind und die Begriffe inhaltlich zum Teil aufeinander aufbauen, so lassen sie sich aber, wie wir gezeigt haben, doch abgrenzen und sollten unserer Einschätzung nach auch entsprechend eingesetzt werden. Reine Programmierung lässt sich beispielsweise leichter an Offshore-Dienstleister outsourcen als komplexe Softwareentwicklung, aber haben die Beteiligten einer beispielhaften Diskussion um das Outsourcing eines großen Entwicklungsvorhabens auch das gleiche Verständnis, um welche Art von Vorhaben es geht? Und was passiert, wenn dabei zwar über Softwareentwicklung verhandelt wird, aber auf der einen Seite Programmierer eingesetzt werden und auf der anderen Seite Software Engineers benötigt werden?

Über die weiteren Ausprägungen, welche insbesondere ein Softwareentwickler einnehmen kann, wie beispielsweise den Frontend-, Backend- oder Fullstack-Entwickler (so es ihn gibt;-) werden wir in einem eigenen Beitrag berichten.