Redmine 5.1 auf FreeBSD

Obwohl es bereits Redmine 6.0.1 zum jetzigen Zeitpunkt gibt, haben wir unter FreeBSD bisher leider “nur” Version 5.1 zur Verfügung. Allerdings gab es auch eine ganze Weile lang keine lauffähige Redmine-Version für FreeBSD in den Packages und Ports.

Ich habe Version 5.1 testweise in einer VM installiert und es funktionierte problemlos. Letztlich kann man nach dieser Anleitung vorgehen:

Ich freue mich darüber, dass es funktioniert und wir Redmine weiterhin unter FreeBSD nutzen können und hoffe, dass es bald auch eine aktuellere Version gibt.

Sprechende Namen oder: Code-Qualität

Da es in einem meiner letzten Projekte vorkam und sich jetzt auch öfter wiederholt hat, möchte ich einmal dazu etwas schreiben. Das Thema ist „Programmieren“.

Beim Programmieren in einer der meisten gängigen Programmier- oder Scriptsprachen schreibt man Quellcode. Dieser Quellcode ruft oftmals Prozeduren oder Funktionen auf, die mit den Bibliotheken beim Compiler mitkommen. Der Programmierer schreibt aber auch eigene. Dabei geht es mir um diese Themen:

  • Verzeichnis- und Dateihierarchie
  • Benamung von Dateien
  • Benamung von Codebestandteilen
    • Funktionen
    • Prozeduren
    • Klassen/Interfaces
    • Variablen
    • Konstanten

Mir ist oft aufgefallen, dass diesen Themen oftmals nur ungenügend Aufmerksamkeit geschenkt wird, dabei ist das, meiner Meinung nach, unglaublich wichtig, wenn

  • Der Code gewartet werden soll über Jahre oder Dekaden
  • Andere den Code verstehen sollen
  • Andere den Code ändern oder erweitern sollen
  • Andere den Code portieren sollen
  • Es keine ausreichende Dokumentation gibt

Ein Beispiel. Wir haben eine Funktion, die sieht selbst so aus und hat folgenden Inhalt:

int ab_ad_nmb_re(int pab, int p_ab, bool ab) { 
    int pab_list; 
    char *pa; 
    … 
}

Da gibt es mehrere Probleme:

  1. Der Funktionsname besteht aus etlichen Abkürzungen, die ein anderer nicht kennt, nachschlagen und sich merken muss. Oder immer wieder nachschlagen muss. Dementsprechend nichtssagend ist der Name
  2. Die Variablen heißen alle fast gleich, sind nichtssagend und unglaublich verwirrend

Oftmals, von mehreren unterschiedlichen Leuten, höre ich dann folgende Argumente:

  • Ich weiß ja, was das alles heißt
  • Du kommst da schon irgendwann rein
  • Wir können doch keine aussagekräftigen Namen nehmen, da das dann zu lang ist und dann bringt das auch keinem was

Ehrlicherweise muss ich da sagen: Nein. Ich nehme (s. GitHub) halbwegs aussagekräftige Namen (manchmal, selten, auch mal nicht, das sollte so aber nicht sein). Sie sagen aus, was sie machen, man braucht keine oder wenig Dokumentation und auch andere sind schnell eingearbeitet und können Änderungen vornehmen.

Bezüglich langer Namen: Jeder halbwegs taugliche Editor zum Programmieren bietet Autovervollständigung. Selbst VIM bringt im Standard bereits eine kontextlose Autovervollständigung mit, die ich gerne benutze: [Strg]+[p/n]. Damit sind längere Namen kein Problem mehr, da nur der oder ein paar Anfangsbuchstaben getippt werden müssen.

Das hat viele Vorteile:

  • Der Code wird lesbarer
  • Andere können sich viel schneller einarbeiten
  • Der Code selbst ist Dokumentation

Mein altes Projekte Warehouse nutzt solche Namen an den meisten Stellen. Das Projekt ist von 2009 und wurde mit VIM umgesetzt. Aber schaut euch auch Frameworks an, die Methodennamen mit vernünftiger Benamung haben wie Qt, wxWidgets, Java-SDK, uvm.

