all repos — notes @ caef450b0cab035d0c38768cc10e5721c614786a

Unnamed repository; edit this file 'description' to name the repository.

uni/Praktikum/Praktikumsbericht.typ (view raw)

 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 111
 112
 113
 114
 115
 116
 117
 118
 119
 120
 121
 122
 123
 124
 125
 126
 127
 128
 129
 130
 131
 132
 133
 134
 135
 136
 137
 138
 139
#import "@preview/meander:0.4.1"

#set text(
  size: 12pt,
)

#set par(
  justify: true,
  leading: 12pt,
)

#set page(
  paper: "a4",
  margin: (x: 1.75in, y: 1.25in),
)

#set heading(numbering: "1.")

#show heading: set block(below: 1.5em)
#show title: set text(size: 24pt)

#align(center)[
  #title[Praktikumsbericht WS 25/26]
  Fraunhofer-Institut für Arbeitswirtschaft und
  Organisation IAO\
  H. Harengel
]
#outline()

#pagebreak()
= Stellenbeschreibung
Bei dieser Stelle beim Fraunhofer-Institut für Arbeitswirtschaft und Organisation handelt es sich um ein Praktikum im Bereich der Softwareentwicklung, spezifisch für die Entwicklung von beidem Front- und Backend. Die Stelle war für das Anwendungszentrum KEIM des Fraunhofer IAOs ausgeschrieben, an dem an Forschungslösungen für verschiedene Bereiche gearbeitet wird und ist eine typische Praktikumsstelle welche auf 6 Monate begrenzt ist und 40 Arbeitsstunden  die Woche voraussetzt.

\
Die Art der Arbeit setzte es voraus das nicht nur eine theoretische Herangehensweise sondern direkt eine fertige Lösung ausarbeitet werden sollte. Dieser Praxisbezug zur Programmierung hat mich überzeugt beim KEIM des Fraunhofer IAOs mein Praktikum zu machen.\
Gesucht wurde nach Personen welche ein Interesse an Technik, Technologien und Innovationen haben und eventuell bereits Erfahrung in den Technologien TypeScript, JavaScript, Python und React mit sich bringen konnten.

#pagebreak()
= Firma und Abteilung
Die Fraunhofer Gesellschaft ist eine der größten Organisationen für angewante Forschung.

Das Fraunhofer Fraunhofer-Institut für Arbeitswirtschaft und Organisation IAO ist Teil der Fraunhofer-Gesellschaft welche sich mit dem Bereich der Arbeitsforschung beschäftigt.

Die Abteilung bei der ich gearbeitet habe war das KEIM, Kompetenzzentrum für energetische und informationstechnische Mobilitätsschnittstellen. Es ist ein Außenposten welcher als Schnittstelle mit dem Hochschule Esslingen dient. Ziel davon ist es Innovation in echte Anwendungsfälle der Industrie zu transferieren.

#pagebreak()
= Aufgaben
== Analyse einer Verkehrs-Datenschnittstelle
Im Umfang eine meiner Ersten Aufgaben durfte ich eine Verkehrs-Datenschnittstelle von TomTom analysieren um durch das Abrufen dieser möglicherweise Verkehrsdaten nutzbar zu machen.

\
== Schnittstelle an Daten-Pipeline anbinden
Eine bereits zum Teil bestehende Daten-Pipeline musste mit der Funktion erweitert werden, Daten direkt aus den DWD Archiven zu sammeln. Dafür gab es eine bereits zum Teil implementierte Lösung, welche ich erweitert habe.
Im Anschluss mussten im Rahmen dieser Daten-Pipeline die gesammelten Daten in eine RabbitMQ geladen werden damit diese von den nächsten Schritten der Pipeline aufgegriffen werden können.

Diese Pipeline war so aufgebaut, das die Daten erst aus verschiedenen Quellen gesammelt werden und dann durch andere Services verarbeitet werden um diese als stimmigen Datensatz nutzbar zu machen.
Für die DWD Daten habe ich dann auch im Anschluss einen dieser weiteren Services gebaut welche die Daten aus der RabbitMQ empfängt und zu einem einheitlichen Datenformat bereinigt.

