JGU Logo JGU Logo JGU Logo JGU Logo

Institut für Informatik

Michael WAND
Christian ALI MEHMETI-GÖPEL
Sommersemester 2021DIGITAL

Einführung in die Softwareentwicklung

Letzte Änderung : 20:33 Uhr, 08 April 2021




Digitale Vorlesung

Die Vorlesung wird auch im Sommersemester 2021 in Form von Videos mit (freiwilligen) Tipps zur Nachbereitung angeboten. Die Videos stammen aus dem Sommersemster 2020; Korrekturen und Anmerkungen sind in einem Addendum zusammengefaßt. Fragen zur Vorlesung können im entsprechenden Forum in Teams gestellt werden. Antworten können nicht nur von allen Tutoren und Dozenten sondern auch von Studierenden gegeben werden (letzteres ist wünschenswert: diskutieren Sie miteinander!).


Im Folgenden finden Sie die Links auf die Videos in Form von Lehreinheiten, die versuchen, das Videomaterial auf die Wochen im Semester zu verteilen (mit Tipps zur Nachbereitung der Videos). Zu jeder Lehreinheit wird auch das entsprechende Übungsblatt gelistet. Derzeit sind 10 Lehreinheiten spezifiziert.






Online Vorlesung in Lerneinheiten

Die Vorlesungsvideos sind in 10 Lehreinheiten eingeteilt. Das Semester hat 14 Wochen und wir planen derzeit mit 11-12 Übungsblättern. Wir empfehlen, jede Woche mindestens eine Lehreinheit (zusammen mit dem Übungsblatt) zu bearbeiten, in den vorletzten beiden Woche das 11. und ggf. 12. Übungsblatt, und in der letzten Wochen den Stoff nochmals quer-Beet zu wiederholen. Die Übungsaufgaben sind auf diesen Rhythmus abgestimmt (am Ende stehen etwas komplexere Aufgaben).


Für jede Lehreinheit stehen ein oder mehrere "Vorlesungs"-Videos zur Verfügung, in denen die Ideen und Hintergründe diskutiert werden. Außerden enthält jede Lehreinheit einige Tipps zur Nachbereitung. Eine aktive Nachbereitung ist wichtig! Setzen Sie sich als Ziel, alle wichtigen Konzepte, die in den Folien und Videos besprochen werden, einmal in der Praxis kurz auszuprobieren, bevor Sie mit den komplexeren Übungsaufgaben beginnen. Wenn ein Video zu langweilig wird ist das nicht schlimm (schauen Sie es ruhig mit höherer Geschwindigkeit, wenn Sie den Stoff schon grob kennen); wirklich feststellen, ob man es verstanden hat, kann man erst, wenn man die Konzepte selbst ausprobiert. Die Hinweise zur Nachbereitung sollen dazu Anregungen geben. Auch hier müssen Sie den Hinweisen nicht starr folgen (die Nachbereitungsaufgaben sind keine offiziellen "Übungsaufgaben", werden also nicht formal überprüft) - passen Sie Ihr Vorgehen Ihren Vorkenntnissen und Verständnislücken an.


Hinweis: Alle Videos werden auch auf dem Panopto-System der JGU gespiegelt. Anders als auf diesen Webseiten stehen die Videos dort im h264/mp4 Format zur Verfügung, das auf mehr Geräten (insbesondere Apple Safari/IPhone ohne Erweiterungen) abspielbar ist. Das Panopto System ist auch skalierbarer und kann noch genutzt werden, falls unser eigener Server die Last nicht bewältigen kann. Klicken Sie auf diesen Link, um auf die Panopto-Seite zu gelangen.


Lehreinheit 1: Versionskontrolle

(geschätzter Aufwand: VID 0.25h + NB 3.5h)


Diese Lehreinheit dient zur Vorbereitung der Übungen. Wir lernen Versionskontrollsysteme wie SVN,HG oder GIT kennen und installieren einen C++-Compiler und eine Entwicklungsumgebung.