Ich kann nur empfehlen, lieber den Code etwas aussagekräftiger zu gestalten, denn meiner Meinung nach zahlt sich das schnell aus. Speicher ist günstig, da machen die paar Bytes den Kohl auch nicht fett.

Bald neue Videos

Viele haben mir geschrieben, dass ich doch weitere Videos bzw. Tutorials machen soll. Das freut mich sehr.

Zur Zeit nimmt mich die neue Arbeitstelle und meine Familie gut ein, ich habe aber schon die nächsten Videos geplant (Themen: wxWidgets, Qt und auch FreeBSD) und freue mich, sie bald machen und veröffentlichen zu können. Es dauert allerdings noch ein paar Tage. Aber: Es wird mit den Tutorials weiter gehen.

Wenn ihr Vorschläge für bestimmte Themen habt, gerne her damit.

compow als Privatprojekt in Form einer Referenz wieder online

Eines meiner Projekte, dass ich vor wenigen Jahren gemacht hatte, lag noch auf meiner Festplatte und war bereits lange nicht mehr aktiv. Ich dachte mir allerdings, dass ich das noch einmal gerne als Referenz von mir online stellen wollte: compow.

Bei compow handelt es sich um eine Website, auf der sich Firmen vorstellen können und Stellenanzeigen schalten können. Ursprünglich war das mal kostenpflichtig, was ich aber herausgenommen habe, da ich nicht selbständig bin und damit kein Geld verdiene, es ist lediglich eine meiner Referenzen.

Das Interessante an der Website ist der Tech-Stack, denn anstelle einer der üblichen Webprogrammiersprachen wie Ruby, PHP, Python, Go, ASP.NET (keine Sprache, aber ihr wisst, was ich meine), basiert diese Website auf folgenden Technologien:

Wie gesagt, die Seite dient einfach nur als Referenz, womit ich mich in den letzten Jahren beschäftigte. Die Website ist nicht weiterentwickelt und wird es mitunter auch nicht.

KITA-Apps: Kita-Info-App, clivver und Co. – Wir müssen reden

Disclaimer: Ich schreibe hier privat meine Meinung. Ich behaupte nicht, dass irgendeine App unsicher ist, Datenhandel betreibt, unseriös ist usw. Dies ist meine private Meinung.

Es muss vor ungefähr zwei Jahren gewesen sein (vielleicht länger, vielleicht kürzer), als unser damaliger Kindergarten die Kita-Info-App einführte. Ich sah mir die Software an und war direkt davon überzeugt: Nein, das sieht nicht gut aus (Sicherheit, Datenerhebung, Qualität, usw.): wir machen da nicht mit. Meine Frau war gleicher Meinung. Wir hatten dann ein Gespräch mit der Kita-Leitung und erläuterten unsere Bedenken. Wir wurden an die nächste höhere Stelle verwiesen, die unsere Bedenken für grundlos hielt. Naja: https://www.heise.de/news/Datenleck-bei-beliebter-KiTa-App-Stay-Informed-9662578.html

Wir waren umgezogen, neuer Kindergarten, keine App, also alles super. Dann wurde vor ein paar Wochen mit clivver eine neue Kita-App eingeführt und wieder schaute ich mir die an. Ich wurde hellhörig, als ich sah, welche Informationen die App für die Nutzung vom Hersteller haben möchte (Stand 26.03.2024):

  • Vorname
  • Nachname
  • Mobilfunknummer
  • Device-ID: Android ID / Identifier for Vendor
  • Zeitpunkt der Registrierung
  • Vorname des Kindes
  • Meldungen zu einem Kind / sich selbst
  • Zeitpunkt des Öffnens einer Nachricht

Da wurde mir bereits schlecht und es stimmt nicht, denn die App benötigt noch eine weitere Information, die anscheinend bereits erhoben und auf den Servern gespeichert wurde: Das Geburtsdatum des Kindes.

