Einführung in C++

05 - Test-getriebene Entwicklung, Debugging, AI Tools

Prof. Dr. Malte Schilling

Autonomous Intelligent Systems Group

🚀 by Decker

Übersicht 5. Termin

  • Test-getriebene Entwicklung
  • Debugging
  • CoPilots – AI Assistant Systeme
  • Feedback, WrapUp

Test-getriebene Entwicklung

Testgetriebene Entwicklung (test-driven development)

  • Methode der agilen Software-Entwicklung (→ Vorlesung “Software Engineering”)

Grundidee:

  1. Tests formulieren,
  2. dann Programm implementieren.

Sicht auf Programmierung und Softwareentwicklung

../data/01/software_engineering_overview_01.png ../data/01/software_engineering_overview_02.png ../data/01/software_engineering_overview_03.png ../data/01/software_engineering_overview_04.png ../data/01/software_engineering_overview_05.png ../data/01/software_engineering_overview_06.png

Debugger und IDE

Syntax- und Semantikfehler in C++

Syntaxfehler

  • Syntaxfehler beziehen sich auf Fehler, die durch das Verletzen der Grammatikregeln einer Sprache verursacht werden.
  • Diese Fehler werden normalerweise vom Compiler oder schon der IDEerkannt und gemeldet.
  • Beispiele: Fehlende Semikolons, falsch geschriebene Schlüsselwörter, falsche Verwendung von Operatoren.

Syntax- und Semantikfehler in C++

Semantikfehler

  • Semantikfehler beziehen sich auf Fehler, die auftreten, wenn eine Anweisung logisch falsch ist.
  • Diese Fehler werden normalerweise während der Laufzeit entdeckt, sind jedoch schwer zu erkennen und zu beheben.
  • Beispiele: Zugriff auf einen nicht initialisierten Speicher, Division durch null, Speicherleck.

Syntax- und Semantikfehler in C++

  • Syntaxfehler verhindern, dass ein Programm kompiliert wird,
  • während Semantikfehler das Kompilieren nicht beeinflussen, aber zu unerwartetem Verhalten während der Laufzeit führen können.

Lösung von Fehlern

  • Syntaxfehler sind leicht zu finden und zu beheben,
  • während Semantikfehler eine gründliche Untersuchung und das Verständnis der Programmlogik erfordern.

Strategien zur Fehlerbehebung

  • Verwendung von Debugging-Tools zur Überwachung und Überprüfung von Codeausführung.
  • Durchführung gründlicher Tests zur Überprüfung des erwarteten Verhaltens.

Was ist Debugging?

Debugging bezieht sich auf den Prozess, Fehler oder Bugs in einem Programm zu finden und zu beheben.

Schritte im Debugging-Prozess

  • Erkennen, dass ein Fehler existiert.
  • Identifizieren und isolieren des Teil des Codes, der den Fehler verursacht.
  • Verstehen der Ursache des Fehlers.
  • Korrigieren des Fehlers.
  • Testen, dass der Fehler behoben ist und kein neuer Fehler eingeführt wurde.

Werkzeuge für das Debugging

Debugger: Softwaretools, die beim Auffinden und Beheben von Fehlern helfen.

  • Breakpoints: Punkte im Code, an denen die Ausführung angehalten wird, damit der Zustand des Programms untersucht werden kann.
  • Stepping: Ein Prozess, bei dem der Code Zeile für Zeile oder Ausdruck für Ausdruck ausgeführt wird, um das Verhalten des Programms genau zu verfolgen.

Strategie für Debugging

  • Verstehen des Problems: Versuchen es zu reproduzieren.
  • Dazu das Programm laufen lassen und dabei Informationen sammeln über
    • Kontrollfluss
    • Veränderung von Variablen
  • Dies wiederholen und versuchen das Problem einzugrenzen.

Integrated Development Environments (IDEs)

Eine IDE ist eine Software-Anwendung, die Software-Entwicklern eine umfassende Reihe von Tools zur Verfügung stellt, um die Softwareentwicklung zu erleichtern.

