Lektion 6.1

Informatikprojekt zu einer Problemstellung

16 min Lesezeit

Eure Klasse hat eine kleine Bücherei. Bisher schreibt die Lehrkraft jede Ausleihe in ein Heft. Bücher verschwinden, und niemand weiß, wer sie hat. Ihr sollt ein System bauen, das die Ausleihen verwaltet, in zehn Unterrichtsstunden und zu viert.

Wer sofort zu programmieren beginnt, merkt nach vier Stunden, dass niemand geklärt hat, wie eine Rückgabe erfasst wird und wer die Tests schreibt. Du lernst, wie man von einer Problemstellung über Planung, Modellierung, Implementierung und Test bis zur Dokumentation kommt, an einem Datenbank- oder Softwareprojekt.

Definition

Problemstellung und Anforderungen

Ein Informatikprojekt beginnt mit einer Problemstellung: einem Problem aus der Wirklichkeit, das sich mit einem Informatiksystem lösen lässt. Du klärst: Für wen ist das System? Was soll es können? Das Ergebnis sind Anforderungen, also Aussagen darüber, was das System leisten soll. Man unterscheidet:

  • Muss-Anforderungen: Ohne sie erfüllt das System seinen Zweck nicht.
  • Kann-Anforderungen: Sie sind nützlich und entfallen bei Zeitnot.
  • Abgrenzung: Das gehört ausdrücklich nicht zum Projekt.

Gute Anforderungen sind überprüfbar. "Das System soll einfach sein" lässt sich nicht prüfen, "Eine Ausleihe wird mit höchstens drei Klicks erfasst" schon. Gespeichert wird nur, was der Zweck verlangt.

Beispiel

Anforderungen für die Klassenbücherei

Ordne diese Wünsche ein: Ausleihe mit Datum erfassen; Rückgabe erfassen; Liste der verliehenen Bücher; Liste überfälliger Bücher; Erinnerung per Handynachricht; Onlineshop zum Kauf der Bücher.

WunschEinordnungGrund
Ausleihe mit Datum erfassenMussOhne sie ist das System sinnlos.
Rückgabe erfassenMussSonst weiß man nie, ob ein Buch da ist.
Liste der verliehenen BücherMussSie beantwortet die Ausgangsfrage, wer das Buch hat.
Liste überfälliger BücherKannNützlich, das Ausleihdatum ist ja gespeichert.
Erinnerung per HandynachrichtAbgrenzungDafür wären Handynummern nötig, der Aufwand ist groß.
OnlineshopAbgrenzungDas ist ein anderes Problem.

Von den Lesenden genügt der Name, eine Adresse wird nicht gebraucht.

Definition

Planung

In der Planung zerlegst du das Projekt in Arbeitspakete, schätzt die Zeit, legst die Reihenfolge fest und verteilst die Arbeit. Zeitplan, Meilensteine, Puffer und Rollen kennst du aus dem Einstieg in das Informatikprojekt. Der Zeitplan folgt den Phasen: Anforderungen klären, Modellieren, Implementieren, Testen, Dokumentieren. Sie laufen nicht streng hintereinander: Ein Test kann zeigen, dass das Modell geändert werden muss. Plane solche Rückschritte ein.

Ein Risiko ist etwas, das den Plan gefährden kann, zum Beispiel ein Ausfall im Team oder eine unklare Anforderung. Notiere zu jedem Risiko, was du dagegen tust.

Beispiel

Ein Zeitplan für zehn Stunden

Das Team hat 10 Unterrichtsstunden und plant 20 % Puffer ein. Die Arbeitspakete sind: Anforderungen klären 1 Stunde, Modellierung 2, Implementierung 3, Test 1, Dokumentation 1. Passt das?

Der Puffer ist 20 % von 10 Stunden, also 2 Stunden. Für die Arbeit bleiben 10 - 2 = 8 Stunden. Die Pakete ergeben 1 + 2 + 3 + 1 + 1 = 8 Stunden. Der Plan passt genau.

Meilensteine: Nach Stunde 3 steht das Modell, nach Stunde 6 läuft die Implementierung, nach Stunde 7 sind die Tests bestanden, nach Stunde 8 ist die Dokumentation vollständig. Stunde 9 und 10 sind Puffer und Präsentation.

Definition