Um das erfolgreich zu erzielen mussten allerdings noch Änderungen am grundsätzlichen Datenformat welches in die RabbitMQ geladen wurde vorgenommen werden um dem System welche diese bereinigt sagen zu können um welche Art von Daten es sich handelt.

\
== Entwicklung, Bereitstellung sowie Administration eines Services
Als Teil einer Aufgabe war es nötig einen Service auf einem Raspberry Pi 4B zu deployen. Dabei war es wichtig eine Stabile und zuverlässige Ausführung zu gewährleisten, so das selbst bei Internet Verbindungsproblemen oder spontanen Stromausfällen das Programm sich selbst rettet und schnell normale Operation wiederaufnimmt.
Dieses Problem könnte mit einer großen Anzahl verschiedenster Herangehensweisen besser oder schlechter gelöst werden, aber ich habe mich am Ende für eine Umsetzung  für einen Softwarestack von Golang als Programmiersprache und NixOS als Betriebssystem entschieden.

\

#meander.reflow({
  import meander: *
  placed(
    top + right,
    figure(
      image("Gopher.png", width: 50%),
      caption: [The Go gopher #cite(<Gopher>)],
    ),
  )
  container()
  content[
    #set par(justify: true)
    #par(
      "Go ist eine kompilierte, statisch typisierte Programmiersprache mit automatischer Speicherbereinigung. Es handelt sich um eine C-ähnliche multiparadigme Sprache welche von Google 2007 entwickelt wurde mit dem Ziel eine leicht erlernbare, hoch effiziente Programmiersprache zu entwerfen welche sich vor allem für Netzwerk-Anwendungen sehr leicht skalieren lässt.",
    )
  ]
})
Genau aus diesem Grund wähle ich diese Programmiersprache sehr gerne für solche Arten von Anwendungen. Hier eignet sie sich besonders gut da durch die automatische Speicherbereinigung weniger Probleme verursacht werden könnten welche zu unerwarteten Programmabbrüchen führen und die statische Typisierung von Go mir trotzdem genug Kontrolle gibt um das erwartete Verhalten näher an das tatsächliche Verhalten des Programms zu bringen.

Zudem macht es Go leicht alle Fehler so zu verarbeiten, das das Programm nicht unerwartet abstürzen sollte indem Fehler als Werte abgebildet werden. Den Rückgabewert eines Fehlers zu ignorieren ist deshalb eine sehr bewusste Wahl (z.B. `_, value := foo()` anstatt `err, value := foo()` bei einer Funktion `foo` welche die einen Fehler und Wert zurückgibt).

\
Die andere genutzte Technologie in diesem Projekt ist Nix bzw. NixOS. Nix ist eine funktionale Programmiersprache, Linux Distribution und Paketmanager. Als Linux Distribution ist NixOS ein Betriebssystem welches um den Nix Paketmanager gebaut ist und Nix als funktionale Programmiersprache nutzt um das gesamte System zu konfigurieren.

Das System wird aus der Konfiguration welche in Nix geschrieben ist reproduzierbar gebaut.
Der wesentliche Grund warum für dieses Projekt NixOS als Betriebssystem gewählt wurde ist das es dank der Reproduzierbarkeit bei Systemproblemen einfach auf die letzte funktionierende Version zurückgerollt werden kann, was das Aufsetzen und Instandhalten eines Systems simpel macht.

\
Die Applikation wurde durch Nix Konfiguration als System-Service eingerichtet. Dazu musste für die Applikation erst ein internes Nix-Paket erstellt werden.

Die Erstellung von Nix Paketen stellte sich grundlegend als relativ simpel heraus, jedoch stellten sich Probleme mit der Kompatibilität von den Go Paket system heraus, da die Pakete im Vorhinein in die isolierte Umgebung geladen werden müssen damit sie beim kompilieren auch ohne Internetzugang verfügbar sind.

Um dieses Problem zu lösen habe ich das Tool gomod2nix genutzt welche die `go.mod` Datei eines Go-Projektes ausliest und diese für den vorhin genannten Prozess zur Verfügung stellt.

\
Am Ende konnte der Service erfolgreich auf dem Raspberry Pi 4B deployed werden und mit minimalem Wartungsaufwand operational gehalten werden.