Vorlesungsvideos
Video - Versionskontrolle (14min)
S11-Versionskontrolle-duo.webm (3360x1080 mit Folien),
S11-Versionskontrolle.webm (1920x1080),
S11-Versionskontrolle-small.webm (853x480)
S11-Versionskontrolle.pdf (PDF-Datei der Folien)

Tipps zur Installation der C++-Tools
C++-Tipps
C++ Coding Styles für EIS20/21

Nachbereitung
Versionsverwaltung mit git:
Recherchieren Sie im Internet nach Dokumentation zum Versionsverwaltungssystem git und machen Sie sich mit der Funktionsweise vertraut.
  • Für Interessierte:
    Ein gehr gutes Buch zu dem Thema ist das Buch „Progit“, das online frei verfügbar ist: (Es reicht vollkommen aus Kapitel 1 bis 3 zu lesen).
    • Eine Zusammenschrift Konzepte aus dem oben gennanten Buches können Sie hier finden.
  • Sofern Sie lediglich die Abgabe absolvieren möchten, ohne sich tiefer mit git zu beschäftigen: Easy Git

Gitlab: Loggen Sie sich auf dem GitLab-Server der JGU ein: gitlab.rlp.net. Suchen Sie nach den für Sie angelegten Repository mit den Übungsaufgaben. Installieren Sie auf Ihrem System den git-client und erzeugen Sie ein ssh-Schlüsselpaar für den Zugang. Clonen Sie dann das bereitgestellte Repository.
Installation der Entwicklungsumgebung: Installieren Sie auf Ihrem System einen C++-Compiler. Unter Windows empfehlen wir den Microsoft Visual C++-Compiler (der Compiler ist kostenlos als "MS C++ Build Tools" bzw. als Bestandteil des MS Visual Studios "Community Edition" verfügbar), unter Linux und MacOS empfehlen wir CLANG (clang++). Auf allen drei Systemen lohnt es sich, den GNU-C++ Compiler (gcc/g++) ebenfalls zu installieren; unter Windows wird dies bei der Installation von QtCreator im Installer angeboten.
Sollten Sie noch unschlüssig sein, welches Betriebssystem sie nutzen möchten, können Sie eine Installation von Ubuntu-Linux in einer virtuellen Machine via VirtualBox in Betracht ziehen; hier ist die Installation der Werkzeuge über den eingebauten Paketmanager recht einfach (z.B. Pakete "build-essential" und "g++" für den gcc/g++-Compiler).
Hello World: Übersetzen Sie ein "Hello World"-Programm mit dem C++-Compiler auf der Kommandozeile und starten Sie es. Schauen Sie ggf. in das nächste Video rein, um zu verstehen, wie man das macht. Internetrecherche hilft ebenfalls.
IDE/QtCreator: Für die weiteren Übungsaufgaben empfehlen wir die Nutzung einer IDE (Integrated Development Environment). Ein sehr gutes und für alle wichtigen PC-Plattformen frei verfügbares Tool ist der QtCreator. Der Download ist z.B. über https://www.qt.io/ möglich; wählen Sie die Open-Source Version (GPL/LGPL). Es gibt auch eine kommerzielle Version; diese ist aber sehr teuer und für die Übungen nicht notwendig. Achten Sie auch darauf, die richtige Version für Ihr Betriebssystem und Ihren bereits installierten C++-Compiler auszuwählen.

Übungsaufgaben

Übungsblatt: Hello EiS
Abgabe: 27. April 2021, 14:00 Uhr
  • Da wäre zum einen die Editor-Compiler-Kombination, die Sie selbstverständlich selbst wählen können; Unterstützung zusichern können wir allerdings nur für CLANG (clang++) (Mac/Linux) und den Visual-Studio Compiler (Windows). Hier werden sicher die größten Schwierigkeiten entstehen. Das Blatt ist so gedacht, dass Sie die Möglichkeit haben, während der Praktika mit den Assistenten eventuell aufkommende Probleme mit dem Setup zu klären.
  • Ein anderes wichtiges Thema ist die Auseinandersetzung mit einem Versionsverwaltungssystem. Wir werden ein Tool verwenden, das insbesondere in den letzten Jahren zum Vorreiter avancierte, Git. Da immer mehr größere Softwareprojekte auch auf dieses dezentrale Versionsverwaltungssystem umsteigen, kann ich Ihnen nur empfehlen, sich damit gut auseinanderzusetzen.1




