IncidArch-Blog

Review & Code-Analyse

Review 👀

Uns ist es leider nicht möglich gewesen ein Review-GesprÀch zu organisieren, stattdessen haben wir textuell eine offene Fragerunde auf Discord gestartet, wo unter anderem Interessant gewesen ist:

  1. Ist allen klar welche Komponenten & Dateien welche Funktion einnehmen?
  2. Ist das Vorgehen nach SOLID in React klar?
  3. Ist die beilÀufige, technische Dokumentation in READMEs & Kommentaren ausreichend?
  4. Ist unser Code wartbar? Folgen wir (strikt) der definierten Atomic-Architektur?
  5. ErfĂŒllt der Code die nicht-funktionalen Anforderungen?
  6. Was kann man im Projektmanagement wie besser machen?

Das Ergebnis, also die individuellen Antworten auf diese Frage fassen sich wie folgt zusammen:

1. Ist allen klar welche Komponenten & Dateien welche Funktion einnehmen?

Es ist ein Fakt, dass mehrere Verzeichnisse in unserem Repository existieren.
Diese Verzeichnisse enthalten verschiedene .ts-Dateien und diese eine und mehr Funktionen.
Der letzte Punkt ĂŒber 1:n Relation auf mehrere Funktionen in einer Datei ist als Verbesserungsvorschlag hervorgegangen, dass eine .ts-Datei möglichst wenig unabhĂ€ngige Funktionen enthalten soll. Dieser Vorschlag wird durch das Single Responsibility Prinzip gestĂŒtzt.

2. Ist das Vorgehen nach SOLID in React klar?

Die SOLID-Prinzipien sind allen soweit bekannt und der Bezug auf React (Native) ist klargestellt. Genaue Implementierungsweisen sind teilweise unklar, was nicht zuletzt React selbst geschuldet ist, wonach Hooks nur in einem bestimmten (React-)Kontext verwendet werden dĂŒrfen.
Dennoch sind besonders die Single Responsibility und Dependency Inversion allseits angewandte Best-Practices.

3. Ist die beilÀufige, technische Dokumentation in READMEs & Kommentaren ausreichend?

Gute Dokumentation lebt und im Fokus der Problemlösung & Feature-Implementierung rĂŒckt die Dokumentation gerne in den Hintergrund. README.md-Dateien existieren in manchen Verzeichnissen, sind jedoch hĂ€ufig einmalige Produktionen. Hier ist es wĂŒnschenswert die Dokumentation soweit zu beleben, dass diese mit dem Projektfortschritt mithalten.

4. Ist unser Code wartbar?

Die Antwort im Team ist »ja«, unser Code ist wartbar, da wir uns auf allgemeine, wie spezielle Best-Practices stĂŒtzen. Diese Aussage gilt universell fĂŒr unser React-Native Front-End, sowie unser Backend mit seinen Edge-Functions und PostgreSQL.

Hinsichtlich der Einhaltung der definierten Atomic-Architektur im Front-End mĂŒssen wir jedoch einrĂ€umen, dass wir aufgrund des Zeitdrucks gegen Ende des Projekts dieseOrdnung etwas vernachlĂ€ssigt haben und viele Komponenten in einer Datei getestet und geschrieben worden und spĂ€ter nicht aufgeteilt worden sind. Hier steht uns in Zukunft ein Refactor bevor, um eine striktere Einhaltung der Architekturprinzipien sicherzustellen und um unsere Code-Duplikations-Metrik im Sinne einer besseren Wartbarkeit gering zu halten.

5. ErfĂŒllt der Code die nicht-funktionalen Anforderungen?

Im Bereich der nicht-funktionalen AbhĂ€ngigkeiten sind wir in der Umsetzung vor allem an der Front der Sicherheit gut gerĂŒstet. Infrastrukturell ist das Backend ausschließlich ĂŒber HTTPS erreichbar, wobei alle Datenbankzugriffe ĂŒber restriktive (manuell) getestete RLS-Policies auf den aktuellen Benutzer und dessen CRUD-Freigabe beschrĂ€nkt werden. Infolge der Entscheidung zu Beginn des 4. Semesters, das Projekt-Ziel auf das Front-End zu fixieren und das Backend zu vereinfachen, können wir mit der Umstellung auf Supabase zugleich auf einen eigenen Controller verzichten. Etwaige GeschĂ€ftslogik, wie die Organisations-Initialisierung werden ĂŒber TypeScript-Edge-Functions abgebildet. Durch die Verwendung von Deno und dem Vorkompilieren von TS-Code reagieren die Endpunkte selbst bei einem Kaltstart ohne ĂŒberflĂŒssige Verzögerungen.

6. Was kann man im Projektmanagement wie besser machen?

