Im Rahmen dieses Projekts wurde eine KI-Plattform entwickelt, um entwickelte Modelle hardware-beschleunigt (via CUDA) per REST-Service im lokalen Netzwerk zur Verfügung zu stellen. Die Modelle wurden per zuerst mit Tensorflow und später mit PyTorch trainiert, in ONNX umgewandelt, um sie dann in .NET über die ONNX Runtime von Microsoft auszuführen. Die Inferenz-Plattform ist sowohl in .NET als auch in Python (via NVIDIA Jetson Xavier NX) hardware-beschleunigt mit minimaler Latenz möglich. Eine Verwendung der Cloud (AWS, GCP, Azure) kam nicht in Frage wegen Datenschutzbedenken und höherer Kosten und Latenz.
Weiterer Bestandteil des Projekts war die Entwicklung eines Image Classifiers und eines Objekt-Detektors. Es wurden mehrere Ansätze getestet, um bestmögliche Accuracy zu erreichen. Der Image Classifier wurde als EfficientNet-B7-Modell (mit NoisyStudent Pre-Training) umgesetzt (TensorFlow 2 / Keras, später PyTorch) und der Objekt-Detektor via YoloV5X (PyTorch) trainiert. Die Accuracy des Image Classifiers konnte zuletzt durch Trainieren eines NFNets (Normalizer-Free ResNet) gegenüber EffizientNet-B7 sogar leicht verbessert werden. Weitere Modelle wie das Training eines Super Resolution GANs und ein GAN zum JPEG Denoising wurden in ONNX umgewandelt und es wurde das Pre-Processing und Post-Processing in .NET implementiert (Umwandlung in Tensoren + Split / Merge Teilbereiche der Bilder). Darüber hinaus sind sehr viele selbst geschriebene Python Tools entstanden, die bei der Auswahl und Bearbeitung der Daten hilfreich sind.
Alle Trainingsdaten wurden selbst gewählt mit der Strategie möglichst wenig personelle Ressourcen einsetzen zu müssen. Dazu wurden zuerst einige Daten manuell annotiert um mehrere schwache binäre Detektoren zu trainineren. Die binären Detektoren wurden dann per Skript zu einem Gesamtdetektor zusammengeführt. Die trainierten Detektoren (binär+gesamt) konnten dann gegeneinander antreten, um neue Trainingsdaten auszuwählen. Mithilfe diesen Ansatzes konnten neue für den Detektor sinnvolle Trainingsdaten automatisiert annotiert und mit wenig Personaleinsatz wo notwendig korrigiert werden (quasi als Semi-supervised Learning Herangehensweise). So konnte die Validation Accuracy von ursprünglich 88% auf >94% mAP gesteigert werden. Darüber hinaus wurden auch Verfahren wie z.B. DETR (End-to-End Object Detection with Transformers) evaluiert, die besseren Einblick in das Lernverhalten zu erhalten. Gegen den produktiven Einsatz von DETR sprach die geringere Leistung bei der Generalisierung (YoloV5 kam mit deutlich weniger Trainingsdaten und Trainingszeit aus, bei vergleichbarer mAP).
In diesem Projekt habe ich tiefes Verständnis für Deep Learning im Bereich der Bildverarbeitung erlangt. Ich musste viel Code in Python schreiben, oder muste bestehende Projekte z.B. um Data Augmentation erweitern (z.B. Albumentations in PyTorch Image Models von Ross Wightman integriert) und es sind viele hilfreiche Python Tools entstanden. Darüber hinaus konnte ich Erfahrungen mit Google Coral Edge TPU, NVIDIA Jetson Xavier NX + Jetson AGX Xavier sammeln. Diese Edge-Hardware und diverse Grafikkarten (insgesamt 6 Ampere-Grafikkarten + 2 Turing-Grafikkarten, u.a. die Spizenmodelle NVIDIA Quadro RTX A6000 48GB & NVIDIA RTX 3090) wurden selbst beschafft und stehen mir uneingeschränkt für weitere Projekte zur Verfügung.
Ziel des Projektes war die Neuimplementierung einer umfangreichen Bestandsdatenverwaltung, die in Silverlight (Frontend, Schwachpunkte u.a.: Business-Logik im Frontend), .NET 4.5 (Backend, Schwachpunkte: keine Tests, kein REST, Legacy Code historisch gewachsen) und Oracle (PL/SQL) als Datenbank umgesetzt war. Die neue Bestandsdatenverwaltung sollte alle Funktionen der Silverlight-Anwendung in Angular (Frontend) und .NET Core (Backend, REST, Tests) abbilden. Die bestehende Datenbank-Struktur wurde größtenteils übernommen bzw. nur minimal verändert. Die Suchfunktion wurde aus Performance-Gründen komplett in ElasticSearch neu umgesetzt. Dafür wurde zusätzlich Hangfire als Job-Server in die Infrastruktur eingeführt. Besondere Herausforderungen waren speziell in Silverlight umgesetzte UI-Komponenten, die in komplex-interaktiven Angular-Komponenten neu entwickelt werden mussten. Während der Entwicklung wurde das eingesetzte Angular-Framework immer auf die aktuellste Version migriert.
Zu Beginn des Projektes existierte bereits ein Prototyp der Neuimplementierung in .NET Core/Angular. Dieser Prototyp wies jedoch schwächen in der Architektur auf (schlechte Wartbarkeit / Testbarkeit), weswegen die Architektur grundlegend neu aufgesetzt wurde. Es fand eine klassische 3-Schichten-Architektur mit klarer Trennung der Zuständigkeiten Anwendung. Die Datenbank-Schicht (Entity Framework) wurde so weit abstrahiert, dass die Datenbank mit wenig Aufwand später ersetzt werden könnte. Die gute Testbarkeit wurde u.a. durch einer verbesserten Dependency Injection ermöglicht. Backend Unit Tests und Integration Tests wurden in xUnit geschrieben und es wurde ein strenges TDD (Test Driven Design) mit dem Ziel einer hohen Test-Coverage eingeführt. Für die Frontend Tests (UI-Komponenten) wurde Jasmine eingesetzt, wobei Business-Logik prinzipiell ins Backend verlagert wurde.
Der Kunde hatte große Anforderungen, was Testbarkeit und Wartbarkeit angeht, da die Weiterentwicklung ausschließlich durch interne Mitarbeiter später übernommen werden sollte. Zwischen den Entwicklern wurden Pull Requests durch gegenseitige Reviews eingeführt (gemessen an den Clean Code-Kriterien von Robert C. Martin), was für eine hohe und einheitliche Code-Qualität (bessere Wartbarkeit) sorgte. Technische Schulden wurden frühzeitig durch Refactoring-Maßnahmen beseitigt, die durch die zahlreichen Unit Tests reibungslos möglich waren.
Das Projekt-Team bestand aus vier Mitarbeitern. Als externer Berater habe ich die grundlegenden Entscheidungen bezüglich Architektur und Umsetzung übernommen. Besondere Wünsche im Frontend-Layout / Bedienbarkeit hat der Kunde mit Absprache mit den Fachabteilungen festgelegt. Das Projekt wurde mit den Grundsätzen der agilen Softwareentwicklung & Scrum umgesetzt. Die allgemeine Zufriedenheit mit der Arbeit am Code war sehr hoch.
Dies war der zweite Einsatz bei einem vorherigen Projekt in Magdeburg im Energiesektor. Schwerpunkt war die Vorbereitung des Projektes für den Go-Live-Betrieb. Beim Portal handelte es sich um eine mehrschichtige ASP.NET MVC Webapplikation (HTML5) mit REST / WebApi-Schnittstellen. Neben klassischen Entwicklungstätigkeiten (.NET / C#) lag besonderes Augenmerk auf die Stabilisierung, Performance-Optimierungen, Verbesserungen der Skalierbarkeit sowie Logging und Monitoring der Webapplikation. Datenbank-Anweisungen (SQL) wurden für den Produktiveinsatz optimiert. Als Entwicklungsumgebung kam Visual Studio 2017 mit Resharper zum Einsatz.
Der Live-Gang des Portals war erfolgreich und die Website wird derzeit bundesweit von Anlagen- und Netzbetreibern eingesetzt.
Für die Skalierung wurden unter anderem ein Job-Server und API-Key-Validator als Micro-Service (WebApi) entwickelt. Der Job-Server wurde in Visual Studio Code als Cross-Platform Anwendung (.NET Framework 4.7 + .NET Core 2.1) erstellt, um einen reibungslosen Docker-Betrieb zu gewährleisten. Darüber hinaus war das Erfassen von Metriken während des Live-Betriebs wichtig. Diese wurden in einem Kubernetes-Cluster (Docker) per Push-Nachrichten in InfluxDB aufgezeichnet und als Grafana-Dashboard dargestellt. An vielen Stellen wurde die Performance durch Parallelisierung und Refactoring verbessert. Durch die vorhandenen Live-Metriken konnten Performance-Bottlenecks erkannt und iterativ beseitigt werden.
Mehrfache Änderungswünsche vom Kunden machten es notwendig einige Features komplett neu zu implementieren oder umfangreich zu erweitern. Für neu geschriebenen Code wurden penibel neue Unit Tests und Integration Tests geschrieben (xUnit, FluentAssertions). Diese mussten durch einen zweiten Entwickler gereviewed werden, um hohen Qualitätsanforderungen gerecht zu werden.
Das war ein wiederholter Einsatz beim deutschen Marktführer im Bereich Brillenoptik.
Es ging einerseits um die Weiterentwicklung der .NET WebApi Anwendung mit RESTful Endpunkten, die als API Backend im Cluster betrieben wurde. Als zweites Aufgabengebiet wurden neue Features für eine Single-Page-Webanwendung mit HTML5 und Angular für die Niederlassungen vorangetrieben. Alle Endpunkte waren im Cluster-Betrieb gegen Ausfall gesichert.
Die Qualität des Angular-Frontends konnte durch Unit-Tests mit Jasmine und durch End-To-End Tests mit Selenium sichergestellt werden. Code-Änderungen wurden durch das Team gegenseitig gereviewed. Das Entwicklungsumfeld war durch Scrum und agile Softwareentwicklung geprägt.
Das Projekt beinhaltete die Entwicklung einer Stammdatenverwaltung mit Historisierungsfunktionen, Ticketsystem und CMS-Komponenten für Energieerzeuger und Netzbetreiber.
Das Frontend und Backend wurde mit ASP.NET MVC realisiert. Als Datenbank kam ein MS SQL-Server mit historisierten Tabellen zum Einsatz. Der Zugriff auf die Datenbank erfolgte via Entity Framework 6. Es wurde darüber hinaus eine API über WCF zur Verfügung gestellt. Die Entwicklung erfolgte als "trunk based development" das per Jenkins "continuous delivered" werden konnte.
Im Rahmen des Projekts waren große Code-Refactorings notwendig, um Dependency Injection einzuführen und den Code nach SOLID-Kriterien teilweise neu zu schreiben. Herausforderungen bestanden im komplexen Rechtesystem, das feingranulare Rechteprüfung auf Objektebene erforderte (implizite Rechte entstanden durch Verknüpfung von veränderlichen Objekten). Es wurden Performance-Analysen und -optimierungen durchgeführt und gezielte Refactorings um die Cluster-fähigkeit zu gewährleisten.
Darüber hinaus fielen organisatorische Aufgaben an, um Scrum und agile Softwareentwicklung im Projekt einzuführen (Retrospective, Sprint Planning, etc.).
Entwicklung eines Kontaktlinsen-Systems, bestehend aus den Hauptkomponenten:
1.) Auftragsverwaltung für Niederlassungen (Angular, Electron)
2.) Online-Auftritt für Kunden zum Bestellen von Kontaktlinsen
3.) Android / iOS Shopping App für Kunden
4.) Serverseitiges Backend mit REST Schnittstellen, um alle drei oben genannten Komponenten zu verbinden (Nancy, Mono)
Die Komponenten 2.) und 3.) wurden durch einen externen Dienstleister entwickelt, was Koordinierung in diesen Bereichen notwendig machte.
Im Rahmen des Projekts wurde im Wesentlichen die Entwicklung der Auftragsverwaltung der Niederlassungen sowie das C# Backend im großen Umfang weiter entwickelt und während der deutschlandweiten Go-Live-Phase betreut und gewartet. Besondere Herausforderungen entstanden nach der Go-Live-Phase. Die Stabilität und Performance des Systems wurde verbessert, ohne für den Kunden sichtbar den laufenden Betrieb zu beeinträchtigen.
Das Projekt war durch eine strenge agile Softwareentwicklung und Einsatz von Scrum sowie durch ein internationales Team gekennzeichnet.
Unit Testing, Integration Testing und End-to-end Testing (via Selenium) sowie regelmäßige Architektur- und Code-Qualitäts-Meetings stellten eine gute Softwarequalität und Lesbarkeit / Wartbarkeit des Codes sicher. Design-Entscheidungen wurden zwischen Teams demokratisch getroffen.
Neben der Software-Entwicklung sind einige DevOps-relevante Aufgaben angefallen. Continuous Integration in TeamCity wurde Schritt für Schritt durch Docker-Komponenten modularisiert, wodurch die Skalierbarkeit, Wartung bzw. die Austauschbarkeit von Komponenten deutlich vereinfacht wurde.
Im Rahmen des Projekts wurde die Weiterentwicklung einer bestehenden Webapplikation (ASP.NET MVC) mit Silverlight-Anteil beauftragt. Das Projekt setzte sich aus einem breiten Spektrum von Aufgaben von Web-UI / Silverlight-UI bis hin zu Datenbank-Backend (SQL, Postgres) zusammen. Wie in den meisten Projekten üblich wurden Unit Tests in (NUnit), Integration Tests (Selenium) und System Tests erstellt und gepflegt. Die Continuous Integration wurde per TeamCity realisiert.
Darüber hinaus wurde eine bestehende Funktionalität der Webapplikation (Authentifizierung, OAuth) in eine neue ASP.NET MVC Webapplikation per Refactoring heraus gelöst. Die ursprünglich proprietäre Authentifizierung wurde durch den offenen OAuth-Standard ersetzt (mittels Thinktecture IdentityServer OpenSource-Komponenten). Dazu wurde eine Web-UI für die gesamte Benutzerverwaltung mithilfe von jQuery, Bootstrap, REST entwickelt und für die Responsive User Experience wurden vorwiegend AJAX-Requests eingesetzt (mit entsprechendem Fallback, falls die Browser-Unterstützung fehlte).
Der Entwicklungsprozess war gekennzeichnet durch agile Softwareentwicklung mit häufigem Pair-Programming.
Refactoring eines bestehenden Systems zur Automatisierung von Sitecore Deployments unter Berücksichtigung der "SOLID"-Prinzipien. Anpassung des Codes so dass Dependency Injection eingesetzt werden konnte. Einführung von Interfaces, um Klassen testfähig zu machen. Aufteilung großer Klassen in mehrere kleinere Klassen (Ziel: Single Responsibility). Erstellung von Tests mit anschließender Code Coverage von ca. 60%.
Konzeption und Entwicklung einer mehrsprachigen Webseite. Es können Dateien hochgeladen werden (auch via Drag & Drop), die anschließend in andere ausgewählte Dateiformate umgewandelt werden können. Dateiformate werden auf Low-Level-Ebene klassifiziert (anhand des Headers, Archiv-Inhalts, etc.). Die Umwandlung wird durch mehrere Windows-Dienste realisiert. Als Message Queue wird die eigens entwickelte RedFoxMQ eingesetzt und als Datenbanken Redis (Cache) und SQLite.
Entwicklung eines Lync Self-Service Portals in ASP.NET MVC 5 für SAP-Mitarbeiter zum Einstellen von Lync-Merkmalen (wie Busy-On-Busy, Caller-ID, etc.). Die MSSQL-Datenbank wurde per Entity Framework 6 angesprochen. Die Lync-Merkmale wurden per PowerShell-Skripte abfragt und gesetzt. Für Busy-On-Busy wurde ein eigenes PowerShell-Modul entwickelt.
10/2005 - 05/2011 Diplom-Informatik (Universität Rostock), Note: 2,0
10/2001 - 05/2005 Bachelor of Business Administration (Duales Studium), Note: 2,5
10/2001 - 08/2003 IHK Ausbildung zum Fachinformatiker Anwendungsentwicklung, Note: 2,0
Diverse Industrie-Zertifikate:
? Microsoft Certified Professional Developer (MCPD)
? Microsoft Certified Systems Administrator (MCSE)
? Linux Professional Institute Certificate (LPIC) - Level 1
- Agile Software Development, SCRUM
- Model View Controller (MVC)
- Model View ViewModel (MVVM)
- Unit Testing (NUnit, xUnit)
- Test Driven Development (TDD)
- UML
- Internet Information Server (IIS)
- Mono (.NET unter Linux)
- Visual Studio
- Anwendungsentwicklung / Datenbanken
- Deep Learning mit Tensorflow (Python)
- Webanwendungen (AJAX, HTML5, MVC 5)
- Erfahrung im Banken / Finanzsektor (1,5 Jahre für ein FTSE 300 Unternehmen in diesem Bereich gearbeitet)
- Erfahrungen mit starker Kryptografie (Diffie-Hellman, Blockchiffren, elliptische Kurven, RSA, HMAC, Hashing)
Im Rahmen dieses Projekts wurde eine KI-Plattform entwickelt, um entwickelte Modelle hardware-beschleunigt (via CUDA) per REST-Service im lokalen Netzwerk zur Verfügung zu stellen. Die Modelle wurden per zuerst mit Tensorflow und später mit PyTorch trainiert, in ONNX umgewandelt, um sie dann in .NET über die ONNX Runtime von Microsoft auszuführen. Die Inferenz-Plattform ist sowohl in .NET als auch in Python (via NVIDIA Jetson Xavier NX) hardware-beschleunigt mit minimaler Latenz möglich. Eine Verwendung der Cloud (AWS, GCP, Azure) kam nicht in Frage wegen Datenschutzbedenken und höherer Kosten und Latenz.
Weiterer Bestandteil des Projekts war die Entwicklung eines Image Classifiers und eines Objekt-Detektors. Es wurden mehrere Ansätze getestet, um bestmögliche Accuracy zu erreichen. Der Image Classifier wurde als EfficientNet-B7-Modell (mit NoisyStudent Pre-Training) umgesetzt (TensorFlow 2 / Keras, später PyTorch) und der Objekt-Detektor via YoloV5X (PyTorch) trainiert. Die Accuracy des Image Classifiers konnte zuletzt durch Trainieren eines NFNets (Normalizer-Free ResNet) gegenüber EffizientNet-B7 sogar leicht verbessert werden. Weitere Modelle wie das Training eines Super Resolution GANs und ein GAN zum JPEG Denoising wurden in ONNX umgewandelt und es wurde das Pre-Processing und Post-Processing in .NET implementiert (Umwandlung in Tensoren + Split / Merge Teilbereiche der Bilder). Darüber hinaus sind sehr viele selbst geschriebene Python Tools entstanden, die bei der Auswahl und Bearbeitung der Daten hilfreich sind.
Alle Trainingsdaten wurden selbst gewählt mit der Strategie möglichst wenig personelle Ressourcen einsetzen zu müssen. Dazu wurden zuerst einige Daten manuell annotiert um mehrere schwache binäre Detektoren zu trainineren. Die binären Detektoren wurden dann per Skript zu einem Gesamtdetektor zusammengeführt. Die trainierten Detektoren (binär+gesamt) konnten dann gegeneinander antreten, um neue Trainingsdaten auszuwählen. Mithilfe diesen Ansatzes konnten neue für den Detektor sinnvolle Trainingsdaten automatisiert annotiert und mit wenig Personaleinsatz wo notwendig korrigiert werden (quasi als Semi-supervised Learning Herangehensweise). So konnte die Validation Accuracy von ursprünglich 88% auf >94% mAP gesteigert werden. Darüber hinaus wurden auch Verfahren wie z.B. DETR (End-to-End Object Detection with Transformers) evaluiert, die besseren Einblick in das Lernverhalten zu erhalten. Gegen den produktiven Einsatz von DETR sprach die geringere Leistung bei der Generalisierung (YoloV5 kam mit deutlich weniger Trainingsdaten und Trainingszeit aus, bei vergleichbarer mAP).
In diesem Projekt habe ich tiefes Verständnis für Deep Learning im Bereich der Bildverarbeitung erlangt. Ich musste viel Code in Python schreiben, oder muste bestehende Projekte z.B. um Data Augmentation erweitern (z.B. Albumentations in PyTorch Image Models von Ross Wightman integriert) und es sind viele hilfreiche Python Tools entstanden. Darüber hinaus konnte ich Erfahrungen mit Google Coral Edge TPU, NVIDIA Jetson Xavier NX + Jetson AGX Xavier sammeln. Diese Edge-Hardware und diverse Grafikkarten (insgesamt 6 Ampere-Grafikkarten + 2 Turing-Grafikkarten, u.a. die Spizenmodelle NVIDIA Quadro RTX A6000 48GB & NVIDIA RTX 3090) wurden selbst beschafft und stehen mir uneingeschränkt für weitere Projekte zur Verfügung.
Ziel des Projektes war die Neuimplementierung einer umfangreichen Bestandsdatenverwaltung, die in Silverlight (Frontend, Schwachpunkte u.a.: Business-Logik im Frontend), .NET 4.5 (Backend, Schwachpunkte: keine Tests, kein REST, Legacy Code historisch gewachsen) und Oracle (PL/SQL) als Datenbank umgesetzt war. Die neue Bestandsdatenverwaltung sollte alle Funktionen der Silverlight-Anwendung in Angular (Frontend) und .NET Core (Backend, REST, Tests) abbilden. Die bestehende Datenbank-Struktur wurde größtenteils übernommen bzw. nur minimal verändert. Die Suchfunktion wurde aus Performance-Gründen komplett in ElasticSearch neu umgesetzt. Dafür wurde zusätzlich Hangfire als Job-Server in die Infrastruktur eingeführt. Besondere Herausforderungen waren speziell in Silverlight umgesetzte UI-Komponenten, die in komplex-interaktiven Angular-Komponenten neu entwickelt werden mussten. Während der Entwicklung wurde das eingesetzte Angular-Framework immer auf die aktuellste Version migriert.
Zu Beginn des Projektes existierte bereits ein Prototyp der Neuimplementierung in .NET Core/Angular. Dieser Prototyp wies jedoch schwächen in der Architektur auf (schlechte Wartbarkeit / Testbarkeit), weswegen die Architektur grundlegend neu aufgesetzt wurde. Es fand eine klassische 3-Schichten-Architektur mit klarer Trennung der Zuständigkeiten Anwendung. Die Datenbank-Schicht (Entity Framework) wurde so weit abstrahiert, dass die Datenbank mit wenig Aufwand später ersetzt werden könnte. Die gute Testbarkeit wurde u.a. durch einer verbesserten Dependency Injection ermöglicht. Backend Unit Tests und Integration Tests wurden in xUnit geschrieben und es wurde ein strenges TDD (Test Driven Design) mit dem Ziel einer hohen Test-Coverage eingeführt. Für die Frontend Tests (UI-Komponenten) wurde Jasmine eingesetzt, wobei Business-Logik prinzipiell ins Backend verlagert wurde.
Der Kunde hatte große Anforderungen, was Testbarkeit und Wartbarkeit angeht, da die Weiterentwicklung ausschließlich durch interne Mitarbeiter später übernommen werden sollte. Zwischen den Entwicklern wurden Pull Requests durch gegenseitige Reviews eingeführt (gemessen an den Clean Code-Kriterien von Robert C. Martin), was für eine hohe und einheitliche Code-Qualität (bessere Wartbarkeit) sorgte. Technische Schulden wurden frühzeitig durch Refactoring-Maßnahmen beseitigt, die durch die zahlreichen Unit Tests reibungslos möglich waren.
Das Projekt-Team bestand aus vier Mitarbeitern. Als externer Berater habe ich die grundlegenden Entscheidungen bezüglich Architektur und Umsetzung übernommen. Besondere Wünsche im Frontend-Layout / Bedienbarkeit hat der Kunde mit Absprache mit den Fachabteilungen festgelegt. Das Projekt wurde mit den Grundsätzen der agilen Softwareentwicklung & Scrum umgesetzt. Die allgemeine Zufriedenheit mit der Arbeit am Code war sehr hoch.
Dies war der zweite Einsatz bei einem vorherigen Projekt in Magdeburg im Energiesektor. Schwerpunkt war die Vorbereitung des Projektes für den Go-Live-Betrieb. Beim Portal handelte es sich um eine mehrschichtige ASP.NET MVC Webapplikation (HTML5) mit REST / WebApi-Schnittstellen. Neben klassischen Entwicklungstätigkeiten (.NET / C#) lag besonderes Augenmerk auf die Stabilisierung, Performance-Optimierungen, Verbesserungen der Skalierbarkeit sowie Logging und Monitoring der Webapplikation. Datenbank-Anweisungen (SQL) wurden für den Produktiveinsatz optimiert. Als Entwicklungsumgebung kam Visual Studio 2017 mit Resharper zum Einsatz.
Der Live-Gang des Portals war erfolgreich und die Website wird derzeit bundesweit von Anlagen- und Netzbetreibern eingesetzt.
Für die Skalierung wurden unter anderem ein Job-Server und API-Key-Validator als Micro-Service (WebApi) entwickelt. Der Job-Server wurde in Visual Studio Code als Cross-Platform Anwendung (.NET Framework 4.7 + .NET Core 2.1) erstellt, um einen reibungslosen Docker-Betrieb zu gewährleisten. Darüber hinaus war das Erfassen von Metriken während des Live-Betriebs wichtig. Diese wurden in einem Kubernetes-Cluster (Docker) per Push-Nachrichten in InfluxDB aufgezeichnet und als Grafana-Dashboard dargestellt. An vielen Stellen wurde die Performance durch Parallelisierung und Refactoring verbessert. Durch die vorhandenen Live-Metriken konnten Performance-Bottlenecks erkannt und iterativ beseitigt werden.
Mehrfache Änderungswünsche vom Kunden machten es notwendig einige Features komplett neu zu implementieren oder umfangreich zu erweitern. Für neu geschriebenen Code wurden penibel neue Unit Tests und Integration Tests geschrieben (xUnit, FluentAssertions). Diese mussten durch einen zweiten Entwickler gereviewed werden, um hohen Qualitätsanforderungen gerecht zu werden.
Das war ein wiederholter Einsatz beim deutschen Marktführer im Bereich Brillenoptik.
Es ging einerseits um die Weiterentwicklung der .NET WebApi Anwendung mit RESTful Endpunkten, die als API Backend im Cluster betrieben wurde. Als zweites Aufgabengebiet wurden neue Features für eine Single-Page-Webanwendung mit HTML5 und Angular für die Niederlassungen vorangetrieben. Alle Endpunkte waren im Cluster-Betrieb gegen Ausfall gesichert.
Die Qualität des Angular-Frontends konnte durch Unit-Tests mit Jasmine und durch End-To-End Tests mit Selenium sichergestellt werden. Code-Änderungen wurden durch das Team gegenseitig gereviewed. Das Entwicklungsumfeld war durch Scrum und agile Softwareentwicklung geprägt.
Das Projekt beinhaltete die Entwicklung einer Stammdatenverwaltung mit Historisierungsfunktionen, Ticketsystem und CMS-Komponenten für Energieerzeuger und Netzbetreiber.
Das Frontend und Backend wurde mit ASP.NET MVC realisiert. Als Datenbank kam ein MS SQL-Server mit historisierten Tabellen zum Einsatz. Der Zugriff auf die Datenbank erfolgte via Entity Framework 6. Es wurde darüber hinaus eine API über WCF zur Verfügung gestellt. Die Entwicklung erfolgte als "trunk based development" das per Jenkins "continuous delivered" werden konnte.
Im Rahmen des Projekts waren große Code-Refactorings notwendig, um Dependency Injection einzuführen und den Code nach SOLID-Kriterien teilweise neu zu schreiben. Herausforderungen bestanden im komplexen Rechtesystem, das feingranulare Rechteprüfung auf Objektebene erforderte (implizite Rechte entstanden durch Verknüpfung von veränderlichen Objekten). Es wurden Performance-Analysen und -optimierungen durchgeführt und gezielte Refactorings um die Cluster-fähigkeit zu gewährleisten.
Darüber hinaus fielen organisatorische Aufgaben an, um Scrum und agile Softwareentwicklung im Projekt einzuführen (Retrospective, Sprint Planning, etc.).
Entwicklung eines Kontaktlinsen-Systems, bestehend aus den Hauptkomponenten:
1.) Auftragsverwaltung für Niederlassungen (Angular, Electron)
2.) Online-Auftritt für Kunden zum Bestellen von Kontaktlinsen
3.) Android / iOS Shopping App für Kunden
4.) Serverseitiges Backend mit REST Schnittstellen, um alle drei oben genannten Komponenten zu verbinden (Nancy, Mono)
Die Komponenten 2.) und 3.) wurden durch einen externen Dienstleister entwickelt, was Koordinierung in diesen Bereichen notwendig machte.
Im Rahmen des Projekts wurde im Wesentlichen die Entwicklung der Auftragsverwaltung der Niederlassungen sowie das C# Backend im großen Umfang weiter entwickelt und während der deutschlandweiten Go-Live-Phase betreut und gewartet. Besondere Herausforderungen entstanden nach der Go-Live-Phase. Die Stabilität und Performance des Systems wurde verbessert, ohne für den Kunden sichtbar den laufenden Betrieb zu beeinträchtigen.
Das Projekt war durch eine strenge agile Softwareentwicklung und Einsatz von Scrum sowie durch ein internationales Team gekennzeichnet.
Unit Testing, Integration Testing und End-to-end Testing (via Selenium) sowie regelmäßige Architektur- und Code-Qualitäts-Meetings stellten eine gute Softwarequalität und Lesbarkeit / Wartbarkeit des Codes sicher. Design-Entscheidungen wurden zwischen Teams demokratisch getroffen.
Neben der Software-Entwicklung sind einige DevOps-relevante Aufgaben angefallen. Continuous Integration in TeamCity wurde Schritt für Schritt durch Docker-Komponenten modularisiert, wodurch die Skalierbarkeit, Wartung bzw. die Austauschbarkeit von Komponenten deutlich vereinfacht wurde.
Im Rahmen des Projekts wurde die Weiterentwicklung einer bestehenden Webapplikation (ASP.NET MVC) mit Silverlight-Anteil beauftragt. Das Projekt setzte sich aus einem breiten Spektrum von Aufgaben von Web-UI / Silverlight-UI bis hin zu Datenbank-Backend (SQL, Postgres) zusammen. Wie in den meisten Projekten üblich wurden Unit Tests in (NUnit), Integration Tests (Selenium) und System Tests erstellt und gepflegt. Die Continuous Integration wurde per TeamCity realisiert.
Darüber hinaus wurde eine bestehende Funktionalität der Webapplikation (Authentifizierung, OAuth) in eine neue ASP.NET MVC Webapplikation per Refactoring heraus gelöst. Die ursprünglich proprietäre Authentifizierung wurde durch den offenen OAuth-Standard ersetzt (mittels Thinktecture IdentityServer OpenSource-Komponenten). Dazu wurde eine Web-UI für die gesamte Benutzerverwaltung mithilfe von jQuery, Bootstrap, REST entwickelt und für die Responsive User Experience wurden vorwiegend AJAX-Requests eingesetzt (mit entsprechendem Fallback, falls die Browser-Unterstützung fehlte).
Der Entwicklungsprozess war gekennzeichnet durch agile Softwareentwicklung mit häufigem Pair-Programming.
Refactoring eines bestehenden Systems zur Automatisierung von Sitecore Deployments unter Berücksichtigung der "SOLID"-Prinzipien. Anpassung des Codes so dass Dependency Injection eingesetzt werden konnte. Einführung von Interfaces, um Klassen testfähig zu machen. Aufteilung großer Klassen in mehrere kleinere Klassen (Ziel: Single Responsibility). Erstellung von Tests mit anschließender Code Coverage von ca. 60%.
Konzeption und Entwicklung einer mehrsprachigen Webseite. Es können Dateien hochgeladen werden (auch via Drag & Drop), die anschließend in andere ausgewählte Dateiformate umgewandelt werden können. Dateiformate werden auf Low-Level-Ebene klassifiziert (anhand des Headers, Archiv-Inhalts, etc.). Die Umwandlung wird durch mehrere Windows-Dienste realisiert. Als Message Queue wird die eigens entwickelte RedFoxMQ eingesetzt und als Datenbanken Redis (Cache) und SQLite.
Entwicklung eines Lync Self-Service Portals in ASP.NET MVC 5 für SAP-Mitarbeiter zum Einstellen von Lync-Merkmalen (wie Busy-On-Busy, Caller-ID, etc.). Die MSSQL-Datenbank wurde per Entity Framework 6 angesprochen. Die Lync-Merkmale wurden per PowerShell-Skripte abfragt und gesetzt. Für Busy-On-Busy wurde ein eigenes PowerShell-Modul entwickelt.
10/2005 - 05/2011 Diplom-Informatik (Universität Rostock), Note: 2,0
10/2001 - 05/2005 Bachelor of Business Administration (Duales Studium), Note: 2,5
10/2001 - 08/2003 IHK Ausbildung zum Fachinformatiker Anwendungsentwicklung, Note: 2,0
Diverse Industrie-Zertifikate:
? Microsoft Certified Professional Developer (MCPD)
? Microsoft Certified Systems Administrator (MCSE)
? Linux Professional Institute Certificate (LPIC) - Level 1
- Agile Software Development, SCRUM
- Model View Controller (MVC)
- Model View ViewModel (MVVM)
- Unit Testing (NUnit, xUnit)
- Test Driven Development (TDD)
- UML
- Internet Information Server (IIS)
- Mono (.NET unter Linux)
- Visual Studio
- Anwendungsentwicklung / Datenbanken
- Deep Learning mit Tensorflow (Python)
- Webanwendungen (AJAX, HTML5, MVC 5)
- Erfahrung im Banken / Finanzsektor (1,5 Jahre für ein FTSE 300 Unternehmen in diesem Bereich gearbeitet)
- Erfahrungen mit starker Kryptografie (Diffie-Hellman, Blockchiffren, elliptische Kurven, RSA, HMAC, Hashing)
Direktester geht's nicht! Ganz einfach Freelancer finden und direkt Kontakt aufnehmen.