Sie integriert normalerweise einen Quellcode-Editor, Build-Automatisierungstools und einen Debugger.

Vorteile von IDEs

  • Intellisense und Codevervollständigung – helfen Tippfehler zu vermeiden, Code schneller zu schreiben und benötigte Funktionen / Klassen leicht zu finden.
  • Produktivitätssteigerung – durch die Integration der Tools in einem System.
  • Debugging-Unterstützung: IDEs bieten oft eingebaute Debugging-Tools, die das Auffinden und Beheben von Fehlern erleichtern.
  • Codeverwaltung – viele IDEs integrieren Versionskontrolle, um das Management und die Zusammenarbeit von Code zu erleichtern.

Nutzen einer IDE – Visual Studio Code

  • Visual Studio Code ist eine kostenlose, Open-Source-IDE, die von Microsoft entwickelt wurde.
  • Sie ist plattformübergreifend und unterstützt viele verschiedene Programmiersprachen, einschließlich C++.

Funktionen von VS Code für C++

  • Intellisense: Codevervollständigungsfunktion und Syntaxhighlighting
  • Debugging: umfangreiche Unterstützung durch Breakpoints, Stepping etc.
  • Git-Integration

Vorteile von VS Code als IDE für die Programmierung

  • Hohe Anpassungsfähigkeit: Vielzahl von Erweiterungen für Entwickler
  • Leichtgewichtig und performant: VS Code ist bekannt für seine hohe Leistung im Vergleich zu anderen, schwereren IDEs.
  • Große Entwickler-Community: Durch die große Anzahl von Entwicklern, die VS Code nutzen, gibt es viele verfügbare Ressourcen und Unterstützung für Entwickler.

Hinweis: Aufgabe 5.1 bis 5.3

Aufgabe zu Debugging. Hierfür soll VS Code im Hub genutzt werden (dies läuft am besten unter Chrome).

Im jupyter-book ist die Aufgaben angegeben:

Jupyter-Book Link

Hierüber kann dann direkt auf dem Hub eine Umgebung gestartet werden, in der C++ interpretiert wird (wird die ersten Termine genutzt):

JupyterHub Link

AI Tools

Chat-Bots und Programmierung

Erfahrungen, Umgang an der Universität mit ChatGPT

Beispiel-Policy UCLA

Don’t use AI chatbots like ChatGPT or Bard or Bing, as doing so “is equivalent to receiving assistance from another person.”

Chancen von Chat-Bots:

  • as a tutor: “can break down new or complex concepts into their most basic parts”
  • as a “naysayer” or “critic”

Online Umfrage: 1. Häufigkeit der Nutzung

Wie oft nutzen sie ein LLM wie ChatGPT (bitte nur eine Antwort auswählen)?

  • Täglich
  • Wöchentlich
  • Selten
  • Noch nie genutzt

2. Einsatzbereiche

Für welche Aufgaben setzen Sie LLMs am häufigsten ein (sie können mehrere Antworten auswählen)?

  • Allgemeine Studienberatung
  • Suche wiss. Ressourcen
  • Hilfe bei Programmierproblemen
  • Organisationshilfe (z.B. Zeitplanung)
  • Privat

3. Zufriedenheit mit Antworten

Wie zufrieden sind Sie mit den Antworten, die sie von LLMs erhalten (bitte nur eine Antwort auswählen)?

  • Sehr zufrieden
  • Zufrieden
  • Neutral
  • Unzufrieden
  • Sehr unzufrieden

Nachfrage

Ergänzungen?

  • Andere Einsatzgebiete
  • Erfahrungen

4. Abgaben

Haben sie solche LLMs schon genutzt in Übungsaufgaben oder Hausarbeiten (bitte nur eine Antwort auswählen)?

  • Ja, regelmässig
  • Nein

5. Abgaben

Wenn sie ChatGPT schon genutzt haben in Übungsaufgaben oder Hausarbeiten – wofür (mehrere Antworten möglich)?

  • Zur Recherche
  • Brainstorming, Generierung von Ideen
  • Erzeugung von Text
  • Erzeugen von Code