Ein Hauptproblem war die mangelnde Erfahrung im Bereich der Projektbeschreibung und Zielsetzung fĂŒr ein komplett neues Projekt in diesem Umfang. Wir haben uns zu viele Funktionen fĂŒr die Version 1.0 vorgenommen. Ein besserer Ansatz wĂ€re gewesen, sich von Anfang an auf die Grundkonzepte zu konzentrieren und zusĂ€tzliche Features fĂŒr spĂ€tere Versionen zu planen. Durch eine Fokussierung auf die BasisfunktionalitĂ€ten hĂ€tte das Projekt wahrscheinlich innerhalb des vorgesehenen Zeitrahmens abgeschlossen werden können.

Diese FehleinschĂ€tzung fĂŒhrte dazu, dass wir zu Beginn des vierten Semesters das aktuelle Projekt zu 80 % verwerfen mussten und noch einmal von vorn anfangen mussten. Dies hat uns wertvolle Zeit und Ressourcen gekostet.

Genauso mĂŒssen wir KrankheitsausfĂ€llen BerĂŒcksichtigung schenken.
Diese unvorhergesehenen AusfĂ€lle haben gelegentlich zu zeitlichen Problemen gefĂŒhrt.

In Zukunft sollten wir Pufferzeiten in unseren ZeitplÀnen einplanen
und eventuell Vertretungsregelungen festlegen, um solche EngpÀsse besser abzufangen.
Das kann die Resilienz des Teams erhöhen und sicherstellen,
dass der Projektfortschritt nicht durch einzelne AusfÀlle gefÀhrdet wird.

Des Weiteren sind regelmĂ€ĂŸige Meetings und eine offene Kommunikationskultur förderlich,
um alle Teammitglieder auf dem gleichen Stand zu halten und MissverstÀndnisse zu vermeiden.

Obwohl bereits ein Kanban-Board verwendet wird, kann die Implementierung zusÀtzlicher, agiler Praktiken (scrum ceremonies) die Effizienz und FlexibilitÀt des Teams weiter steigern.

Insbesondere sollten ausfĂŒhrliche und verpflichtende Sprint-Planungen und regelmĂ€ĂŸige Jour-Fixe eingefĂŒhrt werden.

Aus der Projektmanagement-Sicht haben wir zusammengefasst gefolgert,
dass die folgenden Punkte höher priorisiert werden mĂŒssen:

Code-Analyse mit SonarQube đŸȘŒ

Besser spÀt als nie, nun zum 18. Blogbeitrag hier die Ergebnisse unserer ersten statischen Code-Analyse mit SonarQube und dem SonarScanner:

SonarQube-Score

Grob zusammengefasst sagt der Score aus, dass unsere Code-QualitĂ€t einen akzeptablen Zustand erreicht hat. Zwei der angegebenen “Security-Hotspots” entstehen aus einer Test-Datei zu der RegisterComponent.ts, da diese bei Beginn in die Auswertung gerutscht ist, weshalb SonarQube hier fĂ€lschlicherweise zwei High priority potentially hardcoded credential angibt.

Eine weitere tritt in der HomeScreen.tsx Datei auf, wo wir bis dato noch Zufallszahlen als Statistik-Werte verwenden, wobei SonarCube diese mit einem pseudorandom number Fehler unter Medium priority versieht.

Der einzig ernst zu nehmende Security-Hotspot mit low priority scheinen somit die Wildcard-CORS Angabe der Backend-Funktionen, sowie die Auto-Generierten Berechtigungs-Anfragen von Expo im Android-Kontext zu sein, bei letzterem werden Berechtigungen fĂŒr WRITE_EXTERNAL_STORAGE und RECORD_AUDIO angefragt, zumal wir maximal fĂŒr ersteres im Storage-Kontext einen nutzen haben.

Die Code-Smells bewegen sich grĂ¶ĂŸtenteils im Minor-Bereich, dennoch haben wir 8 kritische Code Smells, wobei fĂŒnf auf noch nicht implementierte, aber deklarierte Funktionen zurĂŒckzufĂŒhren sind, sowie zwei durchzufĂŒhrende Refactors zwecks zu hoher KomplexitĂ€t der Funktionen und eine bezĂŒglich eines Duplikats in einer TS-Typendeklaration, die wohl durch den Linter nicht dedupliziert worden ist.

Da diese Probleme fĂŒr uns vorerst keine PrioritĂ€t haben und diese unsere Demo nicht weiter einschrĂ€nken oder im Endeffekt unsicherer machen, ist es dennoch gut ĂŒber deren Existenz informiert zu sein, um in Zukunft mögliche Maßnahmen treffen zu können.


Letzte Woche: Neue Woche: Fortschritte und Optimierungen

NĂ€chste Woche: Handout