Proudly made without cookies

Blog - Somebody said we need to do content marketing

Software Modernisierung mit Test Creep

Test Creep

Wenn wir Software in die Wartung übernehmen finden wir oft Projekte in denen es keine Tests gibt.

Wir ziehen dann nicht mit der Aufgabe los, Tests um der Tests willen zu schreiben. Stattdessen fangen wir einfach an opportunistische Tests zu schreiben, nur dort wo wir ohnehin einen Bug fixen oder eine neue Funktionalität einbauen und auch nur dann, wenn es einfach und ohne ohne zu viel Refactoring möglich ist. Die Tests binden wir natürlich in eine Dev-Ops Pipeline ein.

Wenn wir das eine Weile machen stellt sich ein super Effekt ein. Die Qualität der Software steigt schnell. Einfach weil schrittweise die kritischen Punkte über Tests abgesichert werden - jedoch genau die Ecken des Quellcodes in denen es viele Bugs oder große Veränderungen gibt. So stabilisiert sich der Quellcode für die Weiterentwicklung. Außerdem sinkt der manuelle Testaufwand.

Diesen Effekt, dass die Tests einfach so in das Projekt reinkriechen nennen wir: Test Creep

und Test Creep ist super!

Software modernisieren oder ablösen

Software modernisieren oder ablösen

Die Frage lautet, ist eine Weiterentwicklung und Modernisierung wirtschaftlich?

Um das herauszufinden, gibt es Hausaufgaben:

  • Gesamtkontext beleuchten: Bedeutung der Software, Schnittstellen zu anderen Systemen, Verfügbarkeit von Standardsoftware, Risiken?
  • Technischen Überblick erarbeiten: Technologien, Software Architektur, Code Qualität, Tests, Sicherheit?
  • Nagelprobe: wie lange brauche ich, um ein kleines Feature zu ergänzen und produktiv zu nehmen?

Die Hausaufgaben bildet die Basis für strategische Szenarien.

codecare hilft gerne bei der Analyse

We moved from Java to Kotlin

java to kotlin

Two years ago we started to move our development from java to kotlin.

Now we are looking back and summing up.

It definitely was the right decision. Mixed stacks of java legacy code and kotlin do work perfectly. Our java coders have built up kotlin experience. The transition proved to be smooth and motivating. The kotlin modules are better tested, more robust and the code is a lot easier to maintain because kotlin is a lot more concise than java.

Kotlin really is just modern java! Do not be afraid to take the step!

Spielraum für Forschung und Entwicklung

forschung und entwicklung

Software Technologie ändert sich beständig. Was wird bleiben? Was läuft aus? Was passt?

  • Soll ich Rust machen oder bei C bleiben?
  • Code ich in Golang oder Java?
  • Brauche ich wirklich Kubernetes?
  • Ist Flutter 2 reif für den produktiven Einsatz?

Diese Liste ist beliebig lang und sinnvolle Antworten findet man nur in einem konkreten Kontext.

Jeder bei codecare hat einen halben Tag in der Woche zum forschen und ausprobieren. Damit schärfen wir die Basis für langfristig tragfähige Technologieentscheidungen.

Verzollung von Modellseilbahnen

modellseilbahn

Wir haben eine Verzollungssoftware geschrieben und ich habe viel gelernt.

Zum Beispiel ist 9503009510 die Zollkategorie für "maßstabgetreue Modellseilbahnen zum Bedrucken". Modell-SEIL-Bahnen. Das habe ich mir nicht ausgedacht. Das ist echt!

Wer denkt sich so etwas aus und vor allem warum?

Benötigt der europäische Wirtschaftszweig der Modellseilbahnhersteller Schutz vor ausländischen Billigimporten? Immerhin gilt ein Drittlandszollsatz von 4,7%.

Oder hat sich ein Kabarettist in die Kommission zur Definition der Warentarifnummern eingeschlichen?

Oder dient es einfach nur dazu, uns Programmierer mal zum Lachen zu bringen?

Lustigerweise muss bei der Einfuhr außerdem durch den Code Y922 bestätigt werden, dass "Keine oder andere Felle als Katzen- und Hundefelle" in der Modellseilbahn verbaut sind.

Ich tippe auf den Kabaretisten...

Modernisierung von C mit RUST

c to rust

Wir suchen fortwährend nach wirtschaftlichen Lösungen für die Software Modernisierung. Im Endeffekt läuft das fast immer auf die Wartbarkeit und Testbarkeit des Quellcodes hinaus.

