Sourcecode Review Criteria

05 November 2013 - .NET, C#, Project Management, Visual Studio

Auto-translate this article in English using Google Translate.

Ich werde regelmäßig von Kunden engagiert, um Reviews für Softwareentwicklungsprojekte speziell in Verbindung mit Microsoft-Technologie durchzuführen. Im Lauf der Jahre habe ich meine persönliche Checkliste erarbeitet. In diesem Blogartikel möchte ich eine Zusammenfassung der Checkliste zeigen. Die Detailfragestellungen in der Checkliste sind nur einige Beispiele. Jedes Kundenprojekt ist anders - man muss sie auf jeden Fall je nach Situation anpassen und erweitern. Fehlt etwas? Kommentare? Ich freue mich über Feedback im Kommentarbereich unten.

Hinweis: Kundenspezifisch angepasste Versionen dieser Review-Checkliste verwende ich für reine Code Reviews. Für Architektur-Reviews habe ich andere Checklisten.

  1. Sourcecode-Review
    1. Automatische Qualitätsprüfung
      1. Kompiliert der Sourcecode fehlerfrei?
      2. Kompiliert der Sourcecode ohne Compiler-Warnungen?
      3. Gibt es auffällige Warnungen von Visual Studio Code Analysis (Analyse IL-Code)?
      4. Gibt es auffällige Warnungen von Quellcodeanalysetools (z.B. StyleCop, JSLint, JSHint, etc.)?
    2. Manuelle Qualitätsprüfung
      1. Werden die von Microsoft ausgegebenen Richtlinien für Framework Design eingehalten (siehe z.B. Framework Design Guidelines)? Beispielkriterien:
        1. Sinnvolle Namensvergabe
        2. Exception Handling
        3. Memory Management (z.B. IDisposable)
        4. Einhaltung von best Practices in Sachen Klassendesign
        5. Etc.
      2. Ist der Code sinnvoll dokumentiert (C# Codedokumentation, Dokumentation in längeren Methode, etc.)?
        1. Wird API Dokumentation aus der Codedokumentation generiert (z.B. Sandcastle)?
      3. Auf welchem Stand ist der geschriebene C# Code? Beispiele:
        1. Werden C# 3 Strukturen wie Lambdas und Linq verwendet wo sinnvoll?
        2. Werden C# 4 bzw. 5 Funktionen wie TPL, async/await verwendet wo sinnvoll?
        3. Welche Version von ASP.NET MVC wird eingesetzt?
        4. Welche Version von .NET wird verwendet?
        5. Werden aktuelle Versionen der eingesetzten Drittanbieterkomponenten verwendet?
        6. Werden aktuelle Kommunikationsstandards genutzt (z.B. REST vs. SOAP, Tokenformate, etc.)?
      4. Ist die Gliederung der Projekte und Solutions in Ordnung?
        1. Ist das Projekt nachvollziehbar in Projekte gegliedert?
        2. Gibt es offensichtliche Schwächen in Sachen Abhängigkeitsmanagement (z.B. klare Trennung der Anwendungsschichten in Projekte mit entsprechenden Projektreferenzen)?
        3. Wird NuGet für gemeinsame Bibliotheken verwendet?
      5. Folgt die Anwendung den von Microsoft definierten Best Practices für Cluster-Systeme (u.A. auch in Windows Azure)? Beispiele:
        1. Umgang mit Web Sessions
        2. Retry-Logik bei Zugriff auf DB-Cluster
    3. Prüfung der Vollständigkeit
      1. Gibt es Unit Tests?
        1. Verteilung Unit Tests vs. Integrationstests?
        2. Laufen die Unit Tests erfolgreich durch?
        3. Welche Code Coverage wird erreicht?
        4. Enthalten die Unit Tests sinnvolle Prüfungen (Asserts)?
        5. Ist die Laufzeit der automatisierten Tests akzeptabel?
        6. Ist der geschriebene Code testbar (z.B. Möglichkeiten für Mocking, klare Trennung von UI und Logik durch MV* Patterns, etc.)?
        7. Sind die Unit Tests dokumentiert?
      2. Sind die Projekte zur Erstellung der Azure-Pakete enthalten?
      3. Gibt es einen automatisierten Build?
        1. Funktioniert der automatisierte Build?
        2. Sind die Unit Tests integriert?
        3. Ist die Erstellung der API-Dokumentation integriert?
        4. Werden die Azure-Pakete automatisch erstellt?
        5. Ist ein automatisiertes Azure-Deployment im Build bzw. mit Scripts (z.B. PowerShell) vorgesehen?
        6. Gibt es ausreichende Vorkehrungen für Versionsmanagement (z.B. Versionsnummernvergabe, Labeling, etc.)?
      4. Gibt es eine ausreichende Dokumentation der Architektur (über reine Codedokumentation hinaus)?
    4. Gibt es offensichtliche Schwächen in Sachen Sicherheit? Beispiele:
      1. Anfälligkeit für SQL Injections?
      2. Ist die eingesetzte Absicherung (Authentifizierung, Authorisierung) der Webseiten und Webservices passend?
      3. Verwenden Webseiten und Webservices SSL?
      4. Ist die Verarbeitung sicherheitskritischer Daten (z.B. Tokens in Web APIs) in Ordnung?
      5. Erfolgt die Speicherung kritischer Daten verschlüsselt? Beispiele:
        1. Zugangsdaten zu Datenbanken in Konfigurationsdateien
        2. Kritische Felder in Datenbanktabellen (z.B. Payment-relevante Daten, personenbezogene Daten)
      6. Wie erfolgt die Verwaltung von Verschlüsselungsschlüssel, Zertifikaten, etc.?
      7. Sind die Assemblies signiert und/oder strong named?
  2. DB-Review
    1. Erscheint die DB-Struktur robust?
      1. Namensgebung
      2. Vergabe von Schlüsseln (Primary Keys, Foreign Keys)
      3. Etc.
    2. Ist das DB-Design konsistent?
    3. Gibt es Indizes (über die von Primary Keys hinaus)?
    4. Gibt es Business Logik in der DB (z.B. Trigger, Stored Procedures, Functions, etc.)? Wenn ja, werden ähnliche Review-Kriterien darauf angewandt, wie oben bei "Sourcecode Review" erwähnt.
    5. Ist die Authentifizierung der Anwendungen gegenüber der DB passend?
  3. Analyse des Laufzeitverhaltens
    1. Performanceanalyse mit .NET Profiler (z.B. ANTS Profiler, PerfView, etc.)
      1. Gibt es offensichtliche Performancekiller (Methoden, Algorithmen, Module)?
      2. Welchen Einfluss hat der Garbage Collector?
      3. Wie ist die Performance unter Last (aufwendiger Test; möglicherweise erst in einem zweiten Schritt zu machen)?
    2. Memoryanalyse mit .NET Memory Profiler (z.B. ANTS Memory Profiler, etc.)
      1. Gibt es offensichtliche Memory Leaks?
      2. Wie speicherintensiv ist die Anwendung?
    3. Analyse des DB-Verhaltens
      1. Gibt es einzelne, offensichtlich langsame DB-Abfragen?
      2. Gibt es idente DB-Abfragen, die extrem häufig ausgeführt werden?
      3. Hat das Kommunikationsverhalten der Anwendung mit der DB offensichtliche Schwächen (z.B. Performanceverlust durch Lazy Loading eines OR-Mappers)?
  4. Sonstiges, das im Rahmen des Reviews gemacht werden könnte/sollte
    1. Erfolgt regelmäßig ein Check-in des Sourcecodes in Team Foundation Server oder ein anderes Quellcodeverwaltungssystem?
    2. Analyse der Umgebungen für Dev, Test, Prod