Blog

Zeiterfassungs-Tool mit Scala.js, Akka und Event Sourcing

Ein Artikel aus den Bereichen Softwareentwicklung, Cap3 Insights
Marian Palkus
07.10.2016
Marian Palkus

Für das CodeCamp 2016 haben wir uns das Ziel gesetzt, ein Projekt mit Scala, Scala.js und Akka unter Verwendung des Event Sourcing-Pattern umzusetzen.

Die Projektidee

Bereits vor einigen Jahren haben wir bei Cap3 ein Tool zur Zeiterfassung entwickelt und dann auch eine Zeit lang in Projekten eingesetzt. Ole und ich sind noch immer der Meinung, dass ein eigenes Zeiterfassungs-Tool eine coole Sache ist. Daher haben wir uns vorgenommen, das Zeiterfassungs-Tool als Web-Backend in Kombination mit einer Single-Page-Application neu aufzusetzen.

Ein Konzept und gute Designs von Moritz Schönfeld existierten bereits, sodass hier das Rad nicht neu erfunden werden musste.

Kurz zum Hintergrund des Zeiterfassungs-Tools: Um die Aufwände für unsere Projekte im Blick zu behalten, trackt jeder Entwickler die Zeit, die er an einem Projekt arbeitet. Auch Aufwände für Projektmanagement oder Designleistungen werden so erfasst. Die Zeiterfassung soll perfekt auf unsere Bedürfnisse zugeschnitten mit wenigen Klicks (so einfach wie möglich) erfolgen.

Event Storming für das Zeiterfassungs-Tool

Am ersten Tag des CodeCamps haben wir zusammen mit Nicolas eine kurze Event Storming-Session für das Zeiterfassungs-Tool durchgeführt. Dadurch konnten wir sehr schnell die Kern-Features, die wir in der kurzen Zeit umsetzen wollten, identifizieren. Außerdem konnten wir die Events direkt in der Umsetzung des Backends verwenden.

Technische Details

Scala.js bietet die Möglichkeit, den kompletten Code eines webbasierten Frontends in Scala zu schreiben. Im Vergleich zu JavaScript bietet der Einsatz von Scala in unseren Augen viele Vorteile, z. B. statische Typisierung, bessere IDE-Unterstützung, bessere Wartbarkeit, weniger Code. Aber auch im Vergleich zu TypeScript bietet Scala.js weitere Vorteile, dazu zählen: Starke Typisierung, eine größere Standard-Bibliothek, Code wird durch Compiler optimiert.

In Kombination mit einem Backend, das ebenfalls mit Scala umgesetzt ist, kann außerdem Code zwischen Frontend und Backend geteilt werden. Das heißt, man erhält z. B. eine typisierte Kommunikationsschnittstelle zwischen Frontend und Backend, die im Code immer aktuell ist. Viele Fehler, die durch Änderungen an der Schnittstelle entstehen können, werden bereits beim Kompilieren gefunden.

Natürlich gibt es auch Nachteile, u. a. ist die Größe des Kompilats mindestens 45kB groß.

Entwicklung des Zeiterfassungs-Tool mit Scala.js, Akka und Event Sourcing

Im Frontend haben wir React und Diode (Bibliothek inspiriert durch Flux, Elm und Redux) eingesetzt. Das Backend haben wir mit dem Play-Framework und Akka/Akka Persistence/Akka Persistence Query unter Anwendung des Event Sourcing-Patterns umgesetzt. Entgegen der traditionellen Datenhaltung in einem relationalen Schema wird der Anwendungszustand als eine Sequenz von Events erfasst (vgl. martinfowler.com “Event Sourcing” ). Eine Technik mit vielen Vorteilen, die wir gerne einmal in einem Kundenprojekt einsetzen möchten.

Auftauchende Probleme bei der Entwicklung

Insgesamt lief der Einsatz der neuen Technologie erstaunlich glatt. Ein nennenswertes Problem tauchte allerdings dennoch auf: Wir hatten bei Projektstart auf die Bibliothek Autowire gesetzt. Autowire bietet Mittel, den für die Netzwerkübertragung zwischen Front- und Backend nötigen Code automatisch erzeugen zu lassen. Zunächst sparte uns der Einsatz der Bibliothek Zeit und wir konnten direkt die Anwendungslogik implementieren. Als es allerdings ins Detail ging, mussten wir feststellen, dass wir nicht genug Kontrolle über die Kommunikation hatten. Beispielsweise war es nicht möglich, den zurückgegebenen HTTP-Statuscode zu beeinflussen. Das Hauptproblem war aber, dass Autowire nicht mit unserem Dependency-Injection-Ansatz zusammengespielt hat. Nachdem wir uns entschieden hatten, auf die Bibliothek zu verzichten, war die fehlende Kommunikationsschicht dann aber in knapp zwei Stunden nachgezogen.

Allgemeine Begeisterung bei der Ergebnispräsentation des Zeiterfassungs-Projekts

Unser Fazit

Wir sind mit dem Projektergebnis sehr zufrieden. Die gewonnenen Erkenntnisse haben uns weiter darin bestärkt, auf Scala zu setzen. Die Erwartungen an Scala.js, worauf der Fokus lag, sind vollständig erfüllt worden: Scala.js bietet sehr gute Möglichkeiten, eine Webanwendung mit hoher Qualität zu entwickeln.

Interesse? Schreiben Sie uns!

Sie möchten ein Software-Projekt mit uns starten oder über Ihre Idee sprechen? Wir freuen uns über Ihre Kontaktaufnahme!

Unverbindliche Projektanfrage

In welchen Bereichen können wir Sie unterstützen?