Bis auf “Zeitpunkt der Registrierung” (aus statistischen Gründen oder zur späteren Löschung bei Inaktivität) kann ich alle weiteren erhobenen Daten der Eltern und des Kindes nicht nachvollziehen. Über die App werden verschiedene Informationen ausgetauscht:

  • Nachrichten an alle/Gruppen
  • an Personal
  • Umfragen
  • Kalendereinträge
  • Krankmeldungen
  • Zuhause-Info (mein Kind bleibt heute zu Hause)
  • Mittagsessen-Info (mein Kind isst mit und was es isst)
  • Kommentare

Weiterhin hörte ich, ob es stimmt, weiß ich nicht, dass bsplw. Bilder, die Kinder gemalt haben oder Bilder von Gebasteltem darin verschickt werden.

Als Techniker im Allgemeinen und letztlich auch sowas wie “Digital Native” im Engeren finde ich eine solche App erstmal super. Aber nur, wenn sie vernünftig gemacht ist.

Was ich damit meine: Warum werden diese Daten erhoben und warum ist nicht alles anonymisiert? Welchen Zweck hat für den Austausch mein Name, das Geburtsdatum meines Kindes, meine Device-ID, usw.?

Ich wollte es mir nicht nehmen lassen und schrieb an den Entwickler der App, seines Zeichens ehemaliger Journalist, ein paar Fragen:

Sehr geehrte Damen und Herren,

unsere Kita setzt ab jetzt clivver ein. Bevor ich den seitenlangen “Datenschutzbestimmungen” zustimme, habe ich doch ein paar Fragen:

  1. Wo werden die personenbezogenen Daten gespeichert?
  2. Wie sind die personenbezogenen Daten verschlüsselt?
  3. Wer hat Zugriff auf die personenbezogenen Daten?
  4. Wozu wird die Telefonnummer gebraucht?
  5. Wozu wird das Geburtsdatum des Kindes benötigt?
  6. Ist die Kommunikation Ende-zu-Ende verschlüsselt?
  7. Wie werden Backups angelegt, sind diese verschlüsselt und
    wer hat Zugriff?
  8. Werden nach dem Löschen des Accounts auch alle Daten aus
    dem Backupbestand restlos entfernt?
  9. Welche Daten werden in der Cloud (Firebase) gespeichert,
    wo liegen diese Daten und wer hat Zugriff darauf und werden
    die Daten seitens Google weiterverwendet?
  10. Die erstellende und betreibende Firma sieht nach einer
    Privatperson aus, die im journalistischen Umfeld tätig
    ist (Sascha Müller-Jänsch). Gibt es im Unternehmen eine
    technische Abteilung, die die Expertise hat, eine solche
    Software sicherheitstechnisch zu betreiben?
  11. Warum werden die Daten nicht vollständig anonymisiert? Weder
    die Eltern noch die Kinder erhalten eine Rechnung, damit werden
    die Daten letztendlich nicht benötigt. Mich interessiert, warum
    diese dann erhoben werden, da ja die Kita die Rechnungen be-
    gleicht.
  12. Wir haben Zettel erhalten, auf denen unsere Namen sowie der Name
    unseres Kindes vermerkt sind und es findet ein Matching in der App
    für das Geburtsdatum des Kindes statt. Wo sind meine persönlichen
    Daten und die meines Kindes jetzt bereits (vor Registrierung) ge-
    speichert und wer hat mein Einverständnis zu dieser Speicherung
    gegeben?

Vielen Dank für die Beantwortung der Fragen und mit freundlichen Grüßen

Thorsten Geppert

E-Mail vom 28.02.2024

Ich bekam auch eine, für mich sehr schwammige, Antwort. Ich fragte nach, ob ich aus dieser Antwort zitieren dürfte. Das wurde abgelehnt. Wie die Antwort aussah, möchte ich aus einem Gedankenprotokoll anhand eines Beispiels klar machen:

Die Frage: “Wie sind die personenbezogenen Daten verschlüsselt?” – Die Antwort: “Ja, sie sind verschlüsselt.”

Da ich nicht aus der Antwort zitieren darf, möchte ich da auch nicht weiter drauf eingehen und respektiere den Wunsch (und kann ihn an der Stelle auch absolut nachvollziehen…).

