Zum Inhalt springen

Effizientes Programmieren

Mein Spezialgebiet ist das effiziente Programmieren, sowohl für Desktopprogramme als auch im Embedded-Bereich. Effizient heißt für mich dabei:

Effiziente Ausführung der App bzw. des Programms

  • schnell ausführbar (Zeitkomplexität, statische Speicherverwaltung, Cacheausnutzung, …)
  • geringer Ressourcenverbrauch (Speicher, Handles, …)
  • möglichst keine Wartezeiten bei Benutzerinteraktionen (z.B. unmittelbare Reaktion in GUIs)
  • paralleles Rechnen sinnvoll ausnutzen
  • dynamisches Erzeugung von Maschinencode vs. Optimierung durch moderne Compiler und CPUs
  • spezielle, z.T. eigene Implementierungen von Bibliotheksfunktionen

Effizientes Implementieren

  • Nutzung der richtigen Programmiersprache(n)
  • Nutzung von Versionsverwaltungs- und Vergleichs-Tools
  • saubere Projektstruktur
  • Trennung von allgemeinen Aufgaben (Bibliotheksfunktionen) und eigentlichen Algorithmen
  • Code-Guidelines verwenden
  • Clean Code (wo möglich, nach Robert C. Martin)
  • sauberer Code (einheitliche Formatierung, …)
  • verständliche Benennungen (für Module, Funktionen, Variablen, …)
  • Kommentare im Code, um Ideen/Hintergründe zu beschreiben
  • Rapid Prototyping
  • Refactoring
  • KI-gestütztes Implementieren (z.B. Nutzung von KI-basierter Autovervollständigung)
  • Nutzung automatischer Code-Snippets
  • Nutzung von Code-Metriken

Effizientes Testen

  • Test-Driven-Development (TDD)
  • häufiges Kompilieren (Erkennung von Syntaxfehlern und Code-Warnungen)
  • Codeanalyse
  • Unit-Tests
  • Test-Automatisierung
  • unabhängige Tests (z.B. alternative Algorithmen, Invarianten, …)
  • Nutzung von Leistungsanalyse- und Profiling-Tools
  • Statistiken

Effiziente Fehlersuche

  • Vermeidung von Fehlern durch saubere Implementierung und Asserts
  • spezielles Assert- und Exceptions-Konzept
  • zusätzliche Asserts im Debug-Modus
  • Ausnutzung der Möglichkeiten moderner Debugger
  • automatische und konfigurierbare Brerakpoints
  • Debuggen im Release-Mode
  • aktivierbare Anpassungen und Erweiterungen von Datentypen im Debug-Modus
  • spezielles Vorgehen bei rekursiven Algorithmen