Nachfrage

Ergänzungen?

  • Andere Einsatzgebiete
  • Erfahrungen

Einschätzung

6. Unterstützung beim Lernen

Fühlen Sie sich durch einen Chat-Bot wie ChatGPT beim Lernen unterstützt (bitte nur eine Antwort auswählen)?

  • Ja, immer
  • Oft
  • Manchmal
  • Selten
  • Nein, nie

7. Nützlichkeit im C++ Programmiereinführungskurs

Wie hilfreich finden Sie ChatGPT speziell für den C++ Programmiereinführungskurs (bitte nur eine Antwort auswählen)?

  • Sehr hilfreich
  • Hilfreich
  • Neutral
  • Nicht sehr hilfreich
  • Überhaupt nicht hilfreich

Nachfrage in Programmierkurs

Bei welchen Programmieraufgaben haben sie gute Erfahrungen mit ChatGPT / CoPilot / StarCoder gemacht?

Angaben Umfrage

Zitieren von Einsatz von ChatGPT

Aktuelle (vorübergehende) Empfehlung der APA (American Psychology Association):

OpenAI’s ChatGPT, personal communication, 12.6.2023

Ideallerweise mit Prompt – für die Umfrage (1. bis 7.) wurde als Prompt genutzt

Ich möchte eine Umfrage zu dem Einsatz von ChatGPT machen. Dabei soll es immer mehrere Auswahlmöglichkeiten geben. Kannst du mir helfen Fragen zu erstellen? Dies richtet sich an Studierende, die so einen Chat-Bot einsetzen könnten. Über die vers. Fragen will ich rausbekommen, wieviel sie diesen einsetzen und in welchen Funktionen. Es sind Informatik-Studierende in einem C++ Programmiereinführungskurs.

Danach wurde zusätzlich dies von ChatGPT in das Markdown-Quiz-Format umgesetzt.

Einschätzungen zum Einsatz von AI Assistenten für Programmierung

Code Assistants Studie – Bekanntheit Assistants

Large-scale survey

How are AI assistants used? Focus on software development activities.

481 programmers, 5 activities:

  • implementing new features,
  • writing tests,
  • bug triaging,
  • refactoring, and
  • writing natural-language artifacts.

Code Assistants Studie – Generelle Einschätzungen

../data/05/sergeyuk2024_opinion.png

Takeaway 1

The overall opinion regarding code provided by AI assistants differs, with the most positive aspect being its usability and the most negative being its security.

Code Assistants Studie – Delegate

../data/05/sergeyuk2024_opinion_activity.png

Takeaway 2: … implementing new features is the most enjoyable and the least likely to be delegated to an assistant, while writing tests and writing natural-language artifacts are the most unpleasant and the most likely to be delegated.

Code Assistants Studie – Cons

Takeaway 4

The top reasons why developers are not using AI assistants are the

  • lack of need,
  • AI-generated output being inaccurate,
  • lack of trust, and the
  • lack of understanding of context by the assistant.

GitHub Umfrage Ergebnisse Übersicht 2022

Aber umstritten: Ergebnisse zu OpenAI’s Codex

Stanford University study

Participants

47 participants (from undergraduate students to professional programmers)

  • 33 had the option to use Codex,
  • remaining 14 didn’t receive automated assistance

Both groups were allowed to copy code from the web.

Tasks

Complete security-themed coding tasks:

  • Python functions that
    • encrypt and decrypt a string respectively,
    • signs a message with a cryptographic key,
    • returns a File object for a given file path, and
  • Javascript function that manipulates an SQL table.

Results

Evaluation

Authors evaluated responses manually: Are these functional and secure?

Result

Participants who used Codex

  • generally produced code that was less functional and secure,
  • yet they expressed greater confidence in it.
  • For Python: non-Codex group more than twice as likely to produce secure code.
  • Without prior digital-security experience: participants were more likely to use unedited, generated code.

