Blog

Alle Artikel

Codeüberprüfung mit KI

In der modernen Welt tauchen immer mehr Werkzeuge, Systeme und Ansätze auf, die mit Hilfe von KI dabei helfen, die menschliche Beteiligung zu automatisieren und in manchen Fällen sogar vollständig zu ersetzen. Natürlich gibt es im IT-Bereich viele Nischen, in denen KI bereits Fuß gefasst hat. Wir analysieren mit Ihnen eine dieser Nischen.

Mein Name ist Alexander, ich arbeite seit mehr als 7 Jahren bei NLT und ich werde versuchen, eine dieser Nischen für Sie aufzuschlüsseln. Nämlich die Automatisierung der Codeüberprüfung.

Heutzutage gibt es mehrere Dutzend KI-basierte Dienste, die bei der Durchführung von Codeüberprüfungen helfen. Nachdem ich die Bewertungen dieser Dienste analysiert hatte, wählte ich die 12 beliebtesten aus.

Ich habe jeden der Dienste anhand eines kleinen Projekts für die mobile iOS-Plattform getestet. Ich habe diesem Projekt einen neuen Pull-Request mit einer großen Datei hinzugefügt und der Reinheit des Experiments halber den gleichen Pull-Request durch alle Dienste durchgeführt. Es handelte sich um eine in Swift geschriebene ViewController-Datei mit 730 Zeilen. Es waren genug Logik, Animationen und diverser Code drin, damit die KI Raum zur Bearbeitung hatte. Der Datei wurden außerdem mehrere nicht verwendete Variablen hinzugefügt.

Beispiel: Ich könnte Dienste im kostenlosen Modus nur unter der Bedingung testen, dass mein Repository öffentlich sein muss. Ich habe mich außerdem dafür entschieden, diese Datei aus einem öffentlichen Repository zu beziehen, anstatt Daten aus einem kommerziellen Projekt zu verwenden. Erstens die NDA bleibt bestehen, und zweitens habe ich beschlossen, auf Nummer sicher zu gehen, weil ich keine Informationen darüber hatte, wie diese Dienste im kostenlosen Modus funktionieren/Informationen nutzen könnten.

Während des Experimentierens habe ich auf folgende Aspekte der Arbeit geachtet:

  • Kompatibilität mit Code-Repository-Verwaltungssystemen
  • Preis
  • Einschränkungen der Programmiersprache
  • Die Ebene der Code-Analyse

Als Ergebnis wurde eine allgemeine Tabelle mit den Ergebnissen für jeden von ihnen erstellt und eine Reihe von Schlussfolgerungen sowie eine persönliche Bewertung zusammengestellt. Nachfolgend finden Sie die Ergebnisse der einzelnen Dienste.

Pluralsight

Dieser Dienst unterstützt nur mit Python geschriebenen Code, daher war es nicht möglich, ein Experiment durchzuführen und seine Leistung zu bewerten.

Сoderabbit

Codacy

Codeclimate

Deepsource

CodeBeat

Houndci

File Length Violation: File should contain 400 lines or less: currently contains 739 (file_length)

Trailing Whitespace Violation: Lines should not have trailing whitespace. (trailing_whitespace)

Und 14 weitere ähnliche Kommentare zu Trailing_Whitespace

Pylint

Dieser Dienst unterstützt nur mit Python geschriebenen Code, daher war es nicht möglich, ein Experiment durchzuführen und seine Leistung zu bewerten.

ESLint

Dieser Dienst unterstützt nur den Code, der in JS und ähnlichen Programmiersprachen geschrieben ist, daher war es nicht möglich, ein Experiment durchzuführen und seine Leistung zu bewerten.

Chat GPT 3.5

Bezeichnung: Sie befolgen bewährte Methoden zur Benennung von Variablen und Funktionen. Versuchen Sie jedoch, aussagekräftigere Namen zu verwenden, um den Code verständlicher zu machen. Beispielsweise toggleArgeementState ist falsch geschrieben, stattdessen sollte es toggleAgreementState lauten.