Darüber hinaus sind wir der Meinung, dass C-Code inhärent "broken" ist. C macht Speicherfehler viel zu einfach und erfordert beinahe geniale Entwickler - so erfordert auch das Lesen von C-Code oft Klimmzüge, bis man versteht, welches fachliche Problem dort gelöst wurde. Deswegen ist C-Code bei Software Modernisierung regelmäßig ein Risiko.

Auf der anderen Seite ist uns klar, dass in Legacy Systemen ein Big Bang Ansatz zur Erneuerung selten ökonomisch tragfähig ist. Daher finden wir Lösungswege extrem hilfreich, die eine Software Modernisierung punktuell an kritischen Stellen erlauben.

Und jetzt kommt "RUST to the rescue". In seiner Bachelor-Arbeit hat unser Kollege Philip Koslowski die technische Machbarkeit einer partiellen Erneuerung einer C Codebasis mit RUST untersucht. Das geht nicht nur gut, es macht sogar wirtschaftlich enorm viel Sinn!

Vielen Dank an Prof. Dr.-Ing. Mira Mezini und Dr. Krishna Narasimhan der TU Darmstadt für die engagierte Betreuung der Bachelor Arbeit.

Ich habe keinen Keks für Dich

kein keks

Die Cookie-Zustimmungsdialoge werden immer fetter, komplexer und grotesker. Warum?

Technisch gesehen braucht es Cookies nur dann, wenn man seine Nutzer tracken will oder einen Zustand speichern muss.

Gehören alle diese Websites mit den abstrusen und irreführenden Cookie-Dialogen zu Firmen, die beständig ihre Conversion-Rates mit Hilfe der Klick-Pfade optimieren und ihre Marketing-Kampagnen vermessen wollen?

Warum kommt der Cookie Dialog für die notwendigen Cookies nicht erst dann, wenn sie wirklich notwendig werden - also beim Login oder wenn ich was in den Warenkorb lege?

Ich habe das Gefühl, das hat sich komplett verselbstständigt.

Unsere Homepage funktioniert jedenfalls komplett ohne Cookies. Wir tracken einfach nicht. Trotzdem freuen wir uns über jeden Besuch.

And the winner is: JAVA

java mit gopher

Bei unserer Software-Modernisierung ist die Programmiersprache meist festgeschrieben. Zuletzt hatten wir aber freie Wahl.

Im Team haben wir intensiv diskutiert. Die Motivation für go, kotlin oder python ist sehr groß.

Aber zu guter letzt ist es mal wieder Java geworden.

Ausschlaggebend dafür war die Risikobetrachtung. Das Java Ökosystem an Open Source Libraries ist super und das Java Know How weitreichend. Außerdem gibt es Legacy-XML-Schnittstellen. Zusammen mit einem engen Zeitrahmen und enormer fachlicher Komplexität ist es dann wieder Java geworden.

Ein wenig langweilig aber sinnvoll.

Aber das nächste Projekt machen wir mit Go!

Welche Wolke passt zu mir?

Wir haben in den letzten Tagen die passende Cloud für eine neues Projekt ausgewählt.

Das Überraschende daran war, dass in der Entscheidungsmatrix die strategischen Punkte den Ausschlag gegeben haben. Aus technischer Sicht waren die Clouds für unsere auf Kubernetes aufbauende Architektur fast austauschbar. Am Ende war das schon vorhandene DevOps Know-how dann maßgebend.

Und aus meiner Sicht passt das auch: "You build it, you run it" ist zusammen mit einer komplexen DevOps CI/CD Pipeline und hohen Anforderungen an die Verfügbarkeit nicht wirklich praktikabel. Eine Arbeitsteilung mit DevOps Experten hilft hier einfach sehr.

Komplexität in DevOps

Komplexität verschwindet nicht, nur weil sie gekapselt ist.

Gestern habe ich 3 Stunden für 30 Zeilen DevOps Konfiguration gebraucht. Das Resultat war eine automatische Bauanleitung. Sie ist kompakt und gut lesbar. Aber unter der Haube verbergen sich viele Technologien: gitlab, docker, nodejs und komplexe Konzepte und Konventionen zur Parametrisierung. Dazu kommt, dass vieles sich in Bewegung befindet und Beispiele oft für ältere Versionen gemacht sind.

Daher ist es sinnvoll, sich erst einmal in die konkreten Konzepte einzulesen und dann an Hand von Best Practice Beispielen die Pipeline aufzubauen.

codecare - wir können DevOps

Goto go - ist Golang die Sprache der Cloud?

Mittlerweile trifft man auf immer mehr Software, die in der Programmiersprache go geschrieben ist.