[1] Meine persönliche Empfehlung ist im Laufe des Studiums ein kleines Feature in ein größeres Softwareprojekt mittels Git einzupflegen (selbstverständlich tun dies im Schnitt 9 von 10 Studenten </ironie>). So viel ist sicher: Beim Lesen von Code und beim Stellen eines „Pull-Request“ lernt man Aspekte der Softwareentwicklung kennen, die kleine und abgeschlossene Übungeneinheiten wie unsere nicht vermitteln können. Damit Sie dies also selbstständig tun können, kümmern wir uns innerhalb dieser Übung also um die Basis.

komplettes Übungsblatt

Lehreinheit 2: Grundlagen der Programmierung in C++

(geschätzter Aufwand: VID 2h + NB 3h)


In diesem Abschnitt lernen Sie die Grundlegenden Features von C++ kennen. Wenn Sie Python aus EiP kennen, sollten Sie nun direkt mit dem Programmieren starten können.


Vorlesungsvideos
Video - Historie und Grundlagen (1h3min)
C01-Grundlagen-duo.webm (3360x1080 mit Folien),
C01-Grundlagen.webm (1920x1080),
C01-Grundlagen-small.webm (853x480)
C01-Grundlagen.pdf (PDF-Datei der Folien)

Video - Kontrollfluss und grundlegende Ablaufstrukturen (25min)
C02-Programstrukturen-duo.webm (3360x1080 mit Folien),
C02-Programstrukturen.webm (1920x1080),
C02-Programstrukturen-small.webm (853x480)
C02-Programstrukturen.pdf (PDF-Datei der Folien)

Video - Selbstdefinierte und zusammengesetzte Datentypen (21min)
C03-Datenstrukturen-duo.webm (3360x1080 mit Folien),
C03-Datenstrukturen.webm (1920x1080),
C03-Datenstrukturen-small.webm (853x480)
C03-Datenstrukturen.pdf (PDF-Datei der Folien)

Nachbereitung
Implementieren/übersetzen Sie 1-2 Übungsaufgaben aus Einführung in die Programmierung, die Sie bereits in Python gelöst haben, in C++. Wählen Sie z.B. eine einfache (z.B. Zählen von 1 bis 100 oder ggt berechnen) und, wenn noch Zeit ist, eine kompliziertere (z.B. n-Damen rekursiv, Bubble-Sort mit std::vector). Probieren Sie aus, einen zusammengesetzten Datentyp (struct) selbst zu definieren.
Eine typische Aufgabe beim Lernen einer neuen Programmiersprache ist es, eine mathematische Größe, wie etwaπ, anzunähern. Die erste Aufgabe haben Sie sicher bereits in EiP gesehen. Als zweite Aufgabe für Sie wollen wir nun ein etwas anderes Experimentnach implementieren. Wir nutzen dazu eine physikalische Simulation. Das Schöne bei unserer Version ist, dass wir zwei Dinge lernen; die einfachste Form der physikalischen Simulation (glauben Sie mir, dieses Experiment ist außerordentlich stabil und benötigt keinerlei Vorwissen zur Numerik oder darunterliegenden Physik) und wie man in C++ while-Loops(und breaks) verwendet.

Übungsaufgaben

Übungsblatt: Low-Level-Repräsentation von Zahlen
Abgabe: 4. Mai 2021, 14:00 Uhr
  • Zum einen schauen wir uns an, wie Operationen direkt auf Bit-Ebene in C++ bewerkstelligt werden können. Als konkrete Anwendung schauen wir uns an, wie beliebig große Zahlen im Dezimalsystem als Binärcode so codiert werden können, dass eine Ausgabe schnell möglich ist.
  • Reelle Zahlen können auf dem Rechner durch Fließkommazahlen approximiert werden. Das Problem dabei ist, dass die Art der Darstellung im Rechner zu einigen Eigenheiten beim Rechnen führt. Welche genau das sind, und wieso sie etwa einige dieser Bugs verhindern könnten, lernen wir in der zweiten Aufgabe.