Aufgabentrennung:Ihr Controller führt viele Aufgaben aus, z. B. Darstellung der Benutzeroberfläche, das Verarbeiten von Benutzereingaben, das Verwalten des Status und sogar die Interaktion mit Ihrem ViewModel. Erwägen Sie die Aufgabentrennung und die Verwendung von Architekturmustern wie MVVM, um die Codeverwaltung und das Testen zu vereinfachen.

Dependencies: Sie haben mehrere Abhängigkeiten wie UIStackView, UIButton, UIViewControllerKeyboardHelper. Versuchen Sie nach Möglichkeit, Abhängigkeiten einzufügen oder die Umkehrung der Kontrolle zu nutzen, um die Klasse besser testbar zu machen und starre Abhängigkeiten von bestimmten Klassen zu vermeiden.

Fehlerbeseitigung: In Ihrem Code scheint die Fehlerbehandlung zu fehlen. Überlegen Sie, wie Sie mit Fehlern umgehen können, die während der Ausführung Ihrer Anwendung auftreten können, und wie Sie Benutzern Informationen zu Problemen bereitstellen können.

Codeduplizierung:  Es gibt einige Duplikate im Code. Beispielsweise sind die Definitionen der Schaltflächenhandler orgNameSelectButton und orgNameClearButton ähnlich. Sie können für beide eine Methode erstellen, um die Codeduplizierung zu reduzieren.

Tastatursteuerung: Ihr Code enthält Tastatursteuerungen für Eingabefelder. Erwägen Sie die Verwendung von Bibliotheken oder Mustern, die diesen Code allgemeiner und benutzerfreundlicher machen können.

Swift-Version: Stellen Sie sicher, dass Ihr Projekt konfiguriert ist und die neueste Version von Swift verwendet.

Gestenbehandlung:  Ihr Code enthält Gestenbehandlung wie UITapGestureRecognizer. Stellen Sie sicher, dass Sie die mit diesen Gesten verbundenen Ressourcen ordnungsgemäß verwalten und freigeben.

RxSwift: Sie verwenden RxSwift (Rx) für die reaktive Programmierung. Stellen Sie sicher, dass Sie Abos korrekt verwalten, um Speicherverluste zu vermeiden.

Animationen: Sie verfügen über Animationen zum Ein- und Ausblenden von Elementen. Stellen Sie sicher, dass sie korrekt funktionieren und animiert werden und dass sie keinen Leistungsverlust verursachen.

Chat GPT 4.0

Name und Codestruktur: FAThirdStepViewController – Der Klassenname folgt allgemeinen Konventionen, sagt aber wenig über seine Funktionalität aus. Versuchen Sie, einen Namen zu wählen, der den Zweck des Controllers besser beschreibt.

Es gibt viele private Lazy-Variablen innerhalb der Klasse, was in Ordnung ist, aber die Lesbarkeit des Codes erschweren kann. Erwägen Sie, verwandte Eigenschaften und ihre Initialisierer in Erweiterungen zu gruppieren, um die Lesbarkeit zu verbessern.

Konstanten und Literale: Das Verschachteln von Enumerationen innerhalb von Consts, um verwandte Konstanten zu gruppieren, ist ein guter Ansatz. Stellen Sie jedoch sicher, dass alle Konstanten tatsächlich benötigt und verwendet werden. Konstanten, die nur einmal verwendet werden und keine allgemeine Bedeutung haben, können lokal am Ort ihrer Verwendung definiert werden.

Die Verwendung von #imageLiteral ist veraltet. Es ist besser, UIImage(named:) zu verwenden, um die Codekompatibilität zu verbessern und verschiedene Bildressourcen zu unterstützen.

Das Initialisieren von UI-Elementen als Lazy-Variable ist gängige Praxis. Stellen Sie jedoch sicher, dass für jedes Element tatsächlich eine Lazy-Variable benötigt wird.

