KI für Codegenerierung

Edit: Das war ursprünglich eine Antwort in Cyborg Codesammelstelle - #21 , aber ist wohl ein eigenes Thema wert. Das meiste CB-spezifische hier sollte man ignorieren können


Omg ist der Thread geil wenn man ne Zeitlang nichts mit dem „perfekten Code“ zu tun hat. Hab jetzt einfach mal spaßeshalber der Jetbrains AI die Aufgabe gegeben, das gleiche „Programm“ zu machen was CB uns hier in perfekter Umsetzung kostenlos zur Verfügung stellt. Und hier ist das Ergebnis:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import me.gosimple.nbvcxz.Nbvcxz;
import me.gosimple.nbvcxz.resources.Generator;
import me.gosimple.nbvcxz.resources.GeneratorOptions;
import me.gosimple.nbvcxz.scoring.Result;

public class PasswordStrengthEstimator extends JFrame {

    private JTextField passwordField;
    private JTextArea feedbackArea;
    private JTextArea generatedPasswordsArea;
    private Nbvcxz nbvcxz;
    private Generator generator;

    public PasswordStrengthEstimator() {
        // Set up JFrame
        setTitle("Password Strength Estimator");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(600, 400);
        setLocationRelativeTo(null);
        setLayout(new BorderLayout());

        // Set up Nbvcxz
        nbvcxz = new Nbvcxz();
        GeneratorOptions options = new GeneratorOptions(8, 15); // passwords between 8 and 15 characters
        generator = new Generator(options);

        // Set up password input panel
        JPanel inputPanel = new JPanel();
        inputPanel.setLayout(new FlowLayout());

        JLabel passwordLabel = new JLabel("Password:");
        passwordField = new JTextField(20);

        JButton checkButton = new JButton("Check Strength");
        checkButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                checkPasswordStrength();
            }
        });

        inputPanel.add(passwordLabel);
        inputPanel.add(passwordField);
        inputPanel.add(checkButton);

        // Set up feedback area
        feedbackArea = new JTextArea(5, 50);
        feedbackArea.setEditable(false);

        // Set up generated passwords area
        generatedPasswordsArea = new JTextArea(10, 50);
        generatedPasswordsArea.setEditable(false);
        JScrollPane scrollPane = new JScrollPane(generatedPasswordsArea);

        // Set up generate passwords button
        JButton generateButton = new JButton("Generate 25 Passwords");
        generateButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                generatePasswords();
            }
        });

        // Add components to frame
        add(inputPanel, BorderLayout.NORTH);
        add(new JScrollPane(feedbackArea), BorderLayout.CENTER);
        add(scrollPane, BorderLayout.SOUTH);
        add(generateButton, BorderLayout.SOUTH);
    }

    private void checkPasswordStrength() {
        String password = passwordField.getText();
        Result result = nbvcxz.estimate(password);
        feedbackArea.setText("");
        feedbackArea.append("Password: " + password + "\n");
        feedbackArea.append("Strength Score: " + result.getEntropy() + "\n");
        feedbackArea.append("Feedback: " + result.getFeedback().getWarning() + "\n");
        feedbackArea.append("Suggestions: " + String.join(", ", result.getFeedback().getSuggestions()) + "\n");
    }

    private void generatePasswords() {
        generatedPasswordsArea.setText("");
        for (int i = 0; i < 25; i++) {
            String password = generator.generatePassword();
            generatedPasswordsArea.append(password + "\n");
        }
    }

    public static void main(String[] args) {
        // Set Nimbus look and feel for a better appearance
        try {
            for (UIManager.LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (Exception e) {
            // If Nimbus is not available, fall back to default
        }

        SwingUtilities.invokeLater(new Runnable() {
          @Override
          public void run() {
              new PasswordStrengthEstimator().setVisible(true);
          }
      });
    }
}

Ich habs jetzt nicht ausprobiert obs funktioniert - hab ich aber auch bei CBs Code nicht (und ich würde mich hüten ein JAR von ihm herunter zu laden). Also schauen wir uns einfach mal den Code an. Also ich denke eine Gemeinsamkeit ist klar: beide Code-Schnippsel-Projekte sind nicht perfekt, verwenden Java und die lib Nbvcxz.

Aber schon auf den ersten Blick sieht man, dass die Lösung der AI deutlich sauberer ausschaut. Außerdem hat Sie ein größeres technisches Verständnis von Swing. Zu sehen z.B. an dieser Zeile:

SwingUtilities.invokeLater(new Runnable() {
   @Override
   public void run() {
      new PasswordStrengthEstimator().setVisible(true);
   }
});

Und ich muss sagen: Krass - das verändert tatsächlich mein Weltbild. Ich hätte nicht erwartet das AI (in der aktuellen Form) für einen „Entwickler“ gefährlich werden könnte, der sich seit >10 Jahren mit einem Thema „beschäftigt“. Aber doch - CB könnte man ohne Problem durch AI ersetzen ohne irgendwelche Einbußen.

Hätte man das früher gewusst, dann hätte man CBs prefekten Code hier sammeln und als Benchmark an AI-Firmen verkaufen können ^^.

1 „Gefällt mir“

Schon der erste Fehler, den Rest können wir uns schenken.

Und nein, irgendwelche Leerzeilen in Methoden einzufügen, erhöht die Codequalität nicht.

Und Tomate, du solltest eigentlich wissen, dass man Strings so nicht zusammenbauen darf.

Was soll denn die Provokation? Mein IQ ist höher…

@Tomate_Salat Das ist jetzt ein Punkt, wo ich neugierig würde. Auf das, was CB geschrieben hat, bin ich nicht eingegangen. Aber das hat eine KI erstellt. Und … das ist ein wichtiger Unterschied.

Der Unterschied sollte klar sein

Eine KI ist lernfähig :slight_smile:

Tatsächlich ist der Code schon erstaunlich gut. Kritikpunkte, beim schnellen Drüberschauen:

  • Das extends JFrame ist meistens nicht sinnvoll. Wenn eine Anwendung größer wird und gut strukturiert sein soll, dann ist ein extends JPanel für die top-Level-Component meistens sinnvoller (manchmal vielleicht nichtmal das).
  • Statt
          JLabel passwordLabel = new JLabel("Password:");
          // Ein paar Zeilen code...
          ...
          inputPanel.add(passwordLabel);
    
    könnte man
          // Ein paar Zeilen code...
          ...
          inputPanel.add(new JLabel("Password:"));
    
    schreiben - eine lokale Variable und etwas „kognitive Belasting“ weniger…
  • Offensichtliche Schnitzer:
          add(scrollPane, BorderLayout.SOUTH);
          add(generateButton, BorderLayout.SOUTH);
    
    Für SOUTH gilt das Highlander-Prinzip: „There can be only one“ :slightly_smiling_face: Die generatedPasswordsArea wird im Ergebnis nicht angezeigt…
  • Weitere Details: Die Fields könnten alle final sein (und wenn sie es könnten, dann sollten sie es auch)
  • java.util.Random wird anscheinend nicht verwendet…?
  • Je nach Java-Zielversion könnte man halt Lambdas verwenden, wie
    generateButton.addActionListener(e -> generatePasswords());

Aber ansonsten: Schon ziemlich gut, ja :slightly_smiling_face:

Moment…

Anders…

Schon ziemlich gut, ja :fearful:


Und Tomate, du solltest eigentlich wissen, dass man Strings so nicht zusammenbauen darf.

Schreib’ mal den Code zum Zusammenbauen des Strings so wie du ihn für „richtig“ oder „besser“ hältst, und schau’ dir dann an, was der Compiler daraus macht :smirk:

2 „Gefällt mir“

Danke … aber brauch’ ich gar net machen, denn das ein bekanntes (und beliebtes :grimacing:) Antipattern …

https://spotbugs.readthedocs.io/en/stable/bugDescriptions.html#sbsc-method-concatenates-strings-using-in-a-loop-sbsc-use-stringbuffer-concatenation

(„SBSC: Method concatenates strings using + in a loop“)

In der Form, wie es in diesem Link beschrieben ist (und man könnte fast sagen „im Allgemeinen“): Ja.

„Rules are for the obedience of fools and the guidance of wise men“
(Wird verschiedenen Leuten zugeschrieben)

Die Aufforderung steht:

Schreib’ den Teil, auf den sich dein Einwand bezieht, mal so um, wie du es für richtig hältst.

Nein. Aus zwei Gründen:

  • der generierte Code ist so schlecht, dass man ein komplettes Rewrite bräuchte …
  • der generierte Code erfüllt auch nicht die (also meine) Anforderungen, also macht nicht das Gewünschte.

Und ich habe bereits eine bessere Version gezeigt, wo lediglich das invokeLater fehlt.

dein Code ist mehrere Stufen schlechter als der von der KI generierte, wenn du bei mir Azubi wärst und solch einen Code im 1. Jahr abliefern würdest wie du oben hast, ok
Im 2. Jahr, nogo nachsitzen
im 3. ? such dir nen neuen Job

1 „Gefällt mir“

Ändere den Teil des generierten Codes, auf den sich dein Einwand zur String-Konkatenation bezog. Ich warte.

Ich bin doch gar nicht mehr dort. Zum Glück. :slight_smile: Dein Beitrag ist aber überzogen, weißte aber selber.

Geben wir uns jetzt gegenseitig Befehle? Nein, denn dafür hab ich keine Zeit.

Dort? Du warst nie bei mir Azubi, wenn wärst du nicht lange hier. Überzogen? Willkommen in der Realität, ich meine das zu 100% ernst.

Ich hab doch auch nichts anderes behauptet.

Separation of concerns (SoC) ist wichtig. Alles mit überflüssigen Klassen zuzukleistern, aber nicht.

Das ist übrigens auch ein beliebter Anfängerfehler. Vielleicht bezog sich der „Realität“-Einwand dort hinauf.

Interessant, dass du den IQ mit rein bringst. Ich hatte eigentlich nur deine „Programmierer-Fähigkeiten“ mit der der KI vergleichen wollen.

Und die KI liefert deutlich besseren Code ab als du. Er ist fehlerhaft - ja. Aber der KI kann man sagen, was sie anzupassen hat. Wobei nicht mal das notwendig ist. Ich kann ihr einfach sagen: verbessere deinen Code und sie kommt von selbst mit Punkten:

Zur Info: ich hab der KI ihren eigenen Code von gestern gegeben. Ich mag den Assistenten, darum quäle ich das arme Ding nicht in dem ich deinen da rein kopiere :smiley:

Aber um auf deinen Punkt zu kommen: Deine Behauptung glaub ich erst wenn du einen IQ-Test gegen eine KI ablieferst und gewinnst.

Ja, für solche „Projekte“ von der Größe wie sie CB anstrebt ist die imho oft schon ziemlich brauchbar. Benutze so einen Output normalerweise auch eher wie Zeug von SO. Man schaut es sich als Beispiel an und lässt sich inspieren. Hier und da verhaspelt sie sich mal mit Methoden und Zeugs das Sie erfindet. Ich glaub meine besten Erfahrungen hab ich bisher mit Fragen zu Flutter gemacht - da waren die Antworten sehr stabil und konnten mir viele Probleme lösen. Da hatte ichs auch nicht gerade selten das eine zusätzliche Google-Suche eben keine besseren Ergebnisse geliefert hat. Ab und an versuche ich mich ja auch an der UE und da waren die Ergebnisse auch schon echt gut (ich hab zumindest erreicht was ich wollte - obs bessere Wege gibt, ka. Weil zur UE was zu googeln bedeutet Ergebnisse für Unity zu bekommen ^^).

+1. Wobei ich dem Azubi manche Dinge von CBs Code auch nur ein halbes Jahr durchgehen lassen würde. Und einen PR würde er bei mir mit so einem Code auch zu keinem Zeitpunkt durchbekommen.

Hatten auch mal einen Azubi wo ich den Chefs gesagt hab: „Das ist kein Entwickler und aus dem wird auch nie einer“. Der Code von dem Typ war trotzdem um Welten besser als das was CB hier abliefert.

@Tomate_Salat Du hast doch mit Softwareentwicklung gar nichts zu tun, weshalb mischst du dich hier mit schlechtem Code ein?

Hast du Paranoia?

Das sind ernstgemeinte Fragen. Ich würde es vorziehen, wenn du dieses Thema einfach meidest.

Viel Text zu schreiben, um damit im Konrad-Stil zu provozieren, hilft eben nicht viel.

Mach’s gut.

Du bist manchmal schon echt putzig wenn du versuchst auszuteilen :slight_smile:

Das ist wohl eine berechtigte Frage. Denn für Schadsoftware fehlen dir erst recht die Skills. Aber letztendlich wüsste ich auch nicht, warum ich bei dir eine Ausnahme von der Regel machen soll, die besagt: „Keine Software ausführen von nicht vertrauenswürdigen Entwicklern“ … auch wenn man bei dir das „Entwicklern“ nochmal in Anführungszeichen setzen müsste :slight_smile:

Och nö. Bin doch extra wegen dir wieder hier im Forum. Und ich find du hattest lange genug deine Ruhe vor mir :wink:

Genau darum geht es ja. Ich zwinge niemanden meine Software auf. Sie kann verwendet werden - oder eben auch nicht.

Und dieser Thread ist auch nicht für eine Paradigmen-Grundsatzdiskussion gedacht.

@Marco13 Sag doch auch mal was … Unser „Kindergärtner“ fängt an, die Kinder zu schlagen. :smile:

Tatsächlich habe ich mich mit dem Thema bisher nicht direkt selbst beschäftigt. (Ich könnte sarkastisch sagen: „Mal sehen, ob AI sowas wie BlockChain ist, und auch morgen niemanden mehr interessiert“, aber … das ist es nicht). Die (entsprechend distanzierte) Bewertung des ganzen ist deswegen in mehreren Facetten zwiespältig:

  • Einerseits „kann“ so eine KI im wesentlichen nur Rekombinationen von existierenden Dingen. Andererseits kann sie das auf einer Ebene, wo es schon nicht mehr ganz trivial ist.
  • Einerseits machen solche KIs im Moment noch viel Mist. Andererseits ist es technisch gesehen trivial, so ein Ding mit einem Linter oder anderen Codeanalyse-Tools zusammenzuklinken, um den größten Müll rauszufiltern.
  • Einerseits ist das gelieferte oft „nicht wirklich gut“. Andererseits hat die richtige Entwicklung gerade erst angefangen, und die bekanntesten/größten Modelle sind im Moment sehr auf natürliche Sprache ausgerichtet, und die Anpassung an Programmiersprachen hat gerade erst angefangen.

Wenn die gleichen Methoden und Mechanismen verwendet werden, aber den Dingern noch ein Verständnis (oder ‚Korsett‘?) für die Programmiersprache mitgegeben wird (in dem Sinne, dass sie „weiß“, was eine Methode ist, und die nicht nur als „das nächste, wahrscheinlichste Token“ ausspuckt),. wird es interessant. Und wenn das, was die KI macht auf einer Ebene („nur noch“) die Problemlösung ist, und das Übersetzen der Problemlösung in Code dann ggf. von einer anderen Schicht übernommen wird (ähnlich wie bei einem Compiler (wie LLVM) das ‚Optimieren‘ und das ‚Übersetzen in Maschinencode‘ zwei getrennte Ding sind) wird es noch interessanter.
(Die Frage, die sich dann stellt, ist: Was ist die ‚IR‘, die ‚Intermediate Representation‘, auf der das Ding arbeitet?)

Hm. Schade. Fast schon bedauerlich, dass dieser Thread hier so aus dem Ruder gelaufen ist :frowning: Eigentlich sollte es nur ein Thread sein, um CB bloßzustellen und über seinen Quälkot zu lästern. Und jetzt hat sich hier versehentlich ein interessanter Unterhaltungsstrang ergeben. (Vielleicht trenne ich das ab, in einen eigenen Thread…)

a) wie es Marco13 schon ganz richtig gesagt hat, LLMs sind in erster Linie Sprachmodelle, die Programmierung nur so nebenbei machen,
b) als Unterstützung für kleinere Methoden, die Standardaufgaben erfüllen, sind sie gut,
c) sie können lernen und man kann ihnen sagen, etwas anders zu formulieren,
d) das Ganze steckt noch in den Kinderschuhen und ist ausbaufähig. :wink:

Außerdem müssen die LLMs ja auch von jemanden programmiert und überwacht werden, deshalb sehe ich meinen Beruf auch nicht in Gefahr.

So … Die Neiddebatte startet bitte in 3 2 1 …

dein Beruf? Die die dich eingestellt haben kann man echt nur bemitleiden.
Entweder werden sie dich nicht mehr los oder sie sind nicht die hellsten.

Ja, ich glaub das kannst du vergessen. KI ist gekommen um zu bleiben (was auch iwie für die Blockchains gilt. Nur ist der Hype um NFTs zum Glück abgeflacht).

Aber KIs sind in ihrer jetzigen Form imho schon mega interessant. Auch wenn Sie praktisch nur gut raten ist das Ergebnis doch oft schon sehr brauchbar sodass ich diese mittlerweile für so manche Bereiche echt gerne einsetze.

Das ist halt mit eine der größten Stärken von KI. Denn dadurch sind die praktisch Suchmachinen auf Steroiden. Mein Lieblingsbeispiel ist hier noch immer: Such was für die UnrealEngine. 9 von 10 Ergebnissen auf Google drehen sich um Unity … aber auch nur wenn du Glück hast. Dazu sei gesagt: meine Fragen sind noch Anfängerfragen!
Da ist es extrem Hilfreich wenn ich die Jetbrains AI einfach fragen kann: „wie mach ich XYZ in C++?“. Die Jetbrains AI sendet dann noch ein paar Projektinfos mit und ich bekomme ein Codebeispiel mit Erklärung. Verifizieren kann ich hier leider nur über den Compiler aber meine einzige alternative wäre try-error (und manchmal nichtmal das).

Und wo das auch praktisch ist: für meine privaten Projekten lass ich mittlerweile die KI meine Commit-Messages schreiben. Seit dem sind die viel aussagekräftiger ^^.

Da muss ich sagen kommts halt drauf an nach was du suchst. Viele Dinge bekommt die AI gut hin, nur wenn es halt wenig Infos im Netz gibt dann hast du mehr Halluzinationen drin.

Auch hier wieder: kommt drauf an für was du es nutzt. Für mein Flutter-Projekt muss ich sagen waren die Antworten afair ausnahmlos alle wirklich gut. Bei meinen GameDev-Projekten würde ichs eher als „durchwachsen“ bezeichnen. Und Bildgenerierung war eigentlich soweit auch gut - seltsam wirds nur wenn man in Filter reinrennt. Da hatte ich z.B. den Fall das ich Blut/Knochen nicht verwenden durfte (ging um einen Dämon in einer Schlachtküche) aber mit „rote flüssigkeit“ und „weise stöcken“ kommt dann sowas raus:

Das ist dann auch wieder schon witzig, wie man überrascht werden kann ^^.