Okay, herzlich willkommen zur letzten SC2-Vorlesung in diesem Semester.
Ja, hier sieht man, was wir heute alles mit euch vorhaben.
Ich muss zwei organisatorische Dinge mit euch klären.
Dann wollte ich nochmal über den funktionalen Stack reden.
Wobei ich die Implementierung, das, was noch fehlt,
gerne ans Ende schieben würde, falls dann noch Zeit ist,
weil ich noch so viel anderes Interessantes habe.
Also ein Student hat gemerkt, Fred hat zu viel geplant,
aber zu wenig geschafft. Ich will nicht wieder in dieselbe Falle treten.
Also das heißt, Funktionalsteck implementieren tue mal dann am Ende
heute, wenn noch Zeit ist. Dann das,
was ich ja eigentlich letztes Mal das Highlight machen wollte,
das kommt dann eben,
das kommt dann
eben heute
Und dann erzählt Heinz noch ein bisschen was zur Lehre-Evaluation,
also ein Feedback zur Lehre-Evaluation quasi.
Was habt ihr uns für Feedback gegeben und was denken wir darüber?
Gut. Okay. Organisatorisches. Es gab ein paar,
ja, Anmerkungen zum Programmieriktat. Ich habe mal eine hier rausgenommen.
Das Programmieriktat sei also nach Ansicht diese Studenten grundsätzlich sinnvoll,
aber das Konzept könnte noch verwässert werden.
Wir haben also eine eigene Umfrage jetzt eingerichtet oder Timo hat die eingerichtet,
die findet ihr im Komsi oder ihr seht auch hier direkt
den Link
Dafür so ein Kennwort, nicht besonders sicheres Kennwort.
Und das dauert ungefähr fünf Minuten, das auszufüllen.
Es gibt also so ein paar Bewertungsfragen,
wie sehr stimmt diese Aussage und am Ende habt ihr nochmal Freitext,
wo ihr dann sagen könnt, ich fände es wirklich sinnvoll,
wenn man es so machen würde oder wenn es früher sein würde oder später oder ich würde die Konzepte ganz anders machen und so weiter.
Das wäre so sehr hilfreich für uns, dass wir sehen können,
wie würden wir das dann im nächsten Jahr machen?
Wollen wir das am Ende von SE1 machen,
am Anfang von SE2 oder so?
Das wäre also ganz toll, wenn ihr das macht.
Wir wollten das eigentlich diese Woche in den Übungen machen,
aber da haben nicht alle Übungsgruppenleiter daran gedacht,
dass ihr in der Übung euch fünf von uns harter findet.
Also denkt bitte dran.
Dann gibt es natürlich bei so einer großen Anzahl von Studenten immer welche,
die in der letzten Woche aus irgendeinem Grund nicht bei einem letzten Termin sein konnten.
Das ist auch völlig in Ordnung. Das kann man einfach
nicht verhindern bei so vielen Studenten. Deswegen biete ich euch an,
jetzt in der kommenden Woche, an jedem Wochentag,
vielleicht könnt ihr ja noch an einem,
könnt ihr zwischen 13 und 18 Uhr zu mir kommen.
Und wir reden dann 15 bis 20 Minuten ungefähr über das letzte Aufgabenblatt,
was euch da noch fehlt. Ihr könnt alleine kommen,
also wenn jetzt ihr die einzigen eurer Gruppe wart,
bei denen was fehlte und ihr könnt auch als ganze Gruppe kommen.
Genau, ihr sollt eine E-Mail schicken, an diese wunderbare Adresse,
se-orga-at-informatik.de Hamburg.de und bitte schreibt konkrete Terminvorschläge rein.
Außer einfach nur schreiben, Ja, irgendwie,
ich muss mal kommen und irgendwas fehlt mir noch.
Also selbst wenn ihr uns schon kontaktiert habt,
schreibt ruhig nochmal und sagt, wann ihr genau Zeit habt.
Ja, dann können wir dann einen Termin vereinbaren.
Ja, und was eben wichtig ist, das,
was ihr uns dann nochmal erklären wollt, das Projekt,
das muss auch wirklich laufen.
Ich habe da schon alles erlebt. Also von Studenten,
der Laptop ging auf einmal nicht mehr,
sie konnten sich nicht mehr einloggen, weil ihr Account abgelaufen war.
Das JDK war veraltet, deswegen gingen Generics nicht und so.
Also stellt einmal bitte sicher,
wenn ihr es auf eurem Laptop machen wollt,
dass das auch wirklich funktioniert, dass man es auch übersetzen kann und ausführen kann und alles.
Weil ich habe da schon mal über eine Stunde verloren,
weil... Ja, gleich geht's, gleich geht's,
gleich geht's und dann ging es immer noch nicht.
Gut. Zu dem organisatorischen
noch Fragen
Okay. Dann... Ich muss ja meine Versprechen halten.
Das hatte ja letzte Woche, hatte mich ja jemand gefragt,
wofür steht eigentlich dieses Cons?
Ist der Herr heute da? Ah, er ist da
, sehr schön. Ich wollte eigentlich einen Snickers kaufen,
aber die sind natürlich günstiger, wenn man mehrere kauft.
Deswegen habe ich jetzt noch ein paar mehr Folien, wo man dieses Symbol sieht,
wo man sich sozusagen noch so einen Snickers verdienen kann.
Genau, holt es dir einfach ab. Ich schaue mir natürlich auch immer das Video,
wenn es hochgelandet ist, einmal selber an,
weil wenn man hier eine halbe Stunde oder Stunde steht und erzählt was,
dann ist da immer Unsinn dabei.
Und mir ist aufgefallen, letztes Mal,
ich habe einen Fehler gemacht und ich dachte,
vielleicht findet ja jemand den Fehler und kann sich dadurch einen Snickers verdienen.
Also ich behaupte, dass hier bei der Operation Push,
Push war ja so,
ich habe einen Stack und ich will einen neuen Stack haben,
wo dann ein weiteres Element obendrauf ist.
Und dazu hatten wir uns vier Nachbedingungen überlegt.
Und mir ist aufgefallen, dass eine Nachbedingung
davon falsch ist
Ich lasse euch jetzt mal vielleicht 30 Sekunden auf die Folie gucken,
währenddessen trinke ich kurz was. Kamera musst du nicht mit.
Sieht da jemand einen Fehler in einer der vier Nachbedingungen?
Wenn jemand den Fehler sieht, wird ganz deutlich die Hand heben.
Okay, einer meldet sich. Du warst zuerst?
Ich würde sagen, weil ihr seid und seid auch,
kommt es zur Übersetzer,
müsste genanntes Zelt
Ähm... Nee, das ist, das ist so schon
richtig. Also, das, was da steht,
ist genau das, was auf Heinzfolien war. Das ist,
ähm, wenn man das aus Java oder Imperativenprogrammiersprachen kennt,
verwirrend, weil da normalerweise das Poppen-Element zurückliefert.
Aber in dieser funktionalen Sicht ist es tatsächlich so,
dass das Pop-In-Stack darunter zurück hilft.
Das ist also nicht der Fehler. Das ist die zweite
Meldung. In den draufzupacken, müsst ihr es dann in
die Ecke sagen. Kannst du es bitte nochmal wiederholen?
Ich hab's nicht 100 Prozent. Da gibt's ja nicht mehr
Feind. Oder es technet sich an die Phänomene der Zeit
und was auch immer
Du sagst also, hier müsste keine Vorbedingungen stehen, die sagt,
not is empty, das stimmt, aber hier steht ja keine Vorbedingungen.
Hier stehen ja nur Nachbedingungen, aber das geht schon sehr in die richtige Richtung.
Also wir sind ja schon in der richtigen Zeile.
Ich kann ja mal hinschreiben, was das hier bedeutet,
das bedeutet ja folgendes. Jetzt sieht es jemand, du?
Es muss bis dahin tun. Richtig, weil sonst sage ich,
egal auf welchen Stack du das rauf tust,
anschließend ist der Stack, auf den du es raufgetan hast,
also der alte Stack ist dann nicht leer, das ist natürlich Quatsch,
wenn ich was auf den leeren Stack drauf tue,
ist der leere Stack ja nach wie vor leer.
Also man muss sich auf das Ergebnis beziehen
Das ist also ein ganz peinlicher Fehler, okay.
Das ist also ein weiteres Snickers. Sehr schön. Und
dann wollte ich euch noch mal ganz kurz in Erinnerung rufen,
was wir letzte Woche implementiert hatten zuletzt.
Wir hatten diese Filterfunktion implementiert und einfach noch mal als Anschauung
, was macht diese Filterfunktion eigentlich?
Die Filterfunktion schaut sich jedes Element des Stacks an und entscheidet,
ob es ein gutes Element ist.
Die guten Elemente habe ich grün markiert oder ob es
ein schlechtes Element ist, die habe ich rot markiert.
Und wie kann die Filterfunktion das entscheiden? Dafür kriegt sie
noch mal eine Funktion übergeben. Ein Prädikat auf Videos.
Und in diesem Fall ist es halt so,
dass ich sage, Videos sind dann gut,
wenn die Größe kleiner gleich 250 ist
Okay, und dann wird als Ergebnis der Filterfunktion ein Stack zurückgeliefert,
wo dann nur noch die guten Elemente sind.
Okay, und das ist so eine Grundstandardoperation, die man
auf solchen Sammlungen gerne hat. Und die gibt es eben
auch in Java, deswegen wollte ich das nochmal kurz wiederholen.
Was wir jetzt noch nicht implementiert hatten, ist folgendes,
es gibt eine Funktion, die nennt sich Map.
Und da ist es so, dass die Anzahl der Elemente gleich bleibt.
Also wenn ich also anfange mit einem Stack von vier Elementen,
dann kommt auch ein Stack mit vier Elementen zurück,
aber es sind andere Elemente. Ja,
in diesem Fall habe ich mich zum Beispiel dafür entschieden zu sagen,
ich will gar nicht das ganze Video haben,
also so ein Videoobjekt,
sondern ich will nur
den Titel haben
Hier oben habe ich also ein Stack von Videos und hier
habe ich ein Stack von Streams, ein Stack von Zeichen kennen.
Und jetzt muss ich auch wieder der Matt-Funktion sagen,
wie sollst du denn jedes einzelne Element verarbeiten?
Das sieht man also hier. Du sollst, ja,
wenn du ein Video siehst, sollst du den Titel da ausextrahieren.
Das heißt das. Ja, das ist also einfach nur hier
eine Funktion, die aus einem Video ein String macht.
Okay. Die werden wir am Ende dort implementieren,
wenn noch Zeit ist, aber wichtig ist,
dass ihr das Konzept verstanden habt, was dieses Map macht.
Nochmal ganz kurz zurück. Filter heißt, ich will nur
bestimmte Elemente, aber die Elemente sind immer noch dieselben.
Und hier ist es die Anzahl Blatt gleich,
aber es sind andere Elemente, irgendwie transformiert.
Ich nehme das Original-Element und transformiere es irgendwie
Okay. So, und jetzt will ich ein Spiel mit
euch spielen. Das ist wie in diesem Film.
Ich habe den Namen vergessen. Saw. Genau, ne?
Ich will ein Spiel mit euch spielen. Und zwar,
das Spiel funktioniert so, ihr sollt euch diesen Quelltext anschauen.
Das ist also ganz normaler Java-7-Quelltext und das sind fast alles,
ist Auszüge aus dem Übungsbetrieb.
Also ihr solltet diesen Failtext irgendwann schon mal gesehen haben.
Und ich möchte, Gesundheit, ich möchte, dass,
es wird mir so ein, unintuitiv.
Ich möchte, dass ihr euch einmal jetzt alle meldet.
Alle einmal die Hand hoch, bitte. Keine Angst,
ich nehme niemanden dran, ihr sollt euch einfach nur melden.
Sehr gut. Und ihr lasst die Hand jetzt oben,
bis ihr für euch verstanden habt,
was dieser Quelltext macht
Ja, also Lesting studiert ihn, wenn ihr Verstand habt,
was er macht, nehmt ihr die Hand wieder runter,
weil dann kann ich sehen, wie weit seid ihr mit dem Verständnis.
Wenn ich das so sehe, okay,
zwei Drittel der Leute haben es verstanden,
dann kann ich langsam anfangen, was darüber zu erzählen.
Sehr gut, dann kann ich wieder trinken,
das ist toll.
So warm draußen
Ok, also die meisten Hände sind unten.
Dann versuche ich mal zu erklären, was ich hier sehe.
Worum ging es hier? Als ihr diese Formel-Karten gebaut hattet,
musstet ihr für euch irgendwie entscheiden, will ich von vornherein für alle,
für jedes Medium schon eine Formel-Karte haben,
dann ist sie einfach leer.
Oder will ich die Formel-Karte erst dann erzeugen,
wenn ich sie das erste Mal brauche?
Man nennt das auch irgendwie lazy oder on demand.
Und hier sieht man so eine Lösung, die haben ganz viele von euch gebaut.
Ich frage also erst mal so optimistisch die Map,
gib mir doch mal die Formel-Karte zu einem Medium.
Das finde ich, was mich interessiert. Und jetzt ist
es so, dass die Map eine Neil-Referenz zurückliefert,
wenn es dazu keinen Eintrag in der Map gibt
Also, wenn du sagst, ich habe zu diesem Medium
keine Formel-Karte gefunden, gibt es noch nicht.
Kommt der Nal zurück. Dann müssen wir uns selber eine erzeugen.
Und dann muss ich sie natürlich auch jetzt in die Map einfügen.
Mit dem Putt füge ich ja ein neues,
einen neuen Eintrag in diese Map hinzu.
Also zu diesem Medium gehört jetzt diese Formel-Karte, die ich gerade erzeugt habe.
Okay, und dann wird sie wieder zurückgeben. Gut,
und hier unten sieht man dann einfach diese Map.
Und jetzt will ich euch zeigen,
wie kann man das Ganze irgendwie direkter, kompakter,
schöner lesbar in Java 8 programmieren.
Und es gab mehrere Anmerkungen in der Lehre-Evaluation,
dass immer zu wenig Code auf den Folien ist.
Also keine Sorge, heute wird sehr viel Code auf
den Folien sein.
So, ja
Jetzt sieht man hier unten, huch, das ist auf eine einzige Zeile zusammengeschrumpft.
Das ist ja interessant. Was steht denn jetzt hier? Also ich,
vielleicht kann man das ja irgendwie auf Englisch verstehen, was hier steht.
Also ich sage, dieser Map, du sollst,
falls es noch keinen Eintrag gibt zu diesem Medium,
sollst du einen Eintrag berechnen.
Und wie soll dieser Eintrag berechnet werden? Du sollst,
ja, dieses New auf der Formel-Karte aufrufen. Das heißt also,
alles, was wir hier oben von Hand programmiert haben,
ich versuche es erst mal und wenn es nicht drin ist,
dann muss ich es ja selber erzeugen und dann muss ich es auch wieder reintun und so.
Das wird jetzt alles um dieser Standardbibliotheksfunktion erledigt.
Da müsst ihr nicht mehr
selber machen
Und der Vorteil ist jetzt, finde ich, man versteht das einfach sofort.
Also wenn ich jetzt... Natürlich muss man dann diese Vokabeln lernen.
Man muss verstehen, was diese Computif-Apps sind, macht.
Aber wenn man es einmal verstanden hat,
dann wird der Quelltext deutlich kürzer und lesbarer.
Und ich muss mich nicht durch irgendwelche IFs durchwühlen und Neireferenzen.
Also erst mal hat man sozusagen mehr Aufwand, das zu verstehen,
aber danach sieht man das dann immer wieder und versteht es dann schneller.
Das ist zumindest die Hoffnung bei sowas.
Gut. Okay. So, weiter im Text.
Zweites Fallbeispiel. Alle wieder die Arme hoch.
Schaut euch an,
was hier passiert
... Ah, sehr schön. Die meisten haben es schon verstanden.
Das ist, dieses Muster hat man ständig gesehen. Das habe ich,
ich habe vier oder fünf verschiedene Stellen gefunden und fast überall was anders implementiert.
Man könnte jetzt noch Variation haben,
dass man hier zum Beispiel noch einen Break reinmacht,
weil man sagt, naja,
wenn ich das erste Millionen gefunden habe, was nicht verdiene,
dann brauche ich mir den Rest dann nicht mehr anzugucken.
Teilweise hat man es ohne IF gemacht.
Also was passiert hier
Ich bin erst mal optimistisch und gehe davon aus,
dass alle Medien verliehen sind in dieser Liste.
Das soll ich ja berechnen. Also ich gehe erst mal
davon aus, dass das der Fall ist.
Und dann versuche ich, ein Gegenbeispiel zu finden.
Also sozusagen unschuldig, bis man einen Beweis gefunden hat.
Gut, ich gehe also durch alle Medien durch.
Und wenn ich jetzt ein Medium finde, was nicht verliehen ist,
dann kann es ja nicht der Fall sein, dass alle verliehen sind.
Sobald ich das erste Gegenbeispiel gefunden habe, sage ich,
nee, dann muss ich wohl voll zurücklegen anstatt True.
Und was mich an dieser Lösung so ein bisschen stört,
ist, ich habe hier eine Vorschleife,
ich habe hier ein If, ich habe hier irgendwelche Variablen.
Am Anfang ist es True, dann wird es auf Foles gesetzt.
Da müssen schon ziemlich viele Zahnräder rattern im Kopf,
bis man versteht,
was da passiert
Natürlich ist es ja so, wenn man das 10 oder
20 Mal gesehen hat, dann erkennt man es schneller.
Aber trotzdem sagt der Quote irgendwie nicht direkt,
was man wissen will. Man will ja wissen,
ob für alle Medien gilt, dass sie verdient sind.
Kann ich das nicht irgendwie direkt dahinschreiben? Huch, schon wieder nur
eine Zeile. Ich habe mir natürlich die Rosinen rausgepickt,
die, die man in eine Zeile kriegt. Gut,
ich habe mal das Blaue, das neue Blau markiert.
Also ich kann jetzt auf so einer Liste sagen oder auf
irgendeiner Collection, gib mir doch nochmal einen Stream.
Mein Stream ist ein relativ abstraktes Konzept. Ihr könnt euch
vorstellen, eine Sammlung liegt ja irgendwo im Speicher.
Je größer die Sammlung ist, desto mehr Speicher braucht ihr.
Während ein Stream ist eigentlich nur sowas ähnliches wie ein Iterator.
Ich hatte euch ja letzte Woche Iteratoren so ein bisschen mal
versucht nahezubringen
Also ein Iteratus ist eigentlich ein neuer Objekt,
was seine Sammlung kennt und weiß, wo man da gerade ungefähr ist.
Mehr nicht. Also der Iterator braucht nicht nur,
Entschuldigung, der Stream braucht nur ganz wenig Speicherplatz.
Aber das Tolle ist, dass ich aus solchen Streams
ganz viele nützliche Operationen aufrufen kann. Ich habe später nochmal
eine Auflösung, was man damit alles machen kann.
Also ich kann zum Beispiel jetzt diesen Stream fragen,
geh doch mal durch alle Elemente durch und prüf mal,
ob die alle ein gewisses Kriterium erfüllen.
Welches Kriterium sollen sie erfüllen? Also du sollst für
jedes Medium prüfen, ob dieses Medium eben verliehen ist.
Das ist alles. Mehr muss ich nicht mehr schreiben.
Keine bulgischen Variablen, keine freie Unterscheidung, keine Schleifen.
Toll. Und das ist auch so effizient, wie es
geht. Also sobald er das erste findet,
hört er dann auch, soweit er das erste Gegenbeispiel findet,
hört er dann sofort auf
Ja? All match. All match wollte ich auch noch mit euch implementieren,
weil ich dachte, es ist schön,
dann seht ihr es hier nicht zum ersten Mal,
aber gut, ihr zählt es zum ersten Mal.
Ja. Okay. Ich bin immer total begeistert,
wenn man irgendwie zehn Zeilen Quelltext auf eine Zeile Quelltext
zusammenkriegt und es dadurch auch noch lesbarer ist.
Es gibt ja auch Programmiersprachen, wo man sagt,
ja super, ich habe eine Zeile,
guckt euch mir, aber man versteht nichts mehr.
Das ist, finde ich hier nicht der Fall.
Ich finde das deutlich besser lesbar.
Gut. Einmal die Hände hoch. Hände hoch. Oder
hinten hat jemand
sofort verstanden
Musik Spürt er den Knoten im Gehirn?
Okay. Gut, ich versuche mal zu erklären,
was hier passiert
Also das ist offenbar einfach nur eine Hilfsmethode,
die man in irgendeiner Klasse von uns braucht.
Die habt ihr euch wahrscheinlich vorher noch nie angeguckt, ja.
Okay, was versucht diese Methode zu erreichen?
Sie kriegt also eine Liste von Verleihkarten rein und sie möchte
eine Map von Medium und Verleihkarte rausgeben.
Jetzt kann man an den Typen schon einiges ableiten.
Wahrscheinlich will man irgendwie durch diese Liste durchgehen und eine Map erzeugen,
wo dann, ja, eben auf diese Verleihkarte abgebildet wird.
Ja, und wo kriegt man jetzt das entsprechende Medium her?
Das steht ja auf der Verleihkarte drauf. Man will also sozusagen den,
man kann auf einer Verleihkarte sehr einfach aufs Medium zugreifen.
Ich rufe einfach Gelbmedium auf, aber andersrum eben nicht.
Und diese Funktion soll eben erlauben, dass das,
dass man das später mit dieser Map eben auch andersrum
effizient machen kann
Gut, wir erzeugen uns erstmal eine neue Hashmap.
Dann gehen wir mal wieder durch unsere ganze Liste durch.
Haben also jetzt immer jeweils eine Karte an der Hand.
Was machen wir jetzt? Wir erzeugen jetzt einen neuen Eintrag und sagen,
der Schlüssel dieses Eintrags soll das Medium sein,
was auf der Karte gespeichert ist.
Und dann soll er auf die Karte selber abgebildet werden.
Okay. Dann habe ich so eine Map und dann kann ich sehr einfach fragen,
hey, was ist denn die Verleihkarte zu James Bonds sowieso?
Ohne diese Map müsste man ja sonst jedes Mal,
wenn man diese Frage stellen will,
immer wieder komplett durch die Liste durchgehen.
Das wäre irgendwie blöd. Also berechnet man das einmal am Anfang? Okay,
also was, nochmal, was wollen wir konzeptionell machen,
wenn wir jetzt mal diese Fonds schleifen und Returns und
so alles
erstmal ausklammern
Wir wollen eine Liste nehmen und wollen daraus eine Map machen,
indem wir jeden Eintrag irgendwie zu einem Eintrag in der Map verarbeiten.
Wie könnte das aussehen? Das sieht so aus, okay.
Ich nehme also wieder die Liste, erzeuge mir daraus einen Stream,
weil der eben diese ganzen tollen Operationen anbietet.
Und sage jetzt, das steht jetzt auch zum ersten Mal,
collect, also ich will jetzt irgendwie diese Elemente wieder in eine andere Sammlung reintun.
Dafür braucht man dieses Collect. Und jetzt gibt es ganz viele Variationen,
in was für eine Art von Sammlung ich das reintun kann.
Ich sage, ich will es in eine Map tun.
Okay. Und dieses Tomat erwartet jetzt zwei Argumente,
das sind auch einfach wieder Funktionen. Denn Diese Funktion Tomat muss ja wissen,
wie soll ich denn jetzt aus einem Element einen Map-Eintrag machen?
Ich kann ja nicht einfach raten. Das musst du mir schon sagen.
Also wie kann ich aus diesem einen Element einen Schlüssel machen?
Ich rufe einfach das Geldmedium auf der Verleihkarte auf.
So erhalte ich den Schlüssel. Und wie kann ich jetzt
aus dem Listeneintrag das Element machen, auf das der Schlüssel zeigt?
Das kann einfach unverändert bleiben. Die Karte,
die da reinkommt, die soll auch unverändert gelassen werden.
Das ist also einfach nur, wenn man so wie die Identitätsfunktion.
Okay. Ja, also hier sieht man schon,
man muss hier wirklich mal sich die API angucken,
was gibt es da alles außer Tomat,
sicherlich auch Tourist und Tossette.
Und man muss es einfach lernen. Also es ist jetzt
nicht auf magische Art und Weise sofort einfach,
sondern man muss diese neuen Vokabeln sozusagen lernen,
wenn man so will
Okay. Und dieses Trommap ist eine statische Methode aus
der Klasse Collectors, glaube ich.
Gut. Schön. Dann Hände hoch
Tschüss. Oh, ich sehe gar keine Hand mehr,
da kommt noch. Gut. Was passiert hier? Also
ich bekomme einen Kunden reingereicht und ich will, ja,
eine Liste der Medien haben, die er gerade ausgeliehen hat.
Okay. Deswegen iterieren wir jetzt mal über die Map,
die wir uns zwei Schritte vorher zusammengebaut hatten.
Okay, wenn ich auf einer Map aufrufe, Values,
bekomme ich eine Collection zurück, wo nur die abgebildeten Elemente sozusagen drinstehen.
Ja, das ist dann also die Medien. Das heißt,
auf Deutsch, ich gehe einfach, Entschuldigung, Nein,
das sind die Verleihkarten, die Medien sind ja die Schlüssel, Entschuldigung.
Also ich bekomme jetzt hier die Verleihkarten, schauen uns also jeder einzelne Verleihkarte an.
Gut. Jetzt interessiert mich aber natürlich nur die Verleihkarten,
wo der Entleiher auch der Kunde ist.
Also wenn ich wissen will, was habe ich denn so alles ausgeliehen,
dann brauche ich ja nur die Verleihkarten, wo ich als Entleiher draufstehe.
Also nur dann, wenn der Entleiher der Kunde ist,
für den ich mich interessiere,
tue ich jetzt nicht die Verleihkarte in die Liste.
Ich will ja nicht wissen, welche Verleihkarten gehören alle zu mir.
Das ist irgendwie ein Implementationsdetail, sondern um welche Medien handelt es sich.
Also muss ich dann immer die Karte fragen,
was ist denn das Medium,
zu dem
du gehörst
Man sieht also hier sozusagen, ja, das sorgt dafür,
dass ich nicht alle Elemente zurückgebe, sondern nur einen gewissen Teil.
Und das sorgt dafür, dass ich nicht die Original-Elemente zurückgebe,
sondern nur eine Teilinformation. Hat jemand das schon mal heute gesehen,
dass ich einmal sage, ich brauche nicht alle Elemente,
sondern nur vielleicht die Hälfte oder so.
Und dass ich hier sage, ich brauche nicht das Element selber,
sondern ich will vorher noch irgendwas machen, eine Funktion darauf aufrufen oder so.
Wurde das heute schon mal thematisiert? Ja? Bei
der Elbjörn Akku sind das viele, viele Fotos.
Es hatte mit den Videos zu tun, genau,
und weiß noch, wie diese beiden Funktionen hießen,
die eine, die sagte,
ich brauche nicht alle und die andere,
die sagt,
ich will das Element noch irgendwie verarbeiten
Das waren diese beiden Folien, die ich vorhin hatte,
ne? Weißt du das vielleicht jemand anders sonst?
Ne? Das war Filter und... Ah, ja.
Ja, genau. Filter on Map, ne? Sehr
gut. Das heißt, ich nehme jetzt wieder diese,
ja, Sammlung, mache einen Strom daraus und sage dann,
ich brauche nicht alle Elemente, sondern welche Elemente brauche ich?
Ja, schau dir einfach die Karte an. Und wenn
der Entleiher dieser Karte der Kunde ist, dann will ich es behalten.
Ansonsten weg damit. Also gedanklich, im Original bleibst du natürlich vorhanden. Gut,
das heißt also, wenn dieses Filter ausgeführt wird,
habe ich sozusagen nur noch einen Strom,
wo die Karten draußen sind, wo ich da entleife bin.
Und dann sage ich hier mit dem Map, hey,
die Verleihkante, das interessiert mich gar nicht, ich brauche nur das Medium.
Also ruf mal bitte das Gap-Medium auf den Verleih gerade auf.
Okay. Und dann würde ich da keinen Strom zurückgeben,
sondern ich will da eine neue Liste zurückgeben.
Also collecte ich wieder und sage, das soll in eine Liste getan werden.
Ja, und sowas ist etwas, was ihr super häufig findet. Immer dann,
wenn ihr irgendwelche Daten verarbeitet,
die irgendwie angezeigt werden sollen oder ich brauche nur bestimmte Dinge,
dass ihr sagt, ja, ich schrumpfe mal ein bisschen ein,
ich will nicht alle tausend Informationen haben,
sondern nur die für den Kunden sind oder was auch immer.
Und dass sie dann am Ende sagt,
ich brauche auch nicht bei jedem Element alles,
sondern nur, ich picke mir mal das raus,
was mich gerade interessiert.
Das ist ein absolutes Standardmus. Also Filter und Map
werdet ihr ständig sehen
Okay. Gut. So, ein Beispiel. Oh,
da ist eine Frage, ja?
Das ist ja jetzt eigentlich nur die Verletzbarkeit oder so.
Formels decke ich schneller. Oh, du hast genau
die beiden Gründe genannt, warum ich das heute vorstelle.
Lesbarkeit und Performance. Wird beides noch erklärt, ja.
Also Lesbarkeit habe ich ja eigentlich schon angesprochen die ganze Zeit.
Ihr seht ja, wie begeistert ich bin.
Über Performance werde ich heute auch noch reden.
Ja. Eigentlich hättest du jetzt auch einen Snickers verdient.
Ich weiß nicht, ob ich genug dabei habe.
Du hast schon eins, alles klar. Gut.
Lass uns jetzt eine Spezialfolie. Also ihr müsst jetzt erstmal
eure Hände heben. Ja, schaut euch das an.
Und ich werde am Ende einen von euch fragen,
dass er mal erklären soll, was hier passiert,
weil das ja doch ziemlich kompliziert ist
Aber erstmal hebt die Hände und schaut euch das an.
Also das ist schon ziemlich kompliziert
Ist nicht einfach, oder?
Ich bin auch noch am Überlegen
Das ist übrigens ein künstliches Beispiel, das ist nicht aus der Mediathek.
Sowas kompliziertes habe ich leider nicht gefunden in der Mediathek.
Okay, die meisten Hände sind unten. Dann nehmt ihr jetzt mal alle
die Hände runter und vielleicht kann ja mal ein Student von euch...
Also ich baue jetzt eigentlich zwei Dinge. Einmal kurz erklären,
was hier passiert, okay. Und dann taucht hier irgendwas auf,
was wir heute schon mal hatten, wo man irgendwie sagen kann,
ah, diese fünf, sechs, sieben,
acht Zeilen, die kann man ja wunderbar verkürzen.
Sowas ähnliches hatten wir heute schon mal. Traut sich da
jemand zu sagen, ich habe hier ein Muster identifiziert,
was wir heute schon mal hatten?
Sonst reicht es vielleicht auch
erst mal
Der Mann kennt ja eine Sammlung vor. Richtig, die
Sammlung von Wartung? Ja. Danach hat er gesagt,
die Band 21, also kann man bei der Märkte sich,
alle Deutscher gehen in Lastungsweihnachten.
Sehr schön, genau. Ich weiß nicht, ob das
jetzt durch das Mikro durchkam. Du hattest gesagt,
man kriegt eine Menge von Wörtern rein und dann wird eine Map erzeugt,
wo eben zu jeder Wortlänge die entsprechenden Wörter drinstehen,
die diese Länge haben.
Sehr gut. Okay, und hast du auch irgendwie gesehen,
dass hier irgendwas drin ist, was schon mal heute vorkam?
Ja? Ja, ich würde ja auch jeden Fall uns
das mit dem Springen drauf und ins April,
was hier reingeht.
Das könnte man ja auch
Und. Ja, doch, das dann. Und kann man
sehen, es ist seit 30 Jahren nach der Kommunikation.
Richtig, sehr gut. Snackers für dich.
Er hat gesagt, das mit dem Set gleich null,
das sieht er nach dem Compute if Appcent aus.
Ich will ja sozusagen, was ich hier machen will,
ist ja folgendes. Ich will zu einer gewissen Wortlänge,
sagen wir mal zum Beispiel, hallo,
da wären die Länge 5. Möchte ich die mir fragen,
hast du schon einen Eintrag zur Länge 5?
Hast du schon Wörter der Länge 5?
Wenn ja, will ich das ja einfach nur hinzufügen.
Ansonsten muss ich dieses Z erstmal erzeugen.
Das ist genau das Muster, was wir schon hatten.
Das heißt, das kann man
so verkürzen
Ja, also für jedes Wort sage ich, liebe Map,
gib mir doch mal zu der Länge, das entsprechende Set.
Und wenn es noch nicht da ist,
erzeuge ein neues Hashtag und anschließend möchte ich dann zu dem Hashtag,
welches auch immer das jetzt ist,
entweder das bestehen oder das Neue, das Wort hinzufügen.
Toll, oder? Also da muss ich noch mal kurz
den Kontrast machen. Dieser furchtbare Quelltext, wo ich jetzt
schon wieder von vorne anfangen müsste, um den zu verstehen.
Und dann dieser Quelltext. Finde ich einfacher.
Ich weiß nicht, wie es euch geht.
Gut. Aber das ist ja mehr als eine Zeile.
Ja, das geht auch noch kürzer. Denn was wir hier eigentlich machen wollen,
ist zu sagen, ich habe eine Sammlung von irgendwelchen Dingen
ich habe eine Schlüsseleigenschaft identifiziert, nämlich die Länge.
Und ich möchte jetzt diese Sendung gruppieren nach der Länge.
Das ist etwas, wenn jemand schon mal Datenbanken,
Vorlesungen oder so besucht hat, etwas völlig Natürliches.
Ich möchte kopieren. Deswegen kann man das in Java 8
auch auf irgendwelchen Sammlungen machen.
Ich mache mir also wieder so einen schönen Stream,
mache wieder einen Collect, weil ich jetzt eine neue Sammlung brauche.
Und dann sage ich, grouping by. Das erzeugt mir
also implizit so eine Map. Ich sage, der Schlüssel,
nachdem du gruppieren sollst, ist die Länge eines Strings.
Und jetzt kann es ja sein, dass du Plikate in
den Wörtern vorkommen, die interessieren mich jetzt nicht.
Also tut es dann mal bitte letzten Endes in ein Set
rein. Wenn ich dieses Trusset weglassen würde,
würde ich eine Map bekommen, die auf Listen von Strings abbildet.
Das will ich in diesem Fall aber nicht
Okay. Ja, also ich bin begeistert. Ich weiß nicht,
wie es euch geht. Gut, wer ist begeistert am
Handtuch? Ja, so ein paar Hardcore-Enthusiasten sind begeistert.
Gut. Okay, was haben wir noch? Genau.
Wenn man sich in diese neuen Java 8, ja,
Bibliotheksänderungen reindenken will, finde ich so eine Landkarte ganz gut,
an der man sich orientieren kann.
Also ich habe jetzt mit mir hier ein Diagramm gemacht.
Ich nenne das einfach mal Typ-Übergangsdiagramm. Ich weiß gar nicht,
ob es sowas gibt, aber ich habe es einfach mal erfunden notfalls.
Man kann also gedanklich hier anfangen. Ich habe eine Collection
von Tee und wenn ich jetzt einen Strom haben will,
dann rufe ich einfach dieses Stream auf oder eine andere Operation,
über die rede ich
gleich noch
Ja, und jetzt kann ich mit dem Stream ganz,
ganz viele tolle Dinge machen. Das sind also jetzt die Operationen,
die ich auf einem Stream aufrufen kann und ich bleibe in dieser Stream-Domäne sozusagen.
Ja, also ich kann sagen, Filter, Filter,
Filter, Map, Filter, Map, Map,
Peak, Filter, Map.
Also ich kann beliebig viele Dinge da hintereinander einfach hinschreiben,
je nachdem, was da gerade sinnvoll ist.
Aber irgendwann will ich dann irgendein sinnvolles Endergebnis haben.
Ich will nicht am Ende, dass ein Strom dabei rauskommt,
sondern vielleicht ein Element oder irgendwie ein Bully oder so.
Ja, und deswegen habe ich mal hier sozusagen die Endergebnisreihe befindet sich sozusagen hier.
Man könnte also zum Beispiel auch so einem Stream das All-Match
aufrufen und ein Prädikat übergeben und dann kriege ich ein Bully und so.
Und dann ist Schluss. Ja, dann ist sozusagen
die Verarbeitungspipeline vorbei
So ein klassisches Muster. Ich habe eine Collection, Ruf einmal Stream auf,
dann ganz viele von diesen Operationen und am Ende einmal das All-Match.
Oder was man auch machen kann, was wir eben gesehen haben,
ich gehe von der Stream-Welt wieder zurück in die Sammlungswelt mit diesem Collect.
Ich kann also sagen, gut,
jetzt in dem Stream sind noch so ein paar Elemente drin,
die will ich jetzt wieder in eine Sammlung reingeschoben bekommen.
Und was wir jetzt noch nicht gesehen haben,
es gibt noch solche weiteren Reduktionsfunktionen,
ich kann zum Beispiel sagen, ich will das Minimum haben,
das kleinste Element in dem Stream oder ich will das erste
haben oder irgendeins oder es gibt ja auch noch solche Reduktionsfunktionen,
die so ähnlich sind wie dieses Fold Ride,
aber deutlich effizienter.
Ja, also das müsst ihr jetzt nicht mit einmal blicken sofort alles verstanden haben,
aber wenn ihr sagt, ich fand das interessant heute,
ich will mal wissen,
ich will mal so ein bisschen selber hacken und gucken,
was gibt es da los, dann finde ich das als Übersicht und als Landkarte,
als Wegweiser irgendwie ganz nett, dass man sonst ist,
man steht immer in so einem Dschungel und weiß gar nicht,
wo man anfangen soll.
Also hier ist eigentlich Staat, gehe nicht über Staat und
Ziel, nicht 40.000 ein. Gut. Parallel Stream,
das habe ich erst ganz spät in die Folienaufnahme.
Ich wollte eigentlich erst gar nicht drüber reden, weil dann dachte ich,
naja, es ist ja eine Motivation dafür gewesen,
ich muss irgendwie darüber reden.
Also, ich darf nicht zu viel erzählen,
denn ich muss ja noch einen Snickers rausgeben
Richtig. Also man hat irgendwann mal festgestellt,
ein Herr bei Intel hat irgendwann mal festgestellt,
dass die Integrationsdichte bei so Prozessoren und Speicherchips,
da scheint es irgendwie ein Gesetz zu geben,
was irgendwie sagt, alle 18 bis 24 Monate verdoppelt sich das.
Ja, das sieht man also,
das sieht man also hier, die Anzahl der Transistoren,
also die Chips sind ja immer ungefähr gleich groß geblieben,
aber vielleicht so groß.
Die Anzahl der Transistoren verdoppelt sich so alle 18 bis 24 Monate.
Ich kriege immer mehr Logik in meinen Chip rein.
Und das hat bis heute nicht aufgehört.
Also diese Grafik geht nur bis 2010, aber glaubt mir,
sie hat bis heute nicht aufgehört. Frage an euch,
wie heißt dieses Gesetz, was sagt, ah,
da meldet sich jemand.
Ja, ein Snickers für Muslan.
Sehr gut
Der Herr Moore, den man hier nicht sieht,
das ist also nicht der Herr Moore, das ist jemand anders.
Der hat das in den 70ern bei Intel irgendwann mal festgestellt.
Er hat das eigentlich nur so scherzhaft gesagt,
das scheint irgendwie so zu sein und dann wurde das zum Gesetz erhoben.
Gut. Okay, wen man hier sieht, das ist Herb Sutter,
der arbeitet bei Microsoft und interessiert sich extrem für Performance.
Und er hat etwas Beunruhigendes festgestellt vor zehn Jahren,
er hat vor zehn Jahren einen Artikel geschrieben,
der hieß The Free Lunch is over.
Früher war das immer so, ein Softwareprojekt,
Neuer dauert ja sicherlich mal, vielleicht ein Jahr,
zwei Jahre, drei Jahre und das Tolle war,
ihr habt irgendwann angefangen mit dem Softwareprojekt, ist zu langsam.
Kein Problem. Das dauert ja eh noch drei Jahre,
bis die Software fertig ist.
Bis dahin sind die Rechner ja schon viermal so schnell.
Dann läuft es wieder. Kein Problem. Wir warten einfach ab.
Die Rechner werden schneller und dann läuft die Software schnell genug.
Das hat irgendwann nicht mehr funktioniert. Und zwar,
wenn man sich diese blaue Kurve anguckt, die sagt,
wie viel, ja, Megaherz hat eigentlich so eine CPU.
Das hat irgendwann aufgehört zu steigen. Wir sind irgendwann
so ungefähr bei drei Gigahertz, ist es stehen geblieben.
Man kann da mit Wasserkühlung oder ihr kennt euch da besser aus.
Flüssiges Stickstoff oder so. Kann man da noch so ein
paar Megahertz rausholen, aber dann ist irgendwann einfach Schluss.
Die Dinge werden einfach zu heiß
Also wir kriegen immer mehr Transistoren auf unsere Chips,
aber sie werden nicht schneller. Das wäre irgendwie blöd.
Was machen wir denn jetzt mit den ganzen Transistoren?
Und ja, einmal eine Umfrage an euch.
Wer hat einen Rechner zu Hause mit einem einzigen Kern,
mit einem einzigen Rechenkern? Da ist noch ein,
zwei Leute, da sind die alten Dinger noch mit Windows XP,
von denen kann man sich nicht trennen, dann hängt emotional zu sehr dran.
Die meisten von euch haben also mindestens zwei Kerne.
Selbst mein furchtbar altes Notebook geht auch schon zwei Kerne.
Und zu Hause habe ich auch, glaube ich,
vier oder so, ich weiß es gar nicht.
Also ist irgendwie, ja, die Herausforderung,
wie kann ich denn jetzt von dieser zusätzlichen Rechenpower Gebrauch machen?
Ich muss irgendwie Dinge parallel berechnen lassen
Nun kann man in Java mit Threads und so zwei Dinge parallel machen,
aber das ist so unglaublich schwierig, das korrekt zu machen.
Ja, dass man da immer nur eigentlich mit den Schultern zocken kann und sagen,
wir wissen auch noch nicht so richtig, was wir da machen sollen.
Und jetzt, ich gehe nochmal eine Folie zurück. Sozusagen,
ja, der heilige Gral wurde jetzt endlich gefunden, zumindest auf einem Teilgebiet.
Wenn ihr also ein Problem habt, dass ihr sagt,
ich habe eine Liste mit einem Millionen Elementen und ich muss damit irgendwas,
ich muss mit jedem Element dies tun,
ich muss das filtern, ich muss das mappen oder so,
dann kann das jetzt relativ einfach parallel gemacht werden,
ohne dass ihr irgendwelche Threads erzeugen sollt oder euch um Synchronisierung
Gedanken machen müsst oder so.
Und das wollte ich mal
live vorstellen
Leider, leider habe ich ja hier nur zwei Kerne.
Deswegen ist es hier nicht ganz so,
oh, das ist ja hier schon ein Spoiler.
Deswegen ist das hier nicht ganz so beeindruckend.
Zu Hause, bei mir war das deutlich beeindruckender.
Also ich habe hier so einen kleinen Micro-Benchmark geschrieben.
Man muss immer vorsichtig sein mit Benchmarks, gerade bei Draver
. Aber gut, wir schauen uns den mal an.
Was machen wir hier? Also, es gibt nicht nur
diese Stream-Klasse, sondern es gibt auch noch spezielle,
die ist ein Instream und Long Stream.
Die sind einfach ein bisschen effizienter als Stream von Integer und Stream von Long,
weil man dann nicht dieses Boxing und Unboxing machen muss.
Und ich kann sagen, ich möchte einen Strom haben,
der von eins bis N zählt.
N ist hier
eine Milliarde
Jetzt braucht dieser Strom aber nicht eine Milliarden Elemente im Speicher,
sondern der Strom weiß einfach nur, wo bin ich gerade,
aber ich bin gerade bei der Eins,
bis wo soll ich, bis eine Milliarde.
Das wird also ein Objekt sein, was irgendwie, keine Ahnung,
zwei, drei Wörter im Speicher, aber auch mehr nicht, ja.
Aber ich kann damit eben dann anfangen rumzurechnen mit dem Strom.
Gut, das kennt ihr schon,
das ist XE1. Ich gucke, wie spät es ist,
ja, einmal auf die Uhr gucken, alles klar.
Dann führe ich eine Operation aus, die ja ein bisschen länger braucht.
Ich summiere also die ganzen Elemente dieses Longstreams auf und
dann schaue ich noch mal, wie spät es ist.
Dann schaue ich, wie viel Zeit ist denn vergangen?
Teile das durch eine Milliarde,
weil ich will das nicht in Nanosekunden haben,
sondern in Sekunden,
muss ich
durch eine Milliarde teilen
Und dann gebe ich am Ende einmal das Endergebnis aus,
vielleicht will man ja wissen,
was die Summe der ersten eine Milliarde zahlen ist.
Und dann sage ich, wie lange das gedauert hat.
Gut. Und jetzt sollte man das nicht nur einmal ausführen,
weil manchmal braucht Java so ein bisschen die virtuelle Maschine,
brauchen wir einfach so ein bisschen, um die Optimierung dadurch durchzuboxen.
Deswegen führe ich das einfach zehnmal aus. Auch hier mal
was Neues, Philadner für euch. Ich sage also,
ich brauche eine Range, die von null inklusive bis zehn Exklusive geht.
Also ich will zehn Durchläufe haben. Und ich will jedes Mal,
das I ist mir in diesem Fall egal,
aber man muss das hier eben hinschreiben, will ich diese Measure-Funktion aufrufen.
Okay, also ich mache hier zehnmal dieses Measure.
Jetzt muss also die Konsole sieht man jetzt hier nicht.
Ich starte das einfach mal
Ja. Ja, also zu Hause ging es natürlich deutlich schneller,
ihr braucht jetzt ein bisschen Geduld, zieht, oh,
das ist schon was Spannendes passiert.
Das hat noch nichts mit Parallelität zu tun.
Das ist mal wieder so ein kleiner Schluck auf.
Ja, also nochmal, dass man alle zehn Messergebnisse sieht.
Ihr seht also offenbar, bei den ersten beiden Durchlaufen war
die Virtuomaschine noch nicht warm gelaufen. Und dann hat sie gemerkt,
oh, dieses Mesher scheint eine wichtige Operation zu sein,
die wird ja mehr als einmal aufgerufen,
dann übersetze ich die mal in Maschinencode,
dass sie nicht mehr interpretiert werden muss.
Und schon ist das schneller. Das hat also nichts
mit Parallelität zu tun, das macht Java schon immer oder
zumindest schon ziemlich lange
Ich wollte euch dazu noch mal zeigen, ach so,
das ist das andere Terminal.
Wie dann hier so die CDU-Auslastung ist. Also unter Linux
ist es so, wenn die CPU-Auslastung 100 Prozent ist,
heißt es, ein Kern wird zu 100 Prozent ausgelastet.
Also ich starte das jetzt hier noch mal.
Ich hoffe, ihr könnt das überhaupt lesen.
Sonst sage ich es einfach. Also hier steht jetzt,
was haben wir hier? 101 Prozent. 100 Prozent.
Ja, 100 Prozent. Ja, also ein Kern wird
super gut ausgelastet und der andere so gar nicht
Dann, und jetzt kommt die Magie, ich sage jetzt hier einfach mal Parallel.
Das nimmt sich also einen Strom und wandelt ihn in einen
parallelen Strom um. Das heißt, alle Operationen,
die ihr hinter dem Parallel ausführt, zum Beispiel dieses Sum,
werden jetzt parallel berechnet, also auf mehrere Kerne aufgeteilt.
Okay, das ist das Einzige, was ich ändern muss.
Wenn ich das vor fünf Jahren irgendwo gesehen hätte,
hätte ich gedacht, das kann nicht sein.
Wenn man normalerweise ein Single-Threaded-Programm hat und würde es auf mehrere Kerne verteilen,
muss man so viel Boiler-Play-Code schreiben und Synchronized und New Thread und so.
Und das braucht man jetzt alles nicht mehr.
Also schieben wir das mal nach rechts.
Das läuft hier noch und dann
starten wir es mal
Achso, wir müssen uns auch das Ergebnis erst mal merken.
Also wir haben ja 1,1 Sekunden, ja.
Wie gesagt, erwartet geht ja nicht so viel.
Ich habe kein besonders tolles Notebook. So, ja,
was haben wir hier an Auslastung? 165 Prozent. Ja
. Also er ist leider nicht bis 200 Prozent gekommen.
Okay. Und wir hatten vorher 1,1 Sekunden, jetzt haben
wir nur noch 0,7. Wer ist gut im Kopf rechnen?
Das ist ungefähr zwei Drittel davon. Das heißt,
es ist um 50 Prozent schneller. Habe ich das richtig
gerechnet? Ja. Immerhin um 50 Prozent. Dafür,
dass ich nur Parallel geschrieben habe. Ich hätte mal Screenshot
zu Hause machen, sondern ich hatte zu Hause
700 Prozent CPU-Auslastung
Da dachte ich, wie geht denn das? Ich habe
doch nur vier Kerne. Bis ich dann nochmal geguckt habe
in meinem Prozessor, der hat so ein sogenanntes Hyper-Threading.
Ich weiß gar nicht, was das ist.
Der simuliert dann weitere Threads in Hardware. Keine Ahnung,
wie das funktioniert. Also um den Faktor sieben schneller.
Ich war extrem beeindruckt. So. Das heißt, das ist schon
mal ganz nett. Ich kann mit relativ wenig Aufwand,
ich muss mich immer an diese neue Syntax gewöhnen und musste jetzt entscheiden,
okay, ich habe hier fünf Medien, da lohnt sich das Parallel nicht.
Bei fünf Medien wird das tausendmal langsamer sein, weil natürlich
ein bisschen Overhead da ist, der am Anfang laufen muss.
Aber wenn ihr viele Elemente habt, dann kann man wunderbar von aktueller Hardware profitieren.
Und jetzt haben wir wieder unser Free Lunch.
Also wenn ich merke, oh, 0,7 Sekunden,
das ist nicht schnell genug, dann warte ich einfach ein Jahr.
Und dann habe ich vier Kerne statt zwei und dann geht
es wieder
Ja. Toll. Gut, wie viele Snickers habe ich noch?
Ich muss vorsichtig sein. Eins habe ich noch.
Ich muss also, darf hier nicht zu viel versprechen.
Gut, ich gehe nochmal ganz kurz zurück. Eine Sache
, nee, Entschuldigung. Eine Sache haben wir noch.
Das ist dieses Optional Tee. Optional Tee ist eine dieser Fragen,
wo sich die Geister scheiden. Es gibt 50 Prozent Java-Programme,
die sagen, das ist so die geilste Erfindung überhaupt.
Und die anderen 50 Prozent sagen, das ist totaler Schwachsinn,
bringt nichts und macht alles noch viel unsicherer und langsamer
Ist, das ist so ähnlich wie bei den Checkt Exceptions.
Es gibt also Leute, die sagen, Checkt Exceptions,
man kann gar keine robuste Software schreiben ohne Checkt Exceptions und andere Leute sagen,
Checkt Exceptions sind das Werk des Teufels und sind nicht kombinierbar und was weiß ich.
Also man muss das einfach akzeptieren, dass die Leute da verschiedene Meinungen haben.
Gut, was kann ich mit so einem Optional Tee machen?
Schauen wir uns erstmal das Grundproblem an.
Vielleicht ist es für euch gar nicht ein Problem,
weil ihr euch an Nall schon so gewöhnt habt.
So, also ich habe mal versucht,
mir ein Beispiel zu überlegen, gar nicht so einfach.
Die meisten Optional Beispiele sind so trivial, dass es sinnlos wirkt.
Also was haben wir? Ich habe mal
unsere klasse Girokonto genommen, die kennen wir auch aus SE1.
Was hat die intern? Ihr müsst das Layout entschuldigen,
auf einer Folie hat man ja schon einen NTV Platz.
Sie hat also eine Exemplarvariable, wo sie sich die Kontobewegung merkt.
Das war irgendwann in Woche 5 oder so hatten wir
das in
Und jedes Mal, wenn ich einzahle, wird da eine
Kontobewegung raufgetan oder reingetan in die Liste und jedes Mal,
wenn ich abhebe.
Gut, ich interessiere mich jetzt für die erste Einzahlung in einem bestimmten Jahr.
Jetzt mache ich das wieder ganz klassisch. Java 7,
ich nehme einfach eine erweiterte Vorschleife. Schauen wir also
jede Bewegung an. Und dann gucke ich erst mal,
ob das eine Einzahlung ist. Und das ist eine Hilfsmethode,
der habe ich mir geschämt, da gucke ich,
da wird einfach nur geguckt, ob der Betrag mindestens null ist.
Bei den Auszahlungen hatten wir immer negative Beträge, negative Verträge.
Negative Zahlen, in die Kontobewegung getan. Gut,
das muss also eine Einzahlung sein und ich kann mir
das Jahr dieser Kontobewegung geben und ich schaue,
dass es auch das Jahr ist,
für das
ich mich interessiere
So, und wenn ich so eine Bewegung gefunden habe,
eine Einzahlung, die im richtigen Jahr ist,
dann gebe ich denen einfach zurück.
Dieses Return springt ja sofort aus der Funktion oder aus der Methode raus.
Das heißt, selbst wenn die Vorschlafe noch nicht durchgelaufen ist,
ist egal, ich kehre jetzt zum Klienten zurück mit dem Element,
was ich gefunden habe.
Wann kommt der Kontrollfluss in diese Zeile, wenn die Vorschlafe
komplett durchgelaufen ist? Und ich habe kein solches Element gefunden.
Und was muss ich jetzt machen? Naja,
ich habe ja dem Klienten versprochen, eine Kontrobewegung zurückzugeben.
Das ist ein Referenztyp, es gibt ja dieses Neil.
Gut, kein Problem, ich gebe einfach Neil zurück.
Da muss ich das natürlich auch dokumentieren. Also diese Methode könnte
nahe zurückliefern, wenn ich so ein Element nicht finde.
Diesen Kommentar habe ich jetzt hier aus Platzmangel nicht hingeschämt.
Das müsst ihr hinschreiben. Sonst kann der Klient nicht wissen,
dass da manchmal auch Neil zurückkommen kann
Okay, nehmen wir an, wir haben es hingeschrieben,
erklärt, hat es verstanden. Wie kann ich das dann aufrufen?
Das ist jetzt hier der Weihnachtsmann. Ich habe mir immer überlegt,
der Weihnachtsmann hat Budgetkürzungen und der will jetzt gucken,
gibt es irgendwelche Leute, die wahnsinnig viel Geld zu Weihnachten kriegen?
Dann brauche ich denen selber ja nichts mehr zu schenken.
Der guckt jetzt erst mal an aus den letzten 20 Jahren.
Er hat jetzt hier also irgendein verdächtiges Konto identifiziert und schaut sich
dann mal jeweils die erste Einzahlung in diesem Jahr an.
Okay, jetzt muss der Weihnachtsmann natürlich daran denken,
der will ja keine Nightcounter Acception kriegen.
Erst mal gucken, gab es denn überhaupt so eine Kontobewegung?
Also ist nicht Night zurückgekommen. Und wenn es eine solche gab in dem Jahr,
dann gucke ich, ob, ja,
ob sozusagen die erste Einzahlung in dem Jahr eine Million war.
Nach dem Motto, ich habe so viel Geld von meinen
Onkels und Tanten bekommen, das tue ich erst mal auf
mein Konto
Dann zieht der Weihnachtsmann, oha, also der hat so viel Geld,
den kann ich von meiner Liste streichen,
der braucht ja offenbar von mir in X mehr.
Das wird dann natürlich einfach gelockt. Gut. Neue Referenz.
Ja, ich habe da später noch eine Folie zu.
Also der Erfinder der Neil Referenz, ich habe ja noch einen Snickers.
Weiß jemand, wer die Neil Referenz erfunden hat?
Ne? Die wird nämlich nächstes Jahr 50, da können wir Geburtstag fallen.
Neil Referenz wird 50 Jahre alt. Okay, gut,
vielleicht habe ich ja noch eine andere Möglichkeit mit den Snickers.
Es gibt also viele Leute, die sagen,
ich will die Tatsache, dass da möglicherweise eine Kontobewegung zurückkommt,
möchte ich im Typsystem festhalten.
Ich will also einen eigenen Typ dafür haben, der sagt,
vielleicht kommt ja was zurück, vielleicht aber auch nicht.
Ja, und das sieht jetzt so zum Beispiel aus.
Ich sage jetzt also als Rückgabertyp nicht mehr Kontobewegung, sondern Optional-Kontobewegung.
Und ich kann dann so eine optional fragen,
ist denn was in dir drin? Und was in dir
drin ist, will ich was machen oder so?
Und natürlich habe ich jetzt hier auch meine ganzen Force und
Ifs durch irgendwelche Methoden an dem Stream ersetzt.
Das heißt, ich filtere erstmal meine ganzen Bewegungen danach,
dass es Einzahlungen sind,
dann habe ich nur noch Einzahlungen,
die Auszahlungen sind jetzt rausgefiltert
Und dann fehlt euch noch danach, naja,
ich will ja nur, wie gesagt,
in dem Jahr, für das ich mich gerade interessiere.
Also wenn ich gerade nach 1995 suche und ich finde,
was aus den 80ern, das interessiert mich da nicht weg damit.
Und dann rufe ich diese Fine-First-Operation auf und Fine-First auf
einem Stream von Kontobewegung, liefert eben keine Kontobewegung zurück,
weil vielleicht ist da ja gar keine.
Der Stream könnte ja leer sein. Das Fine-First ist also
so definiert, das ist tatsächlich ein Optional-Kontobewegung zurückliefert.
Man kann sich ein Optional eigentlich vorstellen, als eine Sammlung,
wo ein Null- oder ein Element drin ist.
Dann ist es ganz einfach. Stell dir vor,
ihr schreibt selber eine Air-Relist. Und das Air hat nur
einen Eintrag. Also entweder ist nichts drin oder eine Sache
ist so, und mehr passt nicht rein.
Eine Liste mit Kapazität, mit Maximalkapazität 1,
kann man sich so ein Optional vorstellen
Okay, und was macht jetzt der Weihnachtsmann?
Der holt sich die erste Einzahlung in dem Jahr,
für das er sich interessiert und muss jetzt überhaupt nicht auf irgendwelche Nights oder so prüfen.
Denn er hat ja sozusagen eine Collection, wo null oder eine Elemente
drin sind und kann jetzt ganz normal mit diesen Stream-Methoden arbeiten.
Er kann also sagen, gut,
vielleicht ist da ein Element drin, vielleicht aber auch nicht.
Jetzt filter ich erst mal danach, dass mich ja selber
nur Einzahlung interessieren, die mindestens einen Betrag von eine Million haben.
Das heißt, ich kann es einfach filtern auf so einem Optional.
Was heißt das denn auf einem Optional zu filtern?
Naja, also wenn schon von vornherein nichts drin war,
dann bleibt das Optional auch weiterhin leer.
Also ein leeres Optional nehmen und filtern, bekommt auch ein
leeres Optional zurück. Wenn jetzt aber ein Element drin war,
Dann könnte dann ein leeres Aufschnitt hier bei dem Filter rauskommen,
wenn eben der Betrag einfach zu klein ist.
Wenn er nicht zu klein ist, dann kommt eben ein Aufschnitt zurück.
Oder dann bleibt es unverändert sozusagen. Es kann dann durch
den Filter sozusagen durch. Gut, dann lasse ich mir
noch eine druckbare Form geben. Und am Ende,
ganz am Ende prüfe ich dann erst, ach übrigens,
wenn jetzt in diesem Aufschnitt noch was drin ist,
dann will ich das an dieses loggeverdächtige Bewegung übergeben.
Ich habe jetzt also jetzt, ich habe hier gar keine
Chance, mir eine Nightmainter Acception auszulösen.
Weil, ja, oder sieht jemand,
wie hier noch eine Nightmainter Acception
entstehen könnte
Optione Kontrobewegung ist ja ein Referenztyp. Das heißt,
wenn ich total blöd bin, gebe ich aus dieser Methode
ein Hall zurück. Da brauchen wir ein bisschen Disziplin,
ja. Also es gibt sozusagen diese Disziplin, hey,
lieber Java-Programmierer, Optional selber soll natürlich nie nahe sein.
Also du sollst immer einen Optional-Effekt haben. Und das ist
eben einer dieser Streitpunkte, wo die Leute sagen,
aber dann bringt es doch letzten Endes nichts.
Und das ist dann selber auch wieder nahe sein kann.
Gut, und das sind ja die beiden Parteien, die sich streiten.
Und bis heute hat keiner gewonnen. Gut. Ich zeige euch
das aber deswegen, ich gehe nochmal zu dieser Landkarte zurück,
weil ihr werdet auf diesen Typ stoßen.
Weil wenn ihr so seht, okay,
ich habe das Stream, ich will das Minimum haben,
wieso kommt da kein Tee zurück?
Warum kommt da so was Komisches zurück?
Das muss man eben einmal verstanden haben.
Okay, ihr habt ja zu dem Optional noch irgendwelche Fragen?
Nee. Gut. Ah, gut. Das ist meine
Lieblingsstelle in dieser Vorlesung. Gut. Comparator-Interface hatten wir euch
in SE1 mal vorgestellt, als wir über Sortieren geredet haben.
Man kann in Java ja sortieren,
ich sag Collections.sawt und dann muss ich dem irgendeinen Comparator übergeben,
damit man weiß, nach welchem Kriterium er jetzt sortieren soll.
Gut. Comparator, wie funktioniert das? Also ich kann einem Comparator sagen,
pass auf, ich gebe dir mal zwei Elemente,
das erste und das zweite Element.
So sind irgendwelche Elemente, die gerade in so einer Sammlung
wahrscheinlich drin sind
Lieber Comparator, sag mir doch mal,
in welcher Beziehung stehen denn diese beiden Elemente?
Da gibt es drei verschiedene Möglichkeiten. Es könnte zum Beispiel sein,
dass das erste Element kleiner ist als das zweite Element.
Dann würde ich eine negative Zahl zurückkommen.
Nehmen wir an, ihr wollt lexikografisch sortieren.
Und hier steht zum Beispiel, hallo und hier steht Welt.
Dann sollte was Negatives zurückkommen, weil hallo soll euer Vorwelt kommen.
Könnte aber auch sein, dass es zweimal derselbe String ist,
zum Beispiel Welt und Welt, dann solche Null zurückkommen.
Null signalisiert, also bei Compare als Ergebnis, die beiden Elemente sind gleich.
Oder, wenn ich erst Welt und dann Hallo übergebe,
soll irgendeine positive Zahl zurückkommen. Das ist einfach so
eine Standardkonvention, die sind ganz vielen Programmiersprochen gibt.
Negativ heißt kleiner, Null heißt gleich,
positiv heißt Größe
Gut, ich habe mal geguckt, werden solche Komparatoren auch in
der Mediathek verwendet, tatsächlich an sehr, sehr vielen Stellen.
Und ich habe mir das mal hier aufgeschrieben,
dass ich das schnell finde, aber ich glaube,
ich habe das schon offen.
Verleihkarten, Table-Model, Sortiere verleihkarten. Das wollen wir uns
einfach mal anschauen. Mache ich das jetzt hier erstmal wieder
zu? Da habe ich schon das Verleihkarten, Table-Model.
Das ist immer kleiner. So, das machen wir hier auch mal.
Ich kann ja Vollbild machen, das vergesse ich immer.
Doppelklick macht mir hier so ein Vollbild. Okay,
hier möchte ich also eine Verleihkartenliste sortieren. Warum eigentlich?
Das sollte ich vielleicht euch einmal ganz kurz zeigen.
Starten wir das System einmal ganz kurz, wo ist
meine Mediathek
Hier ist sie. Ja, es ist Startup.
Genau. Rückgabeansicht, ne? Ja, wie sind denn
hier diese Einträge sortiert? Sieht da irgendjemand eine Ordnung?
Also erstmal sieht es ja komisch aus, dass Katharina vor Kai kommt,
weil Tee ist ja eigentlich nach ihm, ne?
Also nach vorne haben wir da offenbar schon mal nicht sortiert.
Also sieht da irgendjemand, wonach das hier sortiert wird?
Oh, seht ihr überhaupt, dass da Katharina steht?
Ah ja, das K kann man gerade noch sehen, gut.
Kann da jemand irgendeine Ordnung ausmachen? Könnt ihr auch gerne sagen,
Fred fügt nochmal neue Elemente und Schulleien nochmal was aus,
mir ist noch nicht hundertprozentig klar,
was hier passiert
Ja. So, nach der Einfolge der Reihenfolge. Das könnte man denken,
ist aber nicht so, ja, da vielleicht.
Das sieht schon mal nicht schlecht aus, ne?
Also Klum, L ist ja vor, oh,
und dann das KSVS, das sieht ganz gut aus.
Und jetzt gibt es aber natürlich auch Einträge,
wo der Nachname gleich ist, weil der Name gleich ist.
Also wenn jetzt zum Beispiel Kai Konrad,
sind da die Untereinträge auch noch noch irgendwas sortiert.
Da müssen wir vielleicht mal ein paar mehr Dinge einfügen, oder?
Wir lassen Kai Honor vielleicht nochmal eine CD ausleihen.
Kai Konrad soll sich diese CD außen,
oder nehmen wir mal irgendeine ganz am Ende,
nehmen wir mal die hier,
und dann führt nochmal eine ganz am Anfang immer die hier
Wie ist das jetzt? Kai Konrad? Seht ihr da
irgendein System? Es scheint irgendwie nach Titel sortiert zu sein.
Was ist denn hier mit dem Medium-Typ?
Also wenn ich jetzt zum Beispiel noch ein Konsolen-Video spiele,
was ziemlich weit am Anfang ist, nehmen wir mal das hier vielleicht.
Achso, habe ich das schon? Oder warum darf ich
es nicht ausladen? Es ist nicht ausladen, aber jemand
anderes hat alles ausgeliehen, nehmen wir eben das hier.
Ach, blöd, das steht jetzt da drunter.
Aber was ihr ja schon gesehen habt, ist,
die CDs, die ich später eingeführt habe,
standen über den Konsolen-Videospielen
Also es scheint irgendwie so zu sein,
dass man erst nach dem Nachnamen sortiert,
dann nach dem Medium-Typ und dann nach dem Titel.
Scheint so zu sein. Lass uns mal einmal ganz kurz
gucken, ob wir diese Theorie irgendwie bestätigen können.
Also, dieser Verleih-Karten-Comparator entscheidet ja, wonach geordnet werden soll.
Jetzt sieht man hier noch nicht, was das ist.
Deswegen gehe ich da einfach mal rein. So, gut,
ist hier irgendwas, was uns weiterhilft. Comparator-Klasse und Zwei-Fahrleih-Karten
zu vergleichen, damit sie an der GUI sortiert angezeigt werden können.
Das ist so semi-hilfreich. Was haben wir noch?
Vergleich die gegebenen Verleih-Karten anhand des Kunden
Leihkarten mit gleichem Kunden werden anhand des Mediums verglichen.
Okay, er ist der Kunde, dann das Medium.
Für den Vergleich, wenn die Klassenkunden kommen, okay, gut.
Und jetzt kommt hier so ein bisschen Code, ne?
Höh. Ganz viele Ifs und, ah, okay.
Gut. Also erst nach dem Kunden, das passiert offenbar hier.
Wir gehen mal in den Kunden-Comparator rein, ne?
Was passiert hier? Hier werden also zwei Kunden verglichen.
Was passiert jetzt hier? Erstmal werden hier irgendwelche Null-Checks gemacht.
Aber jetzt wird gesagt, ich schaue mit dem Nachnamen von Kunde 1
an und ich schaue mit dem Nachnamen von Kunde 2 an.
Merkt ja jemand was? Zwei Kunden zu vergleichen bezieht sich
nur auf den Nachnamen. Das heißt also, wenn ihr
mehrere Myers habt, Dann ist die Reihenfolge dieser Myers irgendwie.
Das finde ich schon mal irgendwie komisch. Und jetzt frage
ich mich natürlich, war das Absicht des Programmierers?
Ich meine, hier steht ja, dass es Nachnachnamen sein sollte.
Es scheint also schon jemand aufgefallen zu sein.
Also der Programmierer scheint das verstanden zu haben.
Aber ist das denn auch die Anforderung?
Keine Ahnung, da muss man jetzt den Kunden fragen.
Willst du, dass mehrere Myers da zufällig drin stehen?
Wahrscheinlich nicht. Gut, aber akzeptieren wir erst mal so.
Gut, also erst nach Kunde und nach Kunde heißt,
nur nach Nachname. Gut. Was passiert denn jetzt?
Gut, also hier, das gehört sozusagen zusammen.
Und jetzt wird geguckt, ob das Ergebnis null ist.
Wann ist denn das Ergebnis null? Wenn ich zwei Kunden
miteinander vergleiche, wann ist da das Ergebnis null
Richtig, bei Gleichheit und in unserem Firma gleichen Nachnamen.
Das heißt also, wenn die Nachnamen gleich sind,
dann will ich noch mehr machen.
Ansonsten kann ich das Ergebnis einfach zurückliefern.
Okay. Gut, was will ich denn dann machen?
Also wenn die Nachnamen gleich sind. Okay, ich habe
zwar mit einem Mediencomparator und dann compare ich da die Medien.
Das heißt, ich muss mir jetzt wieder angucken,
was macht denn so ein Mediencomparator?
Kann ich auch nicht einfach so wissen.
Schauen wir mal ganz kurz rein. Noch mehr Quelltext.
Gut, was macht der denn? Mal wieder Niledchecks.
Ah, er guckt sich
die Medienbezeichnung an
Okay, das hatten wir auch schon geraten sozusagen.
Erst die CDs, dann die DVDs, dann die Konsolenvideospiele.
Und jetzt kommt wieder hier dieses selbe Muster. Wenn die
gleich sind, die Medienbezeichnung, dann muss ich weiter ververgleichen.
Dann schaue ich mir die Titel an. Okay. Ich
habe jetzt hier zwei Muster identifiziert. Also erstmal das,
wonach ich vergleichen will, das muss ich halt auf
meinem Medium 1 aufrufen und auf meinem Medium 2 aufrufen.
Es macht nicht wirklich Sinn zu sagen, ich will
die Medienbezeichnung von Medium 1 vergleichen mit dem Titel von Medium
2. Das wäre Schwachsinn. Also ich muss immer darauf aufpassen,
dass ich dasselbe aufrufe auf den beiden Elementen.
Das ist das eine Muster und das andere Muster ist,
wenn da jetzt Gleichheit festgestellt wurde, in diesem einen Kriterium,
dann muss ich anschließend noch weitergucken.
Okay, das sind beides Myers, aber wie sieht es
jetzt aus? Vielleicht hat ja der eine in der CD
unter anderem der DVD oder so
Das ist also auch so eine Art Pipeline oder irgendwas.
Fangen wir mit dem ersten an, wenn da schon klar ist,
was ist, kannst du aufhören, ansonsten geht es weiter.
Gut. Wie viel Quelltext haben wir denn jetzt gesehen?
Also ich sage jetzt mal ganz grob, das sind hier
zehn Zeilen, Quelltext. Dann haben wir hier vielleicht auch
nochmal so zehn oder zwölf Zeilen, Quelltext. Ja,
also vielleicht sagen wir mal großzügig 25 Zeilen Quelltext vielleicht, ja.
Gut, durch die man sich erstmal durchwühlen muss.
Okay, oh, hier unten ist ja schon der Spoiler.
Gut, dann will ich nicht weiter euch das verheimlichen,
dann ziehe ich das hier einmal hoch.
So, und das kann also alles aus oder einkommentiert werden
So, und dann kann ich das hier auskommentieren.
So. Und der Eindruck ist jetzt durch die zeitweise Kommentierung ein bisschen komisch.
Okay. Was steht denn jetzt hier? Jetzt steht hier
so ein bisschen direkter das, was ich sagen will.
Was will ich denn eigentlich sagen? Was soll der Quelltext
aussagen? Ich sage, ich brauche einen Comparator,
der ein bestimmtes Kriterium vergleicht, nämlich, ja,
deren Nachname, der auf der Verleihkarte vermerkt ist.
Du sollst also erstmal nach Nachname sortieren. Wenn du
dann festgestellt hast, oh, die sind gleich,
dann sollst du nach der Bezeichnung sortieren.
Und wenn du dann immer noch nichts entschieden hast,
wenn es immer noch unentschieden ist,
dann sollst du nach dem Titel sortieren,
Und das ist alles, die ganzen Comparator brauche ich nicht mehr.
Ja, ich kann also diese Computer wegschmeißen, ich kann
die Tests dafür wegschmeißen, ich muss die Kommentare nicht mehr lesen.
Ja, da ist eine Frage. Wenn das jetzt theoretisch so ist,
dass wir für Leica, 12, 3, 2,
3, 2, 3, 2, 3,
2, 3. Das ist so.
Das ist eine sehr gute Frage. Was passiert, wenn
auch nach der letzten Stufe immer noch alles gleich ist?
Dann schauen wir doch mal in das JavaDoc von dem Salt,
denn das wird er ja hoffentlich stehen
Hm. Okay, steht da nicht. Dann schreibe ich
mal, wie ihr das selber recherchieren könnt.
Suche mal nach stabiler Versus instabile. Ich bin selber schon
ganz instabil. Sortierverfahren. Ein stabiles Sortierverfahren,
wenn du also hier ein Element in der Sammlung hast und irgendwo hier,
und die sind gleich, dann wird ihre relative Reihenfolge garantiert nicht verändert.
Wenn du ein instabiles Sortierverfahren hast, dann könnte es sein,
dass die Reihenfolge verändert wird. Und manchmal sind die instabilen schneller,
aber manchmal will man es eben stabil haben.
Also es hängt immer so ein bisschen davon ab.
Ich glaube, Quicksalt ist instabil, aber ich bin mir
da gar nicht 100 Prozent sicher.
Wäre zum Beispiel Merch Shout, glaube ich,
stabil ist
Muss man dann in seiner Tabelle der Sorti-Algorobe nachgucken.
Ich weiß es nicht auswendig. Okay. So,
und das war der Punkt, wo ich zum ersten Mal
den Eindruck hatte, das bringt wirklich was für die Lesbarkeit.
Denn Lesbarkeit heißt ja auch Wartbarkeit. Also stellt euch vor,
irgendwann kommt der Kunde und sagt, ich will nicht erst
nach Bezeichnung und dann nach Titel sortieren, sondern genau andersrum.
Ja, ich mache mal einmal so. Also stell dir vor,
ihr programmiert gerade, der Kunde ist vor Ort,
ihr macht irgendwie Extreme Programming.
Und dann sagt der Kunde, kannst du das nicht
andersrum sortieren? Und dann sagst du, klar,
ich halte die Eid-Taste gerückt und drücke fein nach oben.
Schon wird andersrum sortiert, ja.
Versuch mal in der alten Code-Basis die Reihenfolge zu ändern.
Das ist nicht so einfach.
Glaubt es mir
Gut. Also da habe ich für mich selber gemerkt,
okay, das scheint wirklich was Sinnvolles zu sein,
mit dem man irgendwie direkter aussagen kann,
was will ich denn eigentlich erreichen in meiner Software?
Ja, aus meinen Folien. Hier sind sie. Okay
. So, das, was ich gerade gesagt habe,
ist hier nochmal zusammengefasst, das muss ich jetzt nicht nochmal vorlesen.
Und ich habe diese Würfel hingestellt,
weil man sozusagen jetzt ganz einfach Dinge austauschen kann.
Also ich muss, ich kann nur sagen, ah,
der Würfel soll noch da oder der soll noch da oder
ich tue sie mal so oder so.
Das ist viel, viel einfacher. Aber wichtig,
was ich eben am allerwichtigsten finde, ist,
man liest diesen Quelltext und versteht ihn.
Man versteht, was der Quelltext einem sagen soll.
Und das ist das Allerwichtigste beim Programmieren
Schreiben, der funktioniert, ist auch schon nicht einfach,
aber Coach schreiben, den man lesen kann, ist noch viel schwieriger.
Gut. Und deswegen habe ich das nochmal irgendwie hier gesagt.
Also man muss immer aufpassen, wenn eine Sprache ein neues Feature bekommt,
dann wird dieses Feature garantiert, wie sagt man, overused.
Das ist eine gute Übersetzung dafür. Überbenutzt kann man,
glaube ich, nicht sagen. Also es wird einfach überall
auf einmal eingesetzt, weil die oder sagen, oh Lamm,
das sind cool und Ströme sind cool und Kollektoren sind auch viel cooler.
Ich muss die Hälfte meines Kurs muss auch sowas bestehen,
sonst bin ich nicht mehr cool.
Also das soll nicht das Ziel sein. Das Ziel soll sein,
Stellen zu finden in euren Quelltext, wo ihr sagt,
eigentlich steht hier noch nicht so hundertprozentig das, was ich mache,
weil hier steht zwar, wie das erreicht wird,
aber was gemacht werden soll, steht da eigentlich nicht.
Und ich müsste jetzt Kommentare schreiben und so, mir wäre es eigentlich viel lieber,
wenn eine Code direkt sagen würde, was passieren soll.
Und es gibt dann ein tolles, ja, Zitat,
was mich persönlich extrem anspricht,
weil es ja immer diese Frage ist,
programmiere ich eigentlich für den Computer oder programmiere ich eigentlich für den Menschen?
Und hier wird das wunderbar vereint. Also kann man lesen,
wer das ist, sonst könnte ich das ja fragen,
ah, das kann man, glaube ich, gar nicht lesen.
Sehr gut. Aber es steht ja hier, verdammt.
Okay. Also Knut sagt, Programmieren ist die Kunst,
einem anderen Menschen zu sagen, was der Computer tun soll.
Das ist eigentlich alles, was Programmieren ausmacht.
In meinem kleinen, bescheidenen Weltbild von Programmieren.
Gut, ein Snickers habe ich ja noch.
Also, Donald Knuth hat eine sehr erfolgreiche Buchserie geschrieben.
Die kennt ihr möglicherweise gar nicht, die ist uralt und
jeder hat ihn in seinem Regal stehen und liest sie nie.
Aber er hat noch eine Software geschrieben,
die im universitären Umfeld extrem beliebt ist.
Weiß jemand, welche Software das ist? Du hast schon Snickers
, oder? Verdammt, ich will irgendjemanden... Du hast
es schon gegessen, okay, notfalls gar nicht hingegeben.
Weißt du es ja? Richtig, Tech, sehr gut
. Ein Snickers für dich. Sehr schön. Gut,
habe ich noch irgendwas? Ja, dann kommen wir jetzt
zur Lehre-Evaluation. Heinz wird euch noch ein bisschen Feedback zu
leere Evaluation geben
Ja, ich möchte mich bei euch bedanken,
dass ich hier so oft sein durfte und dass ihr
auch so zahlreich erschienen seid und mir zugehört habt.
Vielen Dank an euch. Tausend. Okay, so langsam wollen
wir uns in die letzte Folienrunde für diesen Zyklus einschwingen.
Um gleich eine von ihren Kritikpunkten aufzugreifen. Ich hoffe,
ich bin laut genug, bin ich hinten so zu verstehen,
dass ich sie störe, ja?
Okay, gut. Die Sprechgeschwindigkeit von Fred würde ich
nicht erreichen, also die Bordrate kriege ich nicht hin
Wir schauen uns an, was sie uns in den Rückkopplungsbögen mitgegeben haben auf den Weg.
Am Anfang so ein bisschen Statistik. Sie sehen hier,
ich habe das jetzt einmal eingeblendet, ungefähr treibende Fragebögen sind eingegangen.
Also ein, sagen wir so, gut zwei Drittel der Leute,
etwas mehr, die überhaupt an der Veranstaltung insgesamt teilgenommen haben.
Verteilung nach Studiengängen aus unserer Sicht Erwartungskonform, wir kennen ja die Einschreibungszahlen,
aber vielleicht ist das für sie auch nochmal so ein bisschen Rückkopplung.
Wer hat denn hier so alles an Studienfächern und Nebenfächern gesessen?
Informatiker, Wirtschaftsinformatiker, SSEler, MCI, CSI. Und relativ viel,
freut uns natürlich auf der einen Seite relativ viel sonstige Fächer fast, 20 Prozent. Okay. Fasssemester,
auch nicht so wirklich, wirklich überraschend,
die meisten natürlich im Standardsemester von hier dieser Kohorte, dann welche,
die sich im zweiten Durchgang entschieden haben und so ein bisschen nach hinten aus Interesse oder was auch immer,
was auch immer, sehen Sie dann hier, welche Gründe haben Sie,
Entschuldigung, angegeben, um hierher zu kommen.
Klar, es ist Pflicht, Sie wollen den Schein haben,
wegen der Dozenten, das freut uns natürlich und noch mehr freut uns,
dass Sie aus Interesse hierher gekommen sind,
wenn also kein Interesse an der Lehrveranstaltung hätten,
dann brauchten wir uns diesen Aufwand,
nicht zu genehmigen oder den nicht zu investieren.
Ist also sehr schön, das als zweiten Grund.
Freut uns sehr. So, jetzt kommt ein Punkt,
da kann man sagen, ja oder man kann sagen nein.
Wie viele Stunden haben Sie pro Woche investiert nach Ihren eigenen Angaben?
Und Sie sehen, die ganz große Mehrzahl hat,
so irgendwas zwischen, sagen wir, vier und acht Stunden investiert.
So, ich habe jetzt mal die allgemeine Formel genommen,
Leistungspunkte in Arbeitsstunden pro Woche umzurechnen sind.
Und da diese Lehrveranstaltung Vorlesung plus Übung, sechs Creditpoint hat,
erwarten die Lehreplaner, dass sie im Schnitt zwölf Stunden in der Woche investieren.
Ich habe jetzt noch zwei Wochen Vorbereitungszeit in Semesterferien für die Klausur dazugenommen.
Also, zwölf Stunden ist das, was in der Planung
angenommen wird.
Danach werden insgesamt Lehrveranstaltungen kalkuliert
Jetzt kann man auf der einen Seite sagen, toll,
die Lehrveranstaltung ist so gut gewesen, dass sie im Deutlichen,
in der deutlichen Mehrzahl mit weniger Stunden hingekommen sind.
Sie könnten aber auch zu einem Ergebnis kommen, wenn sie hinterher auf ihre Noten schauen.
Ich hätte vielleicht etwas mehr investieren müssen. Also ich bin
da zweigeteilt, muss ich ehrlich sagen. Was mich immer so ein bisschen bei SE1,
SE2, was ich so im Hinterkopf habe, ist,
er ist sehr ernst, SE2 ist hier eine Lehrveranstaltung,
die nur in Teilen Konzepte vermittelt,
die zwar bewusst auch Konzepte vermittelt,
dass zu einen Kritikern ganz bewusst hier auch sehr viel an Wissen,
was rüberkommt, aber programmieren hat extrem viel mit Handwerk zu tun.
Programmieren muss man machen, man muss tippen, man muss lesen.
Ja, man muss einen Programmtext schreiben und das erfordert Übung.
Ja, das ist, ich will das wieder ins Extrem
so in den Sport reinziehen.
Es nutzt nichts hier zu haben,
Einführung in das Tennis spielen und wir zeigen ihnen
nur Folien
Ja. Wenn man irgendetwas sinnvoll über Tennisspielen von sich
geben will, muss man es auch gespielt haben.
Und dazu muss man üben. So. Und ich bin sehr stolz,
dass wir so im ganzen Team der Meinung sind,
Softwareentwicklung 1 und 2, da muss man sehr viel machen und üben.
Und deshalb haben wir auch die Übungsgruppen so organisiert.
Vielleicht noch so das ein bisschen als Hintergrund,
wie wir auf die Zahlen, die sie angeben, draufschauen.
So. Okay, auch das ist nicht erstaunlich,
wie regelmäßig nehmen sie teilen
An fast allen, an allen, an den meisten.
Auch das ist ein guter Schnitt. Und ein sehr guter Schnitt ist,
wenn ich mich hier umsehe, wie viele heute gekommen sind,
das kennen wir aus anderen Lehrveranstaltungen anders.
So, dann haben Sie ja Möglichkeit gehabt, Kommentare zu geben.
Ich habe mal so ein paar rausgenommen, lesen können Sie selbst,
haben Live-Programmierungen ganz, ganz wichtig aus unserer Sicht,
ist bei Ihnen auch sehr gut angekommen,
finde ich toll
Das, was wir an Übungen gemacht haben, unser Übungsbetrieb,
hier nur so ein, zwei, ein,
zwei Hinweise von Ihnen, die Verbindung von Theorie und Praxis,
ganz bewusst auch unser Ziel, dass wir das machen,
dass wir auf der einen Seite sagen,
wir wollen zeigen, dass das anwendbar ist,
was Sie hier mit uns zusammen machen.
Und auf der anderen Seite, wir sind Uni,
wir sind kein Programmierkurs, also gehören auch Konzepte dazu.
Diejenigen, die so in den Kommentaren geschrieben haben,
ich habe mir dann so die Spitzen,
habe ich mir erlaubt, aus Höflichkeit Ihnen gegenüber,
die hier nicht wörtlich wiederzubringen, was einige negativ dazu gesagt haben.
Wer hier eine rein praktische Veranstaltung erwartet hat, hat die falsche Veranstaltung erwartet.
Aber sehr vielen hat das ja in der Mixtur gut gefallen.
Ja, freut uns, was Sie darüber bemerkt haben.
Lecture to go, immer wieder auch in einzelnen Bemerkungen gut angekommen.
Ja, was hat Ihnen nicht gefallen? Natürlich gibt es
immer wieder Meinungen. Sehr schön ist das oder sehr interessant ist,
dass die einen sagen, viel zu theoretisch und die anderen
sagen, Mir haben Konzepte gefehlt.
Ja, so ein Kommentar, ich mag kein Programmieren und finde das langweilig.
Ich weiß nicht, ob das sein Informatiker oder ein Informatikerin war vielleicht.
Wechselnde Dozenten finden einige negativ, andere haben gesagt,
das ist ganz interessant. Also da kommen so Geschmacksfragen rein
. Ja
Die einen finden zu viel Anforderungen, die anderen sagen,
ich habe das doch schon alles gekonnt, das war sehr langweilig.
Also da müsste man immer so etwas ausbalancieren, was man da macht.
Wir haben uns als Ziel, ich weiß nicht,
ob wir das am Anfang klar gemacht haben,
aber unser Ziel war eine Lehrveranstaltung zu machen,
weil es die Haupt- und größte Lehrveranstaltung ist,
nicht nur für die wenigen, die es eigentlich schon alles können,
sondern wir wollen möglichst viel von ihnen,
möglichst vielen von ihnen diese Grundlagen geben.
Das heißt, als wir vor Soll ich sagen.
Als ich vor 21, 22,
23 Jahren hier angefangen habe, diese Grundlehrveranstaltung zu machen,
hatten wir so eine Erfolgsquote um uns bei 30, 35 Prozent.
So, mittlerweile sind wir am anderen Ende anbekommen,
dass wir so gut über 60 bis knapp an die 70 Prozent liegen.
Aus unserer Sicht ist das ein Erfolgssiegel für diese Lehrveranstaltung,
weil das wollen wir. Es gibt andere Lehrveranstaltungen,
Spezial und Vertiefungslehrveranstaltung. Da kann man sagen,
das ist ein spezielles Thema und da sollen wirklich nur die Leute
ran und was rausholen, die sich dafür wirklich interessieren.
Wir wollen in Handwerkszeug mitgeben
Und deshalb. Okay. Dazu hat Fred schon was gesagt,
also Rückkopplung über das Programmierdiktat, ist uns sehr wichtig,
weil, wie gesagt, das ist ein neues Teil in dieser Lehrveranstaltung.
Wir haben uns viel Gedanken darüber gemacht, weshalb wir das
hier drin haben wollen. Auch um uns wechselseitig Rückkopplung zu geben,
sind so die ganz elementaren Dinge, sind die bei ihnen angekommen oder nicht. Das ist einmal,
soll für sie eine Rückkopplung recht früh sein,
zu sagen, Ihr habt es drauf,
wenigstens die Basics und uns auch so ein bisschen davor schützen,
dass wir viel Mühe gerade so im Finale der Veranstaltung investieren,
sie über die Hürde zu bringen, wenn sie eigentlich sagen,
programmieren interessiert mich nicht, ich weiß gar nicht, was ich hier soll.
So, jetzt kommen so ein paar Sachen,
da brauche ich recht wenig zu kommentieren,
nur nochmal als Rückkopplung für sie, weil das sind so die Werte,
die wir erwarten und über die wir uns freuen,
wie wird Stoff und Fang und Niveau,
wie wird das eingeschätzt,
alles Bestens aus unserer Sicht
Die anschaulich sind wir in der Lehrveranstaltung,
wie nützlich sind unsere Themen, auch alles im guten Bereich,
so medial immer noch ein Stück höher als der Mittelwert.
Auch sehr schön. Guter Bezug zwischen Theorie und Praxis,
zum Denken, Anregen, Themen kritisch beleuchten,
dass wir da beim letzten Punkt nicht so ganz gut sind,
dass man vielleicht einige Themen facettenreicher diskutieren könnte,
ist vielleicht richtig,
müssen wir drüber nachdenken oder die,
die die Lehrveranstaltung im weiteren
dann machen
Der anderen Seite haben wir versucht, so einen Ansatz,
diesen anwendungsorientierten Ansatz, über den ich auch gesprochen habe,
ihn näher zu bringen.
Und natürlich gibt es andere Ansätze,
dass vielleicht ein bisschen formaler zu sehen oder ein Stück theoretischer.
Sie finden, wir haben die Lehrveranstaltung klar strukturiert.
Sie war inhaltlich interessant und sie war wichtig für ihr Studium.
Es freut uns sehr, die Lehrveranstaltung in dieser Form,
also SE1, SE2,
läuft ja auch schon einige Jahre,
viele Jahre
Und ich kann ihnen vielleicht zurückgeben, was so IT-Chefs,
IT-Manager, hier aus Hamburg, uns in den letzten Jahren immer als Rückkopplung geben.
Die haben gesagt, also so, als wir damals angefangen haben,
da konnten wir mit den Leuten von der Uni nicht viel anfangen,
weil denen mussten wir erst mal beibringen,
was ein Rechner und was Programmieren ist.
Mittlerweile ist hier die Uni und SE1,
SE2 für eine sehr gute Programmiergrundausbildung bekannt und wird da beneidet.
Also das, was sie selbst empfunden haben,
dass das ganz sinnvoll ist und dass das wichtig für Studium ist,
Können wir Ihnen nur zurückgeben,
dass Ihre perspektivischen Arbeitgeber auch der Meinung sind,
dass Sie hier was Sinnvolles lernen?
Es wurden einige Lehrveranstaltungen genannt, so im Freitext,
wo Sie Überschneidungen gesehen haben, aber fast niemanden hat das gestört.
Also brauchen wir uns darüber auch weniger Gedanken zu machen.
Vorwissen auch ganz gut sortiert, wir wissen,
dass die Verweilzeit von Wissen in Köpfen der Studierenden so So
haben wir so 50 Prozent sind nach 14 Tagen Pause weg,
das ist uns auch schon klar.
Aber es scheint ja von SE1 bis SE2 ganz gut gereicht zu haben.
Gut, Unterlagen habe ich mit Absicht hier ein bisschen kleiner
und wollte ich auch nicht so detailliert drauf eingehen.
Sie sind der Meinung, die Unterlagen sind okay,
wir sind der Meinung auch. Es gibt ein paar Anregungen oder Kritikpunkte,
die haben gesagt, also mach doch lieber ein Skript oder
gleich so ein richtiges Buch
und so
Ich muss sagen, ich habe mit Axel Schmolitzki vor sieben,
acht Jahren begonnen, ein Buch zu schreiben, so wie so ein Lehrbuch zur Lehrveranstaltung.
Das haben wir irgendwann aufgegeben, weil wir gesagt haben,
wenn man das einmal zwischen zwei Deckel festgeschrieben hat,
kann man sich nicht das leisten, was wir uns leisten,
dass wir eigentlich kontinuierlich an den Lehrveranstaltungen weiter arbeiten.
Einigen ist das ja auch aufgefallen,
dass oft schon zwischen den Folien und dem,
was sie vorfinden vom Vorjahr und dem,
was wir hier vorne vortragen, dass es da schon Deltas gibt,
die sind im Regelfall nicht zufällig oder auch das,
was Fred heute mit Java 8 vorgestellt hat.
Das sind ja Themen, die wir natürlich in die nächste Runde einbauen werden.
Und es ist immer, es ist immer schwierig,
dann zu sagen, wir machen hiermit sehr,
sehr viel Aufwand, ein Lehrbuch und auf der anderen Seite,
wir bleiben aktuell mit unseren Vorlesungen.
Okay. Tja, eine Sache, die von den Anregungen,
sie haben eine Reihe von Anregungen hier gegeben.
Alles Mögliche. An Huhu, der entscheidende Punkt aus meiner Sicht,
wo wir wirklich versuchen müssen, was dran zu machen,
dass die Analysisvorlesung offensichtlich parallel zur SE2-Vorlesung ist.
Das ist natürlich nicht gut. Aber wir haben ohnehin schon,
gerade durch unsere Lehramtsstudierenden, so Vorgaben,
welche Lehrveranstaltungen sich nicht überschneiden dürfen.
Und das bringt unsere leere Planer jedes Jahr halb in
den Wahnsinn
Weil die Pflichtvorgaben, was sie sich auf keinen Fall überschneiden darf,
aus irgendeinem Grund von den Lehramtsstudiengängen vorgeschrieben wird.
Und weniger wichtig ist, dass Informatiker, Wirtschaftsinformatiker überschneidungsfreie Lehrveranstaltungen haben.
Das sind soweit hier Lehramtsstudierende, das sind sie natürlich nicht schuld,
sondern das sind Vorgaben von oben,
dass das die erste Priorität hat.
Da können wir leider nichts dran machen.
Okay. Tja
Mit den Selbsttests, ja, das ist,
haben einige angeregt, Selbsttests. Werden wir mal überlegen,
ob wir das hinkriegen, wie wir das hinkriegen,
wer das machen soll, weil das muss ja auch jemand machen.
Das muss ja auch okay sein,
wir können ja nicht einen Selbsttest ins Netz stellen,
der nur halbgar ist, den haben wir noch nicht ins Netz gestellt,
dann fliegen uns schon ihre Kommentare um die Ohren.
Aber okay. Ja, das sind die Anregungen, Anmerkungen.
Ja. Soll ich schon schneller zur Verfügung stehen?
Wir brauchen es ja mittlerweile so,
dass es in unterhalb von 24 Stunden oben ist.
Und vor zwei Jahren war es so,
dass es
14 Tage genau
Okay. Haben Sie das mitgekriegt, also Friedweiß daraufhin,
mittlerweile sind wir bei einer Verweilzeit,
bei 24 Stunden Maximum angekommen und vor ein paar Semestern,
ein paar Jahren waren es 14 Tage.
Also da sind, wir arbeiten dran und auch hier die Kollegen,
die uns da unterstützen,
die machen das ja wirklich sehr professionell und sehr gut.
Okay. Zu den Dozenten, also hier habe ich so das allgemeine Rating,
da habe ich mir die Herzchenbilder mit Axel und Fred
und und so einige Flames mit meinem Namen, habe ich mir gespart.
Uns ist natürlich, dass mich freut, dass Sie uns sagen,
dass Axel natürlich ein toller Dozent ist.
Wir haben schon immer gewusst,
dass Axel ein toller Dozent ist und wir sind natürlich sehr traurig,
dass in der Gruppe der sehr guten Dozentenaxel uns verlassen hat,
aber Fred und Guido werden ja auch noch,
haben wir jetzt gerade letzte Woche ausgehandelt für mindestens ein bis zwei Runden zur Verfügung stehen.
Das hatte ich Ihnen ja gesagt,
am Anfang des Semesters,
das sah ganz anders aus
Das sah so aus, als würden sich nicht wirklich Doozenten bereitfinden,
nachdem an sich wir davon ausgegangen sind,
dass weder Guido noch Fred und Axel schon mal gar nicht
weiterarbeiten können und am Ende des nächsten Semesters für mich auch das Spiel abgefiffen wird.
Ich habe gedacht, okay, neues Spiel, neues Glück,
aber die Leute mit den Herzen hinterm Namen werden also nochmal
bis auf Axel dann in der nächsten Runde zur Verfügung stehen.
Okay, ja, ansonsten waren sie vom Rating her
mit den Dozenten Sehr einverstanden, freut uns natürlich sehr.
Was ich sehr schön finde, und das meine ich jetzt wirklich sehr ernst,
dass alle Dozenten und Dozentinnen offensichtlich aus ihrer Wahrnehmung sehr freundlich mit ihnen umgehen.
Das freut mich sehr und das entspricht auch so unserer Haltung,
die wir versuchen, im Team zu vermitteln,
dass es eine wichtige Aufgabe ist und auch eine lohnenswerte Aufgabe ist,
mit ihnen diese Lehrveranstaltung zusammen zu machen
Ja, ansonsten mit den Medien und dem Einsatz waren sie einverstanden, fanden sie gut. Finden wir auch. Die Übungen,
auch erwartungskonform, kann nur noch mal hier hervorheben,
dass sie sind, vielleicht,
wenn sie hier angefangen haben zu studieren und nicht so wirklich wissen,
was andere Universitäten anbieten, kann ihnen nur noch mal zurückgeben,
dass aus meiner Wahrnehmung dessen,
was im deutschsprachigen Raum an Universitäten und Informatik, Grundausbildungslehrveranstaltung,
da ist, denke ich schon,
da bin ich auch ein bisschen stolz,
dass wir das über die Jahre machen konnten,
haben wir so den besten Übungsbetrieb in Einführung in Softwareentwicklung,
der so im deutschsprachigen da ist,
stehe ich einfach hier vorne und sage das,
das glaube ich fest und da weiß ich auch von vielen Hochschulen,
dass die uns beneiden,
dass wir das hier so hingekriegt haben und jetzt kommt das ein ganz wichtiger Grund,
weshalb wir das hier so machen können und weshalb wir diesen Übungsbetrieb aufrechthalten können,
ist, dass es Leute wie sie gibt,
die nach SE1 und SE2 sagen,
das habe ich im Studium mitgemacht und das will ich auch der nächsten Generation ermöglichen und deshalb melde ich mich als studentische Hilfskraft für die nächste Runde.
Deshalb bitten wir sie immer,
wenn sie fanden, dass das gut war,
was sie erlebt haben, tragen sie dazu bei,
dass in der nächsten Generation auch zu ermöglichen,
denn es ist völlig klar,
wenn wir nicht ihre Mitarbeit hätten in den Übungsgruppen,
könnten wir den Betrieb nicht aufrechterhalten.
Es ist völlig undenkbar, dass das beispielsweise über Mitarbeiter,
Mitarbeiterinnen auch nur in Ansätzen so aufrechterhalten wird.
Ich will Ihnen sagen, was diskutiert worden ist.
Das ist kein Scherz. Es ist diskutiert worden,
wenn wir das mit dem Team und mit Ihnen nicht machen,
dass die Lehrveranstaltungen umgewandelt wird, in drei Stunden Vorlesung und eine Stunde Großübung.
Dass hier vorne jemand steht und für sie übt.
Das ist für mich etwa so sinnvoll, als würde ich
hier als Krafttraining für Sie Liegestütze hier vorne machen.
Ja. Auch da nichts Besonderes, auch wieder ein Dankeschön
hier zu dem letzten Punkt. Nicht nur, dass Sie die Dozenten,
die hier vorne stehen, mit guten Noten bedacht haben.
Heute ist ja übrigens auch in Hamburger Schulen,
gab es Zeugnisse, also das passt ja ganz gut.
Sie finden auch, dass die Übungsgruppen Leitungen gut besetzt und gut vorbereitet sind.
Freut uns natürlich sehr und wir werden also auch an
die Übungsgruppenleitungen das weitergeben,
dass Sie das auch finden
Ja, sie haben selbst die Lehrveranstaltung zusammengefasst. Sie finden,
dass sie viel gelernt haben, dass sie hinterher mehr wissen als vorher.
Ist auch ganz gut. Und dass sie ein grundlegendes Verständnis
mitgenommen haben, das war, habe ich vorhin gesagt,
ja genau Ziel der ganzen Übung.
Und vom Notenschnitt sind wir bei einer glatten 2
mit Tendenz
etwas nach oben
Ist natürlich auch sehr schwer im Sinn für so eine Riesenveranstaltung sehr glücklich,
dass wir das in diesem Jahr wieder geschafft haben.
Okay, haben Sie noch eine Bemerkung, Frage, Anregung?
Bitte. Vielleicht noch ein bisschen was zu der Klappe Uhr sagen.
Zur Klausur sagt, ja, so ist die,
weiß ich nicht. Also Sie haben ja,
also die allermeisten von Ihnen haben ja SE1 mitgemacht.
Damit wissen Sie im Groben schon, was auf Sie zukommt. Ich glaube,
der Anteil an Phil in the Blanks oder so ist ein klein bisschen höher,
aber Also ich würde kontrollieren, einfach mal bei der Klasse,
wo die Folien und die Anstalt von vor zwei Jahren nicht so gelernt sind.
Da sagt er ungefähr fünf Minuten und sehr aufgeregt, was du gesagt hast.
Ich kann das auch gerne verlinken, kommt in dem Samuel.
Okay, noch eine Anmerkung, wenn Sie nicht Lecture-to-go und so.
Ein etwas höherer Anteil, Anfragen bezieht sich auf Konzepte.
Wie ist das in dem Jahre,
hat man so zu dem Punkt gestellt,
also dass der praktisch natürlich irgendwie erwartet hat
Nochmal bitte etwas, Leute. Friedrich Jahre 8, mit dem neuen Funktionalitäten vorgestellt.
Ja, das hatte ich ja wahrscheinlich alles gefunden.
Schwere, das war es mit 50 Jahren.
Wird es nochmal ein Tutorium geben? Friedrich, wird es
nochmal ein Tutorium? Höchstwahrscheinlich ein Foto von Panik und Fotoform
anbieten. Wir fangen ja kein Leben mit den abhängigen Folien.
Also wahrscheinlich müsste es ja nur kommen, ein Frankfurter Flusswort.
Ihr seid ja da
Das ist bewusst. Okay. Ja, dann bedanke ich
mich bei Ihnen. Das war mit Sicherheit meine letzte SE2-Vorlesung,
die ich in meiner Laufbahn gemacht habe.
Wahrscheinlich für Sie auch die letzte SE2-Vorlesung und ich wünsche Ihnen
eine schöne vorlesungsfreie Zeit und viel Glück bei der Klausur