Inhalte

  • Algorithmusbegriff, Laufzeit und Komplexität, Algorithmenanalyse, O-Notation
  • Lineare Datenstrukturen: Sequentielle Listen, Feste Länge vs. dynamische Längenerweiterung, Suche (linear, binär), Sortierverfahrenen; verkettete Listen, Stack, Queue
  • Algorithmenmuster: Rekursion, gierige Verfahren, Teile und Herrsche, Backtracking
  • Nichtlineare Datenstrukturen: Allgemeine Bäume, Binärbäume, Suchbäume; Graphen, Algorithmen zur Wegebestimmung und -suche; Hash-Tabellen
Voraussetzungen: Einführung in die Programmierung

Lernziele

  • Grundlegenden Datenstrukturen und ihre jeweiligen Vorzüge sowie geeigneter Algorithmen zur Suche, Sortierung, etc. kennenlernen
  • Algorithmen anwenden, entwickeln und implementieren
  • Komplexität von Algorithmen abschätzen und beurteilen

Secure Coding, Praktische Methoden zur Entwicklung von hardwarenaher sicherer Software

Überblick sichere Softwareentwicklung: Softwareentwicklungsprozesse, Methoden, Testen, Reviews

Typische Schwachstellen und Ihre Folgen: Typische Sicherheitsprobleme in maschinennahen Programmen (C/C++) wie Überläufe (Puffer, Zahlen), implizite Datentyp Konvertierung, Speicherlecks, Speicherinitialisierung etc. und Ihre Folgen wie Rechteausweitung, Verweigerung des Dienstes (DoS), etc. (Capture the Flag)

Typische Fehler und deren Vermeidung: Code-Qualität, Code-Standards und Regeln, keine magischen Werte, garantierte Initialisierung, Überprüfung aller Eingaben und Ausgaben, Nutzung geprüfter Bibliotheken für passende abstrakte Datentypen, Moderne Sprachmittel zur typsicheren Programmierung, Fokus C/C++

Statische und dynamische Analyse: Finden von typischen Fehlern mit Hilfe von statischen (Quellcode) wie zum Beispiel Clang-Analyzer und dynamischer (Laufzeit) Analyse wie zum Beispiel valgrind und Adress-Sanitizer

Build, Test, Review: Erhöhung der Codequalität durch automatisiertes Testen, Anpassung von Code-Standards, statische und dynamische Checks und deren automatisierte Überprüfung, Code-Reviews, Fuzzing

Einsatz sicherer Programmiersprachen: Maschinennahe Sprachen mit Konzepten für typsichere Speicherüberprüfung und Speicherbesitz wie zum Beispiel Rust (und Garbage Collection und integrierte Nebenläufigkeit wie zum Beispiel Go)

Java, Systemsprache