komplettes Übungsblatt

Lehreinheit 3: Hardwarenahe ("low-level") Programmierung

(geschätzter Aufwand: VID 1.5h + NB 2.5h)


In diesem Kapitel geht es um die Verwendung von Zeigern und die manuelle Speicherverwaltung. Dies ist vielleicht das Feature, das low-level-Sprachen wie C/C++/Pascal/Modula-2/Ada/Rust von weniger hardwarenahen Sprachen wie JAVA, C# und Python abhebt.


Vorlesungsvideos
Video - Zeiger und dynamische Speicherverwaltung (54min)
C04-Zeiger-duo.webm (3360x1080 mit Folien),
C04-Zeiger.webm (1920x1080),
C04-Zeiger-small.webm (853x480)
C04-Zeiger.pdf (PDF-Datei der Folien)

Video - Hardwarenahe Programmierung und Hintergründe (30min)
C05-Hardware-duo.webm (3360x1080 mit Folien),
C05-Hardware.webm (1920x1080),
C05-Hardware-small.webm (853x480)
C05-Hardware.pdf (PDF-Datei der Folien)

Nachbereitung
Legen Sie selbst ein Array von integer-Zahlen mittels new an und bearbeiten Sie es (schreiben, lesen, ausgeben). Wenn Sie schnell vorankommen, versuchen Sie eine einfach verkettete Liste.

Übungsaufgaben

Übungsblatt: Erste Strukturen
Abgabe: 11. Mai 2021, 14:00 Uhr

komplettes Übungsblatt

Lehreinheit 4: Statische Typisierung und generische Programmierung

(geschätzter Aufwand: VID 1.5h + NB 2h) Dieser Abschnitt der Vorlesung behandelt eher theoretische Konzepte: Welche Arten von Typsystemen gibt es in Programmiersprachen und wo ordnen sich Python und C++ dort ein? Es geht natürlich nur um die grundlegenden Begriffe - in den Vertiefungsvorlesungen zu den Programmiersprachen kann man dort wesentlich tiefer einsteigen.


In dem Zusammenhang schauen wir uns auch (ganz kurz) generische Programmierung mit templates an. Alles dies sind eher Exkursionen, um den konzeptionellen Rahmen besser zu verstehen. Konkret wird es bei den Containerklassen und low-level Abstraktionen; dies ist für das Programmieren sehr praktisch.


Vorlesungsvideos
Video - Typsysteme für Programmiersprachen, insbes. C++, Python (46min)
C06-Typsystem-duo.webm (3360x1080 mit Folien),
C06-Typsystem.webm (1920x1080),
C06-Typsystem-small.webm (853x480)
C06-Typsystem.pdf (PDF-Datei der Folien)

Video - Container Und Generische Programmierung (46min)
C07-ContainerUndGenerischeProgrammierung-duo.webm (3360x1080 mit Folien),
C07-ContainerUndGenerischeProgrammierung.webm (1920x1080),
C07-ContainerUndGenerischeProgrammierung-small.webm (853x480)
C07-ContainerUndGenerischeProgrammierung.pdf (PDF-Datei der Folien)

Nachbereitung
Schreiben Sie eine einfache Containerklasse, z.B. für Vektoren fester Länge. Experimentieren mit templates (versuchen Sie, Ihrem Vektor beliebige Typen zu erlauben.)

Übungsaufgaben

Übungsblatt: Zeiger & Referenzen
Abgabe: 18. Mai 2021, 14:00 Uhr


komplettes Übungsblatt

Lehreinheit 5: Module in Theorie und Praxis

(geschätzter Aufwand: VID 1h + NB 2h)