\
== Frontend-Entwicklung
Für die weiterentwicklung einer Webapplikation war es nötig ein neues modernes Frontend zu planen und entwickeln. Das habe ich in einem Team machen dürfen welche sich um das Projekt gekümmert hatte.

Als ersten Schritt bei einer solchen Aufgabe hat es sich angeboten das UI mit einem Tool wie Figma zu designen. Da ich allerdings in der Vergangenheit schlechte Erfahrungen mit Figma gemacht habe und grundsätzlich Freie und Offene Software bevorzuge habe ich mich für die Alternative Penpot entschieden welches ähnliche Funktionalitäten zum erstellen von Mockups hat.

Nachdem das Frontend geplant war, wurden die geplanten Aspekte nach und nach mit Next.js, einem React Framework umgesetzt.

== Middleware Entwicklung
Im Rahmen des neu geschriebenen Frontends für die Webapplikation, sollte eine Art Benchmark-System erstellt werden welches Teilergebnisse der Applikation anzeigt. Dabei war es wichtig das die vollen Ergebnis-Daten nicht an das Frontend gesendet werden sondern nur die Teilergebnisse.

Um das umzusetzen habe ich ein weiteres Backend als eine Art Middleware zwischen dem vollen Backend und dem Frontend der Applikation geschrieben um die vollen Ergebnisse abzufangen, zu den Teilergebnissen zu verarbeiten und nur diese an das Frontend zu senden.

Dieses Backend wurde ebenfalls in Go geschrieben da es sich auch super für API-Entwicklung wie diese anbietet. Diese sind besonders leicht umzusetzen dank Golangs sehr ausführlichen Standard-Bibliothek, welche sehr reife und direkt nutzbare Werkzeuge zur Umsetzung von APIs bietet ohne auf externen Paketen aufbauen zu müssen wie es in den meisten Programmiersprachen der Fall ist (z.B. Python und ein Paket wie Flask).

\
== Datenaufbereitung
Im Rahmen eines Prozesses zur Verarbeitung von Kundendaten mussten diese aus dem Ursprungsformat welches uns zur Verfügung gestellt wurde in ein von unseren Programmen nutzbares Format konvertiert werden. Dabei handelte es sich nicht nur um eine simple Dateiformat Konvertierung da einige Daten ergänzt oder mit einer Anfrage an andere bereits bestehende Datensätze angepasst werden mussten.

Das Skript welches diese Aufgabe erledigen sollte habe ich in Python geschrieben, da es sich als simple Skript-Sprache super für eine solche Aufgabe anbietet und dank dynamischer Typisierung die Deserialisierung der Daten leicht macht, was sich in statischen typisierten Programmiersprachen wie Go oft nur umständlich implementieren lässt. Eine Umsetzung in Go würde das Programm tendenziell schneller und möglicherweise robuster machen aber wegen der nicht zuverlässigen Natur der Daten hat sich eine solche Umsetzung als für diesen fall zu umständlich herausgestellt.

Da ich bei diesem Praktikum oft mit der Deserialisierung von Daten aus meist JSON oder CSV zu tun hatte war das ein häufig vorkommendes Dilemma: Eine Umsetzung in Go ist etwas, was ich generell bevorzuge, aber kann sich manchmal als zu Umständlich herausstellen, da Go als statisch typisierte Sprache bei der Deserialisierung eine feste Zuweisung von Feld zu Typ erwartet. Bei Eingangsdaten wo sich die Felder-namen oder Typen dessen je nach Bedingung ändern, wird eine saubere Typisierung schnell sehr verbos oder unklar, da entweder jedes Ergebnis einzeln als Typ abgebildet werden muss oder mit der Hilfe von Interfaces die Typisierung generalisiert wird, was die Vorteile der statischen Typisierung zum großteil zu Nichte macht.

\
#pagebreak()
= Fazit

#pagebreak()
= Bezug zu Studium

#pagebreak()
= Tipps für Bewerber
Beim Fraunhofer IAO bekommt man die Möglichkeit sich in verschiedenste Projekte einzuarbeiten und so sich durch direkt gewonnene Erfahrung Wissen zur Softwareentwicklung aneignet.

#bibliography("sources.bib")