Verstehen konnte ich auch nicht die Antwort der nächst höheren Stelle der Kita, die von einem Mitglied des Eltenrbeirats angeschrieben wurde. Ich habe gefragt, ob ich diese E-Mail zitieren darf. Die Antwort kam spät, war aber ein Nein. Ich möchte das aber dennoch ohne O-Ton zusammenfassen, zumindest zwei Punkte:

  • Wenn der Hersteller zusichert, dass die Software DSGVO-konform betrieben wird, dann ist das so
  • Wir müssen mit Sicherheitslücken und auch damit, dass wir Opfer werden können, leben, wichtig sei nur, dass diese Mängel schnell beseitigt werden

Also interpretiere ich das so: Wenn Ihre Daten und die sensiblen Daten Ihres Kindes geleakt werden, dann ist das ok, da sie ja DSGVO-konform geleakt sind und der Mangel sicher bald schnell beseitigt wird…

Allerdings wurde noch mitgeteilt, dass wenn wir Datenschutzverletzungen feststellen, wir diese melden können und sie denen nachgehen würden.

In der E-Mail-Antwort der höheren Stelle wurde mir aber mitgeteilt, ich würde seine/ihre Worte nicht richtig interpretieren. Eine Relativierung der Problematiken wäre es damit nicht, sondern im Gegenteil. Dann kam direkt der Satz, dass ich aber die E-Mail nicht zitieren darf, um weitere Missverständnisse zu vermeiden.

Bevor ich noch auf ein wenig Technik komme, mal einen Gedankenanreiz für die, die meinen, dass es sich hier nicht um sensible Daten “Schutzbefohlener” handelt. Bei einem Datenleak könnten die Daten von Ihnen und Ihrem Kind veröffentlicht werden:

  • Der jenige kennt den Namen von Ihnen und Ihrem Kind
  • Er kennt auch Ihre eindeutige Telefonnummer
  • Er weiß, wann Ihr Kind krank war und wie häufig, kann mitunter Rückschlüsse auf chronische Probleme ziehen
  • Er weiß, wann Ihr Kind in den Kindergarten geht
  • Er weiß vielleicht, wenn das mit den oben erwähnte Bildern stimmt, mitunter welchen kognitiven Zustand ihr hat, vor allem in Kombination mit dem Geburtsdatum (Es malt weiter unter der Alterserwartung… usw.)
  • Er kann Rückschlüsse auf Nahrungsunverträglichkeiten ziehen

Es lässt sich ein detailiertes Profil Ihres Kindes und teils Ihrer Familiensituation feststellen (Kind wird mittags geholt, sprich, Sie oder Ihr Partner arbeiten nur halbtags…).

Das wäre meiner Meinung nicht nötig, wenn man diese Daten nicht erhebt, bsplw. wenn das Kind nur eine Nummer ist und keine persönlichen Daten dazu getauscht werden und die Zuordnung zum Kind ausschließlich in der KITA erfolgt. Dann wäre ein Datenleak nicht ganz so schlimm. Das ist hier aber nicht der Fall.

Kommen wir zu etwas technischem, aber ich gehe da nicht in die Tiefe, da mir hier die Zeit zu fehlt. Wenn man sich die Website des Entwicklers ansieht, dann sieht man, dass dieser das Portal “Kita im Blick” betreibt. Wenn man dort eine Bestellung aufgeben will, kann man sowas machen:

Das wird auch so in den Warenkorb übernommen:

Schaut man sich dann noch diese (von mir manipulierte) URL an: https://www.kitaimblick.com/kib/beta/public/auth/loginxxx stellt man zwei Dinge fest:

  • In der URL erscheint das Wort “beta”, was auch immer das (rechtlich) bedeuten mag
  • Es erscheint eine Fehlermeldung, in der sogar absolute Dateipfade sichtbar sind

Wenn wir uns dann noch ein nmap auf diesem Server ansehen, bekommen wir:

Dass bsplw. PostgreSQL und MySQL nach außen offen sind, muss nichts bedeuten, gibt aber ein ungutes Gefühl. Wir wissen nicht, ob dort Ihre Daten liegen und wie weit die gesichert sind.