Erwägen Sie die Verwendung von Factory-Methoden oder die Aufteilung des UI-Erstellungscodes in separate Methoden/Erweiterungen für jedes UI-Element, um die Codemenge im Controller zu reduzieren und ihn leichter lesbar zu machen.

Mehrfachverwendung von Anschlüssen:Die Verwendung von once.perform ist eine interessante Idee, kann jedoch dazu führen, dass der Codefluss schwer zu verstehen ist. Stellen Sie sicher, dass es wirklich notwendig ist und nicht zu unerwartetem Verhalten führt.

Tastaturbehandlung: „keyboardConstraint“ wird initialisiert, aber sein Anfangswert ist nicht festgelegt. Stellen Sie sicher, dass dies bei der Arbeit mit dem Layout keine Probleme verursacht.

Verwendung von View-Modell: Prozesse an das ViewModel zu delegieren ist ein guter Ansatz. Stellen Sie sicher, dass alle notwendigen Aktionen im View Model abgewickelt werden und die Kommunikation mit dem View Model klar und verständlich ist.

Localizability: Texte werden direkt in den Code eingebettet. Um die Lokalisierung zu unterstützen, wird empfohlen, sie in separate Lokalisierungsdateien zu verschieben.

Accessibility: Stellen Sie sicher, dass UI-Komponenten, die im Code nicht erwähnt werden, Barrierefreiheit unterstützen, z. B. Bildschirmsprachausgabe-Beschriftungen.

Benutzerdefinierte UI-Komponenten:TitleWithStepsView, Select, Input, DotsLoader, Buttons.Component.TextWithArrow, CheckBox – stellen Sie sicher, dass alle benutzerdefinierten Komponenten über klare Schnittstellen verfügen und gut in die gesamte Anwendungsarchitektur integriert sind.

Netzwerk und lange Vorgänge: Die Bearbeitung von Netzwerkanfragen oder langen Vorgängen wird nicht erwähnt. Wenn dies der Fall ist, stellen Sie sicher, dass Sie asynchrone Aufrufe korrekt verarbeiten, Ladeindikatoren anzeigen und Fehler behandeln.

DienstPreisKommentar
1Pluralsight29$/Monat per ProduktNur für Python
2Сhat GPT GPT – 3.5 – kostenlos.
GPT – 4.0 – 20$/Monat
Passt nicht in Git. Sie können nur Text einfügen – die Datei akzeptiert diesen nicht. 
Bietet eine der besten Codeanalysen.
3Сoderabbit12$/Monat per EntwicklerGitHub, Gitlab. Prüft bestehende und neue PRs.
Eines der besten Ergebnisse.
4Codacy15$//Monat per Entwickler

GitHub, Gitlab, Bitbucket. Prüft bestehende und neue PRs.
Es verfügt über ein großes Dashboard mit vielen Einstellungen und Statistiken.
Die Analyse erfolgt oberflächlich auf der Ebene des Stilcodes.
5DeepCode
25$/Monat per Produkt
GitHub, Bitbucket und CLI. Die Analyse erfolgt oberflächlich auf der Ebene des Stilcodes.
6CodeclimatePrivatnutzung 16$
/Monat per Entwickler
Nur für GitHub. Keine Fehler gefunden
7Deepsource
Ab 8$//Monat per Entwickler
GitHub, Gitlab, Bitbucket. Kann auch einen Scan des gesamten Projekts erstellen. Keine Fehler gefunden
8SonarQubeAb 150$/jährlichGitHub, Gitlab, Bitbucket.
Eine Überprüfung war nicht möglich, da Es war notwendig, eine Serverinfrastruktur zu verwenden.
Die Bewertungen im Internet sind positiv.
9CodeBeat20$//Monat per Entwickler
GitHub, Gitlab, Bitbucket. Kann das gesamte Projekt auf einmal analysieren.
Hat ein eigenes Dashboard.
Die Ergebnisse sind durchschnittlich.
10PylintkostenlosNur für Python
11ESLint20$//Monat per EntwicklerNur für JavaScript und ähnliche Programmiersprachen
12HoundciAb 29$ Für 50 ÜberprüfungenWird nur in GitHub integriert. Überprüft nur neu erschaffe ПР.
Ergebnisse sind schwach – ähnelt dem SwiftLint.

