Unser Tech-Stack

 Programmiersprachen, Frameworks, Methoden und Tools

Wir arbeiten an unseren Services überwiegend mit Go, Ruby on Rails, Java, Objective-C und JavaScript (mit einem starken Fokus auf React und Node.js). Unsere Plattform, die von unserem DevOps-Team bereitgestellt wird, basiert zu 100 % auf Diensten von AWS, wir betreiben keinen einzigen Server selbst. Unserer Entwicklungsarbeit liegt das CI/CD-Modell zugrunde (Continuous Integration / Continuous Delivery), sodass wir Software schnell und effizient bereitstellen können. Unter anderem mithilfe von TDD (Test-driven Development) und Pair-Programmierung sorgen wir dafür, dass unsere Software die gewünschte Qualität hat. Dabei verfolgen wir einen  Entwicklungsansatz, bei dem hohe Verfügbarkeit und Skalierbarkeit der Software im Mittelpunkt unserer Bemühungen stehen.

Microservices-Architektur

Um sicherzustellen, dass wir schnell und innovativ sind, verfügen wir über eine modulare „austauschbare“ Architektur. Neue Features können nur dann schnell bereitgestellt werden, wenn sie für sich als Dienst autonom entwickelt und getestet werden. Unsere Web-Anwendungen sind eine Föderation von Web-Diensten. Diese Web-Services, werden über definierte APIs integriert. Dabei spielen Micro-Services als kleinste Art von Web-Services eine große Rolle. Die Dekomposition einer komplexen Anwendung in Micro-Services erlaubt uns, dass wir die einzelnen Dienste kontinuierlich, in unterschiedlicher Geschwindigkeit entwickeln können. Auch bestehende Legacy-System können in eine solche Architektur eingebunden werden.

Headless/Decoupled-Architektur

Wir verfolgen den Ansatz API-first. Unsere Backend ist headless und der User Agent vom Backend entkoppelt. Mit Technologien wie OpenAPI/Swagger versuchen wir den Client möglichst frei gestaltbar zu halten. Die Sicherheit wird durch die Isolierung der Dienste und durch den Schutz der API deutlich erhöht. Neben REST kommt beim Zugriff auf die API teilweise auch GraphQL zum Einsatz. Aber auch um das Frontend kümmern wir uns intensiv. Unsere Development-Designer (DevSigner) unterstützen die Entwicklung von GUIs, die eine begeisternde UX bieten und den Benutzer eine intuitive Bedienung ermöglichen.

Methoden

Die Qualität der von uns entwickelten Software ist einer der wichtigsten Aspekte unserer Arbeit. Damit sie den höchsten Ansprüchen genügt, nutzen wir unter anderem die folgenden Methoden.

Agile Entwicklung / Scrum

Wir entwickeln Software immer agil. Mit einer Serie zeitlich begrenzter Sprints erreichen wir zum frühstmöglichen Zeitpunkt nutzbare Ergebnisse (Minimum Viable Product), bleiben flexibel und schaffen die Basis für eine nachhaltige, kontinuierliche Weiterentwicklung unserer Anwendungen. Wir nutzen Scrum als Methode und die Sprints umfassen in der Regel 10 bis 30 Projekttage. Jeder Sprint beginnt mit einem Planning Meeting und endet mit einem Sprint Review, bei dem die erzielten Ergebnisse abgenommen werden und deren Akzeptanz überprüft wird. Darüber hinaus finden regelmäßige Retrospektiven statt, um das Teamwork und die Effizienz kontinuierlich zu verbessern.

TDD (Test-driven Development)

Um Fehler vor dem Entstehen zu identifizieren, führen wir umfangreiche und automatisierte Tests durch. Anstatt als erstes Code zu programmieren, entwickeln wir als erstes den passenden Unit Test. Die Unit-Tests, die aus TDD hervorgehen, sind auch ein integraler Bestandteil des Continuous-Integration-/Continuous-Delivery-Prozesses (CI/CD). Mit Pipelines wie AWS CodePipeline oder Travis CI, unterstützen wir unseren Entwicklungsprozess Prozess bei dem auch alle Unit- und Integration-Tests durchgeführt werden.

Pair-Programmierung

Wir arbeiten in Teams. Wenn jeweils zwei Entwickler an einer Story oder einem Task zusammenarbeiten, dann ist dies ein produktiver Ansatz. Es treten weniger Bugs auf, die Qualität des Codes wird verbessert, der Arbeitsaufwand wird reduziert und das Wissen wird verteilt. Unsere Teams betreiben intensives Mentoring, nutzen Trainings und Nano-Degrees und machen interne Code Reviews.

Tools

Die Auswahl der richtigen Tools ist die Grundlage für unsere Arbeit, weil sie sich entscheidend auf Team-Performance und Codequalität auswirken. Daher nutzen wir für unsere Projekte die besten, bewährten Tools, wie zum Beispiel die im Folgenden aufgeführten.

GitHub

Der Quellcode aller von uns erstellten Anwendungen befindet sich in GitHub-Repositories. Dieser Service wird für die Versionskontrolle, Issues, Code-Reviews, Deployments usw. genutzt. Für die Organisation des Repositorys verwenden wir Git-Flow.

Amazon API Gateway

Amazon API Gateway ist ein AWS-Service, um REST-, HTTP- und WebSocket-APIs in jeder Größenordnung zu erstellen, veröffentlichen, warten, überwachen und sichern. 

AWS CodePipeline

AWS CodePipeline ist ein Continuous-Integration- und Continuous-Delivery-Service, den wir dafür nutzen, um unsere Software zu modellieren, zu visualisieren und automatisiert zu veröffentlichen. In unseren Projekten kommen unterschiedliche Pipelines (virtuelle Umgebungen) zum Einsatz. Jede Pipeline ist dafür konfiguriert, auf die in Git-Branches definierten Aktionen zu reagieren. Sobald Code aktualisiert wird, startet der Prozess automatisch.

AWS CodeBuild

AWS CodeBuild ist ein vollständig verwalteter Service für die kontinuierliche Integration. Wir nutzen ihn, um Quellcode zu kompilieren, Tests auszuführen und implementierbare Softwarepakete zu generieren. In einem CodeBuild-Projekt werden Pakete installiert und dann die Anwendung erstellt. Zugleich werden automatische (Integrations-)Tests durchgeführt. Zudem definieren wir Akzeptanzkriterien, damit die Anwendung allen Anforderungen gerecht wird. Erst, wenn die Anwendung alle Tests bestanden hat, wird sie implementiert.

AWS CodeDeploy

CodeDeploy ist ein Service, mit dem der Inhalt der (öffentlichen) Seiten und die Redirects an den S3-Bucket übermittelt werden. Die Lambda-Funktionen werden bei Bedarf aktualisiert, ihre neuen Versionen mit CFD verknüpft, und der CFD-Cache wird invalidiert.

Sprachen, Frameworks & Tools (Auszug)

Cloud-Infrastruktur (Auszug)

Datenbanken (Auszug)