Das war nur an der Oberfläche gekratzt und meine Frau und ich haben entschieden: wir machen bei clivver nicht mit, unsere Entscheidung. Mir fehlt leider die Zeit, da tiefer zu gehen.

Was ich aber gerne raten möchte ist: Hinterfragen Sie immer, warum gewisse Daten erhoben werden. Überlegen Sie, ob sie notwendig sind und wenn Sie auch nur ein minimales ungutes Gefühl haben, lassen Sie es lieber.

Noch einmal: ich rate auf keinen Fall von solchen Apps ab, ich sage nicht, dass sie unsicher sind, Datenlücken haben oder Datenhandel damit betrieben wird.

Affinity Produkte in Version 1.x stürzen beim Starten unter macOS Sonoma ab

Wer wie ich gerne die Produkte von Affinity nutzt, also

hat mitunter nach dem Upgrade auf macOS Sonoma das Problem, dass diese direkt beim Start abstürzen.

Affinity Photo Screenshot

Auf dieser Website “https://forum.affinity.serif.com/index.php?/topic/192499-known-issue-affinity-v1-apps-crash-on-launch-when-using-intelrosetta-on-macos-sonoma-with-light-ui-style/” wird das Problem auch beschrieben und gelöst. Es liegt wohl an einem Problem des eingstellten UI-Stiels. Sofern dieser auf “Light UI” eingestellt ist, stürzt die Software ab. Das könnte auch der Grund dafür sein, dass das Programm auf meinem anderen Mac funktioniert, denn dort ist das Default-UI eingestellt, weswegen ich verwundert war.

Das Problem ist laut Website einfach zu lösen, bei mir hat es direkt funktioniert:

  1. Terminal öffnen
  2. Alte Konfigurationen löschen
    • defaults delete com.seriflabs.affinityphoto (base)
    • defaults delete com.seriflabs.affinitydesigner (base)
    • defaults delete com.seriflabs.affinitypublisher
  3. Affinity Produkte starten

Mini-Kurztipp: LLVM für Windows

Ein wenig peinlich, aber vielleicht geht es dem ein oder anderem Benutzer unixoider Betriebssysteme genauso: auf FreeBSD nutze ich clang(++), auf macOS auch. Auf Linux kann ich das auch. Ich habe jetzt erst bemerkt, dass es auch auf Windows geht. Und noch mehr: die Libs, die am Ende herausfallen, sind mit denen von Visual Studio kompatibel.

LLVM (clang++) auf Windows

Wer es ausprobieren möchte, findet die Downloads hier.

Ein paar Gedanken: Ist statische Code-Analyse und Code-Coverage ein Garant für guten Code und gute Software?

In den letzten Wochen setzte ich mich mit verschiedenen Werkzeugen zur Verbesserung meines Codes und dem Code anderer auseinander. Teilweise laß und hörte ich, dass durch statische Code-Analyse sowie Code-Coverage, einfach gesagt, der eigene Code und die eigene Software besser wird. Dabei hatte ich ein flaues Gefühl im Magen.

Ich sah mir also folgende Dinge an: SonarQube für die statische Analyse von Quellcode, Google-Test mit gcov beziehungsweise llvm-cov für Code-Coverage, aber auch zusätzlich clang-format und clang-tidy, um einheitliche Codeformatierung hinzubekommen und bereits Warnings zur Bearbeitungszeit zu Problemen in meinem Code. Dies versuchte ich mittels VIM und ALE abzudecken, wobei es da zu größeren, bisher ungelösten Problemen kam.

SonarQube

