- Programmierung
-
Programmierung (von griechisch prógramma „Vorschrift“) bezeichnet die Tätigkeit, Computerprogramme zu schreiben. Dies umfasst vor allem die Umsetzung (Implementierung) des Softwareentwurfs in Quellcode und, je nach verwendeter Programmiersprache, dessen Übersetzung in die Maschinensprache.
Programme werden unter Verwendung von Programmiersprachen formuliert. In eine solche Sprache „übersetzt“ der Programmierer die verwendeten Algorithmen. Zunehmend wird er dabei durch Codegeneratoren unterstützt, die zumindest Teile des Programmcodes auf Basis von Modellen (die im Entwurf entstanden) automatisch erstellen.
In vielen, insbesondere in kleineren Softwareprojekten und bei Einsatz Agiler Prozesse, sind der Entwurf und die Erstellung eines Programms nicht getrennt, das Programm entwickelt sich in diesen Fällen in enger Wechselwirkung mit dem Entwurf und umgekehrt. In größeren Projekten sind Entwurf und Programmierung (dann häufig als Implementierung bezeichnet) getrennt. Der Programmierer bewegt sich dann bei seiner Tätigkeit im Rahmen des Entwurfes; seine Aufgabe ist, die durch den Entwurf beschriebene Wechselwirkung von ebenfalls dort beschriebenen Softwarekomponenten durch Programmcode zu realisieren.
Dennoch ist auch Programmieren eine kreative Tätigkeit; ein Entwurf gibt zwar einen Funktionsrahmen vor, doch kann dieser auf unterschiedliche Art umgesetzt werden.
Umgangssprachlich bezeichnet man manchmal auch das Konfigurieren von Haushaltsgeräten als „Programmieren“.
Inhaltsverzeichnis
Qualitätskriterien
Korrektheit
Ein Programm muss die im Entwurf gemachten Vorgaben korrekt umsetzen. Dazu muss es in der Regel fehlerfrei sein, wobei beim Programmieren meist zwei verschiedene Arten von Fehlern auftreten:
- Syntaxfehler: Fehlerhaft formulierter Quellcode – man verwendet Formulierungen oder Konstrukte, die so nicht in der verwendeten Programmiersprache vorkommen (Tippfehler, Unkenntnis, …). Syntaxfehler können vom Compiler/Linker oder Parser erkannt werden – müssen aber nicht!
- Semantische Fehler: Das Programm verhält sich nicht, wie gewünscht. Möglicherweise weil der Algorithmus oder seine Umsetzung fehlerhaft war.
Der Übergang zwischen diesen beiden Fehlerarten ist fließend. Beispielsweise kann ein Tippfehler im Code (z.B. ">" statt "<") zu einem gültigen ausführbaren Programm führen, das Resultat wird jedoch wahrscheinlich falsch sein. An anderer Stelle wiederum könnte der selbe Fehler einen Syntaxfehler darstellen.
Syntaxfehler werden meist vom Compiler oder Interpreter als solche erkannt und benannt. Semantische Fehler im Programm können in der Regel nicht automatisch erkannt, sondern nur durch gewissenhaftes Testen gefunden werden – beispielsweise in Form von Unittests.
Robustheit
Statistisch gesehen wird die meiste Zeit für die Entwicklung von Quelltext benötigt, um auf Fehler oder außergewöhnliche Anwendungs- oder Hardwareumgebungen zu reagieren. Ein Programmtext, der auch bei unvorhergesehenen Fehlern oder ungewöhnlichen Umgebungen sinnvoll reagiert, wird als robust bzw. portabel bezeichnet. Geübte Programmierer können die möglichen Fehler und Laufzeitumgebungen gut einschätzen und strukturieren das Programm und seinen Quelltext dementsprechend. Der Zeitdruck bei der Entwicklung von Anwendungen stellt selbst an erfahrene Programmierer immer höchste Ansprüche hinsichtlich dieses Kriteriums.
Wartbarkeit
Damit eine Software dauerhaft funktioniert, muss sie wartbar sein. Das heißt, Änderungen wie Bugfixes, Anpassungen und neue Features müssen ohne großen Aufwand eingepflegt werden können. Dies verlangt vor allem, dass der Programmierer sich nicht dazu verleiten lassen darf, zu kurzen, „kryptischen“ Quelltext zu erzeugen, der aber nur noch von ihm selbst (wenn überhaupt) verstanden werden kann. Andernfalls kann die Einarbeitungszeit in den fremden oder alten eigenen Code sehr lang werden.
Um solche Probleme zu vermeiden, existieren eine Reihe von Konventionen wie die Verwendung von selbsterklärenden Variablennamen und die Verwendung von Kommentaren im Code. Auch eine sinnvolle Aufteilung des Codes in intuitiv verständliche Funktionen und Klassen trägt zum Verständnis und Übersichtlichkeit bei.
Performanz
In der Regel stehen einem Programm nur begrenzte Ressourcen (Laufzeit, Speicherverbrauch, Bandbreite) zur Verfügung. Gute Programmierung kann dazu beitragen, unnötigen Ressourcenverbrauch zu reduzieren. Beispielsweise indem bei Verwendung großer Datenmengen an mehreren Stellen im Programm nicht der gesamte Datensatz kopiert wird, sondern nur die Adresse, an der die Daten liegen.
Effiziente Programmierung
Gemäß Niklaus Wirth zeichnet sich gute Programmierung[1] zum einen dadurch aus, dass die Funktionen, die die jeweils verwendete Programmierumgebung bereitstellt, möglichst effizient genutzt werden. Insbesondere geht es darum, für Aufgabenstellungen nicht das Rad neu zu erfinden, wenn bestimmte Funktionen schon durch die Programmierumgebung bereitgestellt werden (beispielsweise in Form von Bibliotheken). Sie zeichnet sich also vor allem dadurch aus, dass ein guter Überblick über den grundsätzlichen Funktionsumfang und die Systematik der von der Programmierumgebung bereitgestellten Funktionen (die in die zehntausende gehen können) erzeugt wird. Für eine definierte Aufgabenstellung können sie in entsprechenden Dokumentationen dann schnell die bereitgestellten Funktionen nachschlagen und einsetzen.
Schlechte Programmierung ist es, wenn viel Zeit in das Adaptieren nicht passender Module gesteckt wird und ein verzwicktes, nur schwer wartbares Gestrüpp von Modulen und Skripten entsteht, die dem jeweiligen Versionswechsel der benutzten Module schutzlos ausgeliefert sind. Man sollte jedes Mal abwägen, ob es sinnvoll ist, etwas Neues zu schaffen oder schon bestehende Funktionen zu nutzen.
Arbeitsmittel
Theoretisch reicht zum Programmieren ein einfacher Texteditor und ein Compiler/Interpreter für die jeweilige Programmiersprache aus. In der Praxis wird jedoch zusätzlich auf eine Reihe von Werkzeugen zurückgegriffen, die typische Programmierarbeiten vereinfachen sollen. Dazu gehören beispielsweise Texteditoren mit speziellen Features wie Syntax-Highlighting, Code Completion und Refactoring – wobei der Übergang zur Integrierten Entwicklungsumgebung (IDE) fließend ist.
Daneben existieren verschiedene Werkzeuge zur Fehlersuche, sog. Debugger, sowie Programme zur Durchführung statischer und dynamischer Tests. Zur Performanzanalyse kann zusätzlich ein Profiler eingesetzt werden.
Arbeiten mehrere Entwickler an der selben Software, kommen meist Versionierungssysteme zum Einsatz, die den Code inklusive früherer Versionen auf einem zentralen Server speichern, auf den alle beteiligten Programmierer Zugriff haben.
Siehe auch
Weblinks
Wiktionary: Programmierung – Bedeutungserklärungen, Wortherkunft, Synonyme, ÜbersetzungenWikibooks: Das Buchregal "Programmierung" – Lern- und LehrmaterialienCommons: Programming – Sammlung von Bildern, Videos und Audiodateien- Deutschsprachiges Software-Entwickler-Wiki (seit März 2001)
- Die Geschichte der Softwareprogrammierung (Joachim Korb)
- Einführung ins Programmieren (für Neueinsteiger)
- Online-Buch "Allgemeine Grundlagen der Programmierung"
Einzelnachweise
- ↑ Niklaus Wirth: A Brief History of Software Engineering. In: IEEE Annals of the History of Computing. 30, Nr. 3, Juli-Sept. 2008, S. 32-39, doi:10.1109/MAHC.2008.33 (http://www2.computer.org/cms/Computer.org/ComputingNow/homepage/2009/0409/BriefHistoryofSoftwareEng.pdf, abgerufen am 30.4).
Wikimedia Foundation.