Vor allem in der Cloud: kubernetes, docker, gitea, caddyserver, restic, ... und das ist alles Open Source!

Wir nutzen go mittlerweile für Microservices und Kommandozeilen-Tools. Unsere Erfahrungen sind durchweg positiv. Go erzwingt klaren und strukturierten Code.

Besonders spannend finde ich, dass Bibliotheken nur im Quelltext eingebunden werden können. Das ist ein eingebauter Inkubator für Open Source. Da ich die Bibliotheken ohnhin im Quelltext in meinem Editor habe, macht es einfach Sinn Fehler oder fehlende Features direkt dort zu fixen und als Pull Request zurückzuspiegeln.

Daher wundert es mich wenig, dass das go Ökosystem so schnell wächst.

... und ein süßes Maskottchen hat go auch noch.

Warum ist die Cloud so kompliziert - cool tool Caddy Webserver

Als Prototyp habe ich eine statische Website generiert. Dann wollte ich sie in der Cloud bereitstellen - und der Spaß ging los.

Azure und AWS können direkt S3 Buckets oder Blob Storage ausliefern. Jetzt fehlte nur noch eine simple Authentifizierung.

Nachdem ich eine halbe Stunde Dokumentation über Account SAS, Ad Hoc SAS, Lambda@Edge mit CloudFront und mehr gelesen hatte war ich kaum weiter. Ich brauche doch nur eine simple HTTP Basic Authentication.

Dann habe ich die Rolle rückwärts gemacht und meine Website einfach zusammen mit einem nginx Webserver in einen Docker Container gepackt. Den kann ich direkt in der Cloud starten. Jetzt hatte ich zwar Basic Autentication aber kein HTTPS mehr.

Und dann habe ich den Caddy Weberver gefunden . Ein simpler Webserver, der sich selbstständig mit Let's Encrypt Zertifikaten versorgt. Meine Konfiguration benötig genau 4 sprechende Zeilen.

Die Cloud macht komplexe Dinge möglich - aber simple Dinge komplex.

Was tun mit verwaisten Excel Macros?

Wir haben für einen Kunden verwaiste Excel Macros analysiert.

Der Code ist akzeptabel aber leider gibt es viele Excel Files mit ähnlichen oder gleichen Macros. Die Power User des Kunden wissen ohnehin, wann Ihnen welches Macro aus welchem File hilft. Was nun?

1) Variante Feuerwehr

Momentan geht alles und wenn es zukünftig Bugs oder Changes gibt, dann wühlen wir uns in die Code und lösen das konkrete Problem. Das dauert dann halt ein wenig, aber es fallen erst mal gar keine Kosten an.

2) Variante Verbesserung der Wartbarkeit

Wir konsolidieren alle Excel Files und Macros, ergänzen fehlende Dokumentation und schreiben Tests oder Referenzdatensheets. Das macht Einiges an Arbeit, aber dann ist es viel einfacher neue Funktionen zu ergänzen oder kurzfristig Bugs zu fixen.

3) Intranet Web-Applikation

An Stelle der Excel Macros schreiben wir eine Web-Applikation für das Intranet. Keine Schatten-IT mehr, zentralisierte digitale Prozesse - aber erst mal ein IT-Projekt zu stemmen.

Aus meiner Techie-Sicht kann ich mit allen Varianten Leben - es hängt an der konkreten Digitalisierungstrategie.

Welche Varianten habe ich vergessen?

Meine erste Docker Schulung

Nächsten Montag werde ich einem Freund Docker erklären. Das wird lustig, da Docker in meinem Arbeitsalltag allgegenwärtig ist. Alles was wir an Build Automation oder Test Automation machen ist komplett verdockert. Die Infrastruktur sowieso schon lange (wiki, Jira, gitea, Datenbanken).

Wie erklärt man jemanden Fahrrad fahren?

Dabei habe ich selbst ein Weilchen gebraucht, die Vorteile zu sehen. Ob ein Service direkt oder in einem Docker läuft scheint egal zu sein, sobald er läuft. Aber wenn man den Service updaten, umziehen oder weitergeben will, dann lohnt sich Docker. Und früher oder später will ich das für jeden Service.

Für mich ist Docker einer der bedeutesten Erfindungen der letzten Jahre! Mal schauen, ob ich das am Montag rüberbringen kann.

Java Microservice für Kubernetes: ist quarkus.io produktionsreif