Student Perspective – Was notwendig ist

  • Students agreed guidelines about “what happens if AI is used” are needed going forward.
  • all students should have the same resources as one another, being of a lower income should not be a reason why other students can do their assessments more efficiently.
  • The traditional ways of learning […] are changing. But this technology is now our present and the future, we need our teachers to prepare us for it.

As one noted: “Please do not assume the worst of us. Rather, teach us how to use this technology in the right way and learn alongside it.”

Discussion

  • Wie wünschen sie sich, dass AI eingesetzt wird?
  • Was für Rahmenbedingungen / Regelungen wünschen sie sich? Was halten sie für notwendig?

Persönliche Einschätzung – AI Assistants in der Programmierung

Diese funktionieren in klar umrissenen Teilaufgaben und Anwendungsfällen:

  • Erzeugung von Tests,
  • Definition von Methode mit klar vorgegebener Funktion,
  • Erklären von Funktion und Verbesserungsvorschläge,
  • Kommentare.

Größere Aufgabenstellungen sind schnell problematisch. Refactoring funktioniert in einem gewissen Maße noch gut – aber größere Projekte und Zerlegung in Aufgaben endet häufig in Sackgassen.

Als Pair Programming sehr gut einsetzbar.

Chancen von Chat-Bots

../data/05/raymond.png

Feedback

Online-Feedback

8 Rückmeldungen (Danke!) – mittlere Noten (aber extrem breite Streuung).

Anregungen:

  • IDE verwenden früher einführen, da dieses online enviroment für mich nicht wirklich funktioniert aht am Anfang.
  • Mit dem Online Tool C++/C zu lernen finde ich eine gute Idee,
  • Vorlesung mir zu schnell geht und ich manchmal nicht folgen kann, da manchmal ganz viele Folien gescipt werden.
  • überfordern mich die Aufgaben - nicht umbedingt von der Schwierigkeit, sondern wegen mangelnder Zeit.
  • Beispiele so zu vereinfachen, dass das Schwierigste ist, das Gelernte anzuwenden.

Zusätzliche Rückmeldungen?

Eigene Einschätzung

Art Vorlesung

  • Arbeiten auf Hub hat eigene Probleme – aber erlaubt Schrittweise Annäherung
  • Vorlesungsanteil - und direkt anwenden: aktuell noch zu starkes Ungleichgewicht (zu viele Folien)

→ Kurz Kernkonzepte einführen, direkt anwenden – danach etwas Vertiefung, aber meiste Teil dann in Webseite auslagern

Was sind aus ihrer Sicht die Kernkonzepte (sammeln)?

Offen: Querbezüge zu A und D, Programmiereinführung – diese ausreichend / hilfreich / unnötig?

Eigene Einschätzung

Art Aufgaben

  • Direkt anwenden von Wissen

→ aber kleinere Aufgaben, begrenzterer Umfang

Zwischentasks – waren gedacht als größerer Kontext und programmieren in einenm schon teils vorgegebenem Kontext.

Wie ist hier ihre Einschätzung?

Anything else?

Danke.

References

Kalliamvakou, Eirini. 2022. „Research: quantifying GitHub Copilot’s impact on developer productivity and happiness“. https://github.blog/2022-09-07-research-quantifying-github-copilots-impact-on-developer-productivity-and-happiness/.
Perry, Neil, Megha Srivastava, Deepak Kumar, und Dan Boneh. 2022. „Do Users Write More Insecure Code with AI Assistants?“ https://arxiv.org/abs/2211.03622.
Sergeyuk, Agnia, Yaroslav Golubev, Timofey Bryksin, und Iftekhar Ahmed. 2024. „Using AI-Based Coding Assistants in Practice: State of Affairs, Perceptions, and Ways Forward“. arXiv preprint arXiv:2406.07765.
Vahrenhold, Jan. 2022. „Informatik I: Grundlagen der Programmierung, 2 Ausdrücke und Funktionen“. Lecture Notes, University of Münster.