Wenn man über C++ redet, kommt man nicht (bzw. seit C++-20 kaum) an "Headerfiles" und "Includes" vorbei. Hier ist die ganze, traurige Geschichte.


Vorlesungsvideos
Video Modularisierung (1h1min)
C08-Modularisierung-duo.webm (3360x1080 mit Folien),
C08-Modularisierung.webm (1920x1080),
C08-Modularisierung-small.webm (853x480)
C08-Modularisierung.pdf (PDF-Datei der Folien)

Nachbereitung
Bauen Sie ein triviales Programm, dass aus zwei Modulen besteht. Nutzen Sie einmal die Kommandozeile und einmal eine IDE (z.B. QtCreator).

Übungsaufgaben

Übungsblatt: Templates & Speicherverwaltung
Abgabe: 25. Mai 2021, 14:00 Uhr

komplettes Übungsblatt

Lehreinheit 6: Ideen und Technik der objektorientierten Programmierung

(geschätzter Aufwand: VID 1.5h + NB 2h)


In diesem Kapitel lernen wir, was objektorientierte Programmierung ist, und wie man diese in C++ (im Vergleich zu Python) realisiert (sowohl technisch, aus Sicht des Übersetzers/Interpreters, wie auch -wichtiger- aus Anwendersicht).


Vorlesungsvideos
Video - Objekt-orientierte Programmierung in C++ und Python (1h29min)
CS09-OOP-duo.webm (3360x1080 mit Folien),
CS09-OOP.webm (1920x1080),
CS09-OOP-small.webm (853x480)
CS09-OOP.pdf (PDF-Datei der Folien)

Nachbereitung
Übertragen Sie ein OOP-Beispiel aus EiP (Python) in C++.

Übungsaufgaben

Übungsblatt: Einführung OOP
Abgabe: 1. Juni 2021, 14:00 Uhr

komplettes Übungsblatt

Lehreinheit 7: Analyse und Entwurf größerer Systeme - ein Überblick über Softwareengineering-Methoden

(geschätzter Aufwand: VID 1.5h + NB 2h)


Softwareentwicklung ist ein hochgradig soziologischer Prozess. Das Feld des Softwareengineerings beschäftigt sich mit diesem Problem: Wie können Menschen die Komplexität bewältigen? Dieser Vorlesungsabschnitt gibt einen Überblick über die Probleme und einige Konzepte, die helfen können. Dieser Teil ist sehr viel weniger technisch als der Rest der Vorlesung.


Vorlesungsvideos
Video - Softwareentwurfsprozesse (1h35min)
S10-Softwareentwurfsprozesse-duo.webm (3360x1080 mit Folien),
S10-Softwareentwurfsprozesse.webm (1920x1080),
S10-Softwareentwurfsprozesse-small.webm (853x480)
S10-Softwareentwurfsprozesse.pdf (PDF-Datei der Folien)

Nachbereitung
Ausprobieren kann man das nicht in 2h. Dazu gibt es z.B. das SE-Praktikum, und noch viele Jahre an Berufserfahrung. Recherchieren Sie statt dessen im Netz nach modernen Konzepten der Teamarbeit, z.B. "Agile", "Scrum", "Extreme Programming". Was treibt diese Ideen an? Vergessen Sie nicht (am besten auf einer polarisierenden Social-Media-Seite wie dem "programming"-Forum von Reddit oder Hacker-News) nach Kritik zu all diesen Ideen zu suchen ;-)

Übungsaufgaben

Übungsblatt: Projektaufgabe Planung + Grundgerüst
Abgabe: 15. Juni 2021, 14:00 Uhr

komplettes Übungsblatt

Übungsblatt: Projektaufgabe Erweiterung
Abgabe: 15. Juni 2021, 14:00 Uhr

komplettes Übungsblatt

Lehreinheit 8: Architekturbeispiele für OOP, Vergleich zu funktionalem Entwurf

(geschätzter Aufwand: VID 2h)