Modellierung

Beim Modellieren entwirfst du die Lösung auf dem Papier, bevor du sie baust.

  • Bei einem Datenbankprojekt besteht das Modell aus einem ER-Modell und den Tabellen mit Primär- und Fremdschlüsseln. Beziehungen werden festgelegt, doppelte Daten (Redundanz) vermieden.
  • Bei einem Softwareprojekt besteht es aus einem Klassendiagramm mit Attributen und Methoden oder aus Flussdiagrammen der wichtigsten Unterprogramme, dazu kommt eine Skizze der Benutzeroberfläche.

Das Modell ist die gemeinsame Sprache des Teams. Es wird besprochen, bevor jemand implementiert, denn ein Fehler im Modell kostet später viel Arbeit.

Beispiel

Das Modell der Klassenbücherei

Zu speichern sind Bücher (Titel, Autor), Schülerinnen und Schüler (Name) und Ausleihen (welches Buch, wer, wann geliehen, wann zurückgegeben). Eine Schülerin kann viele Bücher leihen, und ein Buch wird mit der Zeit von vielen geliehen. Entwirf die Tabellen.

Zwischen Schülerin und Buch besteht eine m:n-Beziehung. Man löst sie mit einer eigenen Tabelle für die Ausleihe auf.

TabelleAttributeSchlüssel
BuchBuchID, Titel, AutorPrimärschlüssel: BuchID
SchuelerSchuelerID, NamePrimärschlüssel: SchuelerID
AusleiheAusleiheID, BuchID, SchuelerID, Ausleihdatum, RueckgabedatumPrimärschlüssel: AusleiheID; Fremdschlüssel: BuchID, SchuelerID

Ein Buch hat viele Ausleihen (1:n), ebenso eine Schülerin. Ist das Rückgabedatum leer, ist das Buch noch verliehen. Der Titel steht nur einmal in der Tabelle Buch, es gibt keine Redundanz.

Definition

Implementierung

Bei der Implementierung setzt du das Modell um: Du legst Tabellen an und füllst sie oder schreibst Programmteile in Python. Das hilft dabei:

  • Arbeite in kleinen Schritten und probiere jeden Schritt sofort aus.
  • Schreibe lesbaren Quelltext: aussagekräftige Namen, Kommentare, kleine Unterprogramme mit Parametern und Rückgabewert.
  • Wenn ein Teammitglied deine Funktion nutzt, legt ihr vorher Name, Eingaben und Ergebnis fest (Spezifikation).
  • Gemeinsame Dateien bekommen Datum oder Versionsnummer, damit sich Stände nicht überschreiben.
Definition

Test

Beim Test prüfst du, ob das System die Anforderungen erfüllt. Ein Testfall ist eine Eingabe mit dem erwarteten Ergebnis. Du legst ihn fest, bevor du das System ausprobierst, sonst passt du die Erwartung unbewusst an das Ergebnis an. Man testet:

  • Normalfälle: typische, gültige Eingaben.
  • Grenzfälle: Eingaben genau an einer Grenze, zum Beispiel der größte erlaubte Wert.
  • Fehlerfälle: ungültige Eingaben wie ein leeres Feld oder eine unbekannte Buch-ID. Bei einer Datenbank prüfst du Abfragen mit Daten, deren Ergebnis du kennst.

Die Ergebnisse stehen im Testprotokoll: Testfall, erwartetes und tatsächliches Ergebnis, bestanden oder nicht. Nach jeder Korrektur wiederholst du alle Tests, denn eine Änderung kann an anderer Stelle etwas zerstören. Zum Schluss prüft ein Abnahmetest, ob die Anforderungen der ersten Phase erfüllt sind. Tests können Fehler finden, aber nie beweisen, dass keine mehr da sind.

Beispiel

Eine Funktion mit Testfällen

Regel der Bücherei: Jede Schülerin darf höchstens 3 Bücher gleichzeitig leihen. Die Funktion bekommt die Zahl der Bücher, die jemand gerade hat, und das Maximum. Sie gibt True zurück, wenn ein weiteres Buch erlaubt ist.

ZeileEinrückungAnweisung
10def darf_leihen(anzahl, maximum):\texttt{def darf\_leihen(anzahl, maximum):}
21return anzahl < maximum\texttt{return anzahl < maximum}