Wir haben unseren neusten Microservice mit quarkus.io gebaut. Das Ziel von quarkus.io ist es, den Einsatz von Java Microservices in Kubernetes zu optimieren: kleinere Container, mehr Performance und extrem schneller Start. Dazu baut quarkus.io mit Hilfe der GraalVM native Images.

Ja, die Versprechen werden eingehalten, aber das Framework ist noch in Bewegung. Dokumentierte Parameter wechseln ihre Namen, ein Upgrade von 1.3.1 zu 1.4.2 baut nicht mehr im Docker. Der native build dauert rund 10 Minuten und im nativen Code tauchen Probleme auf, die im Java Unittests nicht zu reproduzieren sind.

Fazit: die Idee ist genial aber für produktive Services braucht man noch gute Nerven...

Credits: homepage_comic_1.jpeg by quarkus.io, used under CC 3.0 BY / Inverted from original

Wie gut ist ihr Quellcode?

Wir setzen gerne Tools zur statischen Codeanalyse ein. Sie geben einen Überblick und ermöglichen einfaches Abtauchen in den Code. Dennoch ist das Ergebnis nicht einfach zu interpretieren und ein stumpfes Abarbeiten der Findings ist selten sinnvoll.

Wir finden für Sie die wirtschaftlich sinnvolle Modernisierungsstrategie und helfen Ihnen bei der Sanierung.

Dieser Screenshot stammt von SonarQube.

Ist ihre Software veraltet? Hoffnungslos?

Vom Hamsterrad zum Handlungsspielraum!

Eine wirtschaftliche Modernisierung benötigt selten eine teure Komplettüberholung. So betreuen wir bei codecare einen Kunden, der uns seine schwer wartbare aber systemkritische Altsoftware zur Wartung übergeben hat.

Wir haben uns für eine projektbegleitende und schrittweise Modernisierung entschieden. Für jeden Bugfix und Change Request haben wir Tests automatisiert. Nach wenigen Monaten ergab sich eine akzeptable Testabdeckung der kritischen Bereiche - denn genau dort sind die Bugs und der Änderungsbedarf.

Diese Qualität sorgt für den neuen Handlungsspielraum - wer nicht ständig Feuer löscht, kann für das gleiche Geld Innovation schaffen.

Sprechen Sie mich an!

Telcotools

In der letzten Zeit haben wir eine Vielzahl an Kollaborationstools für Telcos verwendet. Teams, Slack, Zoom, ...

Aber es gibt ein Killer-Feature, dass ich bislang nur in Discord gefunden habe: Pro Nutzer kann ich die Lautstärke einstellen. Schlechte Mikrofone regel ich lauter und laute Sprecher leiser. Das macht Telcos deutlich angenehmer.

Leider ist Discord non-commerical use only...!

Buzzwords

Warum gibt es eigentlich noch keine Softwarelösung, die Blockchain mit AI kombiniert und sich dabei auf IoT fokussiert?

Ein neuronales Netz bildet den Algorithmus ab, der dazu dient das valide Ende der Kette zu bestimmen. Ganz einfach, indem die AI zwei konkurrierende Ketten vergleicht und dann urteilt, welche gültig ist und welche nicht. Damit geht ein überschaubarer Resourcenverbrauch einher, so dass es auch direkt auf IoT Geräten laufen kann.

Der größte Vorteil ist: alle Hypebegriffe kommen in einer Software vor!

Vorsicht, das war alles Satire! Wer dafür einen Nutzen finden kann muss echt kreativ sein. Frohe Ostern!

WarteWarte ist Open Source

codecare macht wartewarte.de zu Open Source

Unser Service für Warteschlangen auf dem Handy ist jetzt Open Source und unter der Apache V2 Lizenz für jeden zu nutzen.

github.com/codecare/waitformore

Warteschlangen vermeiden

Momentan möchte niemand in einer Schlange stehen. Daher haben wir bei codecare eine Wartenummern App gebaut. Sie kann kostenlos und ohne Registrierung verwendet werden - derzeit noch Beta.

wartewarte.de

Wir freuen uns über Rückmeldungen!

Cool Tools: Eine Million Datenpunkte visualisieren?

Bei einer Auswertung von Laufzeit-Messpunkten sind bei mir 1.000.000 Datenpunkte in 26 Clustern aufgelaufen. Damit begann die Suche, wie ich sie diese einfach auswerte.

Als Lösung bin ich auf die freie plot.ly JavaScript Bibliothek gekommen (https://plot.ly/javascript/) . Mit wenigen Zeilen Code war die Visualisierung fertig. Alles wird komplett im Browser gerechnet, der braucht etwa 3 Sekunden dafür.

Plot.ly is eindeutig ein cool tool