Wie entwerfe ich ein größeres System mit objektorientierten Methoden? In diesem Video schauen wir uns an einem konkreten Beispiel an, wie man so etwas machen kann. Darüber hinaus gibt es einen (groben) Vergleich zu funktionalen Ideen, und wir lernen das Expression-Problem kennen, dass die beiden Ideen als komplementär darstellt in Bezug auf die Probleme, die man damit am einfachsten/elegantesten (leicht erweiterbar) lösen kann.


Vorlesungsvideos
Video - Objekt-orientiertes und funktionales Design (1h50min)
S12-Muster-OOP-Functional-duo.webm (3360x1080 mit Folien),
S12-Muster-OOP-Functional.webm (1920x1080),
S12-Muster-OOP-Functional-small.webm (853x480)
S12-Muster-OOP-Functional.pdf (PDF-Datei der Folien)

Nachbereitung
Die Ideen werden intensiver in den Übungen verfolgt - planen Sie hier mehr Zeit ein. Vergessen Sie auch nicht, im Internet auf den üblichen Plattformen nach der Kontroverse / Auseinandersetzung zwischen dem "OOP" und dem "functional"-Lager zu suchen. Die Diskussion ist zum Teil sehr polarisiert. ;-)

Übungsaufgaben

Übungsblatt: Weitere Architekturbeispiele & Lambda-Ausdrücke
Abgabe: 22. Juni 2021, 14:00 Uhr

komplettes Übungsblatt

Lehreinheit 9: Graphische Benutzerschnitstellen

(geschätzter Aufwand: VID 1h + NB 3h)


In diesem Kapitel lernen wir die architektonischen Prinzipien von typischen GUI-Systemen/Bibliotheken kennen. Vielleicht bekommen wir sogar einen Anruf aus Hollywood (sicher nicht für das Video, aber vielleicht für das Widget).


Vorlesungsvideos
Video - Softwaredesign für graphische Benutzerschnitstellen (GUIs) (1h04min)
S13-Muster-GUIs-duo.webm (3360x1080 mit Folien),
S13-Muster-GUIs.webm (1920x1080),
S13-Muster-GUIs-small.webm (853x480)
S13-Muster-GUIs.pdf (PDF-Datei der Folien)

Nachbereitung
Programmieren Sie eine "Hello World"-Applikation in Qt (z.B. ein Fenster, das einen Button enthält). Fügen Sie einige weitere Widgets hinzu und experimentieren Sie damit.

Übungsaufgaben

Übungsblatt: GUI Basics
Abgabe: 29. Juni 2021, 14:00 Uhr

komplettes Übungsblatt

Lehreinheit 10: Nebenläufige Systeme

(geschätzter Aufwand: VID 1h + NB 2h) Zum Schluss schauen wir noch ganz kurz auf die parallele Programmierung. Wir können dieses Thema nur anreißen, bekommen aber einen ersten Einblick in die Techniken und Probleme.


Vorlesungsvideos
Video - Design nebenläufiger Systeme (37min)
S14-Muster-Nebenläufigkeit-duo.webm (3360x1080 mit Folien),
S14-Muster-Nebenläufigkeit.webm (1920x1080),
S14-Muster-Nebenläufigkeit-small.webm (853x480)
S14-Muster-Nebenläufigkeit.pdf (PDF-Datei der Folien)

Nachbereitung
Schreiben Sie eine kleine Qt-Konsolenanwendung, die mit zwei Threads parallel Text auf der Konsole ausgibt und dabei die Threads so koordiniert (z.B. mit einem Mutex), dass keinen Textblöcke vermischt werden. Was passiert, wenn man die Koordination ausschaltet (oder noch nicht eingebaut hat)?

Übungsaufgaben

Übungsblatt: Threads
Abgabe: 6. Juli 2021, 14:00 Uhr



komplettes Übungsblatt

Lehreinheit 11: Übungsaufgabe Systementwicklung

Übungsaufgaben

Übungsblatt: Projektaufgabe
Abgabe: 13. Juli 2021, 14:00 Uhr


komplettes Übungsblatt