SonarQube gibt es in verschiedenen Lizensierungsmodellen. Neben der Community-Edition, die nur wenige Programmier- und Auszeichnungssprachen beherrscht, gibt es beispielsweise auch die Developer-Edition, die einige mehr kann. Meine Erfahrungen habe ich mit C++-Code versucht, zu machen. Dementsprechend kommt man um die Developer-Edition nicht herum. Diese ist kostenpflichtig und wird nach zu analysierenden Zeilen von Code gezahlt. Das kann schnell teuer werden, zum jetzigen Zeitpunkt, Oktober 2023, kostet das System 150 USD für 100.000 Zeilen Quellcode pro Jahr. SonarQube unterteilt sich in unterschiedliche Programme, sofern man es für C++ (und C und Objective-C) einsetzt: Die Website, auf der die Ergebnisse illustriert werden, den build-wrapper, der aber auch durch compiledb ersetzt werden kann und den sonar-scaner. Die SonarQube-Werkzeuge sind in Java geschrieben und bringen ihr eigenes JRE mit, können aber auch mit einem anderen genutzt werden. Hier ist Vorsicht geboten, sind die Scripte, die die SonarQube-Komponenten aufrufen, in der Shebang doch fest auf /bin/bash gestellt, was auf verschiedenen Betriebssystemen zu Problemen führen kann.

Nicht jedes jedes System wird mit allen Tools unterstützt. Beispielsweise wird macOS arm64 nicht vom build-wrapper unterstützt, so dass man schlussendlich auf compiledb ausweichen muss. Das impliziert: verschiedene Architekturen, verschiedene Tools. Darum soll es hier aber nicht gehen.

Der Vorgang ist folgender: nachdem SonarQube installiert und initial konfiguriert wurde, erstellt man sein erstes eigenes Projekt und erhält einen Token, den man dann beim sonar-scanner entweder auf der Kommandozeile übergibt oder in die SonarQube-Konfiguration einträgt. Dann lässt man sein Make-System einmal mit dem build-wrapper oder compiledb durchlaufen, damit SonarQube weitere Informationen erhält. Zum Schluß wird der sonar-scanner gestartet, der dann die Code-Analyse durchführt, das Coverage verarbeitet, das aber durch andere Tools vorher erstellt werden muss, und die Ergebnisse ins Internet schiebt, so dass sie auf der Website erscheinen.

So, wie ich das verstanden habe, besteht die Analyse aus verschiedenen Teilbereichen. Es wird teils nach echten Bugs geschaut, teils nach sogennanten Code-Smells. SonarQube erkannte tatsächlich sowas:

auto *x = new y();
if (x) {
    //
} else {
    x->method();
}

Aber auch sowas:

const int x = 10;
return x == 10 ? a : b;

SonarQube stufte diese Fehler als Bugs ein und markierte sie als kritisch, was auch gut war. Womit ich nicht zufrieden war, war die Kategorisierung der anderen Regeln. Dies lässt sich in der Konfiguration zwar abändern, aber ich gebe diese zwei Beispiele trotzdem. Bei beiden geht es um sogenannte Code-Smells. Dabei handelt es sich um Code-Konventionen, die keine Bugs sind, sondern dem in SonarQube eingestellten Regelwerk unterliegen und gefixt werden sollten. Im ersten Fall gilt eine Einrückungstiefe innerhalb von Kontrollstrukturen tiefer als drei als kritisch:

if (true) {
    if (true) {
        if (true) {
            if (true) {
            }
        }
    }
}

Im Gegensatz dazu wurde folgender Code “nur” als Major eingestuft, obwohl er meiner Meinung nach kritisch sein sollte:

int var = 10;
if (true)
    int var = 5;

Man sieht klar, dass das Regelwerk für jeden Programmierer oder jedes Projekt oder jedes Team innerhalb verschiedener Konstellationen angepasst werden muss.

Aber kommen wir zur wichtigen Frage: wird mein Code und/oder meine Software durch den Einsatz von statischer Code-Analyse, wie mit SonarQube, automatisch gut?

Meine Antwort darauf ist nein. Das Positive war, dass SonarQube im Projekt zwei potentielle Bugs gefunden hat, das meiste Andere war eher kosmetischer Natur. Dabei kennt SonarQube keinen Kontext. Es prüft nicht, ob Abläufe richtig sind, ob externe Bibliotheken mit hineinspielen, ob Toolkits bestimmte Voraussetzungen haben, an die man sich halten muss und es prüft natürlich auch nicht die Logik oder Algorithmen. Weiterhin verpflichtet SonarQube nicht. Mittels // NOSONAR direkt im Code schaltet man alle Prüfungen für die Zeile ab. Je nach Situation macht das durchaus Sinn, kann aber natürlich auch vom “faulen” Programmierer missbraucht werden.