Lege Testfälle fest.

TestfallanzahlmaximumerwartetArt
103TrueNormalfall
223TrueGrenzfall: letztes erlaubtes Buch
333FalseGrenzfall: Maximum erreicht
453FalseFehlerfall: mehr als erlaubt

Die Funktion besteht alle vier Fälle: 0 < 3 ist wahr, 2 < 3 ist wahr, 3 < 3 ist falsch, 5 < 3 ist falsch.

Hätte jemand <=\texttt{<=} statt <\texttt{<} geschrieben, bestünden die Fälle 1, 2 und 4, aber Fall 3 würde True statt False liefern. Das ist ein Semantikfehler: Das Programm läuft, tut aber nicht das Gewollte. Solche Fehler findet man vor allem mit Grenzfällen.

Definition

Dokumentation

Die Dokumentation hält fest, was entstanden ist und wie, damit andere es verstehen, benutzen und weiterentwickeln können:

  • Nutzerdokumentation: Anleitung für alle, die das System bedienen: Start, Funktionen, Beispiele.
  • Entwicklerdokumentation: für alle, die es ändern: Problemstellung und Anforderungen, Modell, Aufbau des Quelltextes, Testprotokoll, bekannte Mängel.
  • Projektbericht: Zeitplan mit geplanten und tatsächlichen Zeiten, Arbeitsteilung, Probleme und Entscheidungen, Quellen und Lizenzen fremder Bibliotheken oder Bilder, Rückblick: Was lief gut, was würdet ihr anders machen?

Dokumentiere laufend. Was du heute entscheidest, hast du in zwei Wochen vergessen.

Häufige Fehler

Wir fangen gleich mit dem Programmieren an

"Planen und Modellieren kosten nur Zeit, wir programmieren lieber sofort."

Richtig ist

Ohne Anforderungen und Modell baut jedes Teammitglied etwas anderes, und Fehler im Entwurf fallen spät auf. Dann muss man viel Code ändern. Die Zeit für Planung und Modell sparst du später mehrfach ein.

Häufige Fehler

Wenn es einmal läuft, ist es fehlerfrei

"Ich habe es ausprobiert, und es hat funktioniert. Also ist es fertig."

Richtig ist

Ein Ausprobieren zeigt nur, dass dieser eine Fall klappt. Du brauchst Normal-, Grenz- und Fehlerfälle, ein Protokoll und eine Wiederholung nach jeder Änderung.

Zusammenfassung

  • Ein Projekt beginnt mit der Problemstellung. Daraus entstehen überprüfbare Anforderungen, getrennt in Muss, Kann und Abgrenzung.

  • Die Planung zerlegt das Projekt in Arbeitspakete mit Zeit, Reihenfolge, Meilensteinen, Puffer und Rollen und benennt Risiken.

  • Modellieren heißt, die Lösung vor dem Bauen zu entwerfen: ER-Modell und Tabellen beim Datenbankprojekt, Klassen- oder Ablaufdiagramme beim Softwareprojekt.

  • Implementiert wird in kleinen Schritten mit lesbarem Quelltext. Testfälle werden vorher festgelegt und umfassen Normal-, Grenz- und Fehlerfälle.

  • Die Dokumentation besteht aus Nutzer- und Entwicklerdokumentation und einem Projektbericht und entsteht laufend.

Übungen

Aufgabe 1Multiple Choice

Welche Anforderung ist überprüfbar?

Aufgabe 2Numerisch

Ein Team hat 16 Unterrichtsstunden und plant 25 % Puffer ein. Wie viele Stunden bleiben für die Arbeitspakete?

Aufgabe 3Multiple Choice

Jemand hat in der Funktion darf_leihen(anzahl, maximum) fälschlich anzahl <= maximum statt anzahl < maximum geschrieben. Bei maximum = 3 soll sie True liefern, wenn noch ein Buch erlaubt ist. Welcher Wert für anzahl deckt den Fehler auf?

Aufgabe 4Numerisch

Im Testprotokoll stehen 12 Testfälle. 9 davon wurden bestanden. Wie viel Prozent der Testfälle wurden bestanden?

Aufgabe 5Freitext

Nenne zwei Gründe, warum ein Team das Modell besprechen soll, bevor es mit der Implementierung beginnt.