Programmieren in einer höheren Programmiersprachen mit höherer Entwicklerproduktivität statt Hardware-Nähe. Im Curriculum verwenden wir Java in den Modulen Software Engineering , Mobile Anwendungen, Web-basierte Anwendungen und Concurrent Programming . Die praxisrelevante Programmiersprache Java ist eine der verbreitesten Systemsprachen mit Fokus auf die Anwendungsentwicklung, die in Systemumgebungen, Diensterbringung für das Internet of Things und Web-Anwendungen eingesetzt werden. Studierende können dann auch schnell andere Sprachen und Umgebungen lernen und einsetzen (wie z.B. auch C#). Wahlfach zum Vertiefen der Programmier-Skills. Plattformunabhängig (Linux, MacOSX, Windows), wir verwenden Eclipse als IDE.

  • Syntax C/C++ nahe, andere Philospophie (Polymorphie, Object als Wurzel der Klassenhierarchie, Garbage Collection, Reflection)
  • Objektorientiert Programmieren, Vererbung, Sichtbarkeit, Interfaces, Generics, Typinferenz, Wildcards, Collections, Iteratoren, Lambda-Ausdrücke, Pakete
  • Aufzählungstypen, innere Klassen, Ausnahmen, Module
  • Patterns (Static Factory Method, Listener, Marker Schnittstellen)
  • Verwendung eingebauter Datentypen und Bibliotheken (String, BigInteger, BigDecimal, java.util.* [List, Map, Set])
  • Funktional und Objektorientiert, Lambda-Ausdrücke, Stream-API, filter, map, reduce, unendliche Ströme
  • Nebenläufigkeit (Thread-API, Producer/Consumer)
  • Bibliotheken Unit Testing, reguläre Ausdrücke, Laufzeitumgebung
  • GUIs realisieren mit JavaFx
  • C/C++ integrieren mit JNI

Voraussetzungen: Programmieren, Objektorientierung

Programmieren in höheren Programmiersprachen mit Fokus auf Entwicklerproduktivität statt Hardware-Nähe.
Die praxisrelevante Programmiersprache Python ist die verbreiteste höhere General Purpose Programmiersprache mit Fokus auf Skriptsprache, die in, Systemumgebungen, Anwendungen der künstlichen Intelligenz und Bildverarbeitung und Web-Anwendungen eingesetzt werden. Studierende können dann auch schnell andere Sprachen und Umgebungen lernen und einsetzen (wie z.B. auch Matlab). Wahlfach zum Vertiefen der Programmier-Skills. Plattformunabhängig (Linux, MacOSX, Windows), wir verwenden Visual Studio Code als IDE.

Inhalte: Python, Skriptsprache
• Syntax Einrückung, kompakt, mächtig, eingebaute Datentypen (string, bytes, multiprecision int, complex, list, tuple, dict, set) mit slices/ranges
• Objektorientiert Programmieren mit Klassen (andere Philosophie: Polymorphie default, object als Wurzel, Garbage Collection, Reflection), Properties, Operatorüberladung, Ausnahmen, Iteratoren, Observer
• Funktional Programmieren, Lambda-Ausdrücke, map/filter/reduce, List Comprehension, Generatoren, Lazy evaluation, Module/Pakete
• Unit Testing, Laufzeitumgebung, C/C++ integrieren
• Nebenläufigkeit (Thread-API, Producer/Consumer)
• Bibliotheken (viele), Stringverarbeitung, reguläre Ausdrücke, GUI
• Numerische Berechnungen, Graphiken erstellen, Daten aufbereiten/analysieren

Voraussetzungen: Programmieren, Objektorientierung

Mobile Anwendungen. Einführung in die Entwicklung mobiler Anwendungen und Systeme mit Android.

Vorlesungsphase mit Praktikumsbetrieb, Inhalt:

  • Android-Grundlagen, Komponenten, Entwicklungsumgebung
  • Views, Activities, UI, Benutzerinteraktion
  • Datenablage mit Preferences und Datenbanken, ContentProvider, SQLite, Room
  • Services und Threads, Broadcastreceiver
  • Kommunikation

Projektphase, individuell je Gruppe:

  • Ein Android AppProjekt mit 2-3 Teilnehmern je Gruppe
  • Verteilte Anwendung mit Kommunikation zwischen mehreren Smartphones, zum Beispiel MQTT, NFC, Bluetooth, ...
  • Verwendung von lokalen Diensten, zum Beispiel Beschleunigungssensor, Gyroskop, Geolocation, Kamera, Audio, ...
Objektorientierte Programmierung und Algorithmen und Datenstrukturen

Sie werden Ihre Programmierkenntnisse vertiefen und dabei die objektorientierte Programmierung kennenlernen. Dabei werden  die Programme größer und umfangreicher, und mit C++ (14) die Syntax etwas komplexer aber meist/oft auch etwas schöner. Zusätzlich lernen Sie and grundlegenden Beispielen Algorthmen und Datenstruturen zu verstehen, entwerfen, analysieren und fehlerfrei (sic!) umzusetzen. Spätestens jetzt werden Sie den Debugger verwenden und selbst programmieren!  - seien Sie kreativ, nichts auswendig lernen.

• Einführung in C++, Erweiterungen ggü. C
• Klassen und Objekte
• Überladen von Operatoren
• Templates
• Algorithmen und Datenstrukturen
• Laufzeit und Komplexität, Suche
• Sortieren
• Algorithmenmuster
• Sequenziell gespeicherte lineare Listen
• Verkettete gespeicherte lineare Listen
• Vererbung
• Ausnahmen
• Die Standard-Template Library (STL)
• Bäume
• Hashing

Voraussetzungen:

Voraussetzungen: Imperative und Objektorientierte Programmierung in einer beliebigen Programmiersprache, wir verwenden in der Veranstaltung Java von denen man die relevanten Teile auch im Selbststudium (erster Foliensatz) erlernen kann. Die Kenntnisse sind auf alle Programmierumgebungen und Sprachen anwendbar.

Lernziele:
• Phänomene der Nebenläufigkeit zu erkennen, testen und vermeiden
• Nebenläufigkeit für die Lösung von algorithmischen Problemen richtig einzusetzen
• Typische Patterns der Programmierung mit Nebenläufigkeit problemadäquat einzusetzen
Die erworbenen Fähigkeiten erlauben es, korrekte, nebenläufige Anwendungen zu realisieren, die für mehrere Prozessorkerne skalieren.
Inhalte:
• Grundlagen: Thread-API, kritische Bereiche, Synchronisation
• Unveränderbare Objekte, threadsichere Klassen, Composition
• Sichere Container, Iteration, Sperrgranularität
• Explizite Sperren, Futures, Barriers, Sperrpriorisierung, Fairness
• Ausführung von Tasks, Thread Pools, Fork/Join, Work Stealing
• Blockieren, Unterbrechen, Abbruch und Beenden
• Vermeiden von Verklemmung und Fortschrittsbehinderung
• Nichtblockierende Synchronisation
• Testen von nebenläufigen Anwendungen, statische und dynamische Codeanalyse, Performance-Messungen
• Active Objects, Actor-Prinzip