Ein anderes Problem ist, dass je nach Regelwerk der Code komplexer und auch schwieriger zu lesen wird und der Programmierer mitunter beginnt, an diesem Regelwerk vorbeizuarbeiten. Je nach Firma und Verständnis ist die Übersichtseite (z.B. im Falle von SonarQube) natürlich gut für jeden einsehbar und auch Entscheidungsträger können hier anhand von roten, gelben und grünen Symbolen auf die vermeintliche Qualität der Software schielen und Mitarbeiter dementsprechend beurteilen. Somit könnte der Programmierer natürlich versuchen, gewisse, nervende Regeln zu umgehen. Ein Beispiel: In SonarQube dürfen Klassen aus nicht mehr als 35 Methoden und 20 Membern bestehen. Spätestens bei GUIs kann das schnell zum Problem werden. Diese Klassen dann aufzusplitten, erhöht den Aufwand, die Komplexität und bietet aber mitunter keinen vernünftigen Nutzwert. In diesem Fall könnte der Programmierer beginnen – bei C++ – mit inneren Klassen und/oder Structs zu arbeiten, um dieser Problematik zu entgehen, da er sicher nicht die gesamte GUI-Datei in der Konfiguration ausklammern möchte. Dabei könnte dann folgendes herauskommen:

class MyGUI : public GUI {

public:
    struct UI {
        Button b0;
        Button b1;
    };
    UI ui;

};

Das stimmt SonarQube an der Stelle glücklich. Wie man aber sieht, wird der Code selbst umfangreicher.

Die Qualität kann zunehmen, muss sie aber nicht. Für mich ist an der Stelle statische Codeanalyse ein Werkzeug für mich, aber absolut kein Garant für guten Code, noch für gute Software.

Code-Coverage

Code-Coverage ist vom Wording meiner Meinung nach nicht ganz korrekt. Test-Code-Coverage oder ähnlich sollte es eher immer heißen.

Damit ist gemeint, dass mit Testszenarien (Unit-Tests, Intergrations-Tests, …) eine gewisse Menge Code getestet wird, also abgedeckt ist. Nimmt man hier als Beispiel gcov, ist es recht einfach. Man kompiliert sein Programm mit –coverage und führt es aus. Beim Kompilieren und Ausführen werden verschiedene Parameter gesammelt. Wichtig hier ist, welche Zeile im Code aufgerufen wird. Wird sie mindestens einmal aufgerufen, gilt sie als abgedeckt.

Hier sieht man, dass mitunter Funktionen oder Methoden selbst nicht explizit aufgerufen werden, sondern implizit und dennoch gelten sie als gecovert. Auch sagt Code-Coverage nichts darüber aus, wie sinnvoll ein Test ist, ob es nicht noch weitere Tests geben müsste, ob wirklich alles getestet ist und damit, ob die Qualität der eigenen Software verbessert wurde.

Noch ein Wort zu Formattern und Lintern

Beide Teile, also Formatter und Linter, sind spätestens im Team natürlich durchaus praktisch. Der Linter zeigt an, wo es noch Probleme bei Konventionen im Code geben könnte. Hier funktioniert clang-tidy recht gut. Der Formatter formatiert den Code so, dass er für alle gleich ist. Sprich, er achtet auf Einrückungen und ähnliches.

Fazit

Also, was denke ich? Wenn man diese Programme nutzt, als das, was sie sind, können sie dem Programmierer durchaus nützlich sein. Selbst, wenn man aus verschiedenen Gründen nicht alle Regeln einhalten kann oder möchte, regen sie doch zum Nachdenken an. Aber sie sichern selbst nicht die Qualität des Codes. Das muss der Entwickler selbst tun, wobei es sich hier um einen iterativen Prozess handeln kann.

Diese Tools dürfen aber niemals zum Einsatz gegen den Programmierer genutzt werden, sondern bei Problemen sollte dieser immer erst befragt werden.