Programmiermethoden
- Strukturiertes Programmieren
- Modulares Programmieren
- Objektorientiertes Programmieren
- Ereignisorientiertes Programmieren
Arten von Softwareentwicklung
- Top-down
- Bottom-up
Phasen der Software-Entwicklung (Lebenszyklus - SDLC)
- Planung (evtl. Brainstorming)
- Anforderungsanalyse (Konzept) (Das Lastenheft wird von Auftraggeber, der zukünftiger Benutzer erstellt)
- Grobentwurf (Architektur - Design) (Das Lastenheft wird technisch umgesetzt --> Das Pflichtenheft entsteht - möglicher Einsatz von Modellierungs-Werkzeuge und Code-Reviews)
- Feinentwurf (Spezifikation) (Optionaler Einsatz von Modellierungs-Werkzeuge)
- Codierung (Implementierung, Programmierung) (der Source Code entsteht: (1) durch ein Programmierer alleine (2) durch zwei Entwickler = Pair Programming oder (3) Automatisch z.B. aus UML-Diagramme)
- Testen (Validierung und Verifikation) (1) Code-Reviews: ein anderer Entwickler prüft systematisch den Code und/oder das Design (2) Debugging, Bugfixing: Fehler im Code werden gesucht, gefunden und beseitigt (3) Testen: Die Funktionalität der Software wird geprüft. Arten von Tests: (a) Manuelles Testen: Statische Tests, Unit-Tests, Integrationstests, Systemtests, Black-Box Tests, White Box-Tests, Regressionstests (b) Testautomatisierung (c) Statische Codeanalyse-Tools einsetzen
- Qualitätssicherung (Qualitätsmanagement)
- Dokumentation( (a) Systemdokumentation (1) Quellcode-Dokumentation durch die Verwendung von Kommentaren (2) Von einem Teammitglied geschrieben (3) Automatisiert aus dem Sourcecode erzeugt (b) Benutzerdokumentation
- Configurations-Manegement, Versionsverwaltung (ein oder mehrere Release(s) werden freigegeben)
- Auslieferung an Kunde(n) (Bereitstellung, Softwareeinführung, Markteinführung - Deployment) (Der für den Kunden bestimmter finaler Release (Version) wird übergeben)
- Wartung, Pflege, Rollout (evtl. auch die Abschaltung) ( (1) Eine upgedatete Version des Softwares wird übergeben (2) Eine Refactoring nach Kundenwunsch oder wegen andere Faktoren wird durchgeführt.
Diese oben aufgelisteten Entwicklungsphasen müssen nicht zwingend sequentiell ablaufen.
Das Software Development Life Cycle (SDLC) (--> Details siehe weiter oben) - ist der Prozess des Planens, Schreibens, Änderns und Wartung von Software. Die Einhaltung der SDLC-Methodik trägt zur Optimierung des Endergebnisses bei. In der IT wurde der Begriff "Lebenszyklus"erstmals in den 1950er und 1960er Jahren verwendet, um die Phasen bei der Entwicklung eines neuen Computersystems zu beschreiben. Heutzutage bezieht er sich jedoch allgemein auf alle Phasen bei der Produktion jeglicher Art von Software.
In der Anforderungsphase (requirements) werden die funktionelle-, qualitative- und Hardware-Anforderungen an die Software festgelegt:
Funktionelle Anforderungen:
- Systemverhalten
- Daten
- Input/Output
Qualitative Anforderungen:
- Performance
- Zuverlässigkeit
- Sicherheit
- Verfügbarkeit
- Wartbarkeit
Bei der Erstellung des Lastenheftes kann man auch Use-Case-Diagramme benutzen.
In der Entwurfsphase wird festgelegt welche Entwicklungsumgebung (IDE), welche Libraries, welche IDEs, welche APIs und welche Software Development Kits (SDK) zum Einsatz kommen werden.
Für den Entwurf (Design) der Software können ein Projekt-Ablaufplan, ein Struktogramm (Nassi-Schneidermann-Diagramm) oder auch UML-Diagramme benutzt werden.
Es gibt Programme die aus dem Sourcecode automatisch eine System-Dokumentation erzeugen (z.B. Doxygen).
Eine Beta-Version bezeichnet einen Entwicklungsstand einer Software, in dem ein Teil neuer Funktionen bereits implementiert wurde, die Entwicklung eines Releases jedoch noch nicht abgeschlossen ist. Die Kennzeichen einer Beta-Version sind u.a.
- das Fehlen von Funktionen
- die nicht vollumfängliche Implementierung einzelner Funktionen
- das mögliche Vorhandensein von Hilfsmitteln wie z.B. Stubs oder Mock-Objekten
- die noch ausstehenden Tests einzelner Funktionen bzw. der Gesamtheit der Funktionen
Es ist auch üblich, dass in der Phase der Beta-Version einer Software die Dokumentation der Neuerungen (im Handbuch, im Changelog etc.) noch nicht abgeschlossen ist.
Die bekanntesten Softwareentwicklungsmodelle sind:
- Das Wasserfallmodell (die Phasen der Softwareentwicklung laufen sequentiell ab)
- Das V-Modell
- Das Spiralmodell
- Das inkrementelles und iteratives Modell
- Der Rational Unified Process (RUP)
- Agile Softwareentwicklung - Extreme Programming (XP) (Scrum, Kanban)
Die Agile Softwareentwicklung verspricht eine höhere Transparenz und Veränderungsgeschwindigkeit und einen schnelleren Einsatz des entwickelten Systems.
Agile Praktiken sollen dazu dienen, dass Änderungen oder neue Anforderungen mit wenig Aufwand berücksichtigt werden können. Beispiele für agile Praktiken sind:
- Paarprogrammierung
- Schnelle Codereviews
- Continous Integration
- Continous Deployment
- DevOps
- Testgetriebene Entwicklung
- Behavior Drive Entwicklung
- Agiles Testen
- Rapid Application Development
- Ständige Refactorierungen
(--> Details über die oben aufgeführten Punkte gibt es weiter unten)
Bekannteste Agile Modelle sind Scrum und Kanban. Das Scrum-Team wird von einem Scrum Master und einem Product Owner (PO) betreut. Der Scrum Master unterstützt das Entwicklungsteam. Der PO ist ein Vertreter der Kundenseite. Die Zeit wird in Sprints eingeteilt. Sobald ein Sprint vorbei ist, muss das Team ein marktreifes Produkt präsentieren. Kanban's Hauptidee ist die Visualisierung von Arbeitsabläufen. Es besteht darin, eine physische Tafel zu erstellen, auf welcher der Fortschritt visuell markiert werden kann. Kanban ist Scrum ziemlich ähnlich.
Grafische Modellierungssprachen werden in der Phasen Architektur, Design, Spezifikation, Implementierung und Dokumentation der Softwareentwicklung eingesetzt. Die bekannteste Modellierungsprache ist UML (Unified Modeling Language). UML ist eine visuelle Modellierungssprachefür die oben genannten Phasen der Entwicklung von komplexen Softwaresystemen. UML besteht aus verschiedenen Diagrammarten. Insgesamt beschreiben UML-Diagramme die Grenzen, die Struktur und das Verhalten von Systemen und den darin enthaltenen Objekten. Zwar ist UML keine Programmiersprache, jedoch gibt es Tools (GitMind, Gliffy) die UML-Diagramme nutzen um Code in verschiedenen Sprachen (Java, C++, C# oder XML-Schemata) zu generieren. Manche Tools rekonstruieren zudem UML-Diagramme aus vorhandenen Code. UML hat einen direkten Bezug zu objektorientierter Analyse und Design.
UML hat folgende Diagramme:
- Klassendiagramm (Das am häufigsten verwendete UML-Diagramm und die wichtigste Grundlage für jede objektorientierte Lösung. Es zeigt die Klassen in einem System, Attribute und Vorgänge sowie die Beziehung zwischen den einzelnen Klassen.)
- Komponentendiagramm (Stellt die strukturelle Beziehung von Softwaresystemelementen dar. Komponenten kommunizieren über Schnittstellen.)
- Kompositionsstrukturdiagramm (werden verwendet, um die interne Struktur einer Klasse darzustellen.)
- Implementierungsdiagramm (Illustriert die Systemhardware und die zugehörige Software. Nützlich, wenn eine Softwarelösung auf mehreren Maschinen mit individuellen Konfigurationen implementiert wird.)
- Objektdiagramm (Zeigt die Beziehung zwischen Objekten unter Verwendung von Beispielen aus der Realität. Hierbei wird illustriert, wie ein System zu einem bestimmten Zeitpunkt aussieht.)
- Paketdiagramm (Es gibt zwei spezielle Arten von Abhängigkeiten, die zwischen Paketen definiert werden: Paketimporte und Paketverschmelzungen. Paketabhängigkeiten können so dargestellt werden, dass die Kommunikationsmechanismen zwischen verschiedenen Schichten erkennbar sind.)
Verhaltensbasierte UML-Diagramme:
- Aktivitätsdiagramme
- Kommunikationsdiagramme
- Interaktionsübersichtsdiagramme
- Sequenzdiagramme
- Zustandsdiagramme
- Zeitverlaufsdiagramme
- Anwendungsfalldiagramme
Programme, die den Code, den der Programmierer schreibt - den Sourcecode - in die binäre Computersprache übertragen, heißen Compiler und Interpreter. Der Vorteil der Interpreter gegenüber dem Compiler ist, dass der gleiche Quellcode auf jeder Zielplattform ausgeführt werden kann. Skriptsprachen werden meist über Interpreter ausgeführt, während Sprachen wie C oder C++ kompiliert werden. Ein besonderer Fall liegt bei Java vor, der Weg vom Sourcecode zur Maschinencode geht hier über einen Zwischenschritt, den sogenannten Java-Bytecode (Befehlssatz des Java Virtual Machine - JVM). Somit gewinnt man auf der einen Seite den Vorteil der Portabilität, den der Interpreter bietet, auf der anderen Seite der Effizienzgewinn durch den Compiler.
CASE (Computer Aided Software Engineering) oder Computerunterstützte Softwareentwicklung sind Computerprogramme, welche bei der Entwicklung von Software unter anderem folgende Aufgaben übernehmen können:
- Planung und Überwachung aller erforderlichen Teilschritte.
- Unterstützung der Entwurfsphase durch geeignete Methoden.
- Automatische Umsetzung der Entwürfe in die Datenbank einschließlich Prüfung auf Vollständigkeit.
- Automatische Umsetzung der Entwürfe in lauffähige Programme.
- Automatische Erstellung von Datenstrukturen, Bildschirmmasken und Listenbilder.
Ein wichtiger Bestandteil von CASE-Tools ist eine grafische Notationsweise, die der Visualisierung der Architektur des Software-Systems dient. CASE-Tools sind oft in IDEs integriert. Die Erfahrungen zeigen allerdings, dass CASE-Tools in grösseren Projekten zwar hilfreich sind, dass aber das "Programmieren auf Knopfdruck" in der Realität eher schwierig zu erreichen ist.
Ein Quellcode (Sourcecode) ist eine menschenlesbare Textdatei, die vom Programmierer erstellt wird (Codierung) und Anweisungen enthält, die von einem Computer ausgeführt werden können. Der Quellcode wird in einer bestimmten Programmiersprache geschrieben, die spezifische Syntaxregeln und Schlüsselwörter enthält. Der Quellcode wird in eine ausführbare Datei oder in Bytecode kompiliert oder interpretiert, und das Resultat (die fertige Anwendung) kann vom Computer ausgeführt werden. Der Quellcode ist die Grundlage für die Entwicklung von Software und ermöglicht es Entwicklern, die Funktionsweise eines Programms zu verstehen und es zu modifizieren oder zu erweitern. Die Qualität des Quellcodes bestimmt die Effizienz, Wartbarkeit und Skalierbarkeit des endgültigen Programms.
Es gibt ein Unterschied zwischen Codieren und Programmieren: Beim Codieren werden Ideen in eine geschriebene Sprache umgewandelt, die der Computer verstehen kann. Beim Programmieren geht es um die umfassendere Aufgabe, Anweisungen festzulegen, die einem Computer gegeben werden sollen, damit dieser eine Aufgabe ausführen kann. Programmiersprachen sind das Medium, das Menschen nutzen, um mit einer Maschine zu "sprechen".
Programme, die den Code, den der Programmierer schreibt - den Sourcecode - in die binäre Computersprache übertragen, heißen Compiler und Interpreter. Der Vorteil der Interpreter gegenüber dem Compiler ist, dass der gleiche Quellcode auf jeder Zielplattform ausgeführt werden kann. Skriptsprachen werden meist über Interpreter ausgeführt, während Sprachen wie C oder C++ kompiliert werden. Ein besonderer Fall liegt bei Java vor, der Weg vom Sourcecode zur Maschinencode geht hier über einen Zwischenschritt, den sogenannten Java-Bytecode (Befehlssatz des Java Virtual Machine - JVM). Somit gewinnt man auf der einen Seite den Vorteil der Portabilität, den der Interpreter bietet, auf der anderen Seite der Effizienzgewinn durch den Compiler.