Persönliche Bewertung

Platz 1 – Code Rabbit

  • вбудовується в популярні системи керування репозиторіями коду – GitHub. 
  • Gitlab kann nicht nur neue, sondern auch bestehende Pull Requests prüfen
  • hinterlässt die Verifizierungsergebnisse als Kommentare im Pull-Request selbst
  • hat eine der besten Codeüberprüfungen durchgeführt. Folgende Punkte wurden gefunden: Hinweis auf nicht verwendete Variablen, Warnung vor einer möglichen redundanten Variablendeklaration, Warnung vor einem möglichen logischen Fehler bei der Verwendung der gemeinsam genutzten Ressource „Once“, Empfehlung für einen besseren Ansatz mithilfe eines Schaltflächenziels, Hinweis auf einen logischen Fehler bei der Verwendung von bedingter „IF“-Anweisung, Empfehlung zur Verwendung der Bibliothek für die Arbeit mit der Tastatur aufgrund der aktuellen Komplexität der Implementierung, Hinweise zur Verwendung von Konstanten, Klassenmodifikatoren.

Platz 2 – Chat GPT

  • Meiner Meinung nach sein Hauptvorteil ist der Grad der Analyse, weil er erwies sich als einer der Besten. Ich habe solche Punkte gefunden – Fehler bei der Benennung, habe die Klassenlast bestimmt und eine Aufteilung der Verantwortung empfohlen, habe Empfehlungen zum Arbeiten mit Abhängigkeiten gegeben, auf mögliche Codeduplizierung hingewiesen, Empfehlungen zum Arbeiten mit der Tastatur, Animation, reaktivem Ansatz und vielem mehr gegeben (siehe vollständige Beschreibung). über)
  • Der Hauptnachteil ist die Unfähigkeit, sich in Code-Repository-Verwaltungssysteme zu integrieren. Der Code zur Analyse muss manuell eingefügt werden. Es ist auch unklar, wie Chat GPT mit dem analysierten Code umgehen kann.

Platz 3 – CodeBeat

  • lässt sich in die meinsten Code-Repository-Verwaltungssysteme integrieren – GitHub, Gitlab, Bitbucket
  • verfügt über ein eigenes Dashboard mit vielen Informationen
  • Einer der wenigen Dienste, der das gesamte Projekt und nicht nur einzelne Pull-Anfragen analysiert
  • Analyseniveau – Durchschnittlich. Kann sowohl den Codestil als auch die Codekomplexität bewerten.

Schlussfolgerungen

  • Die meisten Dienste können als separate Anwendung in GitLab integriert werden.
  • Nur zwei Dienste haben das gesamte Projekt gescannt. Der Rest funktioniert nur mit PR/MR.
  • Die Hälfte der Leistungen wurde abgelehnt, weil… hat entweder keine Ergebnisse geliefert oder ist nur auf eine Sprache (Python oder JS) konzentriert.
  • Alle Dienste bieten einen kostenlosen Plan, der jedoch nur für öffentliche Repositories gilt. Für private Anbieter beträgt der Tarif durchschnittlich 15 bis 30 US-Dollar pro Monat und Entwickler.
  • Die meisten Dienste geben nur oberflächliche Kommentare auf der Ebene – Stilcode – ab, die die Länge einer Klasse/Funktion/Zeile, Rechts-/Links-Einrückungen usw. überschreiten.

Abschließend möchte ich sagen, dass solche Dienste generell die Effizienz der Entwicklung steigern können und dieser Effekt mit der Entwicklung der KI immer stärker sichtbar wird.

Autor: Alexander Bondar