WEBVTT

00:00:00.000 --> 00:00:04.080
Ja, hallo liebe Hörerinnen und Hörer, willkommen beim Python-Podcast, 25. Episode.

00:00:05.280 --> 00:00:09.380
Heute geht es um Patterns, Software-Patterns, Design-Patterns, Architektur-Patterns.

00:00:10.020 --> 00:00:12.240
Und wir haben einen Gast dabei, der Antoni, hallo.

00:00:12.860 --> 00:00:13.500
Hallo mal wieder.

00:00:13.940 --> 00:00:14.240
Hallihallo.

00:00:14.500 --> 00:00:15.720
Ich bin der Dominik, Jochen ist auch da.

00:00:15.980 --> 00:00:16.340
Hoiho.

00:00:16.660 --> 00:00:20.820
Wir sind im Wintergarten, beziehungsweise remote, wie es halt sich für die Pandemie so gehört.

00:00:21.600 --> 00:00:23.940
Wir wollten noch sagen, wenn wir aufnehmen, heute ist der 20. Oktober.

00:00:25.060 --> 00:00:25.500
2020.

00:00:25.840 --> 00:00:27.880
20, 20, 20, 20, 20.

00:00:27.880 --> 00:00:29.180
Immer noch 2020.

00:00:30.000 --> 00:00:34.080
Ja, es zieht sich ein bisschen, finde ich, in letzter Zeit.

00:00:34.480 --> 00:00:37.820
Ich erinnere den XKCD, wo ein Zeitreiser nach 2020 kommt

00:00:37.820 --> 00:00:41.660
und fragt, welches Jahr es ist, und er sagt 2020.

00:00:42.380 --> 00:00:43.440
Ja, aber das wievielte.

00:00:48.420 --> 00:00:49.860
Das wissen wir auch nicht so ganz genau.

00:00:52.360 --> 00:00:55.200
Ja, vielleicht noch ein paar News aus der Szene vorweg.

00:00:55.200 --> 00:00:56.740
Genau, ja, was haben wir denn an News?

00:00:56.960 --> 00:00:58.800
5. Oktober kam Python

00:00:58.800 --> 00:01:00.640
3.9.0.

00:01:01.580 --> 00:01:03.120
Oder war das am 6.? Ich weiß gar nicht

00:01:03.120 --> 00:01:04.860
mehr genau. Ich glaube an dem Montag irgendwie.

00:01:05.940 --> 00:01:06.060
Ja.

00:01:08.500 --> 00:01:09.140
Watch released

00:01:09.140 --> 00:01:10.880
on October 5th. Oh, okay.

00:01:11.520 --> 00:01:11.620
Ja.

00:01:12.940 --> 00:01:15.020
Habt ihr alles schon geupdatet? Nein.

00:01:15.380 --> 00:01:16.920
Ich habe mich diesmal nicht getraut, weil letztes Mal

00:01:16.920 --> 00:01:19.120
mir bei 3.8.0 so ein paar Sachen

00:01:19.120 --> 00:01:20.880
wie Jupiter auseinander geflogen sind.

00:01:21.340 --> 00:01:22.860
Und ich diesmal darauf keine Lust hatte.

00:01:24.980 --> 00:01:26.380
Ich glaube, ich habe es auch noch nicht

00:01:26.380 --> 00:01:28.680
bei uns in die Auswahl

00:01:28.680 --> 00:01:30.580
mit reingenommen, aber wir haben eh immer sozusagen

00:01:30.580 --> 00:01:32.000
das komplette Portfolio von allem

00:01:32.000 --> 00:01:33.220
verfügbar.

00:01:35.960 --> 00:01:36.500
Ja, ich habe

00:01:36.500 --> 00:01:38.880
überlegt, wir machen das bei 1 dann, bei 3, 9, 1.

00:01:39.200 --> 00:01:40.560
Ja, ich bin tatsächlich

00:01:40.560 --> 00:01:42.540
schon quasi zumindest mit den privaten

00:01:42.540 --> 00:01:43.380
Sachen umgestiegen, aber

00:01:43.380 --> 00:01:46.540
das wird natürlich noch ein bisschen

00:01:46.540 --> 00:01:47.640
brauchen, bis sich das komplett

00:01:47.640 --> 00:01:50.820
durchgesetzt hat,

00:01:50.880 --> 00:01:52.440
sodass man es halt auch verwenden kann. Zum Beispiel Pandas

00:01:52.440 --> 00:01:54.620
gibt es halt noch keine Binarys

00:01:54.620 --> 00:01:56.360
und da ist das natürlich auch so ein bisschen

00:01:56.360 --> 00:01:58.440
hässlich, wenn man das irgendwie dann selber kompilieren

00:01:58.440 --> 00:02:00.460
muss. Das heißt doch, im Baton

00:02:00.460 --> 00:02:02.560
habe ich tatsächlich das in die

00:02:02.560 --> 00:02:04.280
Travels-Liste schon mit aufgenommen.

00:02:05.540 --> 00:02:06.020
Da kam auch

00:02:06.020 --> 00:02:08.520
jemand vorbei, der sich gleich

00:02:08.520 --> 00:02:10.300
irgendwie sofort beschwert hatte, dass es unter 3.9

00:02:10.300 --> 00:02:11.840
nicht ging, weil

00:02:11.840 --> 00:02:13.920
irgendwas ist rausgeflogen.

00:02:14.360 --> 00:02:15.460
Achso, die haben im Async

00:02:15.460 --> 00:02:18.100
irgendeine

00:02:18.100 --> 00:02:20.380
API, die deprecated war, jetzt tatsächlich gestrichen

00:02:20.380 --> 00:02:22.360
gehabt. Ich glaube, die in 3.7 hatten sie

00:02:22.360 --> 00:02:23.740
irgendeine neue API, um alle

00:02:23.740 --> 00:02:25.500
Pending-Tasks abzufragen

00:02:25.500 --> 00:02:26.720
eingeführt

00:02:26.720 --> 00:02:29.540
und die, glaube ich, in irgendein Untermodul verschoben

00:02:29.540 --> 00:02:30.800
oder so, statt im direkten

00:02:30.800 --> 00:02:33.560
Async-Modul. Das war was, da musste ich dann irgendwie

00:02:33.560 --> 00:02:35.040
hinterher und in 3.9 war dann irgendwie die

00:02:35.040 --> 00:02:37.100
Abwärtskompatibilität von der API jetzt weg.

00:02:38.340 --> 00:02:39.560
Da flog es dann auseinander.

00:02:41.160 --> 00:02:41.360
Ja.

00:02:41.740 --> 00:02:43.680
Insofern, ja, ich habe es schon mal in der Hand gehabt, weil ich was

00:02:43.680 --> 00:02:45.460
Was gibt es denn Neues?

00:02:47.080 --> 00:02:47.920
Ganz viele spannende

00:02:47.920 --> 00:02:49.200
Sachen. Union Operators?

00:02:50.300 --> 00:02:50.960
Was ist das?

00:02:51.440 --> 00:02:52.100
Was macht man damit?

00:02:53.740 --> 00:02:57.600
Ja, zum Beispiel Dictionaries zusammenschübbeln.

00:02:57.660 --> 00:03:01.900
Ja, ich glaube also wirklich mehr als das,

00:03:01.960 --> 00:03:04.260
was man vorher auch schon mit Tuple-Unpacking machen konnte.

00:03:04.260 --> 00:03:08.260
Also man schreibt halt irgendwie neuer Key, neuer Value

00:03:09.060 --> 00:03:11.540
und dann sagt dann hinten der Sternstern irgendwie das andere Dict,

00:03:11.600 --> 00:03:12.260
was man merchen will.

00:03:13.220 --> 00:03:15.940
So, ich glaube, wenn man jetzt den Pipe-Operator verwendet,

00:03:16.000 --> 00:03:17.620
macht es so mehr oder weniger genau das Gleiche.

00:03:18.140 --> 00:03:18.980
Ja, aber warum macht man das?

00:03:19.080 --> 00:03:19.840
Also ich habe es nicht genau verstanden.

00:03:19.960 --> 00:03:20.840
Ich finde es irgendwie, weiß nicht,

00:03:20.880 --> 00:03:22.700
das ist das Erste, was ich bei Python so richtig hässlich fand.

00:03:22.980 --> 00:03:24.940
Naja, was fandst du hässlich?

00:03:25.140 --> 00:03:26.680
Ja, diesen Operator, diesen Pipe-Operator

00:03:26.680 --> 00:03:28.640
da stehen zu haben auf einmal für so eine Operation.

00:03:29.240 --> 00:03:30.440
Och, ich weiß nicht.

00:03:30.580 --> 00:03:33.220
Ich meine, das wäre halt Mengen-Operations-

00:03:33.220 --> 00:03:34.440
Operator an der Stelle.

00:03:35.920 --> 00:03:36.840
Es ist halt ein Oder.

00:03:37.160 --> 00:03:37.960
Ja, das passt schon.

00:03:39.020 --> 00:03:40.960
Das war ja vorher schon immer das Oder

00:03:40.960 --> 00:03:42.760
und wenn ich halt über die mengentheoretische

00:03:42.760 --> 00:03:44.640
Definition nachdenke,

00:03:44.860 --> 00:03:46.740
dann ist das halt genau das, was passiert,

00:03:46.860 --> 00:03:48.840
wenn ich halt die Oder-Verknüpfung von zwei

00:03:48.840 --> 00:03:50.100
Mengen irgendwie definieren möchte.

00:03:51.080 --> 00:03:52.800
Oder gleich dieses

00:03:52.800 --> 00:03:54.740
Assignment, irgendwie ist das komisch.

00:03:55.320 --> 00:03:56.720
Naja, das ist halt so wie plusgleich oder

00:03:56.720 --> 00:03:57.240
malgleich.

00:03:58.880 --> 00:04:01.220
Das habe ich tatsächlich in Bato benutzt

00:04:01.220 --> 00:04:02.900
oder gleich tatsächlich, auch Bato hat ja so eine

00:04:02.900 --> 00:04:04.980
komische Syntax, wo wir plusgleich

00:04:04.980 --> 00:04:06.720
benutzen, wo du

00:04:06.720 --> 00:04:08.920
so einen Baum aufbaust mit self

00:04:08.920 --> 00:04:10.900
plusgleich und dann den Kindknoten

00:04:10.900 --> 00:04:12.240
und da gibt es nochmal

00:04:12.240 --> 00:04:14.800
ein Overloading für die Pipe,

00:04:15.520 --> 00:04:17.020
wo man dann sozusagen eine spezielle Form

00:04:17.020 --> 00:04:19.000
von Verkettung hat. Insofern finde ich das

00:04:19.000 --> 00:04:20.740
ganz cool, dass die jetzt auch die Pipe genommen haben.

00:04:20.840 --> 00:04:22.560
fühle ich mich in meiner Wahl von vor

00:04:22.560 --> 00:04:23.620
sechs Jahren bestätigt.

00:04:24.940 --> 00:04:25.300
Ja.

00:04:27.200 --> 00:04:28.520
Ja, also ich glaube,

00:04:28.760 --> 00:04:30.200
also so, was

00:04:30.200 --> 00:04:32.640
es halt, es sieht halt, ich finde, es sieht schon besser

00:04:32.640 --> 00:04:34.560
aus, als wenn man jetzt immer mit den Sternen und Sternsteinen, da muss man

00:04:34.560 --> 00:04:36.140
mal so ein bisschen nachdenken, was denn jetzt,

00:04:36.760 --> 00:04:38.560
was man jetzt eigentlich genau machen

00:04:38.560 --> 00:04:40.780
wollte. Es ist ein bisschen hübscher,

00:04:40.940 --> 00:04:42.440
aber es ist jetzt keine so weltbewegende

00:04:42.440 --> 00:04:43.620
Änderung.

00:04:44.420 --> 00:04:45.080
Ja, das ist hübscher.

00:04:46.320 --> 00:04:48.660
Und es ist vor allem, es erzeugt halt ja ein neues Dignam.

00:04:49.320 --> 00:04:50.420
Also ganz

00:04:50.420 --> 00:04:52.760
klassisch war ja immer das Thema, dass du

00:04:52.760 --> 00:04:55.080
DictUpdate sagst.

00:04:55.900 --> 00:04:56.840
Ja, und dann macht das

00:04:56.840 --> 00:04:58.540
was anderes, als man denkt. Das modifiziert

00:04:58.540 --> 00:05:00.480
den Original-Dict und genau.

00:05:01.520 --> 00:05:01.700
Ja.

00:05:02.800 --> 00:05:03.100
Ja.

00:05:04.720 --> 00:05:06.660
Insofern ist vielleicht ein bisschen eindeutiger, was es macht.

00:05:06.660 --> 00:05:08.680
Ja, also

00:05:08.680 --> 00:05:10.340
mein Lieblingsfeature tatsächlich, oder

00:05:10.340 --> 00:05:12.580
meine Lieblingsneuerung ist

00:05:12.580 --> 00:05:14.540
der Pack-Parser. So ehrlich gesagt bin ich jetzt

00:05:14.540 --> 00:05:16.600
kein Experte

00:05:16.600 --> 00:05:18.540
für so Parser-Geschichten, aber ich fand das schon eigentlich

00:05:18.540 --> 00:05:20.080
ganz nett,

00:05:20.420 --> 00:05:22.260
was man damit dann eventuell alles dann

00:05:22.260 --> 00:05:24.200
zusätzlich so machen kann. Also

00:05:24.200 --> 00:05:25.580
es hieß irgendwie so, ja,

00:05:26.320 --> 00:05:28.380
das macht dann irgendwie neue Sprachfeatures einfacher

00:05:28.380 --> 00:05:30.220
oder so. Das stimmt nicht so ganz.

00:05:30.700 --> 00:05:34.340
wirklich viel einfacher wird dadurch nicht,

00:05:34.480 --> 00:05:36.360
aber es macht halt so ein paar Sachen, die bisher sehr hässlich

00:05:36.360 --> 00:05:38.320
waren. Du musst uns den Hörer nochmal kurz erklären, was überhaupt

00:05:38.320 --> 00:05:39.760
ein Pack-Parser ist, bitte. Oh nein!

00:05:40.360 --> 00:05:42.200
Das wollte ich eigentlich vermeiden.

00:05:42.520 --> 00:05:44.020
Das kann ich ehrlich gesagt nicht wirklich.

00:05:44.020 --> 00:05:46.260
Also es gibt halt diese Standard-

00:05:46.260 --> 00:05:47.960
Parser für so

00:05:47.960 --> 00:05:49.960
Programmiersprachen. Also die meisten Programmiersprachen

00:05:49.960 --> 00:05:51.800
sind halt, oh, oh je, jetzt kann man

00:05:51.800 --> 00:05:53.960
nochmal positiv in die Informatik

00:05:53.960 --> 00:05:54.640
hinabsteigen.

00:05:55.400 --> 00:05:57.740
Da gibt es halt so, so Programmiersprachen

00:05:57.740 --> 00:05:59.360
sind meistens, die Grammatiken dafür sind so

00:05:59.360 --> 00:06:01.020
kontextfreie Sprachen.

00:06:02.300 --> 00:06:03.040
Also, oh je.

00:06:03.720 --> 00:06:05.760
Ja, ja, genau.

00:06:06.620 --> 00:06:07.380
Ja, du musst halt

00:06:07.380 --> 00:06:08.680
eine bestimmte

00:06:08.680 --> 00:06:11.420
Form davon, so

00:06:11.420 --> 00:06:13.460
LR1-Grammatiken oder so, das ist halt

00:06:13.460 --> 00:06:15.380
LR1,

00:06:15.480 --> 00:06:17.600
LR1-Grammatik zum Beispiel.

00:06:17.780 --> 00:06:18.420
LR1-Grammatik.

00:06:18.580 --> 00:06:43.000
Ja, also in dieser Form ist auch zum Beispiel immer die Java-Sprachspezifikation. Das ist das Erste, was ich in, sollte man sich im Studium, als ich mal angefangen habe, irgendwie sollte man sich das mal kaufen. Habe ich dann gemacht, fand ich sehr langweilig, ehrlich gesagt. Das war ein sehr dickes Buch, in dem stand halt die komplette Sprache und halt Grammatik drin. Und da dachte ich schon, das ist eine komische Abkürzung und das ist halt genau die, die halt beschreibt, ja, wie die Grammatik für diese Sprache aussieht.

00:06:43.480 --> 00:06:45.560
Und wenn man das sozusagen

00:06:45.560 --> 00:06:47.460
in dieser Form notiert hat, dann kann man das in einen

00:06:47.460 --> 00:06:48.640
Parser-Generator werfen

00:06:48.640 --> 00:06:51.520
und dann... Der liest die Sprache und weiß, was

00:06:51.520 --> 00:06:53.480
der machen muss. Der gibt einem dann

00:06:53.480 --> 00:06:55.340
einen Parser, der genau diese Sprache

00:06:55.340 --> 00:06:55.840
akzeptiert.

00:06:57.940 --> 00:06:59.100
Und das sind dann so Dinge wie...

00:06:59.100 --> 00:07:01.540
In letzter Zeit habe ich da wenig mit zu tun gehabt.

00:07:01.820 --> 00:07:03.320
Früher ganz mehr.

00:07:04.080 --> 00:07:05.260
Sowas wie YAK zum Beispiel

00:07:05.260 --> 00:07:06.260
gibt es da.

00:07:07.740 --> 00:07:09.380
Ist auch so ein rekursives Akronym.

00:07:09.740 --> 00:07:11.160
Justiner sagt Compiler, Compiler.

00:07:12.820 --> 00:07:13.340
Dem kann man

00:07:13.340 --> 00:07:15.280
sowas vorwerfen und der spuckt dann halt

00:07:15.280 --> 00:07:16.840
einen Parser aus und das gab es dann

00:07:16.840 --> 00:07:18.840
Lex und Bison und

00:07:18.840 --> 00:07:21.120
ich weiß gar nicht mehr so genau.

00:07:22.140 --> 00:07:23.080
Und genau, damit kann man

00:07:23.080 --> 00:07:25.180
Parser generieren und die akzeptieren

00:07:25.180 --> 00:07:26.460
dann solche Sprachen und die meisten

00:07:26.460 --> 00:07:28.900
Programmiersprachen sind halt so irgendwie diese

00:07:28.900 --> 00:07:31.420
Geschmacksrichtung von kontextfreier

00:07:31.420 --> 00:07:32.060
Sprache.

00:07:33.460 --> 00:07:35.120
Und Python Parser

00:07:35.120 --> 00:07:36.340
war halt auch sowas.

00:07:37.640 --> 00:07:38.080
Aber

00:07:38.080 --> 00:07:41.040
das Problem ist, es gibt halt so ein paar Features,

00:07:41.180 --> 00:07:42.440
die passen da nicht so richtig rein.

00:07:43.140 --> 00:07:46.300
Oder ein paar Dinge in der Sprache, die funktionieren damit halt nicht so richtig.

00:07:47.220 --> 00:07:49.680
Und deswegen gab es da sowieso schon immer so Ausnahmen.

00:07:50.240 --> 00:07:52.580
Und deswegen ist es halt bisher so ein bisschen hässlich gewesen.

00:07:53.860 --> 00:07:56.580
Also es gibt zum Beispiel, ich kriege das auch nicht alles auf die Reihe,

00:07:56.580 --> 00:08:00.620
aber es gibt halt den, der Parser nimmt halt sozusagen den Text,

00:08:01.180 --> 00:08:06.780
also irgendwie ein Python-Programm und gibt dann halt ein Abstract-Syntax-Tree aus.

00:08:07.600 --> 00:08:11.380
Und der wird dann von dem Compiler verwandelt in Bytecode oder so.

00:08:11.680 --> 00:08:13.160
Und da wird dann halt irgendwie interpretiert.

00:08:13.280 --> 00:08:14.500
Und das gibt dann halt so diverse Teile.

00:08:15.520 --> 00:08:15.720
Und

00:08:15.720 --> 00:08:19.140
das Problem ist irgendwie, dass manche

00:08:19.140 --> 00:08:21.140
Sachen halt

00:08:21.140 --> 00:08:23.160
verteilt sind auf unterschiedliche Teile.

00:08:23.160 --> 00:08:24.600
Also dass es halt nicht so ist, dass es

00:08:24.600 --> 00:08:26.840
oder der Parser bisher,

00:08:26.960 --> 00:08:29.260
da bestimmte Sachen halt nicht so einfach damit parsbar waren.

00:08:29.720 --> 00:08:30.540
Und der ist auch handgeschrieben.

00:08:30.740 --> 00:08:32.920
Wenn man sich das angucken will,

00:08:33.060 --> 00:08:34.500
gibt es ein Modul, das nennt sich

00:08:34.500 --> 00:08:37.240
ast.c oder so

00:08:37.240 --> 00:08:38.540
in Python Source Code,

00:08:38.960 --> 00:08:41.160
dass der alte Parser

00:08:41.160 --> 00:08:43.440
paar tausend Zeilen handgeschriebenes C

00:08:43.440 --> 00:08:45.180
ziemlich fies. Also

00:08:45.180 --> 00:08:47.080
genau. Und

00:08:47.080 --> 00:08:49.720
der ist halt nicht automatisch generiert,

00:08:49.820 --> 00:08:51.620
was halt schon mal nicht so schön ist, weil das

00:08:51.620 --> 00:08:52.860
halt dazu führt, dass er nicht so richtig

00:08:52.860 --> 00:08:55.660
konsistent ist und so und sich manchmal komisch

00:08:55.660 --> 00:08:57.360
verhält. Und

00:08:57.360 --> 00:08:59.740
das Problem eigentlich

00:08:59.740 --> 00:09:01.520
dabei ist, wenn man jetzt sozusagen

00:09:01.520 --> 00:09:03.240
teilweise sind halt Sachen,

00:09:03.380 --> 00:09:04.880
ich kriege das nicht mehr richtig auf die Reihe,

00:09:05.180 --> 00:09:06.700
wenn man zum Beispiel

00:09:06.700 --> 00:09:09.720
rechts neben dem Gleichheitszeichen,

00:09:09.740 --> 00:09:23.200
Weil das Gleichheitszeichen ist irgendwie ein Problem und wenn man da mehrere Sachen stehen hat, also mehrere Dinge, die addiert werden oder so, dann muss das hinterher nochmal im Compiler umsortiert werden, weil das der Parser noch nicht irgendwie ordentlich gemacht hat irgendwie.

00:09:23.600 --> 00:09:35.840
Und das heißt, wenn man jetzt irgendwie so ein Problem hat, auch ein Syntaxproblem, Funktion A plus Funktion B rechts von einem Gleichheitszeichen, dann ist halt komplett unklar, wenn jetzt da irgendwo ein Syntaxfehler ist, wo der eigentlich passiert.

00:09:37.220 --> 00:09:40.140
das ja dann schon einem erst im Compiler

00:09:40.140 --> 00:09:41.300
irgendwie um die Ohren fliegt oder so,

00:09:41.940 --> 00:09:43.400
sodass halt der einem

00:09:43.400 --> 00:09:45.880
sozusagen der Python-Interpreter auch gar nicht sagen kann,

00:09:45.960 --> 00:09:47.920
wo der Syntaxfehler ist, was halt eventuell

00:09:47.920 --> 00:09:49.900
ein Problem sein könnte. So, wenn man nicht mehr

00:09:49.900 --> 00:09:52.160
weiß, wo der Fehler ist, dann ist es halt schwer, den zu fixen

00:09:52.160 --> 00:09:53.880
und das sind halt so Hässlichkeiten,

00:09:54.060 --> 00:09:55.320
sodass man halt da diese

00:09:55.320 --> 00:09:58.060
Überprüfung, ist das jetzt korrekter Python-Code

00:09:58.060 --> 00:09:59.900
oder nicht, halt nicht an einer Stelle passiert,

00:10:00.000 --> 00:10:01.980
sondern halt über ganz viele Teile verteilt

00:10:01.980 --> 00:10:03.860
ist, ist das halt, sind manche Sachen

00:10:03.860 --> 00:10:05.660
halt einfach total hässlich und

00:10:05.660 --> 00:10:13.040
Und ich habe da so ein Podcast-Init.

00:10:14.280 --> 00:10:17.680
Da waren die beiden, die den Pack-Baser hauptsächlich gebaut haben,

00:10:17.680 --> 00:10:21.080
jetzt in Python 3.9 zu Gast und haben da halt so ein bisschen was erzählt,

00:10:21.200 --> 00:10:21.840
was sie da gemacht haben.

00:10:23.400 --> 00:10:28.320
Einer von denen meinte so, also eine User-Anfrage war halt so,

00:10:28.380 --> 00:10:33.120
warum können wir das in RIS-Context-Managern mit diesem RIS-Statement

00:10:33.120 --> 00:10:35.040
nicht einfach so machen wie bei Imports

00:10:35.040 --> 00:10:35.800
oder halt mit

00:10:35.800 --> 00:10:38.980
bei Strings, dass wir da Klammern drumrum

00:10:38.980 --> 00:10:40.640
machen und dann haben wir mehrzeilige Dinge, weil

00:10:40.640 --> 00:10:42.720
mehrzeilige With-Statements geht halt einfach nicht.

00:10:44.460 --> 00:10:44.860
Und

00:10:44.860 --> 00:10:46.900
das hat er dann versucht umzusetzen im alten Parser

00:10:46.900 --> 00:10:48.700
und das ging halt überhaupt gar nicht.

00:10:48.880 --> 00:10:50.800
Also er hat da irgendwie wohl eine Menge Sachen

00:10:50.800 --> 00:10:51.860
probiert und es ging einfach nicht.

00:10:52.640 --> 00:10:54.860
Und er meinte so, ja yes, jetzt geht

00:10:54.860 --> 00:10:56.820
es endlich, jetzt kann man das auch mit Klammern

00:10:56.820 --> 00:10:58.340
machen, das ist viel besser, voll gut.

00:10:58.760 --> 00:11:00.800
Obwohl das wahrscheinlich nie irgendjemand verwenden

00:11:00.800 --> 00:11:02.280
wird wahrscheinlich, aber

00:11:02.280 --> 00:11:05.020
ja, also

00:11:05.020 --> 00:11:05.780
aber das

00:11:05.780 --> 00:11:09.140
was jetzt oft erzählt wird

00:11:09.140 --> 00:11:11.140
ist halt irgendwie, dass man damit besser

00:11:11.140 --> 00:11:13.160
neue Sprachfeatures umsetzen kann oder so, das ist eigentlich

00:11:13.160 --> 00:11:15.360
nicht unbedingt der Fall, es ist halt nur so, dass es jetzt konsistenter

00:11:15.360 --> 00:11:17.180
ist, dass der Faser automatisch generiert

00:11:17.180 --> 00:11:17.960
wird und

00:11:17.960 --> 00:11:19.280
ja

00:11:19.280 --> 00:11:23.480
Ja, nee, also

00:11:23.480 --> 00:11:25.200
er braucht

00:11:25.200 --> 00:11:27.160
sogar mehr RAM. Ja, genau, also das

00:11:27.160 --> 00:11:28.560
war der Grund, warum man das früher nicht gemacht hat,

00:11:29.080 --> 00:11:31.120
weil man muss jetzt alle Tokens im Hauptspeicher

00:11:31.120 --> 00:11:32.980
halten und das war halt früher ein Problem.

00:11:33.500 --> 00:11:34.100
Heute nicht mehr so.

00:11:35.180 --> 00:11:36.340
Also genau, er braucht einfach

00:11:36.340 --> 00:11:38.780
mehr Rahmen. Irgendwer hatte

00:11:38.780 --> 00:11:40.920
auch was erzählt von, dass sie jetzt per

00:11:40.920 --> 00:11:43.080
Default sagen, also mehr als eine Million Zeilen

00:11:43.080 --> 00:11:45.100
in einer passenden

00:11:45.100 --> 00:11:46.580
Datei wollen sie jetzt bitte nicht mehr sehen.

00:11:47.100 --> 00:11:47.200
Ja.

00:11:48.500 --> 00:11:51.000
Oh Mist, was war ich denn jetzt?

00:11:51.340 --> 00:11:52.940
Ja genau, da habe ich

00:11:52.940 --> 00:11:54.220
eine ganze Firma drauf aufgebaut.

00:11:56.500 --> 00:11:56.940
Ja,

00:11:56.940 --> 00:11:58.580
also von der Performance her

00:11:58.580 --> 00:12:00.720
ist kein großer Unterschied, sowohl von der Laufzeit

00:12:00.720 --> 00:12:02.040
und Hauptspeicher braucht es ein bisschen mehr.

00:12:02.620 --> 00:12:04.660
Aber genau, das ist das tolle Ding, was man

00:12:04.660 --> 00:12:05.780
eventuell jetzt damit machen kann.

00:12:07.620 --> 00:12:08.720
Was sonst sehr

00:12:08.720 --> 00:12:10.080
schwer geworden wäre, ist

00:12:10.080 --> 00:12:12.420
da gibt es auch ein PEP jetzt,

00:12:12.560 --> 00:12:14.720
weiß ich nicht welche Nummer, Pattern Matching.

00:12:16.200 --> 00:12:16.740
Bin mal

00:12:16.740 --> 00:12:18.220
gespannt, ob das angenommen wird

00:12:18.220 --> 00:12:19.660
für Python 3.10.

00:12:20.860 --> 00:12:22.200
Dass man halt so

00:12:22.200 --> 00:12:24.480
Lisp-Style-Makros hat, beziehungsweise

00:12:24.480 --> 00:12:26.260
in funktionalen Programmiersprachen ist das schon länger

00:12:26.260 --> 00:12:28.240
oder das ist halt ja so eins der grundlegenden

00:12:28.240 --> 00:12:28.600
Geschichten.

00:12:29.880 --> 00:12:32.640
ja, in Python ging das halt auch

00:12:32.640 --> 00:12:34.420
vor allen Dingen wegen dem Parser bisher

00:12:34.420 --> 00:12:36.320
nicht. Und das

00:12:36.320 --> 00:12:38.580
geht dann eventuell. Und wenn man das darin hat, ist es natürlich

00:12:38.580 --> 00:12:40.220
schon nett. Da hat man so eines der zentralen Features

00:12:40.220 --> 00:12:42.320
von funktionalen Programmiersprachen auch mit drin.

00:12:42.440 --> 00:12:44.180
Was sind denn Lisp-like-Makro?

00:12:44.180 --> 00:12:46.780
Ja, das müssen wir

00:12:46.780 --> 00:12:48.520
mal irgendwann machen, wenn wir irgendwie auch so ein bisschen

00:12:48.520 --> 00:12:50.580
so, ja, noch mal funktionalen Programmiersprachen

00:12:50.580 --> 00:12:52.640
und was ist Pattern-Matching und was sind Makros?

00:12:52.760 --> 00:12:54.540
Da können wir das nochmal. Aber ich glaube, das ist einfach

00:12:54.540 --> 00:12:56.680
Okay, das verschiebe ich auf eine folgende Folge.

00:12:57.360 --> 00:12:58.420
Für die Leute, die gucken wollen,

00:12:58.500 --> 00:12:59.680
wäre es 6-3-4.

00:13:00.100 --> 00:13:00.860
Ah, 6-3-4, ja.

00:13:01.200 --> 00:13:03.060
Das ist auch eins, wo Guido jetzt selber

00:13:03.060 --> 00:13:06.080
wieder, Guido hat ja beim Parser natürlich

00:13:06.080 --> 00:13:06.860
mit drin gesteckt

00:13:06.860 --> 00:13:09.900
und das ist jetzt auch anscheinend

00:13:09.900 --> 00:13:12.140
eins seiner Themen, wo er dran steckt.

00:13:12.580 --> 00:13:12.700
Ja.

00:13:13.640 --> 00:13:15.520
Ja, also auf jeden Fall, das klingt irgendwie

00:13:15.520 --> 00:13:17.740
sehr vielversprechend und ich bin mal gespannt, was dabei so rauskommt.

00:13:18.560 --> 00:13:20.160
Ja, ein Bug ist auch schon aufgefallen

00:13:20.160 --> 00:13:21.540
wohl. Achso, Match war,

00:13:21.660 --> 00:13:23.920
achso, ja, vielleicht tatsächlich

00:13:23.920 --> 00:13:25.820
das ist

00:13:25.820 --> 00:13:28.140
eine bessere Variante

00:13:28.140 --> 00:13:30.140
dessen, was sonst in anderen Sprachen das Case

00:13:30.140 --> 00:13:30.900
gewesen wäre.

00:13:32.920 --> 00:13:33.840
Nur mal so als

00:13:33.840 --> 00:13:36.180
zur groben Einordnung. Also mit

00:13:36.180 --> 00:13:38.000
dem Match geht es dann am Ende

00:13:38.000 --> 00:13:39.980
tatsächlich darum, die, wenn man sehr

00:13:39.980 --> 00:13:41.460
komplexe If-Else

00:13:41.460 --> 00:13:43.520
Zweige hat,

00:13:44.140 --> 00:13:46.080
dann kann man die damit ein bisschen hübscher abbilden.

00:13:47.280 --> 00:13:48.140
Also substanziell

00:13:48.140 --> 00:13:48.440
hübscher.

00:13:50.440 --> 00:13:51.860
Warum hat man das nicht Case genannt?

00:13:56.280 --> 00:13:57.920
Das müsste ich jetzt nachlesen.

00:13:58.140 --> 00:14:01.060
Also es macht schon, glaube ich, noch ein bisschen mehr.

00:14:01.180 --> 00:14:03.200
Also ich meine, ja, naja.

00:14:03.980 --> 00:14:04.760
Ach, keine Ahnung.

00:14:08.260 --> 00:14:09.800
Genau, einen Bug gab es auch schon.

00:14:10.140 --> 00:14:12.480
Da wird jetzt dann wahrscheinlich in 3.9.1 gefixt.

00:14:13.320 --> 00:14:16.680
Und zwar, was der alte Parser konnte

00:14:16.680 --> 00:14:18.540
und was jetzt halt mit dem neuen nicht mehr geht,

00:14:18.540 --> 00:14:22.540
ist, wenn man Tuple Unpacking,

00:14:23.280 --> 00:14:25.540
halt auch so Stern irgendwas in WIS,

00:14:25.780 --> 00:14:27.920
so Context Manager verwendet,

00:14:27.980 --> 00:14:29.260
dann funktioniert das nicht.

00:14:31.560 --> 00:14:33.720
Tja, aber es ist halt bisher niemandem aufgefallen,

00:14:33.840 --> 00:14:35.140
also so häufig scheint es nicht verwendet zu werden,

00:14:35.320 --> 00:14:36.620
aber das klappt schon irgendwie nicht.

00:14:36.880 --> 00:14:38.120
Achso, das ist auch vielleicht ganz interessant,

00:14:38.300 --> 00:14:41.400
also in 3.9 sind beide Parser drin,

00:14:41.540 --> 00:14:43.240
man kann auch irgendwie per Kommando zahlen,

00:14:43.380 --> 00:14:46.240
Optionen sagen, Minus X irgendwas, Old Parser oder so,

00:14:46.960 --> 00:14:48.000
verwendet doch bitte den alten,

00:14:48.100 --> 00:14:49.280
wenn man irgendwie mit dem neuen Probleme hat.

00:14:49.780 --> 00:14:51.520
Der neue ist defaultmäßig aktiv

00:14:51.520 --> 00:14:54.740
und der alte ist aber halt noch drin

00:14:54.740 --> 00:14:58.560
und mit Python 3.10 wird es dann halt so sein,

00:14:58.660 --> 00:15:00.000
dann wird der alte Parser komplett rausfliegen

00:15:00.000 --> 00:15:01.060
und nur noch der neue drin sein.

00:15:03.920 --> 00:15:05.920
Was mit Tablet-Uppacking in Context-Managern,

00:15:05.980 --> 00:15:06.860
das habe ich jetzt nicht so ganz verstanden.

00:15:06.960 --> 00:15:08.900
Warum geht das nicht oder ging das vorher auch nicht?

00:15:09.080 --> 00:15:11.400
Doch, das ging vorher schon, das hat bloß keiner gemacht.

00:15:11.800 --> 00:15:15.200
Warum auch, aber jetzt geht es nicht mehr.

00:15:15.560 --> 00:15:17.040
Also warum will er das denn nicht machen?

00:15:17.040 --> 00:15:27.240
Na ja, also warum, also das ist halt, niemand versteht dann, was du tun willst wahrscheinlich.

00:15:28.100 --> 00:15:31.060
Ich überlege gerade, wie die genaue Syntax ist, was da kaputt geht.

00:15:31.520 --> 00:15:32.540
Hast du den Bug irgendwo da?

00:15:34.320 --> 00:15:36.280
Na ja, Moment, da müsste ich auch gerade suchen.

00:15:42.300 --> 00:15:44.480
Ich versuche so leise wie möglich zu tippen.

00:15:44.480 --> 00:15:44.700
Ja.

00:15:45.980 --> 00:15:48.040
Also ich kann mir schon vorstellen, warum nicht im Contact-Manager

00:15:48.040 --> 00:15:50.460
einfach irgendeinen Tuple anpacken, das ist doch durchaus okay.

00:15:51.560 --> 00:15:52.100
Nee, nee, die Frage

00:15:52.100 --> 00:15:54.040
meinst du wahrscheinlich oben in der With-Expression.

00:15:54.040 --> 00:15:55.800
Ja, ja, in der Expression selber.

00:15:56.000 --> 00:15:58.260
Also With und dann irgendwas mit Tuple-Unpacking machen.

00:15:58.780 --> 00:16:00.220
Also ich sehe da echt keinen Anwendungsfall

00:16:00.220 --> 00:16:02.220
für. Und es ist, glaube ich, also die haben da ja

00:16:02.220 --> 00:16:04.140
die komplette Standard-Bibliothek durchgejagt und noch viele

00:16:04.140 --> 00:16:06.260
PyPI-Pakete und sie haben es

00:16:06.260 --> 00:16:07.840
nicht, also das ist nie aufgetreten.

00:16:08.100 --> 00:16:10.080
Also das ist nicht so, dass das irgendwie dauernd gemacht

00:16:10.080 --> 00:16:12.120
wurde, sondern das hat bisher wohl noch nie jemand

00:16:12.120 --> 00:16:14.140
gemacht. Quasi. Also jedenfalls

00:16:14.140 --> 00:16:15.960
nicht ein Code, der irgendwie häufiger

00:16:15.960 --> 00:16:16.880
verwendet worden wäre.

00:16:18.000 --> 00:16:18.580
Also, ja.

00:16:19.840 --> 00:16:21.720
Es war nur, das ist halt schon mal aufgefallen,

00:16:21.800 --> 00:16:23.200
dass da ein Unterschied zwischen den beiden Paaren gab.

00:16:25.800 --> 00:16:26.160
Ja.

00:16:28.200 --> 00:16:29.460
Tja, was haben wir denn noch so?

00:16:30.540 --> 00:16:31.160
Oh, na hier.

00:16:32.280 --> 00:16:33.860
Also, was ich wirklich hübsch fand, war

00:16:33.860 --> 00:16:35.080
jetzt irgendwie nochmal explizit

00:16:35.080 --> 00:16:37.940
die String, Prefix,

00:16:38.020 --> 00:16:39.480
Suffix-Removals.

00:16:40.480 --> 00:16:41.820
Weil das ist einfach, das war

00:16:41.820 --> 00:16:43.600
seit langen Jahren

00:16:43.600 --> 00:16:45.520
ist ja, es gibt einen L-Strip und einen R-Strip

00:16:45.520 --> 00:16:47.480
und da

00:16:47.480 --> 00:16:49.180
fallen Leute ja gern drauf rein.

00:16:51.460 --> 00:16:53.520
Dass Leute gerne irgendwie sagen

00:16:53.520 --> 00:16:55.540
L-Strip oder

00:16:55.540 --> 00:16:57.460
Strip und dann irgendwie

00:16:57.460 --> 00:16:59.600
eine Zeichenkette und sie denken

00:16:59.600 --> 00:17:01.540
damit wird irgendwie, also

00:17:01.540 --> 00:17:03.600
wenn ich sage Strip,

00:17:04.320 --> 00:17:05.580
ABC, also möchte ich

00:17:05.580 --> 00:17:07.420
immer, wenn ABC ganz links steht, das

00:17:07.420 --> 00:17:09.540
weggestrichen haben, aber das

00:17:09.540 --> 00:17:11.000
macht es ja nicht, sondern das macht ja

00:17:11.800 --> 00:17:12.840
Streich von links

00:17:12.840 --> 00:17:14.440
so lange alles weg,

00:17:14.900 --> 00:17:16.760
wie das, was links ein A, ein B

00:17:16.760 --> 00:17:17.540
oder ein C ist.

00:17:18.440 --> 00:17:20.920
Das heißt, da kommen ganz lustige Dinge dann manchmal raus.

00:17:22.000 --> 00:17:22.480
Und

00:17:22.480 --> 00:17:24.020
jetzt gibt es halt ein explizites

00:17:24.020 --> 00:17:26.400
Remove Prefix, Remove Suffix und dann

00:17:26.400 --> 00:17:28.840
wäre das auch geklärt.

00:17:30.200 --> 00:17:30.320
Ja.

00:17:30.860 --> 00:17:32.400
Das ist schon hilfreich.

00:17:33.400 --> 00:17:34.360
Ja, ansonsten

00:17:34.360 --> 00:17:36.960
Zeitzonenhandling

00:17:36.960 --> 00:17:37.980
ist jetzt irgendwie mit drin.

00:17:39.540 --> 00:17:40.860
Das habe ich noch nicht angeguckt,

00:17:40.940 --> 00:17:43.000
ich bin seit irgendwie 15 Jahren

00:17:43.000 --> 00:17:44.200
mit PyTZ unterwegs

00:17:44.200 --> 00:17:47.080
und PyTZ hat halt den Vorteil,

00:17:47.140 --> 00:17:48.540
das ist unabhängig, das ist halt so ein Ding,

00:17:48.980 --> 00:17:51.180
die Zeitzonen-Datenbanken werden halt ständig

00:17:51.180 --> 00:17:52.800
aktualisiert und geändert

00:17:52.800 --> 00:17:54.860
und ich bin mir gerade nicht sicher,

00:17:54.960 --> 00:17:55.440
haben die

00:17:55.440 --> 00:17:58.860
da irgendwie die Datenbanken mit dabei

00:17:58.860 --> 00:18:00.260
oder ist das nur eine API?

00:18:00.580 --> 00:18:01.920
Genau, das ist halt auch der Grund, warum

00:18:01.920 --> 00:18:05.480
im DateTime-Standard-Modul

00:18:05.480 --> 00:18:06.640
in der Standardbibliothek

00:18:06.640 --> 00:18:09.240
waren diese Zeitzonen-Datenbanken

00:18:09.240 --> 00:18:11.180
auch nie drin, wohl aber eine API dafür,

00:18:11.280 --> 00:18:13.040
wie man da seine eigene Datenbank oder sein

00:18:13.040 --> 00:18:14.600
eigenes Objekt, das halt implementiert,

00:18:14.840 --> 00:18:16.120
das halt so ein Objekt irgendwie

00:18:16.120 --> 00:18:18.540
reintun kann, weil sich die Leute gesagt haben, ah,

00:18:18.680 --> 00:18:21.120
Python-Release-Zyklus, viel zu lang für diese Updates

00:18:21.120 --> 00:18:22.320
und dann wollen die Leute das mal selber machen

00:18:22.320 --> 00:18:24.900
und dann haben es die Leute natürlich nicht selber gemacht,

00:18:25.620 --> 00:18:27.080
weil keiner Bock hatte, das zu

00:18:27.080 --> 00:18:28.800
machen und ja,

00:18:28.980 --> 00:18:31.160
nee, wie es jetzt wohl ist, ist, dass

00:18:31.160 --> 00:18:32.980
Ach, ja, die nehmen

00:18:32.980 --> 00:18:34.980
die System-Time so, weil sie haben eine

00:18:34.980 --> 00:18:36.520
API dafür, um das reinzuziehen.

00:18:36.680 --> 00:18:39.040
Ja, und genau, auf Windows

00:18:39.040 --> 00:18:40.600
gibt es noch eine komische Geschichte,

00:18:40.880 --> 00:18:42.220
da gibt es dann ein

00:18:42.220 --> 00:18:45.220
First-Party-Package, was man dann noch installieren

00:18:45.220 --> 00:18:46.640
muss, TZ-Data oder sowas.

00:18:48.920 --> 00:18:49.360
Dann

00:18:49.360 --> 00:18:50.680
geht das da wohl irgendwie auch.

00:18:52.680 --> 00:18:53.000
Aber

00:18:53.000 --> 00:18:54.960
genau, so ist das dann. Ja, das ist so als

00:18:54.960 --> 00:18:57.080
Fallback gedacht, für wenn das andere nicht da ist.

00:18:57.760 --> 00:18:59.220
Und die intern

00:18:59.220 --> 00:18:59.920
funktioniert das wohl

00:18:59.920 --> 00:19:02.780
mehr oder weniger genauso wie

00:19:02.780 --> 00:19:05.020
DateUtil oder sagen wir so, das ist auch

00:19:05.020 --> 00:19:06.940
also wie

00:19:06.940 --> 00:19:08.360
DateUtil das macht, also

00:19:08.360 --> 00:19:10.640
ich glaube, das ist auch von dem Autor von

00:19:10.640 --> 00:19:12.620
von DateUtil irgendwie

00:19:12.620 --> 00:19:14.800
meine ich jedenfalls

00:19:14.800 --> 00:19:16.440
gehört zu haben, dass der das von dem

00:19:16.440 --> 00:19:18.460
das ist und es implementiert halt so die

00:19:18.460 --> 00:19:20.520
Kerngeschichten, aber viele von den fancy Features

00:19:20.520 --> 00:19:22.120
von DateUtil sind halt nicht drin, aber

00:19:22.120 --> 00:19:24.060
so die Kerndinge.

00:19:27.640 --> 00:19:28.040
Ja.

00:19:31.480 --> 00:19:32.100
Noch was?

00:19:32.480 --> 00:19:33.060
Noch irgendwas?

00:19:38.020 --> 00:19:39.880
Naja gut, da gab es noch irgendwas mit Dekoratoren

00:19:39.880 --> 00:19:41.920
und Syntax, dass man da konnte man

00:19:41.920 --> 00:19:43.960
früher immer nur, bis jetzt halt

00:19:43.960 --> 00:19:45.880
immer nur Funktionen verwenden und jetzt kann man

00:19:45.880 --> 00:19:48.060
halt auch irgendwie ein Dikt nehmen

00:19:48.060 --> 00:19:49.780
und dann eckige Klammern oder so, das ging vorher

00:19:49.780 --> 00:19:51.840
auch nicht so richtig. Und das geht

00:19:51.840 --> 00:19:53.820
jetzt. Ah, das wird wahrscheinlich auch kaum jemand

00:19:53.820 --> 00:19:54.760
machen insofern.

00:19:55.860 --> 00:19:57.960
Ja, obwohl, da kann ich mir jetzt KMR vorstellen noch.

00:19:58.360 --> 00:19:59.740
Ja, dass man halt, man könnte sich vorstellen,

00:19:59.780 --> 00:20:01.840
man hatte irgendwie ein Dikt von Dekoratoren oder so,

00:20:01.880 --> 00:20:03.940
wo die Values halt irgendwie Funktionen

00:20:03.940 --> 00:20:05.840
sind und dann wählt man halt das Ding

00:20:05.840 --> 00:20:07.840
aus, was man halt, und da hätte

00:20:07.840 --> 00:20:09.660
man halt bisher immer irgendwie eine

00:20:09.660 --> 00:20:11.880
Extra-Funktion haben müssen, die dann halt

00:20:11.880 --> 00:20:14.000
die richtige Funktion auswählt

00:20:14.000 --> 00:20:15.140
und jetzt geht es halt direkt.

00:20:15.620 --> 00:20:16.700
Ja, auch nicht so schlecht.

00:20:17.780 --> 00:20:18.880
Es ist ja eine Frage von

00:20:18.880 --> 00:20:21.280
in solchen Momenten immer bei diesen

00:20:21.280 --> 00:20:23.120
syntaktischen Kleinheiten

00:20:23.120 --> 00:20:27.620
dann kann man ja immer dieses

00:20:27.620 --> 00:20:28.760
berühmte Dokument des

00:20:28.760 --> 00:20:31.800
PHP, a fractal of bad design

00:20:31.800 --> 00:20:33.240
rausholen,

00:20:33.660 --> 00:20:35.640
dass du dich halt irgendwie

00:20:35.640 --> 00:20:37.380
darauf verlassen können möchtest, wenn

00:20:37.380 --> 00:20:39.360
gesagt wird, okay, hier hinter dem Ad

00:20:39.360 --> 00:20:41.280
kommt halt eine Expression,

00:20:41.980 --> 00:20:43.240
dann kann ich hier auch bitte alles

00:20:43.240 --> 00:20:44.840
machen, was eine Expression halt kann.

00:20:45.620 --> 00:20:47.300
Und wenn das halt nicht geht,

00:20:47.380 --> 00:20:49.240
dann steht man immer traurig da und fragt sich, was soll

00:20:49.240 --> 00:20:50.040
denn der Quatsch eigentlich?

00:20:51.660 --> 00:20:52.780
Insofern, ich finde das einfach,

00:20:53.240 --> 00:20:55.280
das ist halt so das Thema, wenn das auch gerade was ist, was der

00:20:55.280 --> 00:20:57.240
neue Parser vielleicht besser unterstützt,

00:20:57.420 --> 00:20:59.560
dann all for it.

00:21:00.480 --> 00:21:00.940
Was ist

00:21:00.940 --> 00:21:02.500
a PAPEffect of Bad Design?

00:21:03.520 --> 00:21:05.240
Also, um nicht auf

00:21:05.240 --> 00:21:05.800
anderen

00:21:05.800 --> 00:21:08.780
Sprachen rumzuhauen.

00:21:09.420 --> 00:21:10.560
Gibt es aber ein

00:21:10.560 --> 00:21:12.660
wirklich berühmtes Dokument

00:21:12.660 --> 00:21:14.000
zum Thema, warum PHP

00:21:14.000 --> 00:21:16.600
so ein massives Problem im Sprachdesign

00:21:16.600 --> 00:21:18.240
hat. Und da gibt es

00:21:18.240 --> 00:21:20.040
in dieser Blogpost, der ist jetzt auch

00:21:20.040 --> 00:21:21.600
bestimmt schon 10 Jahre alt oder so.

00:21:21.680 --> 00:21:22.080
2012.

00:21:23.580 --> 00:21:24.300
8 Jahre.

00:21:25.980 --> 00:21:27.900
Und da geht es

00:21:27.900 --> 00:21:30.220
sozusagen darum, dass diese Herangehensweise

00:21:30.220 --> 00:21:31.800
des Sprachdesigns, und da ist

00:21:31.800 --> 00:21:33.840
Python ja schon lange ein Vorreiter gewesen, dass es halt

00:21:33.840 --> 00:21:36.000
eine explizite Sprachdefinition

00:21:36.000 --> 00:21:38.040
gibt, aus der dann halt das C-Python

00:21:38.040 --> 00:21:39.920
nur, in Anführungszeichen,

00:21:40.040 --> 00:21:41.680
die eine Implementation ist, und es

00:21:41.680 --> 00:21:44.280
ist klar, es kann auch andere Implementationen

00:21:44.280 --> 00:21:45.840
geben, und

00:21:45.840 --> 00:21:48.100
ich erinnere mich

00:21:48.100 --> 00:21:49.480
an mindestens ein Thema,

00:21:50.220 --> 00:21:51.760
wo allein von

00:21:51.760 --> 00:21:54.240
dieser syntaktischen Genauigkeit

00:21:54.240 --> 00:21:55.900
tatsächlich irgendwie,

00:21:56.040 --> 00:21:57.960
ich glaube, war das

00:21:57.960 --> 00:21:59.940
das Type-of-Äquivalent

00:21:59.940 --> 00:22:01.880
bei PHP oder so, war so

00:22:01.880 --> 00:22:03.820
im Parser integriert, dass tatsächlich

00:22:03.820 --> 00:22:05.960
die Aussage war, diese eine Funktion kann

00:22:05.960 --> 00:22:07.980
immer nur exakt mit einem variablen Namen

00:22:07.980 --> 00:22:10.260
aufgerufen werden, aber niemals

00:22:10.260 --> 00:22:11.840
jemals mit einer

00:22:11.840 --> 00:22:13.780
Expression, wo du dann von dem Ergebnis

00:22:13.780 --> 00:22:15.560
den Typen haben

00:22:15.560 --> 00:22:17.980
möchtest. Weil halt

00:22:17.980 --> 00:22:20.100
jemand das in den Parser so reingestrickt hat.

00:22:21.480 --> 00:22:23.860
Und dieser Artikel geht das sozusagen

00:22:23.860 --> 00:22:26.120
in arg detaillierter

00:22:26.120 --> 00:22:27.700
Form durch und nimmt da irgendwie

00:22:27.700 --> 00:22:29.920
tausend von den Sachen auseinander und sagt halt hier

00:22:29.920 --> 00:22:32.420
was willst du jetzt noch sagen, wenn du irgendwie

00:22:32.420 --> 00:22:34.640
nur noch von einem zum anderen stolperst

00:22:34.640 --> 00:22:34.920
dabei?

00:22:36.680 --> 00:22:38.780
Ja, der ist mal ganz interessant zu lesen,

00:22:38.840 --> 00:22:40.340
wird zum Thema irgendwie

00:22:40.340 --> 00:22:42.520
ein bisschen analytisch auseinandergenommen,

00:22:43.100 --> 00:22:44.500
was das liebe PHP

00:22:44.500 --> 00:22:46.780
da so ein bisschen auf die schiefe Bahn

00:22:46.780 --> 00:22:47.420
geraten lässt.

00:22:48.100 --> 00:22:49.480
Ja, müssen wir mal in die Shownotes packen.

00:22:49.480 --> 00:22:49.820
Ja.

00:22:51.080 --> 00:22:53.680
Ja, mit den iii.ii

00:22:53.680 --> 00:22:54.200
oder sowas.

00:22:57.220 --> 00:22:59.380
Ja, aber

00:22:59.380 --> 00:23:00.800
ich glaube, das war es dann auch schon

00:23:00.800 --> 00:23:02.180
mehr oder weniger, ne?

00:23:02.840 --> 00:23:05.020
Ich glaube, sonst war da eigentlich nichts drin.

00:23:05.560 --> 00:23:07.360
Ja, ich glaube, irgendwie noch was zu Typins oder sowas, aber

00:23:07.360 --> 00:23:09.260
Oh ja, stimmt, man kann jetzt irgendwie

00:23:09.260 --> 00:23:10.780
List, man muss nicht mehr

00:23:10.780 --> 00:23:13.160
diese List mit Großbuchstaben vom

00:23:13.160 --> 00:23:15.300
Typing importieren. Wahrscheinlich

00:23:15.300 --> 00:23:17.300
war das halt auch so gedacht, ja, wer

00:23:17.300 --> 00:23:19.280
weiß, wie lange, ob die Leute das gut finden mit

00:23:19.280 --> 00:23:20.820
dem Typing, Typins und so.

00:23:22.400 --> 00:23:23.360
Nehmen wir mal nicht

00:23:23.360 --> 00:23:25.340
irgendwie, machen wir nicht den Aufwand, das

00:23:25.340 --> 00:23:27.160
direkt so zu ändern. Und jetzt kann man,

00:23:27.160 --> 00:23:28.440
muss man das halt nicht mehr aus Typing

00:23:28.440 --> 00:23:29.560
irgendwie

00:23:29.560 --> 00:23:32.620
Listen mit großem L importieren, sondern kann halt

00:23:32.620 --> 00:23:34.380
die Build-ins verwenden und das

00:23:34.380 --> 00:23:35.780
funktioniert dann halt auch in den Type-ins.

00:23:37.700 --> 00:23:38.580
Genau, das ist ganz

00:23:38.580 --> 00:23:39.920
nett. Das macht es ein bisschen

00:23:39.920 --> 00:23:42.360
einfacher, das zu schreiben und man muss nicht immer nachgucken, welche

00:23:42.360 --> 00:23:43.140
Imports das jetzt waren.

00:23:44.520 --> 00:23:44.880
Ja,

00:23:46.480 --> 00:23:48.480
was steht an Veranstaltungen an?

00:23:49.040 --> 00:23:50.500
Habt ihr irgendwelche? Oh, hab ich jetzt

00:23:50.500 --> 00:23:52.320
dummerweise gar nicht so richtig nachgeschaut.

00:23:52.600 --> 00:23:53.980
Die DjangoCon ist gerade vorbei.

00:23:54.480 --> 00:23:56.060
Ja, gab es eigentlich die Python auf jetzt?

00:23:57.360 --> 00:23:58.100
Oder waren die

00:23:58.100 --> 00:24:00.800
War die PyCon dieses Jahr virtuell?

00:24:00.900 --> 00:24:02.760
Ich weiß gar nicht. Welche meinst du?

00:24:02.780 --> 00:24:03.940
Die deutsche? Ja, die D.

00:24:05.060 --> 00:24:06.600
Ne, die haben wir tatsächlich

00:24:06.600 --> 00:24:07.600
verschoben. Also wir hatten

00:24:07.600 --> 00:24:10.680
relativ zeitig im Jahr mit den, also es

00:24:10.680 --> 00:24:12.360
wäre jetzt wieder in Berlin gewesen.

00:24:12.420 --> 00:24:13.740
Genau, letzte Woche war es gewesen eigentlich.

00:24:14.600 --> 00:24:16.500
Genau, und wir haben aber relativ

00:24:16.500 --> 00:24:17.780
frühzeitig mit dem

00:24:17.780 --> 00:24:20.460
Veranstaltungsort, wie wir haben gewesen, im

00:24:20.460 --> 00:24:22.580
Haus des, nicht Haus des Lehrers

00:24:22.580 --> 00:24:23.340
hier daneben an.

00:24:26.300 --> 00:24:26.700
Ja.

00:24:28.100 --> 00:24:30.180
in Berlin, genau

00:24:30.180 --> 00:24:32.500
ach, wie heißt denn das noch, da wo immer

00:24:32.500 --> 00:24:34.540
der CCC-Kongress war, da wo immer der Kongress

00:24:34.540 --> 00:24:36.640
war, genau, dieses UFO

00:24:36.640 --> 00:24:38.620
ja, da wären

00:24:38.620 --> 00:24:40.100
wir gewesen eigentlich und

00:24:40.100 --> 00:24:42.480
wir haben mit denen dann halt, das war halt so ein bisschen

00:24:42.480 --> 00:24:44.640
schwierig, weil im Januar

00:24:44.640 --> 00:24:46.600
ja wirklich, im Februar

00:24:46.600 --> 00:24:48.440
März war das, März, März

00:24:48.440 --> 00:24:50.520
nicht klar war, wie wird denn das

00:24:50.520 --> 00:24:52.320
jetzt sich über das Jahr eigentlich entwickeln

00:24:52.320 --> 00:24:53.920
und tatsächlich, jetzt sehen wir ja gerade auch

00:24:53.920 --> 00:24:56.200
dass die Zahlen schon wieder schwierig sind

00:24:56.200 --> 00:24:57.680
und Massenveranstaltungen sind ja eh

00:24:57.680 --> 00:24:59.600
abgesagt bis mindestens Ende

00:24:59.600 --> 00:25:01.580
2020 und wir hätten gerechnet,

00:25:02.220 --> 00:25:03.680
also in einem regulären Jahr

00:25:03.680 --> 00:25:05.800
wäre unsere Hochrechnung

00:25:05.800 --> 00:25:07.840
glaube ich bei knapp 2000 Leuten gewesen

00:25:07.840 --> 00:25:09.900
und das kannst du halt

00:25:09.900 --> 00:25:11.140
gerade knicken, das geht gar nicht.

00:25:12.080 --> 00:25:13.600
Und gleichzeitig war halt auch schon

00:25:13.600 --> 00:25:14.960
eine Anzahlung geleistet gewesen,

00:25:15.920 --> 00:25:17.400
deswegen mussten wir mit denen entsprechend verhandeln

00:25:17.400 --> 00:25:19.120
und jetzt ist die Aussage, wir probieren es 2021

00:25:19.120 --> 00:25:21.320
und 2022, also wir haben uns committet

00:25:21.320 --> 00:25:23.860
2021 und 2022 nochmal in Berlin zu machen

00:25:23.860 --> 00:25:25.640
und haben uns gedacht, na gut,

00:25:26.160 --> 00:25:27.420
um dann halt sozusagen die

00:25:27.420 --> 00:25:29.480
Anzahlung zu retten.

00:25:29.820 --> 00:25:31.320
Dadurch dürfen wir die für das nächste Jahr mit

00:25:31.320 --> 00:25:33.280
verrechnen und haben jetzt auch

00:25:33.280 --> 00:25:36.320
garantierte Preise

00:25:36.320 --> 00:25:37.380
für 2021 und 2022

00:25:37.380 --> 00:25:39.100
schon rausgehandelt. Die haben ja auch das Problem.

00:25:39.660 --> 00:25:41.500
Auf der einen Seite müssen sie irgendwie sehen, wo sie bleiben

00:25:41.500 --> 00:25:43.340
und auf der anderen Seite wollen sich natürlich auch nicht alle

00:25:43.340 --> 00:25:44.700
Leute verbrennen, die eigentlich jetzt

00:25:44.700 --> 00:25:46.840
regelmäßig Veranstaltungen mit ihnen machen.

00:25:47.700 --> 00:25:49.160
Ich bin ein bisschen froh, dass wir halt jetzt

00:25:49.160 --> 00:25:51.460
planmäßig schon für Berlin geplant

00:25:51.460 --> 00:25:52.880
hatten und nicht für

00:25:52.880 --> 00:25:55.300
Hinterpose Muckel, um

00:25:55.300 --> 00:25:56.940
dann sagen zu müssen, so auf die nächsten

00:25:56.940 --> 00:25:59.060
x Jahre müssen wir nach Hinterpolse muckeln,

00:25:59.260 --> 00:25:59.760
ansonsten

00:25:59.760 --> 00:26:03.060
sind wir pleite,

00:26:03.200 --> 00:26:04.720
wären wir nicht pleite, aber

00:26:04.720 --> 00:26:07.220
ansonsten müssten wir da

00:26:07.220 --> 00:26:09.140
irgendwie Dutzende, Zehntausend Euro

00:26:09.140 --> 00:26:11.260
vergraben.

00:26:11.260 --> 00:26:13.080
Ja, nee, genau,

00:26:13.160 --> 00:26:14.720
das wäre es gewesen, das haben wir verschoben.

00:26:14.940 --> 00:26:16.620
Was tatsächlich im November noch ist,

00:26:16.720 --> 00:26:18.940
vielleicht für alle, die auch im Peißenverband

00:26:18.940 --> 00:26:20.540
schon Mitglied sind, ist

00:26:20.540 --> 00:26:22.080
Mitgliederversammlung tatsächlich.

00:26:22.860 --> 00:26:24.280
Das hatten wir auch ursprünglich geplant,

00:26:24.400 --> 00:26:26.240
die jetzt, weil es ja eigentlich ganz gut aussah, im Oktober

00:26:26.240 --> 00:26:28.320
mit vor Ort

00:26:28.320 --> 00:26:30.340
hier in Halle zu machen, aber

00:26:30.340 --> 00:26:32.100
sind gerade dabei.

00:26:32.560 --> 00:26:33.680
Ich glaube, morgen wird das beschlossen

00:26:33.680 --> 00:26:36.400
und dann wird das wahrscheinlich auch eine digitale

00:26:36.400 --> 00:26:37.120
Veranstaltung werden,

00:26:38.100 --> 00:26:40.300
im November. Da gehen demnächst

00:26:40.300 --> 00:26:42.100
noch Einladungen raus, wer beim

00:26:42.100 --> 00:26:43.480
Python-Verband Mitglied werden will.

00:26:43.900 --> 00:26:45.500
Stimmt, kann ich das gerne noch machen.

00:26:45.500 --> 00:26:47.600
Ja, dafür muss er tatsächlich noch mal kurz Werbung machen.

00:26:48.380 --> 00:26:49.440
Die Webseite kurz nennen

00:26:49.440 --> 00:26:51.480
und... Genau, das wäre der

00:26:51.480 --> 00:26:53.640
python-verband.org

00:26:53.640 --> 00:26:55.820
der Python Software Verband

00:26:55.820 --> 00:26:57.420
als die deutsche Interessensvorredung

00:26:57.420 --> 00:26:59.780
und eine unserer

00:26:59.780 --> 00:27:01.740
Hauptaktionen, und das war diesmal jetzt leider

00:27:01.740 --> 00:27:02.500
dann auch ein bisschen

00:27:02.500 --> 00:27:05.000
wenig durch Corona,

00:27:05.600 --> 00:27:07.920
ist, dass wir alle möglichen

00:27:07.920 --> 00:27:09.800
Community-Aktionen fördern.

00:27:10.640 --> 00:27:11.840
Sowohl organisatorisch

00:27:11.840 --> 00:27:13.760
als auch mit Geld. Das heißt, wir

00:27:13.760 --> 00:27:15.920
verstehen uns da ein bisschen

00:27:15.920 --> 00:27:17.160
als eine Drehscheibe.

00:27:17.960 --> 00:27:19.680
Python selber ist ja gut bekannt, aber

00:27:19.680 --> 00:27:21.680
was wir stark unterstützen wollen,

00:27:21.800 --> 00:27:23.300
ist halt, Python

00:27:23.300 --> 00:27:25.380
noch in Communities zu tragen, die es vielleicht

00:27:25.380 --> 00:27:27.440
nicht so kennen und aber auch Veranstaltungen

00:27:27.440 --> 00:27:29.460
zu fördern. Das heißt, man kann da auf der Webseite

00:27:29.460 --> 00:27:30.820
unser Förderprogramm nachschlagen

00:27:30.820 --> 00:27:33.340
und dann kann man sich relativ

00:27:33.340 --> 00:27:35.320
unkompliziert Geld für Ideen abholen,

00:27:35.380 --> 00:27:37.420
die man mal mit, wie man Python an andere

00:27:37.420 --> 00:27:39.140
Leute ranbringen will, mal was coden möchte,

00:27:39.620 --> 00:27:40.160
etc., etc.

00:27:41.440 --> 00:27:43.080
Genau. Okay, interessant. Und

00:27:43.080 --> 00:27:45.180
im Corona-Jahr war es jetzt auch so, dass wir tatsächlich

00:27:45.180 --> 00:27:46.940
ein, zwei schon länger

00:27:46.940 --> 00:27:48.180
bekannte Partner,

00:27:49.460 --> 00:27:51.360
da gibt es die TechKids zum Beispiel

00:27:51.360 --> 00:27:53.200
im Schwäbischen, die haben

00:27:53.200 --> 00:27:55.200
jetzt auch ganz schön drunter gelitten, weil denen die ganzen Veranstaltungen

00:27:55.200 --> 00:27:56.960
weggebrochen sind, mit denen sie normalerweise

00:27:56.960 --> 00:27:59.520
dann ja auch wieder so Teilnahmegebühren reinholen

00:27:59.520 --> 00:28:01.080
und haben da jetzt dieses Jahr

00:28:01.080 --> 00:28:02.980
im Fördertopf tatsächlich dann auch eher mal

00:28:02.980 --> 00:28:05.200
großzügig gesagt, okay, wir sponsoren euch jetzt auch mal,

00:28:05.260 --> 00:28:07.100
wenn gerade nichts los ist, damit

00:28:07.100 --> 00:28:09.540
das jetzt hier über die Corona-Zeit

00:28:09.540 --> 00:28:11.000
nicht alles zerbricht, einfach,

00:28:11.100 --> 00:28:12.160
was die Leute aufgebaut haben.

00:28:13.460 --> 00:28:15.120
Ja. Ja. Das ist tatsächlich

00:28:15.120 --> 00:28:16.780
vielerorts ein größeres Problem, ja.

00:28:17.300 --> 00:28:17.460
Ja.

00:28:19.760 --> 00:28:20.420
Tja, ja.

00:28:21.260 --> 00:28:23.020
Also es ist dann demnächst Weihnachten. Ich habe heute die

00:28:23.020 --> 00:28:24.640
erste Weihnachtswärmung gekriegt.

00:28:25.120 --> 00:28:26.820
Ja, tatsächlich. Weihnachtswünsche.

00:28:28.360 --> 00:28:28.540
Ja,

00:28:28.680 --> 00:28:30.900
geht schnell vorbei

00:28:30.900 --> 00:28:31.940
mit so einer Pandemie, ja.

00:28:35.040 --> 00:28:35.760
So oder so.

00:28:36.500 --> 00:28:38.360
Ja, also genau, ich weiß nur,

00:28:38.700 --> 00:28:40.620
Juro Python war jetzt auch

00:28:40.620 --> 00:28:42.700
vor kurzem. Die Vorträge sind

00:28:42.700 --> 00:28:44.580
irgendwie da und Django Con,

00:28:44.680 --> 00:28:46.620
das wollte ich mir auf jeden Fall angucken, aber habe ich

00:28:46.620 --> 00:28:48.700
noch bisher nicht geschafft. Gibt es auch die ganzen

00:28:48.700 --> 00:28:50.200
Vorträge online.

00:28:50.900 --> 00:28:52.620
Und was jetzt in Zukunft kommt, weiß ich gar nicht.

00:28:52.720 --> 00:28:54.200
weil ich es nicht nachgeguckt habe.

00:28:54.680 --> 00:28:56.680
Ja, wir verpassen übrigens gerade wieder das Django-Meetup

00:28:56.680 --> 00:28:58.720
Cologne, ne? Ja, ich weiß, aber das ist halt

00:28:58.720 --> 00:29:00.860
dann blöd, muss man...

00:29:00.860 --> 00:29:02.660
Ja, die Froscon war auch noch, das ist jetzt auch

00:29:02.660 --> 00:29:04.020
so fünf, sechs Wochen her, glaube ich.

00:29:04.240 --> 00:29:06.580
Da hat es ein bisschen gedauert, die haben jetzt auch erst vor, glaube ich, zwei, drei

00:29:06.580 --> 00:29:08.460
Wochen dann die Videos

00:29:08.460 --> 00:29:10.440
online gehabt, genau.

00:29:11.600 --> 00:29:12.540
Ja, und es gibt, glaube ich, noch wieder

00:29:12.540 --> 00:29:14.500
so eine neue Anmeldung für das nächste Jahr, ne?

00:29:14.500 --> 00:29:16.300
Die 21, die auch online statt

00:29:16.300 --> 00:29:18.160
sein wird, äh, Forstdem, diesmal, ja.

00:29:18.540 --> 00:29:20.720
Forstdem, achso, das ist dann Februar, Januar, Februar

00:29:20.720 --> 00:29:21.800
irgendwann die Forstdem, genau.

00:29:22.200 --> 00:29:23.240
Nee, ich meinte die Frostcon.

00:29:23.740 --> 00:29:24.780
Genau, die ist normalerweise

00:29:24.780 --> 00:29:27.580
St. Augustin. Genau, ja.

00:29:27.760 --> 00:29:28.340
Damals, ja.

00:29:30.260 --> 00:29:31.880
Ja, ansonsten, was mir noch so

00:29:31.880 --> 00:29:33.640
eingefallen ist, was jetzt geht, was

00:29:33.640 --> 00:29:34.320
früher nicht ging,

00:29:35.440 --> 00:29:37.540
Icehorde und Black sind kompatibel.

00:29:38.680 --> 00:29:39.560
Ja, das

00:29:39.560 --> 00:29:40.720
ist auch nett.

00:29:42.040 --> 00:29:43.060
Wie kam es?

00:29:44.100 --> 00:29:45.660
Ich weiß es nicht genau,

00:29:45.660 --> 00:29:45.940
also

00:29:45.940 --> 00:29:49.820
mit irgendeinem Update

00:29:49.820 --> 00:29:51.080
von Icehorde ist das jetzt

00:29:51.080 --> 00:29:53.420
sozusagen erledigt dann irgendwie gewesen.

00:29:53.880 --> 00:29:55.620
Also iSort hat was gemacht, damit Black

00:29:55.620 --> 00:29:56.640
nicht mehr dazwischen punkt.

00:29:57.300 --> 00:29:58.640
Ja, irgendwie so, genau.

00:29:59.780 --> 00:30:01.320
Und ja, jetzt geht es halt, man kann es

00:30:01.320 --> 00:30:03.500
halt parallel, also man kann halt beides

00:30:03.500 --> 00:30:04.260
verwenden und

00:30:04.260 --> 00:30:07.340
hat dann da kein, nicht mehr so, dass das eine

00:30:07.340 --> 00:30:09.760
immer die Sachen vom anderen umsortiert, was ja irgendwie ein bisschen doof ist.

00:30:09.800 --> 00:30:11.600
Jetzt müsste man das nur noch in PyProjectHummel

00:30:11.600 --> 00:30:13.580
konfigurierbar machen, genau wie PyTest und

00:30:13.580 --> 00:30:15.560
Lake8 und dann...

00:30:15.560 --> 00:30:16.540
PyTest ist das?

00:30:17.800 --> 00:30:19.200
Ist das schon? Ja, aber

00:30:19.200 --> 00:30:20.280
mit so einem komischen

00:30:20.280 --> 00:30:23.500
Ja gut, der Key ist so ein bisschen komisch.

00:30:23.520 --> 00:30:25.260
Genau, PyTest, INI-Options

00:30:25.260 --> 00:30:27.480
oder so so ein Quatsch.

00:30:29.380 --> 00:30:31.020
Wobei ich sagen muss, wir haben jetzt

00:30:31.020 --> 00:30:33.460
tatsächlich Black an ein paar Stellen wieder zurückgebaut

00:30:33.460 --> 00:30:35.380
und ich breche

00:30:35.380 --> 00:30:37.280
noch eine Lanze für alle Leute, die sozusagen

00:30:37.280 --> 00:30:39.420
neben schwarz noch ein bisschen grau haben wollen.

00:30:40.340 --> 00:30:40.540
Ja.

00:30:41.700 --> 00:30:43.740
Und empfehle mal noch ins Japf reinzuschauen.

00:30:44.080 --> 00:30:44.800
Japf, okay.

00:30:45.900 --> 00:30:47.440
Ja, Black wird auch

00:30:47.440 --> 00:30:49.240
ein Problem kriegen, Black Fernandes

00:30:49.240 --> 00:30:50.990
auch den alten Parser

00:30:50.990 --> 00:30:52.850
und

00:30:52.850 --> 00:30:55.070
spätestens ab Python 3.10 wird es dann halt

00:30:55.070 --> 00:30:56.130
muss er sich

00:30:56.130 --> 00:30:58.850
was einfallen lassen, weil das geht dann nicht mehr.

00:31:00.650 --> 00:31:00.810
Naja.

00:31:02.250 --> 00:31:03.190
Kannst du kurz was zu JAPF noch

00:31:03.190 --> 00:31:05.190
sagen? Ja, JAPF

00:31:05.190 --> 00:31:07.130
ist so ein, wie auch, wir waren ja vorhin schon

00:31:07.130 --> 00:31:07.590
beim JAK,

00:31:08.550 --> 00:31:10.930
der Yet Another Compiler Compiler und

00:31:10.930 --> 00:31:13.110
JAPF ist der Yet Another Python Formatter

00:31:13.110 --> 00:31:15.130
und die haben

00:31:15.130 --> 00:31:17.070
sich tatsächlich eher auf die Fahnen geschrieben, dass das

00:31:17.070 --> 00:31:19.210
Ding ein bisschen konfigurierbarer

00:31:19.210 --> 00:31:21.070
ist. Auch mit einer Jap Ignore, ich hab's grad

00:31:21.070 --> 00:31:21.290
gesehen.

00:31:23.170 --> 00:31:25.150
Und der erzeugt

00:31:25.150 --> 00:31:27.150
für mich, find ich, deutlich

00:31:27.150 --> 00:31:29.150
lesbareren Code. Also das ist

00:31:29.150 --> 00:31:31.090
die, ich komm persönlich mit

00:31:31.090 --> 00:31:33.070
der Black-Formatierung an

00:31:33.070 --> 00:31:34.470
vielen Stellen so richtig gar nicht klar

00:31:34.470 --> 00:31:36.990
und find sie einfach

00:31:36.990 --> 00:31:39.070
urpot hässlich.

00:31:39.130 --> 00:31:41.050
Ich fand sie auch sehr ugly, aber Jochen hat's mir immer aufgezogen.

00:31:41.830 --> 00:31:42.250
Ja, sorry.

00:31:43.230 --> 00:31:44.970
Also ich unterstütze

00:31:44.970 --> 00:31:46.410
volle Kanne das Thema,

00:31:46.970 --> 00:31:48.790
einen Auto-Formatter einzusetzen.

00:31:49.210 --> 00:31:51.250
Ähm, aber ich finde

00:31:51.250 --> 00:31:52.630
Black ist halt nicht der weiße letzter Schluss

00:31:52.630 --> 00:31:55.230
Ja, das mag, also ich

00:31:55.230 --> 00:31:56.910
verstehe das durchaus, ich finde auch, ich habe so ein bisschen

00:31:56.910 --> 00:31:58.930
Schwierigkeiten mit den Anführungszeichen

00:31:58.930 --> 00:32:00.730
Ich habe auch vorher immer Single-Codes verwendet

00:32:00.730 --> 00:32:02.610
Das ist schon so ein bisschen

00:32:02.610 --> 00:32:04.250
Auf der anderen Seite würde ich sagen, naja gut

00:32:04.250 --> 00:32:06.290
Also, äh

00:32:06.290 --> 00:32:08.950
Selbst wenn man es nicht so hübsch empfindet

00:32:08.950 --> 00:32:11.030
Äh, wenn alle den gleichen

00:32:11.030 --> 00:32:12.630
Auto-Format verwenden, ist das

00:32:12.630 --> 00:32:14.510
ein so viel größerer Gewinn, als

00:32:14.510 --> 00:32:16.670
dass ich dann sage, nur gut, dann

00:32:16.670 --> 00:32:18.830
gebe ich dafür die persönlichen Präferenzen auf

00:32:18.830 --> 00:32:21.070
Aber ja, ich kann auch verstehen, dass man das, ja.

00:32:21.970 --> 00:32:38.890
Weil mein Streit sozusagen schon über das, was ich als persönliche Präferenz empfinde, rausgeht, weil es verletzt mein ästhetisches Gefühl so, dass ich wirklich daneben stehe und sage, nee, das ist volle Kanne gegen die Designziele von Python als Sprache.

00:32:40.870 --> 00:32:52.990
Ja, also das ganze Thema, dass die Indentation mir Dinge sagt und dann irgendwie über x Dutzend Zeilen hinweg wieder schließende Klammerorgien zu sehen, dafür brauche ich kein Python, also dann brauche ich kein Python, dann kann ich JavaScript schreiben.

00:32:54.130 --> 00:32:55.910
Ja, naja.

00:32:55.910 --> 00:33:24.650
Und sie wollen, also ich verstehe ja, warum das passiert, sie versuchen ja eine Formatierung zu machen, die möglichst wenig Diff erzeugt, wobei ich das bisher auch nicht gesehen habe, dass das wirklich, also da hätte ich gerne mal tatsächlich noch eine Metrik gesehen und ich muss aber sagen, das verletzt dann so ganz klassische Clean-Code-Aspekte auch von Code optisch ist zum Lesen für Menschen da und wenn das Ding halt tatsächlich erfordert,

00:33:24.650 --> 00:33:30.090
dass meine Kognition massiv mehr Aufwand leisten muss, um es zu lesen.

00:33:30.170 --> 00:33:32.910
Und alle Leute dann mehr oder weniger mit einem Stockholm-Syndrom ankommen

00:33:32.910 --> 00:33:34.290
und sagen, ja, ich habe mich daran gewöhnt.

00:33:34.910 --> 00:33:37.190
Dann erinnert mich das so ein bisschen eher wie an die alten Leute,

00:33:37.390 --> 00:33:40.810
die ich hatte, als ich ein Haus gekauft habe und die Flugzeuge drüber fliegen

00:33:40.810 --> 00:33:42.390
und die sagen, ich höre die schon alle nicht mehr.

00:33:44.070 --> 00:33:47.270
Ja, so fühlt sich das für mich jetzt halt an.

00:33:47.350 --> 00:33:48.710
Und wir haben jetzt tatsächlich in einem Projekt,

00:33:49.050 --> 00:33:51.730
in einem größeren Projekt, das eben nochmal umgestellt von Black

00:33:51.730 --> 00:33:52.650
auf einen anderen Formatter.

00:33:52.650 --> 00:33:53.250
Auf Japf.

00:33:53.890 --> 00:33:55.530
auf JAPF halt mit entsprechenden

00:33:55.530 --> 00:33:57.130
anderen Optionen und

00:33:57.130 --> 00:33:59.550
siehe da, plötzlich hat man wieder so ein

00:33:59.550 --> 00:34:01.690
Ah, stimmt, so muss das aussehen. Danke, das ist Python.

00:34:02.510 --> 00:34:03.770
Kannst du dafür mal

00:34:03.770 --> 00:34:05.210
die Config irgendwie

00:34:05.210 --> 00:34:06.830
teilen mit uns in den Show Notes?

00:34:07.570 --> 00:34:09.390
Na klar. Das wäre super, weil das

00:34:09.390 --> 00:34:11.550
finde ich sehr spannend. Weil ich finde Black auch

00:34:11.550 --> 00:34:13.490
mega ultra hässlich und genau das, was du

00:34:13.490 --> 00:34:15.330
sagtest, also ein paar Sachen, wo ich dachte so, ah, wieso

00:34:15.330 --> 00:34:16.830
macht das so? Das ist auch eklig.

00:34:18.130 --> 00:34:19.390
Ja, na ja, gut.

00:34:19.750 --> 00:34:21.810
Ja, so, na ja.

00:34:21.810 --> 00:34:22.810
Ist schon was dran.

00:34:23.270 --> 00:34:24.790
dazu fällt mir gerade noch ein, ich habe letztens

00:34:24.790 --> 00:34:27.190
einen Podcast gehört, also ich höre den

00:34:27.190 --> 00:34:27.810
ab und zu,

00:34:28.970 --> 00:34:31.110
gefällt mir eigentlich, also mir gefallen ja auch so Formate,

00:34:31.190 --> 00:34:33.070
die so ultra lang sind und das ist halt auch

00:34:33.070 --> 00:34:33.810
so immer schön lang,

00:34:34.790 --> 00:34:36.370
der heißt irgendwie Lex Friedman

00:34:36.370 --> 00:34:39.030
und der spricht so mit allen möglichen Leuten

00:34:39.030 --> 00:34:41.110
und halt darunter sind halt

00:34:41.110 --> 00:34:42.490
auch viele der so Korrifäen.

00:34:43.990 --> 00:34:45.330
Zum Beispiel hatte er letztens

00:34:45.330 --> 00:34:47.150
ein Interview mit

00:34:47.150 --> 00:34:48.050
James Gosling,

00:34:49.270 --> 00:34:49.630
zu dem

00:34:49.630 --> 00:34:53.010
ja quasi Entwickler

00:34:53.010 --> 00:34:54.310
von Java

00:34:54.310 --> 00:34:57.410
und das fand ich

00:34:57.410 --> 00:34:58.030
ganz interessant

00:34:58.030 --> 00:35:01.270
und der erzählte dann halt

00:35:01.270 --> 00:35:02.850
auch so, ja, also

00:35:02.850 --> 00:35:04.550
was ihn dann dazu gebracht hat, Java

00:35:04.550 --> 00:35:07.570
sich auszudenken, war halt

00:35:07.570 --> 00:35:09.370
ja, seine lange Erfahrung mit C

00:35:09.370 --> 00:35:11.130
auch sowas, was ich nicht wusste, der hat

00:35:11.130 --> 00:35:12.730
Emacs irgendwie geschrieben

00:35:12.730 --> 00:35:15.410
in C, oder die erste ordentliche Version

00:35:15.410 --> 00:35:17.450
von Emacs und stand

00:35:17.450 --> 00:35:19.130
dann irgendwann vor der Entscheidung, okay, ich mache jetzt entweder

00:35:19.130 --> 00:35:20.270
den Rest meines Lebens Emacs

00:35:20.270 --> 00:35:22.990
oder halt nochmal was anderes und dann dachte ich so

00:35:22.990 --> 00:35:24.990
naja, Emacs, so geil ist es dann, also weiß nicht,

00:35:25.110 --> 00:35:25.910
muss auch nicht sein.

00:35:26.350 --> 00:35:28.710
Dann hat er lieber was anderes gemacht und das abgegeben irgendwie.

00:35:29.830 --> 00:35:31.230
Also Emacs und Java sind eng

00:35:31.230 --> 00:35:31.930
verwandt, interessant.

00:35:32.450 --> 00:35:34.690
Naja, also, ja.

00:35:34.690 --> 00:35:35.290
In gewisser Weise.

00:35:36.290 --> 00:35:38.210
Aber er hat halt auf jeden Fall sehr, sehr viel C geschrieben.

00:35:38.310 --> 00:35:39.710
Die ungleichen Zwillinge.

00:35:40.030 --> 00:35:42.450
Und dann auch größeren Projekten

00:35:42.450 --> 00:35:44.630
und dann sind ihm halt so Dinge aufgefallen,

00:35:44.710 --> 00:35:46.210
die immer wieder schief gehen in C und dann

00:35:46.210 --> 00:35:48.310
Java war halt sozusagen der Ansatz. Also mit diesen

00:35:48.310 --> 00:35:50.690
großen Fehlerklassen, die halt

00:35:50.690 --> 00:35:52.590
C immer wieder ganz böse Probleme

00:35:52.590 --> 00:35:54.430
machen, halt aufzuräumen und

00:35:54.430 --> 00:35:55.710
das ist ja auch dann irgendwie gelungen.

00:35:57.250 --> 00:35:58.530
Aber der sagte dann etwas,

00:35:58.730 --> 00:35:59.970
als es darum ging,

00:36:00.430 --> 00:36:02.430
wie das dann so ästhetisch aussieht,

00:36:03.270 --> 00:36:03.990
daher die

00:36:03.990 --> 00:36:06.270
Anknüpfung

00:36:06.270 --> 00:36:08.530
sozusagen weiter so, ja, also

00:36:08.530 --> 00:36:10.530
wenn ich irgendwie Code lese, es gibt ja mal so Leute,

00:36:10.650 --> 00:36:12.530
die sagen dann so, oh, ich finde das ästhetisch ist aber

00:36:12.530 --> 00:36:14.550
nicht so, gefällt mir nicht so

00:36:14.550 --> 00:36:16.650
richtig. Und dann so, mir war das immer alles total

00:36:16.650 --> 00:36:18.530
egal. Ich habe da nie

00:36:18.530 --> 00:36:20.450
den Code gesehen. Wenn ich irgendwie so

00:36:20.450 --> 00:36:22.350
eine Funktion angucke, dann sehe ich immer nur so

00:36:22.350 --> 00:36:24.190
dann habe ich da so eine visuelle, so eine

00:36:24.190 --> 00:36:26.290
Bildvorstellung von, so wie so Zahnräder

00:36:26.290 --> 00:36:28.430
von einer Maschine und dann sehe ich, ob das das Richtige

00:36:28.430 --> 00:36:30.410
tut oder nicht. Und wie die Syntax

00:36:30.410 --> 00:36:31.870
von der Sprache ist und wie die Sprache aussieht,

00:36:32.450 --> 00:36:34.230
das sehe ich gar nicht und das ist mir auch total egal.

00:36:34.370 --> 00:36:36.270
Jetzt wissen wir, was uns da war. Und dann dachte ich so,

00:36:36.350 --> 00:36:38.430
okay, ja, das erklärt natürlich einiges.

00:36:39.170 --> 00:36:39.250
Aber

00:36:39.250 --> 00:36:41.870
das ist aber halt, da ist er halt noch

00:36:41.870 --> 00:36:44.610
auch schwierigen Positionen, weil er hat den Quatsch halt erfunden

00:36:44.610 --> 00:36:46.370
und

00:36:46.370 --> 00:36:48.250
mir geht es halt auch so, wenn ich irgendwelche

00:36:48.250 --> 00:36:49.530
Tools baue und erfinde,

00:36:50.270 --> 00:36:54.730
dann sehe ich da, wenn jemand die Tools verwendet, halt auch mit einem Schlag die Zahnräder.

00:36:55.390 --> 00:36:59.850
Das ist aber halt kognitiv ein völlig anderer Prozess, als wenn ich das halt nicht erfunden habe

00:36:59.850 --> 00:37:03.530
und ich das verarbeiten muss, was da steht.

00:37:03.530 --> 00:37:08.690
Und das ist sozusagen, und da gibt es, jetzt habe ich halt im Studium auch Linguistik gemacht

00:37:08.690 --> 00:37:12.030
und deswegen bin ich an der Stelle auch immer ein bisschen mit dran zu gucken,

00:37:12.530 --> 00:37:16.890
wie hängt das zusammen und unser Gehirn, kognitive Last ist halt was,

00:37:16.970 --> 00:37:19.530
das zwingt uns irgendwann halt dann nicht mehr über die Sache nachzudenken,

00:37:20.250 --> 00:37:22.050
sondern das Gehirn ist dann halt nur noch damit beschäftigt,

00:37:22.670 --> 00:37:23.930
dieses komplizierte Zeug zu lesen.

00:37:24.030 --> 00:37:25.750
Deswegen hast du halt sowas wie Brainfuck.

00:37:26.150 --> 00:37:27.790
Da bleibt dann halt nicht mehr viel über für

00:37:27.790 --> 00:37:29.830
was macht der Code eigentlich?

00:37:31.890 --> 00:37:32.250
Buchstabensalat.

00:37:32.270 --> 00:37:33.950
Das ist halt schon eine echte Balance.

00:37:35.550 --> 00:37:36.170
Ja, oder

00:37:36.170 --> 00:37:38.130
vielleicht sind unterschiedliche Leute da halt auch einfach

00:37:38.130 --> 00:37:40.030
unterschiedlich. Vielleicht gibt es Leute, denen

00:37:40.030 --> 00:37:42.430
ist das halt egal. Die sehen halt, wie

00:37:42.430 --> 00:37:44.070
die Mechanik dahinter

00:37:44.070 --> 00:37:46.210
direkt aussieht und können

00:37:46.210 --> 00:37:48.170
sozusagen an dem Code vorbeigucken, aber mir geht

00:37:48.170 --> 00:37:49.810
das auch nicht so. Also wenn ich

00:37:49.810 --> 00:37:52.290
bin sehr an der ästhetischen...

00:37:52.290 --> 00:37:54.310
Wenn man die ästhetischen Patterns direkt

00:37:54.310 --> 00:37:56.290
sehen kann und die einem klar ins Auge springen.

00:37:56.370 --> 00:37:57.850
Ja, du willst

00:37:57.850 --> 00:38:00.690
ein anderes Thema einleiten.

00:38:00.750 --> 00:38:02.230
Ich habe gerade versucht, einen kleinen Übergang

00:38:02.230 --> 00:38:02.610
zu finden.

00:38:04.110 --> 00:38:06.230
Ich weiß nicht, ob es mir geglückt ist. Wie geschickt.

00:38:07.150 --> 00:38:08.030
Ja, aber es war wirklich so.

00:38:08.110 --> 00:38:10.190
Wenn man das sehen kann, dann kann man doch auch diese

00:38:10.190 --> 00:38:12.230
Patterns auch mit einer gewissen Ästhetik betrachten.

00:38:13.430 --> 00:38:14.230
Und deswegen ist vielleicht

00:38:14.230 --> 00:38:15.350
diese Ästhetik der Sprache

00:38:15.350 --> 00:38:18.390
für manche wichtiger,

00:38:18.550 --> 00:38:21.150
vielleicht für einige unermichtiger, aber ich finde, das ist ein sehr essentieller Teil.

00:38:21.310 --> 00:38:23.850
Also gerade, weil auch die Hürde dadurch deutlich gesenkt wird.

00:38:23.950 --> 00:38:26.990
Selbst wenn es jetzt ein sehr hochentwickeltes Feature ist,

00:38:27.190 --> 00:38:29.490
ermöglicht es halt auch einen deutlich einfacheren Einstieg,

00:38:29.610 --> 00:38:35.010
weil durch diese ästhetische Klarheit man das Konzept auch deutlich einfacher verstehen kann.

00:38:35.750 --> 00:38:38.970
Man kann ja auch tatsächlich Ästhetik mal zur Seite legen und an der Stelle einfach,

00:38:39.270 --> 00:38:41.450
also es gibt ja mehrere andere Kriterien, die man ansetzen könnte,

00:38:41.450 --> 00:38:46.650
eben zum Thema Lesbarkeit, Menge der Zeichen auf dem Bildschirm,

00:38:46.990 --> 00:38:51.950
Menge an Noise, an syntaktischem Drumherum und so.

00:38:53.050 --> 00:38:55.610
Und es gibt auch bestimmte Sprachen, bei denen ich halt sage,

00:38:55.710 --> 00:38:57.250
da ist es mir wieder zu wenig.

00:38:57.490 --> 00:39:01.250
Also Python ist halt tatsächlich für mich so die Sweet-Spot-Sprache.

00:39:01.370 --> 00:39:05.870
Da ist mein Gehirn super drauf angesprungen damals und extrem gut drin.

00:39:06.490 --> 00:39:08.330
Mit Ruby tue ich mich zum Beispiel extrem schwer.

00:39:08.330 --> 00:39:11.450
Ruby hat halt dieses Thema, dass sie sehr viel metasyntaktisch arbeiten.

00:39:12.250 --> 00:39:14.250
Und das heißt aber, du musst teilweise schon überlegen,

00:39:14.730 --> 00:39:16.830
meint, hier ist ein Leerzeichen,

00:39:16.950 --> 00:39:18.850
deswegen bedeutet jetzt gerade hmm, und wenn das

00:39:18.850 --> 00:39:20.350
dahinter eine Funktion ist, dann

00:39:20.350 --> 00:39:22.470
da musst du schon auch

00:39:22.470 --> 00:39:25.190
in diesen Mustern ganz schön

00:39:25.190 --> 00:39:27.050
arg drin stecken, um das halt wirklich lesen

00:39:27.050 --> 00:39:28.930
zu können. Und ich habe bei Python halt immer

00:39:28.930 --> 00:39:30.970
das Gefühl, egal wie es

00:39:30.970 --> 00:39:33.050
geschrieben ist, irgendwie kriege ich

00:39:33.050 --> 00:39:35.010
es dann schon auch wieder relativ schnell auseinander

00:39:35.010 --> 00:39:37.050
klamüsert. Aber ich

00:39:37.050 --> 00:39:38.970
merke auch, oh, jetzt ist es auf eine Art

00:39:38.970 --> 00:39:41.050
geschrieben, die ist irgendwie von dort durch die Brust

00:39:41.050 --> 00:39:42.910
ins Auge und war

00:39:42.910 --> 00:39:43.890
irgendwie nicht zum Lesen gedacht.

00:39:44.730 --> 00:39:47.550
Ja, man muss ja schon irgendwie

00:39:47.550 --> 00:39:49.530
Methode relativ schnell begreifen können irgendwie,

00:39:49.710 --> 00:39:51.470
das ist zumindest ein Ziel, wenn man das so

00:39:51.470 --> 00:39:52.250
vernünftig machen möchte.

00:39:53.310 --> 00:39:55.310
Naja, es ist halt so, ich glaube auch da

00:39:55.310 --> 00:39:57.370
wieder, dass halt für unterschiedliche Leute

00:39:57.370 --> 00:39:58.570
vielleicht da unterschiedliche

00:39:58.570 --> 00:40:01.410
Trade-Offs besser funktionieren oder

00:40:01.410 --> 00:40:03.490
schlechter und irgendwie

00:40:03.490 --> 00:40:05.290
so die, wie sieht das aus oder wie kann man,

00:40:05.850 --> 00:40:07.330
wie schreibt man Dinge dran, ist halt irgendwie so das

00:40:07.330 --> 00:40:09.030
User-Interface der Sprache,

00:40:09.470 --> 00:40:11.370
was ich auch letztens noch gehört habe,

00:40:11.370 --> 00:40:13.410
was ich ganz interessanten Ansatz fand,

00:40:13.510 --> 00:40:18.570
dass es ja auch noch andere Aspekte gibt.

00:40:19.070 --> 00:40:21.290
Also genau, das war auch in einem Interview-Podcast

00:40:21.290 --> 00:40:22.470
mit, glaube ich, Chris Lettner,

00:40:22.930 --> 00:40:27.310
der Swift und Clang und so gebaut hat.

00:40:28.010 --> 00:40:31.390
Und das hatte ich vorher noch nicht so richtig auf dem Schirm,

00:40:31.470 --> 00:40:31.950
weil ich dachte immer so,

00:40:32.290 --> 00:40:34.010
ja gut, was halt dann an Code dasteht,

00:40:34.050 --> 00:40:34.870
ist halt das Entscheidende.

00:40:35.270 --> 00:40:36.230
Und der meinte dann halt auch so,

00:40:36.230 --> 00:40:38.270
ja, also User-Interface der Sprache sehr wichtig

00:40:38.270 --> 00:40:39.130
und Python voll gut.

00:40:39.670 --> 00:40:41.390
Wusste ich auch gar nicht, dass er da so meinte,

00:40:41.470 --> 00:40:42.090
das ist total super.

00:40:42.490 --> 00:40:44.070
Das Problem ist nur, es gibt halt auch noch

00:40:44.070 --> 00:40:46.150
andere Dinge,

00:40:46.290 --> 00:40:47.990
die halt auch eventuell wichtig sind, wie zum Beispiel

00:40:47.990 --> 00:40:49.870
so etwas wie, wie gut ist das denn jetzt nicht,

00:40:49.990 --> 00:40:51.450
wenn ich da drin irgendwas

00:40:51.450 --> 00:40:54.110
programmieren will, was dann irgendwie mein Problem löst,

00:40:54.210 --> 00:40:56.030
sondern wie ist das eigentlich,

00:40:56.170 --> 00:40:57.830
wenn ich jetzt ein Framework da drin entwickeln will,

00:40:57.890 --> 00:40:58.650
oder irgendeine Library,

00:40:59.850 --> 00:41:01.350
ist das denn dann immer noch gut, weil

00:41:01.350 --> 00:41:03.870
bei Python hat man dann zum Beispiel

00:41:03.870 --> 00:41:05.910
das Problem, okay,

00:41:06.090 --> 00:41:07.370
wenn das jetzt irgendwas ist, was

00:41:07.370 --> 00:41:09.910
CPU-bound ist,

00:41:10.090 --> 00:41:11.790
sozusagen, dann hat man

00:41:11.790 --> 00:41:13.770
wahrscheinlich, wenn man jetzt irgendwie so ein Basis

00:41:13.770 --> 00:41:15.630
zum Beispiel sowas wie ein Machine Learning Framework oder so

00:41:15.630 --> 00:41:17.690
bastelt, dann

00:41:17.690 --> 00:41:19.690
kommt man da nicht aus ohne relativ

00:41:19.690 --> 00:41:21.770
große Anteile C, C++, irgendwie

00:41:21.770 --> 00:41:23.210
sowas. Und

00:41:23.210 --> 00:41:25.370
dann wiederum hat man das Problem,

00:41:25.930 --> 00:41:27.570
dass das User Interface sozusagen

00:41:27.570 --> 00:41:29.630
von dem Use Case ausgesehen halt

00:41:29.630 --> 00:41:31.630
nicht mehr so schön ist, weil jetzt kann man nicht mehr richtig

00:41:31.630 --> 00:41:33.510
debuggen, weil man hat halt ein Teil

00:41:33.510 --> 00:41:34.850
in C und ein Teil

00:41:34.850 --> 00:41:36.890
in Python und

00:41:36.890 --> 00:41:39.050
ja, was macht man jetzt, wenn irgendwie

00:41:39.050 --> 00:41:41.310
und wenn

00:41:41.310 --> 00:41:43.270
da irgendwo Fehler auftreten, gibt's

00:41:43.270 --> 00:41:45.210
keine konsistente Art mehr, das so richtig zu

00:41:45.210 --> 00:41:45.550
debuggen.

00:41:47.530 --> 00:41:49.350
Und das ist natürlich schon so ein Punkt.

00:41:49.550 --> 00:41:51.230
Oder was er auch meinte, ist dann halt so was

00:41:51.230 --> 00:41:52.410
wie, ja, also

00:41:52.410 --> 00:41:55.330
was ist eigentlich, kann ich so was

00:41:55.330 --> 00:41:57.070
wie ein Int-Typ

00:41:57.070 --> 00:41:59.330
überhaupt irgendwie selber basteln?

00:41:59.430 --> 00:42:01.230
Das geht ja jetzt in Python nicht, geht

00:42:01.230 --> 00:42:03.210
auch in Java nicht. Aber in

00:42:03.210 --> 00:42:05.050
Swift ging das natürlich, deswegen Swift, voll gut.

00:42:07.310 --> 00:42:08.950
Da könnte man halt, kann man solche Typen halt

00:42:08.950 --> 00:42:10.730
tatsächlich bis ganz runter selber

00:42:10.730 --> 00:42:13.050
sozusagen als Library-Autor

00:42:13.050 --> 00:42:15.070
halt auch haben und

00:42:15.070 --> 00:42:16.250
selber definieren.

00:42:17.350 --> 00:42:18.910
Und natürlich, also in gewisser Weise

00:42:18.910 --> 00:42:20.750
da ist schon das auch ein Punkt dabei.

00:42:20.870 --> 00:42:22.830
Und das ist natürlich in Python vielleicht jetzt nicht

00:42:22.830 --> 00:42:24.350
so einfach wie in anderen Sprachen.

00:42:24.350 --> 00:42:25.790
Also ja,

00:42:26.050 --> 00:42:27.850
aber

00:42:27.850 --> 00:42:30.190
zum Lösen von Problemen

00:42:30.190 --> 00:42:32.110
finde ich das auch, das ist halt irgendwie

00:42:32.110 --> 00:42:34.190
schon sehr, sehr angenehm im Vergleich zu allem anderen.

00:42:34.650 --> 00:42:36.190
Aber kann auch sein, dass ich da einfach nur

00:42:36.190 --> 00:42:37.830
komisch bin und das halt für mich funktioniert.

00:42:38.950 --> 00:42:48.530
Und die Interviewreihe, die du da gerade aufgemacht hast, die kann ich auch allgemein empfehlen. Da hatte ich letztens nämlich jemanden, wie hieß der noch mal, wie hieß der Interviewer?

00:42:49.130 --> 00:42:49.750
Lex Friedman.

00:42:49.990 --> 00:42:51.170
Lex Friedman, genau.

00:42:51.730 --> 00:42:54.930
Und da hatten wir diesen einen Chip-Designer.

00:42:56.750 --> 00:42:59.230
Der ist auch extrem spannend, den sich anzunehmen.

00:42:59.310 --> 00:43:01.410
Das ist gerade so ein thematischer Querschlag.

00:43:02.930 --> 00:43:05.810
Aber ich glaube, die muss ich einfach mal loswerden,

00:43:05.890 --> 00:43:08.970
weil der hat mich dermaßen begeistert.

00:43:09.790 --> 00:43:10.910
Wie hieß er denn?

00:43:12.830 --> 00:43:15.770
Lex Friedman mit...

00:43:19.990 --> 00:43:23.790
Der hat zu viele Sachen gemacht.

00:43:24.270 --> 00:43:24.550
Oh ja.

00:43:25.730 --> 00:43:26.870
Der macht eine ganze Menge, ja.

00:43:27.730 --> 00:43:28.310
Ah, genau.

00:43:29.990 --> 00:43:30.910
Wo ist er, wo ist er, wo ist er?

00:43:31.050 --> 00:43:32.810
Chipdesigner, Chipdesigner, Chipdesigner.

00:43:34.150 --> 00:43:35.870
Namen sind Schall und Rauch.

00:43:38.510 --> 00:43:39.950
Ja, manchmal macht er auch so ein bisschen komisch.

00:43:39.950 --> 00:43:41.070
Also manchmal ist mir das auch...

00:43:41.070 --> 00:43:42.430
Ich weiß nicht, es gibt ja so eine...

00:43:42.430 --> 00:43:43.670
Also ich würde das mal...

00:43:43.670 --> 00:43:44.770
Also wenn man das so...

00:43:44.770 --> 00:43:45.730
Wenn man versteht...

00:43:45.730 --> 00:43:47.850
Also es ist halt auch sehr amerikanisch, muss man sagen.

00:43:48.330 --> 00:43:49.910
Und manchmal macht er auch einfach so

00:43:49.910 --> 00:43:51.550
etwas seltsame Dinge, irgendwie so

00:43:51.550 --> 00:43:54.010
sagt er, dass er jetzt nur noch Fleisch isst

00:43:54.010 --> 00:43:55.910
oder keine Ahnung oder macht ganz viel mit

00:43:55.910 --> 00:43:57.630
Cryptocurrency-Zeugs, was ja auch irgendwie

00:43:57.630 --> 00:43:59.090
so ein bisschen ist, aber

00:43:59.090 --> 00:44:02.030
ja, aber es sind auch auf jeden Fall

00:44:02.030 --> 00:44:02.990
super interessante Sachen dabei.

00:44:03.770 --> 00:44:05.590
Genau, also hier Lex Friedman Nummer 70,

00:44:06.250 --> 00:44:07.870
Jim Keller. Ah, okay,

00:44:08.110 --> 00:44:10.230
gut. Jim Keller

00:44:10.230 --> 00:44:11.790
ist tatsächlich einer, der

00:44:11.790 --> 00:44:14.050
also ich habe da gleich

00:44:14.050 --> 00:44:16.230
nach 10 Minuten so ein bisschen so einen Man-Crush entwickelt.

00:44:18.330 --> 00:44:19.370
Der ist so

00:44:19.370 --> 00:44:21.210
intense,

00:44:22.070 --> 00:44:23.210
wie der da sitzt

00:44:23.210 --> 00:44:25.110
und denkt und redet und

00:44:25.110 --> 00:44:27.030
sein Minenspiel eigentlich gar nicht so richtig

00:44:27.030 --> 00:44:28.970
präsent ist so richtig. Und dann doch so

00:44:28.970 --> 00:44:30.450
ganz kleine Nuancen und

00:44:30.450 --> 00:44:32.930
haut da Sachen raus zum Thema

00:44:32.930 --> 00:44:34.630
Chip-Design. Und der ist halt sozusagen

00:44:34.630 --> 00:44:36.830
in den 80ern

00:44:36.830 --> 00:44:38.270
ins Chip-Design eingestiegen

00:44:38.270 --> 00:44:41.150
und hat so alles mitgemacht.

00:44:41.230 --> 00:44:42.950
Der hat halt bei AMD und bei Apple und bei

00:44:42.950 --> 00:44:44.190
Tesla und bei Intel gearbeitet.

00:44:44.890 --> 00:44:46.050
Und ich habe jetzt so ein bisschen so persönlich

00:44:46.050 --> 00:44:47.930
so diese, dieses Gefühl

00:44:47.930 --> 00:44:49.950
von, ah, dieser

00:44:49.950 --> 00:44:51.350
Kampf zwischen AMD und Intel,

00:44:52.450 --> 00:44:53.890
der wird eigentlich nicht irgendwie da weit

00:44:53.890 --> 00:44:55.550
oben ausgetragen, sondern die Frage ist nur,

00:44:56.070 --> 00:44:58.090
ob Jim gerade bei AMD oder bei Intel ist.

00:44:58.770 --> 00:44:59.550
Die Folge heißt übrigens

00:44:59.550 --> 00:45:01.790
Moore's Law, wenn ich das so sagen würde.

00:45:02.130 --> 00:45:02.610
Ja, genau.

00:45:03.570 --> 00:45:05.050
Also der war, der ist schon krass.

00:45:05.270 --> 00:45:06.750
Der war richtig gut.

00:45:08.870 --> 00:45:09.950
Ja, der Podcast kann man

00:45:09.950 --> 00:45:11.950
tatsächlich empfehlen. Es gibt auch andere tolle Folgen,

00:45:12.010 --> 00:45:13.570
die man hören kann, mit Donald Knoos oder

00:45:13.570 --> 00:45:15.530
Paul Krugman sogar mal dabei gewesen

00:45:15.530 --> 00:45:17.530
und und und. Es lohnt sich, die auch

00:45:17.530 --> 00:45:19.550
auf YouTube zu gucken. Es gibt Videos davon mit

00:45:19.550 --> 00:45:21.610
den Interviews, nicht nur als Podcast.

00:45:22.190 --> 00:45:23.290
Und da ist,

00:45:23.550 --> 00:45:24.790
ja, die Mimik ist

00:45:24.790 --> 00:45:27.230
Peter Norweg.

00:45:28.410 --> 00:45:28.890
Ja, ja.

00:45:29.110 --> 00:45:30.090
Wenn man mal so durchscrollt.

00:45:32.650 --> 00:45:33.510
Ja, genau.

00:45:34.170 --> 00:45:35.210
Wo waren wir denn jetzt?

00:45:35.890 --> 00:45:37.390
Wir waren eigentlich bei Petra Kohl

00:45:37.390 --> 00:45:37.570
gemacht.

00:45:38.590 --> 00:45:39.950
Ja, genau.

00:45:42.770 --> 00:45:43.470
Ja, und

00:45:43.470 --> 00:45:45.110
irgendwie gewisserweise,

00:45:45.110 --> 00:45:46.930
da, genau, da, da

00:45:46.930 --> 00:45:48.950
auch zu Patterns hatte

00:45:48.950 --> 00:45:51.230
Dirk Fresslater noch was zu sagen und da meinte er dann so,

00:45:51.290 --> 00:45:53.150
ja, also Patterns sind ja auch immer so,

00:45:53.430 --> 00:45:54.330
es wird halt gesagt,

00:45:55.390 --> 00:45:57.290
wenn man Patterns braucht, dann hat

00:45:57.290 --> 00:45:59.070
die Sprache eventuell, ja,

00:45:59.210 --> 00:46:00.890
einfach nicht genug, also hat,

00:46:01.510 --> 00:46:02.190
was ist das eigentlich?

00:46:03.190 --> 00:46:05.290
Das ist ein Zeichen dafür, dass die Sprache

00:46:05.290 --> 00:46:07.050
halt etwas nicht kann, was sie vielleicht können sollte, ne,

00:46:07.050 --> 00:46:08.270
und deswegen muss man halt einen Pattern machen

00:46:08.270 --> 00:46:11.110
und das kenne ich auch schon

00:46:11.110 --> 00:46:13.030
lange und er

00:46:13.030 --> 00:46:14.830
fügte halt dann noch was hinzu, was mir dann

00:46:14.830 --> 00:46:26.510
Und ich dachte so, oh ja, das stimmt, das ist ja auch eigentlich so ein Punkt, das ist nicht nur bei Patterns so, sondern halt auch bei sowas wie, gibt es eigentlich sowas wie eine Standardbibliothek und das ist halt immer, das ist ein ähnlicher Trade-off.

00:46:26.670 --> 00:46:39.110
Also wenn du jetzt eben wie bei Python eine relativ große Standardbibliothek hast, dann hat das natürlich eventuell den Vorteil, dass du dir so etwas erspaarst wie JavaScript, ja, die haben das da halt nicht und dann kriegst du halt NPM.

00:46:39.730 --> 00:46:40.810
Und das ist halt sozusagen

00:46:40.810 --> 00:46:42.650
ein Pattern, um halt

00:46:42.650 --> 00:46:44.750
diese fehlende Standardbibliothek

00:46:44.750 --> 00:46:46.830
irgendwie dann aufzufangen,

00:46:47.510 --> 00:46:48.830
sozusagen außerhalb von

00:46:48.830 --> 00:46:50.270
dem, was die Sprache tatsächlich macht.

00:46:50.430 --> 00:46:52.850
Und das ist halt so ein bisschen fies

00:46:52.850 --> 00:46:54.750
dann unter Umständen. Auf der anderen

00:46:54.750 --> 00:46:56.510
Seite ist es natürlich auch so, dass es wieder

00:46:56.510 --> 00:46:58.490
ein Vorteil sein kann, weil wenn man jetzt

00:46:58.490 --> 00:47:00.350
irgendwie sich TypeScript anguckt oder so,

00:47:00.650 --> 00:47:02.550
wenn sich so ein

00:47:02.550 --> 00:47:04.630
Typesystem halt außerhalb

00:47:04.630 --> 00:47:06.590
der Sprache entwickeln kann, kannst du das natürlich deutlich

00:47:06.590 --> 00:47:08.330
schneller tun, als wenn das immer nur

00:47:08.330 --> 00:47:11.210
alle 18 Monate oder jetzt alle 12 Monate

00:47:11.210 --> 00:47:13.990
updatbar ist.

00:47:14.550 --> 00:47:16.390
Mit dem Release-Zyklus der Sprache.

00:47:17.130 --> 00:47:18.090
Also es ist nicht so einfach.

00:47:20.710 --> 00:47:22.690
Und mit Patterns ist es halt irgendwie

00:47:22.690 --> 00:47:23.550
ähnlich.

00:47:24.210 --> 00:47:26.630
Wenn eine Sprache halt sehr, sehr viel kann, dann

00:47:26.630 --> 00:47:28.570
braucht man eigentlich nicht so viele Patterns, weil

00:47:28.570 --> 00:47:30.210
dann hat man einfach diese Probleme nicht.

00:47:30.910 --> 00:47:32.090
Und auf der anderen Seite, wenn

00:47:32.090 --> 00:47:33.250
ja,

00:47:34.510 --> 00:47:36.770
gibt es einen Nachteil, wenn eine Sprache zu viele Features hat.

00:47:38.330 --> 00:47:40.210
Naja gut, dann ist man halt auch an die

00:47:40.210 --> 00:47:41.570
Sprache sehr gebunden.

00:47:42.670 --> 00:47:44.090
Naja, eigentlich hat das keinen Nachteil.

00:47:44.130 --> 00:47:46.050
Also Patterns, ich glaube Patterns ist sozusagen

00:47:46.050 --> 00:47:50.170
Das war gerade

00:47:50.170 --> 00:47:52.050
aufgekommen, da war ich glaube ich im Studium.

00:47:53.270 --> 00:47:54.110
Ich weiß nicht, wann das

00:47:54.110 --> 00:47:56.410
Buch rauskam. Ich glaube 1994

00:47:56.410 --> 00:47:57.990
war es. Wenn man das typatisch jetzt wüsste,

00:47:58.070 --> 00:47:59.050
dann war ich da nicht im Studium.

00:48:00.990 --> 00:48:01.870
Oh, Tatsache.

00:48:02.950 --> 00:48:04.050
94. Ne, da war ich

00:48:04.050 --> 00:48:05.370
bei weitem noch nicht im Studium.

00:48:05.370 --> 00:48:05.730
Oh.

00:48:08.330 --> 00:48:09.630
Ja, Tatsache, 94.

00:48:10.490 --> 00:48:10.970
Und

00:48:10.970 --> 00:48:14.150
wir hatten ja vorhin schon mal kurz angerissen,

00:48:14.250 --> 00:48:15.750
dass das in C++

00:48:15.750 --> 00:48:18.150
Ja, also du wolltest über das Buch

00:48:18.150 --> 00:48:19.910
reden, ging auch vor, Design Patterns.

00:48:19.950 --> 00:48:21.910
Ging auch vor, Design Patterns, genau. Das ist

00:48:21.910 --> 00:48:23.790
wenn man diesen Begriff Patterns in die Hand nimmt,

00:48:24.330 --> 00:48:26.210
ist das in der IT sozusagen das, wo

00:48:26.210 --> 00:48:28.090
es alles mit

00:48:28.090 --> 00:48:30.110
angefangen hatte. Und

00:48:30.110 --> 00:48:31.710
vielleicht kann man da noch kurz

00:48:31.710 --> 00:48:32.250
den

00:48:32.250 --> 00:48:36.050
einen Umweg gehen zu

00:48:36.050 --> 00:48:37.910
Name, wie hieß er,

00:48:37.970 --> 00:48:38.630
Steve Alexander?

00:48:39.590 --> 00:48:39.830
Nee.

00:48:40.510 --> 00:48:41.670
Alexander war Alexander...

00:48:41.670 --> 00:48:42.490
Christopher Alexander.

00:48:42.830 --> 00:48:44.470
Christopher Alexander war das, genau.

00:48:44.570 --> 00:48:45.130
Er war ein Architekt.

00:48:45.850 --> 00:48:50.330
Und der hatte dieses Thema Patternsprachen halt mal aufgegriffen

00:48:50.330 --> 00:48:51.910
und beziehungsweise entwickelt,

00:48:52.110 --> 00:48:57.970
um sich städtebaulich so einem Gesamtkunstwerk anzunähern.

00:48:58.910 --> 00:49:00.790
Um halt auf der einen Seite zu sagen,

00:49:00.790 --> 00:49:05.830
okay, Patterns sind Dinge, die immer wieder auftauchen,

00:49:05.890 --> 00:49:08.850
die halt in leichten Variationen anwendbar sein müssen.

00:49:09.790 --> 00:49:12.230
Und es ging ja nicht darum, dass Patterns,

00:49:12.610 --> 00:49:14.630
es sind ja Patterns und nicht Templates.

00:49:15.210 --> 00:49:15.930
Also was ist das denn?

00:49:15.970 --> 00:49:17.870
Ist das sowas wie ein Mosaik-Baustein-Ding,

00:49:17.950 --> 00:49:19.210
das man irgendwo reinstecken kann

00:49:19.210 --> 00:49:21.190
und dann in alle Richtungen funktioniert?

00:49:22.770 --> 00:49:23.810
Nee, eigentlich nicht.

00:49:23.950 --> 00:49:27.850
Eigentlich ist es halt tatsächlich ein Entwurfsmuster,

00:49:28.670 --> 00:49:33.350
wo du mehrere Dinge genannt bekommst drumherum.

00:49:35.010 --> 00:49:37.470
Also die haben da ein gewisses formales Schema aufgebaut.

00:49:37.810 --> 00:49:42.550
Es ist ein Name und Klassifikation und Zweck und Synonyme und Motivation.

00:49:43.230 --> 00:49:48.230
Und aber was eben tatsächlich interessant ist, sind halt dann immer Hinweise zur Anwendbarkeit,

00:49:48.730 --> 00:49:53.870
Hinweise zu einer allgemeinen Oberflächenstruktur,

00:49:58.750 --> 00:50:02.850
Akteure, das ist jetzt sehr C++ nah, dann schon so Klassen, die daran beteiligt sind,

00:50:03.250 --> 00:50:07.510
aber auch das Zusammenspiel davon und eine Abwägung von Konsequenzen mit Vor- und Nachteilen,

00:50:07.630 --> 00:50:11.190
Implementierungen und Beispielcode häufig.

00:50:12.130 --> 00:50:16.890
Und da geht es halt darum, dass man für einen bestimmten Fall, wenn man merkt,

00:50:16.890 --> 00:50:23.730
ich schreibe jetzt hier Code, der hat so ein ähnlicher Einsatz wie von diesem Muster

00:50:23.730 --> 00:50:28.150
und dann liefert dir das Muster zumindest schon mal einen Design-Input von,

00:50:28.250 --> 00:50:32.570
also wenn du jetzt sowas in dieser Art machst, dann solltest du auf x, y, z achten

00:50:32.570 --> 00:50:34.470
und dann hängt da noch das und das und das dran.

00:50:35.130 --> 00:50:40.230
Und es ging nicht darum, sozusagen ein fertiges Stück Code,

00:50:40.590 --> 00:50:43.050
was man nur noch copy-pasted irgendwo reinzusetzen,

00:50:43.830 --> 00:50:47.490
sondern zu sagen, na guck mal, es gibt zum Beispiel,

00:50:47.490 --> 00:50:51.990
wenn du das Problem hast, dass du Code dynamisiert auswählen können möchtest,

00:50:52.390 --> 00:50:55.850
dann ist zum Beispiel das Strategy-Pattern eine mögliche Variante, das zu tun.

00:50:56.510 --> 00:50:58.150
Das sieht dann so und so und so aus

00:50:58.150 --> 00:51:00.450
und da muss man auf das und das und das aufpassen

00:51:00.450 --> 00:51:02.070
und den Rest baust du dir jetzt selber zusammen.

00:51:02.570 --> 00:51:12.370
Ja, das ist ein bisschen wie, wenn ich sage, ich setze mich hin und schneide mir ein Kleid, dann habe ich da Entwurfsmuster, aber ich muss natürlich trotzdem noch messen, ob mein Bauch ein bisschen dicker ist, meine Beine ein bisschen länger und muss das dann halt anpassen.

00:51:14.710 --> 00:51:26.550
Und da ging es tatsächlich dann darum, und das ist auch das, was der Christopher Alexander an der Stelle wollte, er wollte ja damit Leuten eine Auswahl von Mustern an die Hand geben, wo die Muster auch ineinander greifen und zusammenspielen.

00:51:26.690 --> 00:51:30.830
Also das ist ja auch ein Thema, dass das nicht irgendwie eine wahllose Menge von Patterns ist,

00:51:30.970 --> 00:51:35.450
wo man sagt, die lerne ich jetzt auswendig und dann nehme ich einmal das und einmal das und einmal das,

00:51:35.450 --> 00:51:39.730
sondern das soll eine Sprache ergeben, wo man dann anhand von diesem Zusammenspiel,

00:51:39.830 --> 00:51:42.350
von den Verknüpfungen zwischen den Teilen dann immer weiß,

00:51:42.470 --> 00:51:46.230
ah, wenn ich hier drüben das mache und da das mache, dann sollte ich wahrscheinlich hier drüben gleich mal aufpassen,

00:51:46.630 --> 00:51:48.130
dass ich nicht noch x, y, z versaue.

00:51:49.910 --> 00:51:54.450
Und diese Sprache, da geht es ein bisschen um Kräfteverhältnisse zwischen den Dingen,

00:51:55.150 --> 00:52:00.330
aber eben auch immer dieses, man muss es sich selber zurechtschneiden für den eigenen Anwendungsfall.

00:52:00.490 --> 00:52:02.470
Ansonsten hätte man das ja auch in der Library kippen können.

00:52:02.570 --> 00:52:05.410
Das hätte man sagen können, das ist jetzt der einmal fertige Code.

00:52:06.250 --> 00:52:10.410
Und der Trick ist aber, das Muster auf einer Ebene greifen, wo ich nicht vorher sagen kann,

00:52:10.750 --> 00:52:15.070
ah, da braucht man eine Funktion für oder da braucht man dieses Ding oder eine Klasse oder sowas,

00:52:15.070 --> 00:52:19.450
sondern es ist häufig auch ein, ja, wenn du folgende sieben Zeilen dreimal geschrieben hast,

00:52:19.550 --> 00:52:22.490
dann solltest du mal darüber nachdenken, ob du das vielleicht anders anordnen möchtest.

00:52:22.630 --> 00:52:24.370
Aber das ist jetzt ja vielleicht noch mal

00:52:24.370 --> 00:52:26.290
interessant für alle unsere Hörer, weil wir haben jetzt ja

00:52:26.290 --> 00:52:27.970
abstrakt vielleicht irgendwie da

00:52:27.970 --> 00:52:30.330
mit angefangen, was so Patterns

00:52:30.330 --> 00:52:31.430
vielleicht so

00:52:31.430 --> 00:52:34.290
konzeptuell sein sollten und

00:52:34.290 --> 00:52:36.570
vielleicht gehen wir noch so ein bisschen in die konkretere Implementierung,

00:52:37.430 --> 00:52:38.130
was es denn so gibt

00:52:38.130 --> 00:52:40.110
an Sprachpatterns überhaupt und

00:52:40.110 --> 00:52:42.070
dass wir vielleicht die mal erklären und

00:52:42.070 --> 00:52:43.070
ein bisschen

00:52:43.070 --> 00:52:46.290
versuchen, wie man das in Python vielleicht macht,

00:52:47.110 --> 00:52:48.270
wenn man

00:52:48.270 --> 00:52:49.790
das macht, wenn man die überhaupt braucht.

00:52:51.110 --> 00:52:51.150
Also,

00:52:51.570 --> 00:53:01.350
Ja, genau. Also ich meine, die Muster, die sind ja sozusagen allgemeingültig. Das sind ja tatsächlich sehr abstrakte Ideen, die da existieren.

00:53:01.370 --> 00:53:04.430
Fangen wir vielleicht mal mit der Antwort an. Hast du eben irgendwie Strategie gesagt?

00:53:04.610 --> 00:53:06.910
Ja, ich würde woanders anfangen. Ich würde beim Singleton anfangen.

00:53:06.950 --> 00:53:08.770
Ja, okay. Fangen wir beim Singleton an. Was ist denn Singleton?

00:53:09.410 --> 00:53:15.110
Die mäßige, schöne Übersetzung ist das Einzelstück. Ich mag es einfach nicht, wenn.

00:53:15.870 --> 00:53:22.170
Es gibt ja so ein paar Kategorien, also der Singleton gehört zu den Mustern aus dem Bereich

00:53:22.170 --> 00:53:30.570
Creational Patterns, also wie werden in einer objektorientierten Sprache Objekte erzeugt.

00:53:30.970 --> 00:53:35.610
Da gibt es so verschiedene Muster und es gibt manchmal den Effekt und gerade in Java ist

00:53:35.610 --> 00:53:42.290
das halt noch ein stärkerer Fall, dass ja alles muss eine Klasse sein und manchmal brauchst

00:53:42.290 --> 00:53:44.130
aber Code, wo das Objekt

00:53:44.130 --> 00:53:45.930
nur ein einziges, wo es nur ein einziges

00:53:45.930 --> 00:53:46.870
Objekt zu geben darf.

00:53:48.110 --> 00:53:50.070
Ja. Und

00:53:50.070 --> 00:53:51.970
dieses Objekt soll aber auch gut

00:53:51.970 --> 00:53:53.910
zugänglich sein. Und

00:53:53.910 --> 00:53:55.770
das kann zum Beispiel sowas sein wie

00:53:55.770 --> 00:53:59.810
das Objekt

00:53:59.810 --> 00:54:01.810
in Python ist, es gibt ein

00:54:01.810 --> 00:54:03.550
Python-Analogum dazu tatsächlich sogar.

00:54:04.510 --> 00:54:05.850
Das ist nämlich das Objekt, was

00:54:05.850 --> 00:54:07.810
den Logger in dieser Anwendung

00:54:07.810 --> 00:54:08.930
zum Beispiel repräsentiert.

00:54:10.370 --> 00:54:11.710
Davon will es nicht, will sie fünf

00:54:11.710 --> 00:54:13.550
Logger haben nachher, sondern du willst halt

00:54:13.550 --> 00:54:16.030
irgendwie, wo ist denn hier die Log-Konfiguration,

00:54:16.150 --> 00:54:17.610
mit dem Ding möchte ich jetzt reden, da soll jetzt

00:54:17.610 --> 00:54:18.850
bitte Log-Output rausgehen.

00:54:19.850 --> 00:54:20.210
Und

00:54:20.210 --> 00:54:23.490
da gibt es dann halt

00:54:23.490 --> 00:54:25.210
entsprechende Muster, wo man sagen kann, okay,

00:54:25.630 --> 00:54:27.530
wenn irgendwer die Klasse in die Hand kriegt und die

00:54:27.530 --> 00:54:29.550
nochmal neu instanziiert, dann dreht die sich um

00:54:29.550 --> 00:54:30.890
und gibt einfach statt

00:54:30.890 --> 00:54:33.290
ein neues Objekt zu machen,

00:54:33.810 --> 00:54:35.630
dir das eine erzeugte Objekt

00:54:35.630 --> 00:54:36.210
schon wieder zurück.

00:54:37.370 --> 00:54:39.350
Und dieses konkrete Singleton

00:54:39.350 --> 00:54:41.550
lässt sich aus Java

00:54:41.550 --> 00:54:43.990
so auf Python, du kannst es glaube ich

00:54:43.990 --> 00:54:45.590
codemäßig sogar

00:54:45.590 --> 00:54:47.930
so

00:54:47.930 --> 00:54:49.630
bauen, das hat aber nicht

00:54:49.630 --> 00:54:51.670
die gleichen Eigenschaften, weil die Sprache ja eine andere ist

00:54:51.670 --> 00:54:53.710
und in Python gibt es

00:54:53.710 --> 00:54:55.530
dafür halt andere Möglichkeiten sowas zu machen

00:54:55.530 --> 00:54:57.550
dass du zum Beispiel sagst, du hast einen Namespace

00:54:57.550 --> 00:54:59.610
bei dir

00:54:59.610 --> 00:55:01.550
in deiner Anwendung, ein Modul, das heißt dann

00:55:01.550 --> 00:55:03.630
Log, Tipp, man sollte es nicht

00:55:03.630 --> 00:55:05.370
Logging nennen, das geht gerne schief

00:55:05.370 --> 00:55:07.610
wenn man die Standardbibliothek startiert

00:55:07.610 --> 00:55:09.570
das heißt

00:55:09.570 --> 00:55:11.630
vielleicht Log und da drinnen

00:55:11.630 --> 00:55:13.530
gibt es eine Klasse, das ist dann dein

00:55:13.530 --> 00:55:15.650
Logger und nach der

00:55:15.650 --> 00:55:17.310
Definition der Klasse würdest du gleich

00:55:17.310 --> 00:55:19.630
dieses Objekt instanziieren und wenn du

00:55:19.630 --> 00:55:21.710
willst, löschst du danach

00:55:21.710 --> 00:55:23.670
diese Klasse einfach aus dem

00:55:23.670 --> 00:55:25.510
Namespace von dem Modul wieder raus.

00:55:26.890 --> 00:55:27.690
Dann kann auch

00:55:27.690 --> 00:55:29.650
keiner aus Versehen so eine

00:55:29.650 --> 00:55:31.570
zweite Instanz machen und dann

00:55:31.570 --> 00:55:33.490
muss man wieder dazu sagen, naja, Python als Sprache

00:55:33.490 --> 00:55:35.530
für Erwachsene, das stimmt halt so auch nicht, weil wenn du

00:55:35.530 --> 00:55:37.770
die Klasse aus dem Modul dann löschst,

00:55:38.690 --> 00:55:40.130
dann ist der Name zwar nicht mehr ansprechbar,

00:55:40.210 --> 00:55:42.310
aber du kannst natürlich auf diesem Singleton-Objekt

00:55:42.310 --> 00:55:44.710
wieder nach under, under class fragen.

00:55:44.790 --> 00:55:45.750
Dann hast du das Klassenobjekt,

00:55:45.830 --> 00:55:47.570
dann kannst du da wieder eine neue Instanz von machen.

00:55:48.070 --> 00:55:49.190
So, jetzt kannst du halt hergehen

00:55:49.190 --> 00:55:50.710
und kannst, wenn du willst, in Python sagen,

00:55:50.710 --> 00:55:55.190
also der, jetzt muss ich selber überlegen,

00:55:55.290 --> 00:55:58.270
welche Doppel-Underscore-Methode da die richtige war.

00:56:00.050 --> 00:56:01.350
Nicht init, sondern was?

00:56:01.350 --> 00:56:01.710
Create?

00:56:02.410 --> 00:56:03.270
New, genau.

00:56:03.670 --> 00:56:04.930
Ich habe es zu lange nicht mehr in der Hand gehabt.

00:56:05.690 --> 00:56:06.750
Ich merke, ich mache in letzter Zeit

00:56:06.750 --> 00:56:08.210
zu wenig Metaprogrammierung in Python.

00:56:08.690 --> 00:56:27.610
Du könntest aber under under new nehmen und könntest dort sowas machen wie, wenn es auf dem Klassenobjekt schon ein bestimmtes Attribut gibt, nämlich die Instanz selber von dem Objekt, was du mit der Klasse erzeugt hast, dann liefer einfach das zurück und ansonsten mach einmal ein neues und ansonsten nie wieder.

00:56:27.830 --> 00:56:30.010
Solche Meta-Aktionen kann man damit machen.

00:56:30.610 --> 00:56:31.710
Die Frage ist nur immer,

00:56:32.650 --> 00:56:39.210
wie gesagt, was hat das Pattern für einen Kontext?

00:56:40.050 --> 00:56:41.790
Und es gab eine ganze Zeit lang,

00:56:42.070 --> 00:56:46.570
und das wurde so ein bisschen diesen Java-Programmierer-Schmieden,

00:56:46.570 --> 00:56:48.150
die halt so viele Leute, wie möglich,

00:56:48.270 --> 00:56:49.470
die Java programmieren können sollten,

00:56:49.570 --> 00:56:52.410
rausgespuckt hatten, so Ende der 90er und Anfang der Nullerjahre.

00:56:53.430 --> 00:56:54.810
Die sind immer rausgekommen mit,

00:56:54.870 --> 00:56:57.210
ich kann die Patterns, ich muss alles in Patterns denken.

00:56:57.830 --> 00:57:09.830
Und das ist aber in der Informatikausbildung selber ein Pattern, was immer wieder kommt, dass die Leute irgendwie Werkzeuge in die Hand gedrückt kriegen und dann denken, ich muss alles mit diesen Werkzeugen ausdrücken.

00:57:10.710 --> 00:57:21.810
Und eigentlich ist es aber umgekehrt. Eigentlich ist es halt, du schreibst halt Code und wenn du die Patterns kennst, dann merkst du vor deinem Auge plötzlich, ich baue hier etwas auf, das riecht wie so ein Singleton.

00:57:22.690 --> 00:57:38.170
Dann sollte ich mir jetzt nochmal kurz Gedanken machen, was wir alles wissen über diese Form von Pattern und ob ich jetzt bestimmte Dinge von Fehlerbehandlung, von bestimmten Edge Cases etc. nicht einfach alle gleich glatt ziehe, weil ich weiß, wenn ich das jetzt so und so mache, dann habe ich das hier alles handwerklich ordentlich gemacht.

00:57:38.750 --> 00:58:04.630
Und es ist aber ein Bottom-Up-Approach und gelehrt wird das Ganze häufig halt als Top-Down-Approach, im Sinne von, du baust deine Anwendung nur noch aus Dingen zusammen, die diese Patterns sind. Und das ist halt Quatsch. Du baust halt die Anwendung erstmal, wie du die willst und wenn du feststellst, ah, du hast hier ständig irgendwie Dinge, die eigentlich nach diesen Patterns riechen und dafür ist es dann wichtig, dafür muss man sie halt kennen, dann kannst du es damit leichter und schneller strukturieren und musst das Rad nicht jedes Mal neu erfinden.

00:58:05.850 --> 00:58:16.690
Ja, genau. Ich würde auch sagen, eben genau diese Creational Patterns, das ist halt so ein, es gibt irgendwie drei Teile, Creational, Structural und Behavioral oder sowas, glaube ich.

00:58:19.890 --> 00:58:21.830
würde ich sagen, ist auch

00:58:21.830 --> 00:58:23.810
schon eine der Hauptpunkte, dass es halt

00:58:23.810 --> 00:58:25.070
irgendwie fehlende Sprachfeatures

00:58:25.070 --> 00:58:28.010
so ein bisschen relevant, weil

00:58:28.010 --> 00:58:28.890
tatsächlich

00:58:28.890 --> 00:58:32.070
braucht man diese Patterns vor allen Dingen

00:58:32.070 --> 00:58:34.070
in Sprachen, wo halt

00:58:34.070 --> 00:58:36.150
das syntaktisch einen Unterschied

00:58:36.150 --> 00:58:37.970
macht. Also wenn ich halt zum Beispiel in C++

00:58:37.970 --> 00:58:38.650
oder auch in Java

00:58:38.650 --> 00:58:42.230
oder selbst in JavaScript, wenn ich da new sage,

00:58:42.590 --> 00:58:44.270
um ein neues Objekt

00:58:44.270 --> 00:58:46.070
irgendwie zu erzeugen,

00:58:47.510 --> 00:58:48.130
dann

00:58:48.130 --> 00:58:49.770
habe ich halt das Problem, dass das, also

00:58:49.770 --> 00:58:51.950
in Python ist es halt, ist ja

00:58:51.950 --> 00:58:53.890
sozusagen neues Objekt erzeugen gar

00:58:53.890 --> 00:58:56.210
nicht syntaktisch zu unterscheiden von einem Funktionsaufruf.

00:58:56.270 --> 00:58:57.450
Das sieht halt einfach genauso auf.

00:58:57.910 --> 00:58:59.870
Und ich kann ja irgendwas zurückgeben. Also ich

00:58:59.870 --> 00:59:01.750
muss ja jetzt, wenn ich ein neues Objekt erzeuge,

00:59:01.850 --> 00:59:03.690
nicht irgendwie irgendwas new sagen, sondern

00:59:03.690 --> 00:59:05.750
ich rufe halt eine Funktion auf und dann

00:59:05.750 --> 00:59:07.830
habe ich halt ein neues Objekt. Aber die könnte da halt

00:59:07.830 --> 00:59:09.630
auch was ganz anderes machen. Auch ein

00:59:09.630 --> 00:59:10.610
Objekt von einer anderen

00:59:10.610 --> 00:59:13.890
Klasse zurückgeben oder so. Das geht

00:59:13.890 --> 00:59:15.870
halt in C++ nicht. Wenn ich da sage

00:59:15.870 --> 00:59:17.850
new irgendwie diese Klasse, dann kriege ich halt

00:59:17.850 --> 00:59:19.830
ein Objekt von dieser Klasse. Also muss ich mir, wenn

00:59:19.830 --> 00:59:21.850
dann was anderes dabei rauskommen soll, halt überlegen,

00:59:21.950 --> 00:59:23.630
wie gehe ich denn jetzt damit um? Und dann wird es halt,

00:59:24.130 --> 00:59:25.750
kriege ich halt irgendwie If-Else-Kaskaden

00:59:25.750 --> 00:59:27.870
in irgendwie Konstruktoren und dann irgendwann denke ich mir

00:59:27.870 --> 00:59:29.450
so, hm, das sieht aber hässlich aus, was meine ich denn jetzt?

00:59:30.330 --> 00:59:31.310
Und dann brauche ich halt Patterns.

00:59:32.270 --> 00:59:35.790
Und das

00:59:35.790 --> 00:59:37.790
hat man in Python so, eigentlich

00:59:37.790 --> 00:59:39.670
würde ich sagen, so viele der braucht man so nicht. Also es gibt

00:59:39.670 --> 00:59:41.830
vielleicht, ich würde sagen, Ausnahme ist vielleicht das Bilder-Pattern,

00:59:41.890 --> 00:59:43.730
das man halt auch in Python vielleicht ganz gut

00:59:43.730 --> 00:59:44.430
verwenden kann.

00:59:44.710 --> 00:59:46.510
Dann bitte noch mal erklären, was ist das für ein Bilder-Pattern?

00:59:46.690 --> 00:59:49.330
Also das Builder-Pattern

00:59:49.330 --> 00:59:51.030
ist halt sozusagen, wenn man jetzt nicht nur

00:59:51.030 --> 00:59:52.990
ein Objekt bauen möchte, sondern halt

00:59:52.990 --> 00:59:55.350
eine ganze Menge von Objekten,

00:59:56.230 --> 00:59:56.890
dann

00:59:56.890 --> 01:00:01.150
wird das halt unter Umständen unübersichtlich.

01:00:01.570 --> 01:00:02.650
Wenn ich das jetzt irgendwie,

01:00:03.150 --> 01:00:04.970
muss ich halt einen Konstruktor machen, der irgendwie

01:00:04.970 --> 01:00:07.130
riesig wird und ganz viele Argumente übergeben oder so,

01:00:07.210 --> 01:00:08.870
das ist halt eventuell nicht so schön.

01:00:09.830 --> 01:00:11.490
Ein gutes Beispiel dafür ist halt

01:00:11.490 --> 01:00:15.110
LXML hat da so ein Ding,

01:00:15.230 --> 01:00:19.190
wie man sozusagen XML-Dokumente zusammenbauen kann.

01:00:19.390 --> 01:00:21.350
Das ist halt quasi Bilder-Pattern, kann man sagen.

01:00:21.430 --> 01:00:23.090
Also wenn man sich das mal angucken will,

01:00:23.430 --> 01:00:26.410
da gibt es dann halt für jedes Tag gibt es halt ein Objekt

01:00:26.410 --> 01:00:27.870
und dann kann man das halt ineinander schachteln

01:00:27.870 --> 01:00:30.010
und dann sieht das quasi syntaktisch so ein bisschen aus,

01:00:30.070 --> 01:00:31.430
als würde man XML zusammenbauen

01:00:31.430 --> 01:00:36.210
und hat dann aber tatsächlich eigentlich quasi

01:00:36.210 --> 01:00:40.330
halt eine Reihe von Objekten zusammengebastelt.

01:00:41.330 --> 01:00:42.410
Meistens reicht es aber,

01:00:42.530 --> 01:00:44.430
also das, wofür dann das Bilder-Pattern verwendet wird,

01:00:44.590 --> 01:00:47.130
in anderen Sprachen, in Python reicht es dann

01:00:47.130 --> 01:00:48.750
meistens irgendwie einfach eine neue

01:00:48.750 --> 01:00:51.130
Klassenmethode an ein Objekt ranzumachen, die halt dann

01:00:51.130 --> 01:00:52.110
irgendwie Sachen zusammenbaut.

01:00:53.330 --> 01:00:55.090
Das geht halt. Anderswo geht das

01:00:55.090 --> 01:00:57.170
halt nicht so gut. Da muss man halt

01:00:57.170 --> 01:00:59.070
das ein bisschen komplizierter machen. Aber es gibt

01:00:59.070 --> 01:01:00.870
auch in Python Fälle, wo man das

01:01:00.870 --> 01:01:01.850
Pattern tatsächlich braucht.

01:01:02.870 --> 01:01:04.990
Und es ist halt schön, das Pattern zu kennen, auch wenn es

01:01:04.990 --> 01:01:07.230
halt nicht primär um komplizierte Syntax geht.

01:01:08.350 --> 01:01:09.290
Hat das was mit Factory

01:01:09.290 --> 01:01:10.670
zu tun, weil das Builder-Pattern heißt?

01:01:11.270 --> 01:01:13.170
Ja, also Factory-Pattern würde ich sagen, braucht man

01:01:13.170 --> 01:01:14.950
fast nicht. Das ist genau so etwas,

01:01:15.350 --> 01:01:17.170
das ist, da das irgendwie

01:01:17.170 --> 01:01:19.150
da Funktionen

01:01:19.150 --> 01:01:21.210
First Class Dinger sind in Python,

01:01:21.810 --> 01:01:22.490
gibt es eigentlich gar keine.

01:01:22.490 --> 01:01:24.970
Was ist denn das Factory Python? Fangen wir wieder so an, wir wollen ja auch ein bisschen

01:01:24.970 --> 01:01:25.270
erklären.

01:01:30.130 --> 01:01:33.110
Ich weiß gar nicht, ob ich das genau

01:01:33.110 --> 01:01:34.930
gut erklärt kriege.

01:01:38.110 --> 01:01:38.470
Äh,

01:01:38.470 --> 01:01:43.130
guckt irgendwas aus, wird

01:01:43.130 --> 01:01:45.350
irgendwas fabriziert auf eine ähnliche Art und Weise,

01:01:46.410 --> 01:01:47.530
irgendwas generiert,

01:01:47.670 --> 01:01:49.290
was ähnliche Eigenschaften besitzt, ich weiß nicht.

01:01:50.290 --> 01:01:51.090
Nee, es geht eigentlich

01:01:51.090 --> 01:01:52.510
eher darum, dass du deine Objekt

01:01:52.510 --> 01:01:55.050
Konstruktionen konfigurierbar

01:01:55.050 --> 01:01:56.930
machen möchtest. Dass du nicht

01:01:56.930 --> 01:01:58.990
sagen möchtest, also du hast halt nicht irgendwie einen Hammer

01:01:58.990 --> 01:02:00.790
und ich hätte was jetzt irgendwie

01:02:00.790 --> 01:02:02.970
New Hammer, sondern du hättest gerne

01:02:02.970 --> 01:02:04.790
jetzt einen sehr speziellen Hammer mit einem

01:02:04.790 --> 01:02:06.390
möglichen, keine Ahnung,

01:02:06.510 --> 01:02:08.670
so ein Stil, der so und so lang ist und

01:02:08.670 --> 01:02:09.690
keine Ahnung,

01:02:10.510 --> 01:02:12.370
der soll so und so schwer sein und weiß ich nicht.

01:02:12.710 --> 01:02:14.810
Und ja,

01:02:15.050 --> 01:02:17.050
jetzt ist halt

01:02:17.050 --> 01:02:18.510
die Frage, wie konfiguriert es zu

01:02:18.510 --> 01:02:20.530
dieses Ding halt und wo man in Python halt eine Funktion

01:02:20.530 --> 01:02:22.450
verwenden würde, musst du halt in

01:02:22.450 --> 01:02:23.910
anderen Sprachen jetzt anfangen,

01:02:24.790 --> 01:02:26.330
sozusagen da Objekte ineinander zu

01:02:26.330 --> 01:02:26.730
stapseln.

01:02:28.730 --> 01:02:30.310
Und ja, aber ich kriege es jetzt auch,

01:02:30.410 --> 01:02:32.030
weiß ich nicht genau, ob ich das so super erklärt kriege.

01:02:32.290 --> 01:02:33.670
Ich habe mir das auch schon lange nicht mehr angeguckt.

01:02:34.570 --> 01:02:36.490
Ja, man muss an der Stelle halt auch

01:02:36.490 --> 01:02:40.450
es geht wieder

01:02:40.450 --> 01:02:41.810
um Syntax halt auch an der Stelle.

01:02:42.390 --> 01:02:44.410
Das eine ist, du benutzt

01:02:44.410 --> 01:02:46.310
halt plötzlich keinen New Operator mehr an der

01:02:46.310 --> 01:02:48.450
Stelle. Das geht weg, sondern du

01:02:48.450 --> 01:02:50.290
änderst halt den Aufruf eines

01:02:50.290 --> 01:02:52.270
traditionellen Konstruktors in

01:02:52.270 --> 01:02:53.250
halt eine ganz normale

01:02:53.250 --> 01:02:55.390
Funktion oder Methode

01:02:55.390 --> 01:02:58.170
und kannst halt

01:02:58.170 --> 01:03:00.390
tatsächlich auch

01:03:00.390 --> 01:03:01.290
unterschiedliche

01:03:01.290 --> 01:03:03.890
Semantiken haben. Also hier wird zum Beispiel

01:03:03.890 --> 01:03:05.730
gerade ein Beispiel aufgeführt von

01:03:05.730 --> 01:03:08.050
hab eine Farbklasse, ja, und du willst jetzt

01:03:08.050 --> 01:03:10.190
eine neue Farbinstanz haben und sagst

01:03:10.190 --> 01:03:12.070
einmal create from RGB oder

01:03:12.070 --> 01:03:14.090
create from HSV oder solche

01:03:14.090 --> 01:03:16.110
Sachen, das kannst du damit

01:03:16.110 --> 01:03:17.270
ein bisschen expliziter machen,

01:03:17.770 --> 01:03:20.150
speziell wenn du dann halt wirklich unterschiedliche

01:03:20.150 --> 01:03:21.990
Semantiken haben willst

01:03:21.990 --> 01:03:24.070
oder das Ding noch 13 andere Dinge tun

01:03:24.070 --> 01:03:26.070
soll oder eben gar kein

01:03:26.070 --> 01:03:27.850
new aufruft, sondern das Ding von woanders

01:03:27.850 --> 01:03:28.430
ranzerrt,

01:03:29.710 --> 01:03:31.930
da sind Konstruktoren halt häufig

01:03:31.930 --> 01:03:33.390
einfach extrem begrenzt,

01:03:33.830 --> 01:03:35.490
was die Flexibilität angeht.

01:03:35.730 --> 01:03:46.070
Und das ist tatsächlich in Python halt ein, naja, Init und Usen sind halt auch nur ganz normale Funktionen, die kannst du parametrisieren und benutzen, wie du willst, da ist Python halt einfach eine Ecke voraus gewesen.

01:03:47.670 --> 01:04:00.570
Nichtsdestotrotz kann man halt noch was daraus lernen, ich mache das auch gerne manchmal, dass ich Konstruktoren habe oder solche Factories habe, die eben dieses aus unterschiedlichen Kontexten heraus initialisieren.

01:04:00.570 --> 01:04:29.350
Es ist in der Python-Bibliothek selber auch drin, wenn man sich DateTime zum Beispiel anguckt, dann gibt es da mehrere, das sind dann entweder Klassen- oder Statische Methoden, die heißen dann irgendwie fromTimeStamp oder from was auch immer, um dann halt ein Objekt dieser Klasse zu erzeugen, aber eben mit völlig anderen Ansätzen und der Code ist natürlich leichter zu strukturieren, als wenn du nur einen Konstruktor hättest, wo 23 Parameter drin sind, die sich alle nicht auf den Füßen rumtreten dürfen.

01:04:30.570 --> 01:04:38.030
Ja, dann machen wir doch weiter

01:04:38.030 --> 01:04:40.010
mit was würdet ihr als nächstes nehmen?

01:04:40.190 --> 01:04:41.650
Eigentlich hatten wir ja mit dem Singleton angefangen

01:04:41.650 --> 01:04:43.070
und mit den verschiedenen Arten.

01:04:43.070 --> 01:04:44.970
Achso, ja, ja, genau, auch zu Singleton wollte ich auch noch

01:04:44.970 --> 01:04:47.050
kurz, genau, was ich meistens verwende

01:04:47.050 --> 01:04:48.950
oder was für meine Anwendungsfälle, wo ich

01:04:48.950 --> 01:04:50.290
sowas habe, wie den Singleton,

01:04:50.650 --> 01:04:53.030
meistens reicht

01:04:53.030 --> 01:04:54.790
ist tatsächlich irgendwie eine Variable

01:04:54.790 --> 01:04:57.070
in einem Modul, weil das ist

01:04:57.070 --> 01:04:58.790
ja, das Modul ist schon ein Singleton irgendwie

01:04:58.790 --> 01:05:00.630
und wenn ich da halt irgendwas dran packe,

01:05:00.730 --> 01:05:02.450
dann ist das halt überall gleich.

01:05:03.390 --> 01:05:04.550
Wenn ich das irgendwo importiere,

01:05:05.370 --> 01:05:06.830
es gibt da

01:05:06.830 --> 01:05:08.710
so einen Pattern von Alex

01:05:08.710 --> 01:05:10.930
Martley, wenn man tatsächlich sowas braucht wie Shared State

01:05:10.930 --> 01:05:11.990
über, dann aber

01:05:11.990 --> 01:05:14.690
manchmal braucht man nicht unbedingt immer die gleiche

01:05:14.690 --> 01:05:16.630
Instanz, sondern nur, dass sich alles immer gleich irgendwie

01:05:16.630 --> 01:05:18.750
verhält und den gleichen State hält,

01:05:19.110 --> 01:05:20.490
da kann man das Borg-Pattern verwenden.

01:05:21.110 --> 01:05:22.270
Das ist so ein bisschen ähnlich wie ein...

01:05:22.270 --> 01:05:23.190
Das Borg-Pattern?

01:05:24.290 --> 01:05:25.750
Kein originales Gang of Four.

01:05:25.890 --> 01:05:28.290
Nein, aber das ist halt sozusagen irgendwie

01:05:28.290 --> 01:05:29.650
eine etwas pythonischere Variante.

01:05:32.170 --> 01:05:34.070
Und es gibt dann natürlich auch noch die, also man kann

01:05:34.070 --> 01:05:36.190
tatsächlich auch so machen, dass es halt so ist wie

01:05:36.190 --> 01:05:38.150
Singleton in anderen Sprachen, dann meistens irgendwie

01:05:38.150 --> 01:05:40.350
muss man dann so Metaprogrammierung mit new und keine Ahnung,

01:05:40.610 --> 01:05:42.410
ist aber dann schon nicht mehr so richtig einfach und meistens

01:05:42.410 --> 01:05:44.210
wie gesagt, also meiner Erfahrung nach

01:05:44.210 --> 01:05:45.430
braucht man es eigentlich nicht.

01:05:46.910 --> 01:05:47.270
Ja.

01:05:49.750 --> 01:05:50.110
Ja.

01:05:51.750 --> 01:05:52.070
Okay.

01:05:52.330 --> 01:05:53.730
Also was für Appletten haben wir denn noch? Also ich

01:05:53.730 --> 01:05:56.150
kann jetzt natürlich die Liste hernehmen, aber

01:05:56.150 --> 01:05:57.770
wir haben jetzt Singleton gehabt, wir haben kurz Factory

01:05:57.770 --> 01:06:19.690
Ja, es gibt noch zwei, die jetzt aus meiner Historie immer relevant waren. Das waren Proxys und Adapter. Da muss ich mal die ganz ollen kleinen Kamellen rausholen. Also SOAP 3 war damals tatsächlich, also SOAP 2 und deren Nachfolger SOAP 4 und SOAP 5.

01:06:19.690 --> 01:06:20.930
Wie bitte was?

01:06:20.930 --> 01:06:22.310
gab es auch einen. Bitte?

01:06:23.390 --> 01:06:24.470
Soap, genau.

01:06:24.630 --> 01:06:26.250
Es ist der

01:06:26.250 --> 01:06:28.710
Open-Source-Urgroßvater

01:06:28.710 --> 01:06:30.130
der Applikationsserver.

01:06:31.050 --> 01:06:32.410
Z-O-P-E, Soap.

01:06:32.550 --> 01:06:34.430
Ach, Soap. Ja, okay. Ja, genau.

01:06:35.210 --> 01:06:35.530
Und

01:06:35.530 --> 01:06:38.670
das war ursprünglich ja so ein

01:06:38.670 --> 01:06:41.110
Through-the-Web-Entwicklungs-

01:06:41.110 --> 01:06:41.790
Umgebungstool,

01:06:42.530 --> 01:06:44.490
wo man halt nur durch einen Browser

01:06:44.490 --> 01:06:46.970
mit Python und so ein paar HTML-Template-Sprachen

01:06:46.970 --> 01:06:48.470
sich extrem schnell

01:06:48.470 --> 01:06:49.810
Webanwendungen zusammenbauen konnte.

01:06:50.530 --> 01:07:09.930
Das war original 96 entstanden, glaube ich, und 2001 rum gab es da einen Aufschlag zu sagen, so bauen wir alles nochmal neu mit besserem Engineering und da kam dann so ein SOP3-Projekt raus und da gab es schon mal so eine Zwei-nach-Drei-Transition, die nicht so smooth war.

01:07:11.610 --> 01:07:24.970
Für SOAP war es tatsächlich, glaube ich, so ein bisschen auch dann der Untergang im Sinne von, das war sowas anderes, man hätte es nie SOAP 3 nennen dürfen. Es hat einfach nichts, also richtig gar nichts mehr mit dem vorherigen Ding zu tun gehabt.

01:07:25.350 --> 01:07:48.710
Da war halt eine der Grundideen, dass es möglich sein sollte, Libraries und Anwendung oder Anwendungskomponenten, das nannte sich dann auch Komponentenarchitektur, so miteinander zu verheiraten, dass es eine zentrale Registry gibt, in der aufgezeichnet wird, wie man Dinge miteinander verbinden kann.

01:07:48.710 --> 01:08:06.350
Also das war dann sehr stark Interface-basiert. Das ist jetzt auch was, was in anderen Sprachen stärker verankert ist als in Python. Und da hatten wir extra einen Interface-Typ für entwickelt, mit dem du dann deklarieren konntest, okay, das hier ist ein formales Interface, es muss folgende Methoden haben, die Methoden müssen folgende Parameter haben.

01:08:06.630 --> 01:08:08.650
Also ein Interface ist ja ein anderes Design-Pattern.

01:08:09.190 --> 01:08:11.830
Nee, Interface ist noch nicht mal so richtig ein Design-Pattern.

01:08:11.930 --> 01:08:16.510
Interface kommt eher aus dem Bereich der Typsysteme

01:08:16.510 --> 01:08:19.490
und ist in einigen Sprachen sozusagen

01:08:19.490 --> 01:08:27.310
eine Möglichkeit, Schnittstellen zwischen Code zu explizieren.

01:08:27.310 --> 01:08:31.790
Also in Java ist es ja sehr explizit und in C++ auch.

01:08:33.030 --> 01:08:35.290
Ich glaube, Modula 3, damit hatte ich gelernt,

01:08:35.410 --> 01:08:36.090
ist es auch so ein Ding,

01:08:36.850 --> 01:08:38.310
weil Dinge, die du nicht deklarierst,

01:08:38.370 --> 01:08:39.670
kannst du nicht ansprechen, sozusagen.

01:08:41.790 --> 01:08:43.110
Ja, du musst halt sozusagen immer,

01:08:43.230 --> 01:08:45.630
wenn du eine Funktion aufrufst oder eine Methode aufrufst,

01:08:45.730 --> 01:08:47.370
irgendwie, wenn du dir irgendwas übergibst,

01:08:47.430 --> 01:08:48.970
musst du dir halt sagen, was das denn ist.

01:08:49.530 --> 01:08:51.030
Kannst du dann nicht einfach irgendwas übergeben.

01:08:51.870 --> 01:08:56.710
Und wenn du jetzt Objekte unterschiedlicher Art da reintun willst,

01:08:57.230 --> 01:09:00.270
dann müssen die zumindest quasi vom gleichen Interface erben,

01:09:00.430 --> 01:09:01.510
sonst geht das halt einfach nicht.

01:09:01.690 --> 01:09:06.050
Du könntest zum Beispiel sagen,

01:09:06.490 --> 01:09:08.590
okay, ich habe hier irgendwie eine Methode,

01:09:08.710 --> 01:09:10.090
die schreibt irgendwie zum Beispiel,

01:09:10.230 --> 01:09:11.430
die lockt irgendwas weg oder so

01:09:11.430 --> 01:09:14.010
und ich gebe da jetzt irgendwas rein,

01:09:14.090 --> 01:09:15.790
aber was du jetzt reingeben möchtest,

01:09:15.790 --> 01:09:17.270
ist einmal vielleicht irgendein Log-File,

01:09:17.390 --> 01:09:18.250
in das reingeschrieben wird,

01:09:18.330 --> 01:09:19.130
aber du möchtest vielleicht auch,

01:09:19.190 --> 01:09:22.050
dass das irgendwie übers Netz in irgendein Socket geschrieben wird.

01:09:22.430 --> 01:09:23.010
Und dann kannst du sagen,

01:09:23.110 --> 01:09:26.190
okay, Socket und mein File haben beide ein File-like Interface,

01:09:26.250 --> 01:09:27.930
sozusagen, das sie implementieren

01:09:27.930 --> 01:09:30.110
oder dann halt auch explizit davon erben,

01:09:30.190 --> 01:09:31.730
wenn du das halt irgendwie so machen willst.

01:09:31.950 --> 01:09:34.890
Und dann kannst du das halt dann sozusagen,

01:09:34.990 --> 01:09:36.170
sagst du in der Methode,

01:09:37.230 --> 01:09:39.870
also ich habe hier, hätte ich gern ein Ding,

01:09:39.970 --> 01:09:43.790
dass das File-Interface sozusagen implementiert

01:09:43.790 --> 01:09:47.110
und kannst dann sozusagen darauf dann irgendwie

01:09:47.110 --> 01:09:48.170
write aufrufen oder so.

01:09:48.650 --> 01:09:51.890
Und die Menge der Methoden sozusagen,

01:09:52.310 --> 01:09:54.590
die man da aufrufen kann, das ist halt das Interface.

01:09:55.190 --> 01:09:57.970
Also die Idee ist, der wichtige Unterschied ist,

01:09:58.030 --> 01:10:04.170
dass du mit Interfaces halt Implementationen und Spezifikationen voneinander halt trennst.

01:10:04.210 --> 01:10:06.790
Das heißt, ich habe eine Art abstrakte Vordefinition.

01:10:07.730 --> 01:10:11.710
Ja, also wir hatten es damals so gemacht, es gab einen speziellen Klassentyp,

01:10:12.430 --> 01:10:17.510
also eine Basisklasse Interface, die konnte auch keinen richtigen Code haben.

01:10:18.430 --> 01:10:22.350
Da wurde also, da hattest du immer nur Rümpfe von Methoden gehabt

01:10:23.350 --> 01:10:29.870
Und dann konntest du halt deklarieren, dass eine bestimmte Klasse dieses Interfaces implementiert.

01:10:29.950 --> 01:10:32.930
Und wichtig ist eben, dass die Implementationen nicht voneinander geerbt haben.

01:10:32.930 --> 01:10:37.090
Es gab nicht irgendwie eine Basisimplementation oder du könntest das Interface gegebenenfalls

01:10:37.090 --> 01:10:40.350
so etwas wie eine abstrakte Basisklasse nennen.

01:10:41.710 --> 01:10:45.430
Aber das ist expliziter noch viel weiter voneinander entkoppelt worden.

01:10:45.830 --> 01:10:48.650
Und Python, normalerweise, da gibt es ja das sogenannte Ducktyping.

01:10:49.290 --> 01:10:54.610
Das heißt, solange es sich so verhält, wie es soll, ist mir als Laufzeitumgebung völlig egal, was du reinstopfst.

01:10:55.070 --> 01:10:59.210
Das ist ja dann jetzt mit den Type Annotations kannst du da jetzt Laufzeitumgebungen nehmen,

01:10:59.310 --> 01:11:03.810
die das halt ein bisschen strenger behandeln und auch mit statischer Analyse schon mal versehen.

01:11:04.330 --> 01:11:07.810
Aber da ging es uns tatsächlich mehr darum, wenn man solche Annotationen hat,

01:11:08.490 --> 01:11:15.930
dass man daraus dann auch den Vorteil zieht, dass ich sage, okay, ich definiere ein Interface für etwas

01:11:15.930 --> 01:11:24.730
und wenn ein Objekt ein Parameter eines bestimmten Typs erwartet

01:11:24.730 --> 01:11:28.330
oder ein Objekt erwartet, das ein bestimmtes Interface erfüllt,

01:11:29.210 --> 01:11:34.750
dann wird nicht einfach gesagt, nee, du implementierst dieses Interface nicht,

01:11:34.850 --> 01:11:38.710
sondern was dann passiert ist, dann wurde ein Adapteraufruf gemacht,

01:11:38.810 --> 01:11:42.950
man hat also das Ursprungsobjekt genommen, was jetzt als Parameter in die Funktion reingereicht wurde

01:11:42.950 --> 01:11:46.930
und hat dann geguckt, welches Interface soll es denn erfüllen,

01:11:47.730 --> 01:11:49.810
hat einen Adapteraufruf gemacht und hat gesagt,

01:11:49.930 --> 01:11:53.530
so, liebe Laufzeitumgebung, ich habe hier ein Objekt gekriegt,

01:11:53.870 --> 01:11:57.390
mach bitte, dass es ein iLogger ist.

01:11:58.610 --> 01:12:01.390
Und dann konntest du in der Laufzeitumgebung vorher registrieren und sagen,

01:12:01.390 --> 01:12:05.790
ah, also, wenn jemand einen iLogger braucht und einen String bekommen hat,

01:12:06.190 --> 01:12:09.870
dann mach bitte folgendes und dann kommt da dieses Objekt raus.

01:12:10.930 --> 01:12:16.690
Oder wenn eine Methode einen iLogger braucht und da kommt ein Socket raus,

01:12:17.410 --> 01:12:20.790
da wurde ein Socket übergeben, dann mach bitte das und geh dann weiter.

01:12:20.890 --> 01:12:25.830
Und da kannst du sozusagen immer wieder beliebige Typtransformationen mitten reinsetzen

01:12:25.830 --> 01:12:29.150
und hast dich dadurch flexibilisiert, dass jemand anderes plötzlich anfängt,

01:12:29.150 --> 01:12:33.030
okay, ich gebe dir, liebes Programm, jetzt plötzlich Objekte anderen Typs rein

01:12:33.030 --> 01:12:37.930
und deklariere an der dritten Stelle, wie diese Typtransformationen zu laufen haben

01:12:37.930 --> 01:12:40.050
und dann kann ich

01:12:40.050 --> 01:12:41.930
plötzlich halt Anwendungen auf Art benutzen,

01:12:42.030 --> 01:12:43.190
die nie so vorgesehen waren.

01:12:43.650 --> 01:12:45.110
Hört sich nach großer Magie an.

01:12:45.790 --> 01:12:47.890
Das war ein Haufen Magie, da war ein Haufen Engineering

01:12:47.890 --> 01:12:49.290
drin, um das auch schnell zu kriegen.

01:12:50.270 --> 01:12:51.810
Also das war wirklich so, wenn man

01:12:51.810 --> 01:12:53.710
bei Soap nachher in einer ernsthaften

01:12:53.710 --> 01:12:55.670
Anwendung mal eine Seite aufgerufen hatte,

01:12:55.770 --> 01:12:57.810
dann waren in einem Call bestimmt eine halbe Million

01:12:57.810 --> 01:12:58.690
Adapter-Calls drin.

01:13:00.470 --> 01:13:02.030
Und die waren aber auf C-Ebene

01:13:02.030 --> 01:13:04.050
halt so optimiert, das waren halt nur ein paar Millisekunden,

01:13:04.170 --> 01:13:05.950
die dafür draufgingen. Das war alles extrem schnell.

01:13:06.810 --> 01:13:09.130
Da wurde extrem viel Arbeit reingesteckt.

01:13:10.150 --> 01:13:16.410
Und da gibt es wirklich, also da gibt es Architekturen, die wir in Anwendung hatten, die waren extrem, extrem interessant.

01:13:17.370 --> 01:13:20.030
Problem ist aber, die sind auch extrem aufwendig zu pflegen.

01:13:20.750 --> 01:13:28.910
Also da spielst du dann halt Informatik wieder mit in der Klasse von, wir ziehen uns jetzt alle den Laborkittel an und designen das jetzt hier ordentlich durch.

01:13:29.030 --> 01:13:30.650
Ansonsten fliegt uns das alles um die Ohren.

01:13:31.170 --> 01:13:32.730
Da ist so ein iteratives Vorgehen

01:13:32.730 --> 01:13:35.390
nur so begrenzt

01:13:35.390 --> 01:13:37.390
getragen, weil du halt häufiger recht große

01:13:37.390 --> 01:13:39.430
starre Refactorings hattest, die du dann halt

01:13:39.430 --> 01:13:41.110
nehmen musstest. Aber

01:13:41.110 --> 01:13:43.530
dieses Adapter-Pattern hat es extrem flexibel

01:13:43.530 --> 01:13:45.530
gemacht. Also das

01:13:45.530 --> 01:13:47.150
war schon richtig gut.

01:13:48.870 --> 01:13:49.350
Und das zweite,

01:13:49.470 --> 01:13:50.270
wo ich mich hier in

01:13:50.270 --> 01:13:52.970
Fanatismus und Rage

01:13:52.970 --> 01:13:55.010
vor euren Augen im Video

01:13:55.010 --> 01:13:57.290
begeben hatte, was da auch eine Rolle

01:13:57.290 --> 01:13:58.970
gespielt hat, waren sogenannte Proxy-Patterns.

01:13:59.730 --> 01:14:01.570
dass also ein Objekt anstelle eines

01:14:01.570 --> 01:14:03.250
anderes irgendwo reingereicht wird

01:14:03.250 --> 01:14:05.570
und er emuliert alle Attributzugriffe

01:14:05.570 --> 01:14:06.930
und alle Funktionsaufrufe,

01:14:07.630 --> 01:14:09.790
macht irgendwas und reicht den Originalaufruf

01:14:09.790 --> 01:14:11.570
dann an das Originalobjekt halt weiter.

01:14:13.070 --> 01:14:13.650
Damit kannst du

01:14:13.650 --> 01:14:15.750
zum Beispiel sowas machen wie ein Logging-Proxy

01:14:15.750 --> 01:14:17.510
und das geht in Python tatsächlich total

01:14:17.510 --> 01:14:18.830
super. Du kannst ein Objekt bauen,

01:14:19.510 --> 01:14:21.750
der alle Attribut- und Methodenzugriffe

01:14:21.750 --> 01:14:23.230
halt an ein anderes übergibt

01:14:23.230 --> 01:14:25.530
und währenddessen zum Beispiel mitschreibt,

01:14:25.650 --> 01:14:27.710
ja hier wurde gerade folgende Methode mit folgendem

01:14:27.710 --> 01:14:29.850
mit folgendem

01:14:29.850 --> 01:14:30.890
Parameter aufgerufen

01:14:30.890 --> 01:14:33.610
und der Code, der das Objekt reingereicht kriegt,

01:14:33.670 --> 01:14:35.650
der muss aber noch von nichts wissen. Der denkt einfach

01:14:35.650 --> 01:14:37.390
nur, hier kommt ein Objekt, was halt irgendwie

01:14:37.390 --> 01:14:39.630
keine Ahnung, eine Datei ist.

01:14:41.310 --> 01:14:42.250
Eine Middleware quasi.

01:14:42.750 --> 01:14:43.270
Genau, und

01:14:43.270 --> 01:14:44.510
sowas wie eine Middleware,

01:14:45.050 --> 01:14:47.290
nur genau umgedreht im Prinzip.

01:14:48.330 --> 01:14:49.530
Du injectest das Ding in

01:14:49.530 --> 01:14:50.470
was anderes rein.

01:14:53.530 --> 01:14:55.370
Eine Middleware ist ja typischerweise was, was in der

01:14:55.370 --> 01:14:57.590
Pipeline irgendwo drin sitzt und du kannst

01:14:57.590 --> 01:14:59.770
aber halt beliebigem anderen Code

01:14:59.770 --> 01:15:01.010
das Ding einfach unterjubeln.

01:15:01.810 --> 01:15:03.710
Und das läuft dann durch diesen Code mit durch.

01:15:04.150 --> 01:15:05.030
Und wie mache ich das?

01:15:06.390 --> 01:15:07.610
Das ist relativ easy.

01:15:07.850 --> 01:15:09.570
Also die Frage ist immer,

01:15:10.130 --> 01:15:11.270
wann du bei Python

01:15:11.270 --> 01:15:13.510
mit irgendwelchen Metafunktionen auf die Schnauze

01:15:13.510 --> 01:15:14.170
fliegen möchtest.

01:15:15.950 --> 01:15:17.490
Also die ernsthaften

01:15:17.490 --> 01:15:19.070
Proxys, die wir hatten, waren dann

01:15:19.070 --> 01:15:20.090
Security-Proxys.

01:15:20.850 --> 01:15:23.650
Die waren in der Lage, anhand von

01:15:23.650 --> 01:15:25.650
Access-Controls, einer relativ aufwendigen

01:15:25.650 --> 01:15:27.650
Architektur tatsächlich für jeden einzelnen

01:15:27.650 --> 01:15:29.710
Funktionsaufruf zu sagen, ob der

01:15:29.710 --> 01:15:31.730
zulässig ist oder nicht. Ob dieser User mit den

01:15:31.730 --> 01:15:33.590
Rechten auf dem Objekt,

01:15:33.690 --> 01:15:35.510
das da aus der Datenbank kam, wenn das Objekt dann

01:15:35.510 --> 01:15:37.410
auch noch zu dem Kunden gehört, da so,

01:15:37.570 --> 01:15:39.390
darf der jetzt diese Funktion aufrufen, ja oder nein.

01:15:40.130 --> 01:15:41.670
Das war halt eine sogenannte

01:15:41.670 --> 01:15:43.110
Subject-Oriented Security

01:15:43.110 --> 01:15:45.090
und das ist so ein Unterschied.

01:15:45.450 --> 01:15:47.490
Heutzutage, viele Systeme haben

01:15:47.490 --> 01:15:50.010
nur View-Oriented

01:15:50.010 --> 01:15:51.870
Security,

01:15:52.030 --> 01:15:53.510
dass du halt sagst, okay, darf ich jetzt diesen

01:15:53.510 --> 01:15:55.470
View anschauen oder nicht. Und da

01:15:55.470 --> 01:15:56.690
war es aber tatsächlich so, dass wir

01:15:56.690 --> 01:15:59.490
praktisch alle Objekte,

01:15:59.650 --> 01:16:01.910
die aus der

01:16:01.910 --> 01:16:03.210
originalen

01:16:03.210 --> 01:16:05.630
Factory mal rausgefallen

01:16:05.630 --> 01:16:07.850
sind von, okay, hier ist deine Datenbank-Connection

01:16:07.850 --> 01:16:09.010
oder sowas,

01:16:09.430 --> 01:16:11.530
die wurden in solche Security-Proxys eingepackt

01:16:11.530 --> 01:16:13.390
und dann konntest du nachher wirklich für

01:16:13.390 --> 01:16:14.790
jeden einzelnen Attributzugriff

01:16:14.790 --> 01:16:17.810
aussteuern, ob da jetzt Security

01:16:17.810 --> 01:16:19.390
eingreifen soll und

01:16:19.390 --> 01:16:21.510
sagen soll, nee, User mit den Permissions

01:16:21.510 --> 01:16:23.490
dürfen halt auf die Passwortfelder nicht zugreifen.

01:16:24.250 --> 01:16:25.530
Und wenn du das in deinem Template-Code

01:16:25.530 --> 01:16:27.470
aber gemacht hast, dann ist aber der ganze Request

01:16:27.470 --> 01:16:28.970
abgewürgt worden mit, das geht so nicht.

01:16:29.830 --> 01:16:31.410
Da musst du halt dann noch

01:16:31.410 --> 01:16:33.430
einen Check gegenbauen und sagen, ah, der darf

01:16:33.430 --> 01:16:35.110
das nicht, dann wird das Template ordentlich gerendert.

01:16:35.270 --> 01:16:37.530
Ansonsten hast du aber immer den Safety-Belt,

01:16:37.610 --> 01:16:39.390
das ist dein Framework, selbst wenn du

01:16:39.390 --> 01:16:41.510
Blödsinn im Code schreibst, du musst

01:16:41.510 --> 01:16:43.530
da nicht drüber nachdenken, darf ich jetzt hier das Passwort

01:16:43.530 --> 01:16:45.530
rausrendern oder nicht, das geht nicht raus. Im schlimmsten

01:16:45.530 --> 01:16:47.410
Fall wird die Seite halt abgebrochen und du sagst, so hier

01:16:47.410 --> 01:16:47.770
ist nichts.

01:16:49.370 --> 01:16:51.250
Und die mussten wir aber tatsächlich auf

01:16:51.250 --> 01:16:53.390
C-Ebene schreiben, um wirklich

01:16:53.390 --> 01:16:55.230
alles komplett unterbinden zu können an

01:16:55.230 --> 01:16:57.190
Protokollen, die Python so kann mit den

01:16:57.190 --> 01:16:58.510
Doppel-Underscore-Methoden.

01:16:59.130 --> 01:17:00.930
Einen einfachen Proxy kannst du in Python

01:17:00.930 --> 01:17:03.170
schreiben, indem du einfach nur sagst, das ist eine Klasse,

01:17:03.750 --> 01:17:04.470
die hat ein Init,

01:17:05.130 --> 01:17:07.190
da übergibst du das Objekt, was geproxied

01:17:07.190 --> 01:17:09.210
werden soll, also was eingepackt werden soll

01:17:09.210 --> 01:17:11.350
und dann kannst du über die

01:17:11.350 --> 01:17:13.190
GetAttribute

01:17:14.130 --> 01:17:15.190
Protokolle

01:17:16.010 --> 01:17:16.930
dann halt

01:17:16.930 --> 01:17:19.490
sagen, okay, aha, hier versucht jemand gerade zuzugreifen

01:17:19.490 --> 01:17:20.510
auf folgendes Attribut

01:17:20.510 --> 01:17:23.410
und jetzt kannst du ein bisschen Log-Output

01:17:23.410 --> 01:17:25.310
erzeugen und danach halt das Original-Objekt

01:17:25.310 --> 01:17:26.790
mit genau diesem Objekt wieder aufrufen.

01:17:27.410 --> 01:17:29.410
Und das ist der Vorteil bei Python, was diese Patterns

01:17:29.410 --> 01:17:31.250
angeht, mit Python als

01:17:31.250 --> 01:17:32.610
protokollorientierter Sprache.

01:17:33.010 --> 01:17:35.470
Du hast immer irgendwas, was keine spezielle Syntax

01:17:35.470 --> 01:17:37.710
braucht, sondern du kannst in der Metaprogrammierung

01:17:37.710 --> 01:17:39.810
immer diese Doppel-Underscore-Methoden

01:17:39.810 --> 01:17:41.430
benutzen, um dann wieder

01:17:41.430 --> 01:17:43.330
über das System selber zu reden.

01:17:43.370 --> 01:17:45.510
Also dann Magic quasi direkt auf den

01:17:45.510 --> 01:17:47.650
Objekten, während die gebaut werden.

01:17:50.510 --> 01:17:54.370
Und jetzt müssten wir im Podcast sozusagen ein bisschen Live-Coding machen, um da...

01:17:54.370 --> 01:17:58.970
Ja, ich kann mir nicht ganz genau vorstellen, an welcher Stelle das injiziert werden soll.

01:17:59.010 --> 01:18:02.530
Wenn du jetzt sagst, dass das schon gebaut wird, jetzt weißt du, die Init ist dann quasi schon durch.

01:18:02.650 --> 01:18:06.750
Also der Konstruktor ist quasi geschehen und dann habe ich ein fertiges Objekt.

01:18:07.110 --> 01:18:08.490
Genau, das ist aber das Proxy-Objekt.

01:18:09.650 --> 01:18:15.350
Also es hat aber doch erst ein Proxy-Objekt gebaut und das dann quasi die anderen Init-Methoden erst aufruft.

01:18:15.350 --> 01:18:24.370
Nein, du hast ein Proxy-Objekt, das kriegt das Objekt, was du hinter dem Proxy haben möchtest, das reichst du dem rein.

01:18:25.310 --> 01:18:28.090
Also, ich versuche es ein bisschen bildlicher zu machen.

01:18:28.170 --> 01:18:35.370
Du hast ein Objekt aus deiner Anwendung, zum Beispiel den Datensatz von einer Person aus der Datenbank als Objekt.

01:18:35.870 --> 01:18:41.590
Class Person und die Instanz davon, die aus der Datenbank kam und jetzt mit den Daten gefüllt wurde, die hast du vor dir.

01:18:41.750 --> 01:18:42.250
Person A.

01:18:42.810 --> 01:18:43.450
Person A.

01:18:43.450 --> 01:18:50.510
So, und jetzt würdest du sagen, ich habe einen Proxy, der loggt alle Zugriffe auf Attribute von Objekten mit.

01:18:51.270 --> 01:18:54.510
Das Ding weiß nichts von Personenklassen oder irgendwas.

01:18:54.710 --> 01:18:59.010
Aber ich instanziere jetzt quasi den Proxy mit dem Objekt Person A.

01:18:59.430 --> 01:19:01.650
Mit dem Objekt Person A als Parameter.

01:19:02.370 --> 01:19:06.570
Bei dem Proxy heißt dieses Objekt intern nur Kontext, zum Beispiel.

01:19:07.330 --> 01:19:11.470
Das speichert der bei sich auf under under Kontext, zum Beispiel.

01:19:11.470 --> 01:19:13.470
Dann ein Contact, ja. Genau. Wichtig ist

01:19:13.470 --> 01:19:15.130
under under, also auch hinten,

01:19:15.470 --> 01:19:17.150
damit es in private Namespace kommt und so.

01:19:18.490 --> 01:19:18.850
Und

01:19:18.850 --> 01:19:21.430
wenn jetzt implementiert

01:19:21.430 --> 01:19:22.930
der Proxy noch eine zweite Methode,

01:19:23.270 --> 01:19:25.390
wenn du es ganz einfach machst, nimmst du under under

01:19:25.390 --> 01:19:26.590
getAttribute under under.

01:19:27.970 --> 01:19:29.510
Die wird ja immer dann getriggert,

01:19:29.590 --> 01:19:31.350
wenn jemand auf ein Attribut zugreift, was

01:19:31.350 --> 01:19:32.230
nicht definiert ist.

01:19:33.610 --> 01:19:35.250
Da der Proxy selber kein Attribute hat,

01:19:35.310 --> 01:19:37.250
wird es immer getriggert.

01:19:38.490 --> 01:19:39.450
In dem Moment

01:19:39.450 --> 01:19:41.270
würde er dann zum Beispiel ein Print machen

01:19:41.270 --> 01:19:43.110
von, ja, hier wurde jetzt auf folgendes Attribut

01:19:43.110 --> 01:19:44.470
zugegriffen

01:19:44.470 --> 01:19:46.890
und ruft dann self.under

01:19:46.890 --> 01:19:49.190
under context, under under, get attra

01:19:49.190 --> 01:19:51.170
dieses Objekt auf.

01:19:51.890 --> 01:19:53.150
Diese Attributnahme

01:19:53.150 --> 01:19:54.950
auf. Erreicht sozusagen den Methodenaufruf

01:19:54.950 --> 01:19:57.090
eins zu eins weiter und

01:19:57.090 --> 01:19:59.030
gibt es auch wieder zurück. Und dieses

01:19:59.030 --> 01:20:00.850
Objekt kannst du jetzt jedem anderen,

01:20:01.510 --> 01:20:03.110
der von Logging keine

01:20:03.110 --> 01:20:04.630
Ahnung hat, einfach in die Hand drücken

01:20:04.630 --> 01:20:06.770
und könntest damit zum Beispiel

01:20:06.770 --> 01:20:09.070
tracen, wer ruft denn hier

01:20:09.070 --> 01:20:11.010
auf diesem Objekt jetzt, wenn ich jetzt folgenden Client-Code

01:20:11.010 --> 01:20:12.410
habe eigentlich was auf.

01:20:12.490 --> 01:20:15.410
Was wird da gemacht? Da würde ich auch noch einen Debugger bauen oder sowas quasi.

01:20:15.670 --> 01:20:16.770
Kannst du dir einen Debugger mitbauen,

01:20:16.850 --> 01:20:18.830
einen Flow-Debugger. Genau.

01:20:20.790 --> 01:20:21.750
Oder kannst du halt auch

01:20:21.750 --> 01:20:23.290
sozusagen, ja genau, einen Debugger.

01:20:23.350 --> 01:20:24.450
Kannst du zum Beispiel auch was machen mit

01:20:24.450 --> 01:20:27.290
Aha, den Code da hinten kann ich

01:20:27.290 --> 01:20:29.350
nicht ändern, weil der ist so irgendwie, keine Ahnung

01:20:29.350 --> 01:20:30.410
wie, komme ich nicht ran.

01:20:31.210 --> 01:20:33.290
Aber jetzt mache ich so ein Proxy-Objekt

01:20:33.290 --> 01:20:35.230
und wenn jemand auf dem Proxy-Objekt die Methode

01:20:35.230 --> 01:20:36.870
A aufruft, dann starte ich ein PDB.

01:20:40.710 --> 01:20:42.790
Ja. So, und das ist dann ein Proxy.

01:20:43.090 --> 01:20:44.830
Du wickelst etwas ein

01:20:44.830 --> 01:20:46.390
und gibst das

01:20:46.390 --> 01:20:48.450
eingewickelte Ding weiter mit dem anderen, mit dem

01:20:48.450 --> 01:20:50.570
Original drin. Da kann ich quasi

01:20:50.570 --> 01:20:52.330
alles mitlesen, was der da an Daten

01:20:52.330 --> 01:20:54.530
aus der Datenbank zieht. Genau, also in Python

01:20:54.530 --> 01:20:56.050
kannst du, wie gesagt, es ist immer die Frage,

01:20:56.630 --> 01:20:58.210
diese Double-Under-Methoden,

01:20:58.530 --> 01:20:58.850
wenn du

01:20:58.850 --> 01:21:02.310
sagst, der andere kann alles an Python

01:21:02.310 --> 01:21:04.570
schreiben, was es gibt und du hast den Client-Code,

01:21:04.910 --> 01:21:06.350
der ist völlig unbekannt, dann musst du

01:21:06.350 --> 01:21:08.310
den auf C-Ebene schreiben, um wirklich

01:21:08.310 --> 01:21:10.330
sicher zu sein. Wenn du aber weißt,

01:21:10.410 --> 01:21:12.470
was der andere Code macht, dann kannst du

01:21:12.470 --> 01:21:13.950
Proxys auch rein in Python schreiben.

01:21:15.230 --> 01:21:16.130
Es ist nur in Python,

01:21:16.670 --> 01:21:18.050
wenn jemand gegen dich arbeitet

01:21:18.050 --> 01:21:20.410
mit deiner Metaprogrammierung, dann kommst du

01:21:20.410 --> 01:21:22.190
gegen das Gegenarbeiten auch erst wieder an,

01:21:22.230 --> 01:21:23.730
wenn du weißt, wie er gegen dich arbeitet.

01:21:25.730 --> 01:21:26.450
Damit kannst du

01:21:26.450 --> 01:21:28.230
keine Security bauen, aber du kannst halt

01:21:28.230 --> 01:21:30.030
hilfreiche Dinge bauen.

01:21:34.530 --> 01:21:36.310
Oder du kannst zum Beispiel eine Proxy bauen,

01:21:36.310 --> 01:21:37.570
der alle Methodenaufrufe casht.

01:21:40.410 --> 01:21:46.490
Und das Schöne ist, du kannst das

01:21:46.490 --> 01:21:48.530
dann halt machen für Objekte, die du selber nicht unter Kontrolle

01:21:48.530 --> 01:21:50.310
hast. Also, das ist sozusagen, du hast

01:21:50.310 --> 01:21:52.410
einmal, die Objekte kommen von irgendwo, wo

01:21:52.410 --> 01:21:53.630
du den Code nicht ändern kannst

01:21:53.630 --> 01:21:56.210
und du steckst in irgendwas rein, wo du

01:21:56.210 --> 01:21:58.230
auch nicht ändern kannst, was da passiert und

01:21:58.230 --> 01:22:00.510
ein Proxy kann da an der Stelle halt

01:22:00.510 --> 01:22:02.570
dann plötzlich neue Fertigkeiten einführen,

01:22:02.750 --> 01:22:02.910
die

01:22:02.910 --> 01:22:06.270
mit beiden Code-Basen im Prinzip nichts zu tun hatten.

01:22:07.690 --> 01:22:08.350
Ja, da gibt es

01:22:08.350 --> 01:22:10.030
verschiedene Magie mit dem Flow irgendwie was.

01:22:10.410 --> 01:22:10.670
Genau.

01:22:13.670 --> 01:22:15.430
Das war der Proxy-Pattern.

01:22:15.430 --> 01:22:16.330
Das ist ein ganz interessanter Pattern.

01:22:16.330 --> 01:22:16.810
Ja, genau.

01:22:18.850 --> 01:22:19.910
So eine Strategy

01:22:19.910 --> 01:22:21.890
ist halt auch was ganz Interessantes noch.

01:22:22.050 --> 01:22:23.990
Vielleicht, das wäre so eins, was ich reinbringen würde.

01:22:24.210 --> 01:22:24.590
Aber Max,

01:22:26.190 --> 01:22:27.490
Jochen, magst du vielleicht noch eins?

01:22:28.890 --> 01:22:30.010
Ja, also ich würde

01:22:30.010 --> 01:22:31.330
zum Beispiel Fassade.

01:22:31.830 --> 01:22:32.750
Das ist halt sozusagen wie

01:22:32.750 --> 01:22:35.830
baut man eine API

01:22:35.830 --> 01:22:37.530
sozusagen, wenn man eine komplizierte

01:22:37.530 --> 01:22:40.030
Geschichte hat mit vielen Objekten oder so,

01:22:40.090 --> 01:22:41.410
dann baut man davor halt

01:22:41.410 --> 01:22:42.770
eine

01:22:42.770 --> 01:22:45.850
API, die jetzt irgendwie einfacher zu bedienen ist.

01:22:46.170 --> 01:22:47.750
Das ist auch etwas, was man häufig hat

01:22:47.750 --> 01:22:49.970
und würde ich jetzt sagen, so in

01:22:49.970 --> 01:22:51.370
Python, was man da ganz oft macht,

01:22:51.990 --> 01:22:53.930
ist ja eben nicht das Pattern zu verwenden, sondern das

01:22:53.930 --> 01:22:55.030
halt irgendwie in

01:22:55.030 --> 01:22:57.990
PY zu schreiben sozusagen,

01:22:58.090 --> 01:22:59.790
was halt exportiert werden soll und

01:22:59.790 --> 01:23:01.890
quasi alles so

01:23:01.890 --> 01:23:03.830
umzuorganisieren, dass es dann halt von außen

01:23:03.830 --> 01:23:05.650
gut aussieht. Ja, genau.

01:23:07.890 --> 01:23:08.330
Ja.

01:23:09.250 --> 01:23:11.350
Decorator sind ein Python-Sprachfeature inzwischen.

01:23:12.690 --> 01:23:15.590
Das war auch mal ein separates Muster.

01:23:17.010 --> 01:23:19.430
Aber ich meine, Decorator-Pattern ist das nicht das,

01:23:19.490 --> 01:23:21.250
wo man so etwas machen kann,

01:23:21.390 --> 01:23:22.830
wie wenn man aus einem File liest,

01:23:22.990 --> 01:23:25.310
dann die Leerzeilen wegschmeißen oder sowas?

01:23:25.390 --> 01:23:27.090
Man rappt den Funktionsabruf und irgendwas.

01:23:27.190 --> 01:23:29.050
Input und Output kann man dann immer modifizieren.

01:23:29.790 --> 01:23:31.950
Nee, das ist ein Python-Decorator.

01:23:32.110 --> 01:23:33.470
Also das mit dem Add irgendwas drüber.

01:23:34.110 --> 01:23:36.190
Aber ich meine, das Decorator-Pattern wäre ein bisschen anders.

01:23:36.790 --> 01:23:38.010
Aber vielleicht täusche ich mich auch.

01:23:38.070 --> 01:23:38.530
Weiß nicht mehr genau.

01:23:39.110 --> 01:23:40.410
Ich meinte, das wäre halt irgendwie sowas,

01:23:41.370 --> 01:23:41.970
dass du halt

01:23:41.970 --> 01:23:44.350
sozusagen

01:23:44.350 --> 01:23:46.170
eben

01:23:46.170 --> 01:23:48.930
du tust halt so,

01:23:49.070 --> 01:23:50.770
als wäre das ein normales File, aber

01:23:50.770 --> 01:23:52.750
in Wirklichkeit schmeißt das Objekt,

01:23:52.850 --> 01:23:54.990
was du halt mit dem Decorator-Pattern

01:23:54.990 --> 01:23:56.570
gebaut hast, halt intern, weiß ich nicht,

01:23:56.610 --> 01:23:58.770
sowas wie Leerzeilen weg oder Dinge, die nicht gepasst werden können

01:23:58.770 --> 01:24:00.670
oder so. Tatsächlich ist es gerade

01:24:00.670 --> 01:24:02.450
auch so ein bisschen ähnlich zu

01:24:02.450 --> 01:24:04.190
dem Proxy, wie wir es beschrieben haben.

01:24:04.350 --> 01:24:06.690
Da ist in Python der Unterschied nicht so groß.

01:24:07.550 --> 01:24:08.470
Ja, ja. Hier wird nochmal,

01:24:08.650 --> 01:24:10.650
Also ich gucke gerade immer so ein bisschen nochmal die Wiki-Seiten

01:24:10.650 --> 01:24:12.730
nebenbei nach. Beim Dekorierer

01:24:12.730 --> 01:24:14.150
wird nochmal explizit darauf

01:24:14.150 --> 01:24:16.590
hingewiesen, dass man hier halt chainen kann.

01:24:17.310 --> 01:24:18.670
Das kannst du mit Proxy aber auch machen.

01:24:19.390 --> 01:24:20.530
Dass du da mehrere

01:24:20.530 --> 01:24:21.430
hintereinander schaltest.

01:24:23.050 --> 01:24:23.170
Ja.

01:24:25.650 --> 01:24:26.050
Ja.

01:24:29.570 --> 01:24:30.350
Ansonsten, was mir noch

01:24:30.350 --> 01:24:32.490
letztens

01:24:32.490 --> 01:24:33.970
ist mir das aufgefallen.

01:24:34.310 --> 01:24:36.430
Mysterium, ich weiß nicht, in welcher Episode wir das hatten.

01:24:36.890 --> 01:24:38.030
Da habe ich mich irgendwann mal gewundert.

01:24:38.650 --> 01:24:41.450
da dachte ich zuerst, das muss irgendwann letztes Jahr

01:24:41.450 --> 01:24:43.330
gewesen sein, ob das irgendwie eine Python 3.8

01:24:43.330 --> 01:24:45.490
Neuerung gewesen wäre oder so. Ich weiß es

01:24:45.490 --> 01:24:47.410
nicht. Ich hatte mit Listen von irgendwelchen Dingen zu tun,

01:24:47.590 --> 01:24:49.130
mit Listen von Integers

01:24:49.130 --> 01:24:50.730
und das war

01:24:50.730 --> 01:24:53.330
deutlich kleiner, als ich das

01:24:53.330 --> 01:24:53.870
gedacht hätte.

01:24:55.090 --> 01:24:56.370
Ich dachte so, hä, komisch,

01:24:57.110 --> 01:24:58.870
also es braucht tatsächlich nur

01:24:58.870 --> 01:24:59.610
irgendwie

01:24:59.610 --> 01:25:04.910
8 Byte irgendwie pro

01:25:04.910 --> 01:25:07.270
Integer. Eigentlich hätte ich jetzt mit

01:25:07.270 --> 01:25:09.250
deutlich mehr gerechnet. Irgendwie, weiß ich nicht,

01:25:09.350 --> 01:25:10.050
eher so

01:25:10.050 --> 01:25:13.330
23 oder weiß ich irgendwas von dem

01:25:13.330 --> 01:25:15.270
Dreh. Darum ist

01:25:15.270 --> 01:25:17.090
das so viel kleiner. Und

01:25:17.090 --> 01:25:19.150
die Antwort darauf habe ich jetzt gefunden und

01:25:19.150 --> 01:25:21.170
das ist eigentlich blöd, aber ich weiß nicht, wisst ihr

01:25:21.170 --> 01:25:23.150
das zufällig oder hättet ihr eine Ahnung gehabt, was das

01:25:23.150 --> 01:25:24.190
hätte sein können?

01:25:25.250 --> 01:25:26.610
Also ich habe halt eine Liste gemacht mit

01:25:26.610 --> 01:25:29.210
100 Millionen Integers und

01:25:29.210 --> 01:25:30.970
das war halt dann bloß 800 Megabyte im Hauptspeicher

01:25:30.970 --> 01:25:33.230
und ich hätte aber eigentlich erwartet, dass es deutlich mehr

01:25:33.230 --> 01:25:33.670
sein müssen.

01:25:35.350 --> 01:25:36.850
Okay, hat er Renundanzen weggelassen, oder?

01:25:37.270 --> 01:25:50.830
Ja, nee, das, was da tatsächlich passiert ist, ist halt intern benutzer der Python-Interpreter auch ein Pattern, um halt Integers, und zwar nur kleine Integers sozusagen, da Hauptspeicher zu sparen.

01:25:51.630 --> 01:25:53.790
Das Pattern nennt man Flyweight.

01:25:55.570 --> 01:25:59.710
Und die Integer von 0 bis 255, glaube ich,

01:25:59.730 --> 01:26:01.510
sind halt irgendwie immer die gleichen.

01:26:01.650 --> 01:26:04.450
Also man kriegt immer das gleiche Integer sozusagen zu sehen.

01:26:04.590 --> 01:26:08.510
Und deswegen ist das halt im Hauptspeicher deutlich kleiner.

01:26:08.730 --> 01:26:11.990
Das heißt, es gibt halt sozusagen nur...

01:26:11.990 --> 01:26:13.050
Ist ja auch eine Form von Singleton.

01:26:13.410 --> 01:26:15.570
Es ist sehr ähnlich zu Singleton, genau.

01:26:16.610 --> 01:26:18.510
Also eigentlich ist das halt für solche Dinge gedacht,

01:26:18.510 --> 01:26:27.410
wie, du hast halt, wenn du jetzt einen, weiß ich nicht, einen Textprocessor hast,

01:26:27.550 --> 01:26:32.610
irgendwie so ein Programm, sowas wie Word oder so, und wenn das jetzt irgendwie Buchstaben rendert,

01:26:32.750 --> 01:26:40.470
dann willst du halt nicht immer quasi alles, was halt in, der Buchstabe ist halt ein Objekt,

01:26:40.670 --> 01:26:44.710
dann willst du nicht immer alles für jeden Buchstaben, was da dran hängt, nochmal haben,

01:26:44.710 --> 01:26:46.730
sondern du willst es halt nur den Teil

01:26:46.730 --> 01:26:48.830
in dem Buchstaben austauschen, der halt ausgetauscht

01:26:48.830 --> 01:26:50.730
werden soll und der ganze Rest bleibt ja einfach immer gleich.

01:26:51.650 --> 01:26:52.770
Und genau, für sowas ist es eigentlich

01:26:52.770 --> 01:26:54.810
gedacht und in Python wird es halt auch für

01:26:54.810 --> 01:26:55.790
Integers verwendet.

01:26:56.850 --> 01:26:58.190
Und deswegen ist halt, wenn man jetzt

01:26:58.190 --> 01:27:00.750
sagt, Liste

01:27:00.750 --> 01:27:02.650
von 100 Millionen Integers, also für E in

01:27:02.650 --> 01:27:04.810
Range, weiß ich nicht, 100 Millionen,

01:27:05.390 --> 01:27:06.710
aber dann sagt man halt irgendwie sowas

01:27:06.710 --> 01:27:08.750
wie 0 oder 5 oder so, dann ist das halt

01:27:08.750 --> 01:27:10.870
sehr klein. Aber wenn man sagt,

01:27:11.370 --> 01:27:12.390
nicht, also

01:27:12.390 --> 01:27:15.230
nicht 0, sondern irgendwie

01:27:15.230 --> 01:27:17.150
i, dann wird es plötzlich sehr groß.

01:27:17.630 --> 01:27:18.790
Also dann hat man den Vorteil nicht mehr.

01:27:19.450 --> 01:27:21.190
Aber genau, da hatte ich mich

01:27:21.190 --> 01:27:23.210
irgendwann mal drüber gewundert und jetzt

01:27:23.210 --> 01:27:24.970
habe ich irgendwann zufällig gesehen,

01:27:25.390 --> 01:27:26.010
woran das lag.

01:27:27.290 --> 01:27:29.230
In Python gibt es ja noch den Begriff in-turning

01:27:29.230 --> 01:27:31.430
für. Das ist zu sagen,

01:27:31.610 --> 01:27:31.790
da wird,

01:27:33.030 --> 01:27:35.450
das kann man dann auch ganz gut sehen, wenn man halt die Objekte

01:27:35.450 --> 01:27:37.330
dann mit einem Identitätsvergleich

01:27:37.330 --> 01:27:38.490
halt anguckt.

01:27:39.390 --> 01:27:40.870
Dann sind es halt tatsächlich wirklich immer,

01:27:41.090 --> 01:27:42.870
dass das Is das gleiche ist.

01:27:44.450 --> 01:27:46.330
Und das gibt es bei Strings halt auch.

01:27:46.950 --> 01:27:48.430
Da gibt es auch in einem bestimmten Bereich

01:27:48.430 --> 01:27:50.470
irgendwas mit Strings,

01:27:50.630 --> 01:27:52.370
die kürzer sind als so und so lang

01:27:52.370 --> 01:27:54.230
und kein Leerzeichen enthalten.

01:27:54.890 --> 01:27:56.050
Und du machst ihn zweimal,

01:27:56.230 --> 01:27:58.610
also du jagst ihn auch zweimal durch den Literal durch,

01:27:59.130 --> 01:28:00.690
sind am Ende die gleichen Strings.

01:28:03.310 --> 01:28:05.030
Das ist so ähnlich wie bei den Integern.

01:28:05.030 --> 01:28:05.450
Ja.

01:28:07.030 --> 01:28:07.590
So.

01:28:08.550 --> 01:28:08.830
Wow.

01:28:10.430 --> 01:28:11.030
Okay.

01:28:11.090 --> 01:28:13.450
und also das, was ich halt sonst immer noch

01:28:13.450 --> 01:28:15.150
ganz gerne mag, ist das Strategy-Ding

01:28:15.150 --> 01:28:17.630
und das ist im Prinzip halt das Thema von

01:28:17.630 --> 01:28:19.650
wie du halt Code flexibilisieren möchtest

01:28:19.650 --> 01:28:20.930
und zwar

01:28:20.930 --> 01:28:23.170
gegebenenfalls auch noch auf eine Plugable-Art

01:28:23.170 --> 01:28:25.650
du könntest halt normalerweise, wenn du

01:28:25.650 --> 01:28:27.450
ein komplexes If-Else

01:28:27.450 --> 01:28:28.730
hast, oder

01:28:28.730 --> 01:28:31.450
If-Else, If-Else, If-Else-Else

01:28:32.470 --> 01:28:33.570
ähm

01:28:33.570 --> 01:28:34.150
äh, Elif

01:28:34.150 --> 01:28:36.710
ähm, und

01:28:36.710 --> 01:28:39.370
du willst es flexibilisieren, weil da kommt noch ein Fall dazu

01:28:39.370 --> 01:28:40.870
noch ein Fall dazu, noch ein Fall dazu

01:28:40.870 --> 01:28:47.490
Zum Beispiel sowas wie, aha, du möchtest unterschiedlichen Code ausführen, je nach Sprache, die wir unterstützen.

01:28:48.670 --> 01:28:59.770
Dann kannst du halt das lange Elif so refaktorieren, dass du jeden Teil davon in eine eigene Funktion packst.

01:29:00.290 --> 01:29:19.990
Und entweder legst du die alle nach einem bestimmten Schema benannt in eine Klasse, sagst also sozusagen Class Country Address Format und die Methoden da drauf sind dann entsprechend zum Beispiel die ISO-Codes von den Ländern.

01:29:20.690 --> 01:29:35.950
Und wenn du dann für eine Adresse, die du hast, dann sowas formatieren möchtest, dann kannst du sagen, so, dann schnappen wir uns die Klasse, lesen von dem Objekt runter den ISO-Code von dem Land und rufen dann die Methode auf, deren Namen dem ISO-Code entspricht.

01:29:37.150 --> 01:30:02.490
Und dann kannst du natürlich dir auch überlegen, das muss ich ja nicht unbedingt auf einer Klasse machen, ich kann ja auch einfach ein Dictionary irgendwo hinlegen, wo diese ISO-Codes drinstehen und lade damit sozusagen andere Drittanbieter-Packages ein, in dieses Dict hinein, andere Arten von, noch andere ISO-Codes reinzuschreiben, die ich halt noch nicht kannte und mein Code ist dann in der Lage, halt jede beliebige Art der Formatierung aufzurufen.

01:30:02.490 --> 01:30:11.170
oder jemand anders kann auch hergehen und sagen, hey, ich definiere dein Format für italienische Adressen, gefällt mir nicht,

01:30:11.270 --> 01:30:16.230
also überschreibe ich jetzt diesen DICT-Eintrag von IT mit meiner eigenen Methode

01:30:16.230 --> 01:30:24.270
und der Code, der das aufruft, der hat halt jetzt keine hartcodierten LFL-Zweige mehr,

01:30:24.370 --> 01:30:28.490
sondern der macht immer bloß noch dieses Dictionary-Lookup von, ja, mit welcher Methode soll ich es denn formatieren?

01:30:29.710 --> 01:30:32.110
Und das ist dann halt eine sogenannte Strategy im Prinzip.

01:30:32.490 --> 01:30:39.110
Und was ist ein Observer?

01:30:45.690 --> 01:30:46.990
Ich gucke nach.

01:30:47.330 --> 01:30:48.850
Muss ich hier auch nachgucken.

01:30:49.270 --> 01:30:50.610
Let me google this for you.

01:30:50.870 --> 01:30:52.870
Also ich glaube, das ist, ah doch, warte mal, das ist halt,

01:30:53.610 --> 01:30:55.370
wenn du benachrichtigt werden

01:30:55.370 --> 01:30:57.590
möchtest über, wenn sich irgendwo was geändert hat.

01:30:57.910 --> 01:30:59.450
Also bei dir auch, ob sie dir einen Bescheid

01:30:59.450 --> 01:30:59.690
sagt.

01:31:00.490 --> 01:31:04.910
du registrierst

01:31:04.910 --> 01:31:06.950
dich halt irgendwo quasi.

01:31:07.170 --> 01:31:09.050
Also alle, die benachrichtigt werden möchten,

01:31:09.310 --> 01:31:10.610
registrieren sich irgendwie und dann

01:31:10.610 --> 01:31:12.630
rufst du da einmal

01:31:12.630 --> 01:31:13.810
halt das auf

01:31:13.810 --> 01:31:16.130
und dann werden halt alle benachrichtigt.

01:31:16.450 --> 01:31:18.510
Ach Gott, ja, es ist lange her,

01:31:18.590 --> 01:31:20.250
dass ich mich damit verständigt habe.

01:31:22.890 --> 01:31:24.030
Das hat man im SOAP auch.

01:31:24.130 --> 01:31:26.510
Das war das Event-Handling-System

01:31:26.510 --> 01:31:26.950
tatsächlich.

01:31:28.230 --> 01:31:29.290
Das ist halt ein

01:31:29.290 --> 01:31:33.350
Du hast zwei Enden, die da mitspielen müssen.

01:31:33.470 --> 01:31:39.310
Das eine ist, du möchtest halt, dass zu bestimmten Ereignissen in deiner Anwendung

01:31:39.310 --> 01:31:42.950
andere Leute flexibel definieren können, was da alles noch passieren soll.

01:31:45.170 --> 01:31:48.170
Das heißt, du hast sowas wie, okay, ich habe hier eine Methode,

01:31:48.590 --> 01:31:51.510
ein Datensatz wird geändert, dann änderst du den Datensatz

01:31:51.510 --> 01:31:54.310
und am Ende von der Methode schreibst du einmal sowas rein wie

01:31:54.310 --> 01:31:57.730
Eventsystem.event

01:31:57.730 --> 01:31:59.030
oder Trigger

01:31:59.030 --> 01:32:00.950
und dann kannst du zum Beispiel

01:32:00.950 --> 01:32:03.450
übergeben den Namen eines Events

01:32:03.450 --> 01:32:05.130
à la Changed

01:32:05.130 --> 01:32:05.990
Record

01:32:05.990 --> 01:32:09.430
kannst auch alle möglichen Sachen

01:32:09.430 --> 01:32:11.070
machen, um das zu identifizieren, du kannst auch

01:32:11.070 --> 01:32:13.010
Singleton-Objekte machen, um Events zu registrieren

01:32:13.010 --> 01:32:14.990
oder Interface oder was immer, aber im einfachsten Fall

01:32:14.990 --> 01:32:17.110
sagst du sowas wie Event Trigger

01:32:17.110 --> 01:32:18.590
Event Name

01:32:18.590 --> 01:32:20.350
und danach übergibst du zum Beispiel

01:32:20.350 --> 01:32:22.670
irgendeinen event-spezifischen Payload

01:32:22.670 --> 01:32:27.670
Und das ist in Python ja auch schön zu machen, weil du ja auch mit Stern-Arcs, Stern-Stern-KW-Arcs arbeitest.

01:32:27.700 --> 01:32:45.360
Aber du würdest halt sagen, so, Record Change als Event und hier ist das Objekt, was sich geändert hat und jemand anders kann zu dem Event-System als unparteiischen Dritten hingehen und sagen, so, hier ist eine Funktion, die übergebe ich dir jetzt, die rufst du bitte immer dann auf, wenn ein Record Change Event kommt.

01:32:45.360 --> 01:33:00.540
Das ist so, wie man es in JavaScript ja auch kennt, dass man sagt, ich möchte bei einem Mausklick benachrichtigt werden, ich möchte bei einem Tastaturanschlag benachrichtigt werden, so kann man das natürlich auch einfach für beliebige Dinge kodieren und wichtig dabei ist halt, daraus baut man sich sein eigenes Framework.

01:33:00.540 --> 01:33:02.580
in JavaScript ist über das DOM

01:33:02.580 --> 01:33:04.040
definiert, welche Events da gibt

01:33:04.040 --> 01:33:06.680
und das ist eine Art, wie man sich selber solche Events

01:33:06.680 --> 01:33:08.320
halt bauen kann, dass man sagt, so, okay,

01:33:09.240 --> 01:33:10.580
wenn auf

01:33:10.580 --> 01:33:12.120
einem Record-Objekt

01:33:12.120 --> 01:33:14.520
das Save aufgerufen wird, dann triggert der gleichzeitig

01:33:14.520 --> 01:33:16.780
noch, wenn sich tatsächlich was geändert hat,

01:33:17.160 --> 01:33:18.740
diesen Event und dann kannst du zum Beispiel

01:33:18.740 --> 01:33:20.160
solche Dinge tun, wie wieder

01:33:20.160 --> 01:33:22.740
loggen oder nochmal ein anderes Event

01:33:22.740 --> 01:33:24.700
mitschreiben oder keine Ahnung.

01:33:24.760 --> 01:33:26.660
Also quasi Eventsignale abfangen quasi.

01:33:26.960 --> 01:33:28.280
Kann man Signale abfangen, genau.

01:33:29.140 --> 01:33:53.420
Und wichtig ist halt an der Stelle, das ist in Python dann typischerweise eine synchrone Aktion, weil ja im Prinzip, du rufst die eine Funktion auf, die ruft dann, die macht ein sogenanntes, das nennt sich auch Method Dispatch, die ruft dann auf, die guckt dann nach, da kann man auch überlegen, darf es mehrere Händler geben oder nur einen, in welcher Reihenfolge werden die aufgeführt, das sind dann so wirklich so differenzierte Betrachtungen von dem konkreten Eventsystem, was man sich baut.

01:33:54.520 --> 01:34:04.720
Oder gibt es nur ein Best-Match von, je nachdem, dass ich auch noch auf Typen von den Parametern matche, sowas wie, ich will aufgerufen werden beim Rekord-Change, aber nur, wenn der Rekord vom Typ Person war und solche Sachen.

01:34:05.340 --> 01:34:19.300
Und dann kannst du halt solche Dinge machen wie, der erste, ein User setzt eine Bestellung ab und anderer Code von dir, ein anderes Modul, ist zum Beispiel dafür da, eine E-Mail rauszuschicken, wenn der User seine allererste Bestellung abschickt.

01:34:20.620 --> 01:34:35.220
Ja, da kannst du das halt als völlig komplex, da geht es immer, also häufig geht es bei diesen Sachen darum, wie kann ich Code so geschickt modularisieren, dass ich halt später, wenn ich die Anwendung umbaue, möglichst wenig umstricken muss und mir selber auf den Füßen stehe.

01:34:36.200 --> 01:34:53.740
Idealerweise kannst du halt dann auch mit sowas wie FeatureFlex ganze Module stilllegen und das ergibt aber trotzdem noch eine konsistente Anwendung und nicht, ah, da musst du in der Klasse die drei Zeilen da wegschmeißen, in der Klasse die drei Zeilen, in der Klasse die drei Zeilen, sondern daraus kriegst du halt so eine komponierbare Anwendungsarchitektur im Prinzip nachher.

01:34:56.740 --> 01:35:20.380
Und auch da wichtig, Patterns sind etwas, die entstehen erst, wenn man etwas macht, deswegen ist das ja ein sehr handwerkliches Buch, ein handwerkliches Konzept, im Sinne von, die haben halt, das ist nichts, was man sich hinsetzt und sagt, so wir designen jetzt hier mal ein paar Patterns, sondern das ist halt ein so, wir haben jetzt hier so und so viel drölfzig Anwendungen geschrieben und das da sehe ich ständig in Variation.

01:35:20.380 --> 01:35:22.400
was ist denn jetzt die Essenz von

01:35:22.400 --> 01:35:24.460
diesem Ding in Variation? Ah, okay, das ist

01:35:24.460 --> 01:35:26.240
ein Published Subscriber, das ist ein Observer.

01:35:26.440 --> 01:35:28.420
Okay, alles klar, da hat man also dieses Ende

01:35:28.420 --> 01:35:30.300
und jenes Ende und das Ende und hier jetzt geht der

01:35:30.300 --> 01:35:32.420
Blumenstrauß auf von, wie könnte man das eigentlich

01:35:32.420 --> 01:35:34.380
alles bauen? Und das heißt aber nicht,

01:35:34.480 --> 01:35:36.640
dass man das halt jedes Mal ständig in der Vollausprägung

01:35:36.640 --> 01:35:38.400
baut. Ich weiß, ich sage das jetzt

01:35:38.400 --> 01:35:40.460
zum dritten Mal, aber ich habe

01:35:40.460 --> 01:35:42.440
auch gelernt, wenn man Dinge zum siebten Mal sagt,

01:35:42.540 --> 01:35:44.300
dann hat es die Hälfte der Leute zum ersten Mal gehört.

01:35:45.620 --> 01:35:46.440
Und ich habe heute

01:35:46.440 --> 01:35:48.220
gelernt, weil du gerade vom Blumenstrauß an Methoden sprachst,

01:35:48.220 --> 01:35:50.000
es gibt auch welche Blumen in Blumensträußen?

01:35:50.380 --> 01:35:56.860
Ja, genau. Es gibt auch Welkeblumen. Möchtest du unter den Patterns Welkeblumen suchen?

01:35:57.360 --> 01:36:04.880
Ja, tatsächlich. Du weißt ja nicht genau, was da stimmt, wenn du davon noch keine Ahnung hast und die eben nicht durch Pattern-Publishing von vornherein verstehst.

01:36:04.920 --> 01:36:10.660
Oh ja, das ist das, dies und jenes. Sondern du versuchst halt, dich irgendwie an eine, ich sag mal, clevere Architektur zu halten.

01:36:10.860 --> 01:36:13.360
Oder eine, die du für clever hältst, vielleicht, weil du es noch nicht verstehst.

01:36:13.360 --> 01:36:14.920
oder denkst, du möchtest halt in die Richtung

01:36:14.920 --> 01:36:17.220
entwickeln, um möglicherweise

01:36:17.220 --> 01:36:19.060
flexibel oder modular zu bleiben oder so

01:36:19.060 --> 01:36:21.180
oder halt verschiedene Schnittstellen aufmachen

01:36:21.180 --> 01:36:23.060
zu können, wenn du sie brauchst, dann

01:36:23.060 --> 01:36:25.240
könnte sowas ja passieren, dass man eine welke

01:36:25.240 --> 01:36:27.240
Blume baut, weil man da irgendwelchen Unsinn gebaut hat.

01:36:27.960 --> 01:36:29.140
Also speziell halt,

01:36:29.240 --> 01:36:30.660
das kommt dann eher aus dem Agilen, das

01:36:30.660 --> 01:36:33.220
you ain't gonna need it. Also ich finde

01:36:33.220 --> 01:36:35.060
halt, man sollte sich bei der Anwendungsbewegung extrem

01:36:35.060 --> 01:36:37.080
stark auf den, erst mal

01:36:37.080 --> 01:36:39.200
auf den Inhalt der Anwendung

01:36:39.200 --> 01:36:40.300
konzentrieren

01:36:40.300 --> 01:36:42.960
und erst, wenn man eine gewisse Menge

01:36:42.960 --> 01:36:44.620
und Masse beisammen hat und überhaupt weiß,

01:36:44.740 --> 01:36:46.540
worum es eigentlich geht und was man tut,

01:36:47.460 --> 01:36:48.680
dann kann man irgendwie ans Gärtnern gehen

01:36:48.680 --> 01:36:50.280
und kann gucken, okay, jetzt räumen wir hier mal auf.

01:36:50.460 --> 01:36:52.340
Da ist Python als Sprache natürlich auch wieder

01:36:52.340 --> 01:36:54.660
extrem gut positioniert, weil

01:36:54.660 --> 01:36:56.320
ich habe jetzt

01:36:56.320 --> 01:36:58.580
in den letzten Jahren häufig Projekte

01:36:58.580 --> 01:37:00.720
angefangen mit so, ich fange mit einer einzigen Datei an,

01:37:00.780 --> 01:37:02.940
ich baue bei keinem Package kein Nichts,

01:37:03.280 --> 01:37:04.600
eine einzige Datei, keine

01:37:04.600 --> 01:37:06.500
Dependencies, erstmal nur die Standard-Library

01:37:06.500 --> 01:37:07.920
und mal gucken, wie weit ich komme,

01:37:08.680 --> 01:37:09.940
um das eigentliche Problem mal so

01:37:09.940 --> 01:37:12.460
80% zu lösen, was ich eigentlich gerade habe.

01:37:12.960 --> 01:37:26.520
Und wenn ich dann weiß, worum es hier eigentlich geht, weil ich bin ständig dabei, dann alle Steine wieder auseinander und zusammen und auseinander und zusammen und vorwärts und rückwärts, wenn du da schon zu viel Code angehäuft hast in so einem Moment, dann macht dich das halt langsamer.

01:37:27.240 --> 01:37:53.940
Und das ist ab einem gewissen Punkt dann auch halt legitim, wenn du feststellst, so, jetzt brauchen wir hier irgendwie ein Plugin für NFS und für Ceph und für ein S3 und für so, jetzt müssen wir anfangen, diesen ganzen Code zu restrukturieren, dann ist es halt schön, wenn man in der Hinterhand hat, was gibt es denn da für Patterns, wenn man sowas umstrukturiert, also bauen wir da jetzt, okay, guck mal, hier passt jetzt irgendwie eine Strategy und da passt noch ein Event-Handling-System und dann haben wir den ganzen Code irgendwie reduziert, dann ist es jetzt so, jetzt gefällt es mir.

01:37:55.020 --> 01:37:56.640
Aber für mich ist das immer eine Sache,

01:37:56.740 --> 01:37:58.160
das geht erst am konkreten Objekt.

01:37:58.440 --> 01:38:00.560
Ich kann mich nicht vorher hinsetzen und sagen,

01:38:01.180 --> 01:38:02.840
so, wir bauen jetzt ein neues Backup-System.

01:38:03.240 --> 01:38:04.600
Wir brauchen einen Observer.

01:38:13.020 --> 01:38:15.060
Und ich glaube, was eben ganz wichtig ist,

01:38:15.140 --> 01:38:16.740
was bei den Patterns auch...

01:38:16.740 --> 01:38:18.180
Also Yagni ist auch ein Pattern.

01:38:18.680 --> 01:38:21.360
Nee, Yagni ist eine Methode,

01:38:22.000 --> 01:38:24.860
die aus dem originalen Extreme-Programming kam.

01:38:25.020 --> 01:38:34.020
Und das ist immer, wenn jemand sagt, ah, vielleicht könnten wir, nein. Aber irgendwann in Zug, nein. Aber wenn dann in zwei Jahren, nein.

01:38:37.040 --> 01:38:47.580
Wichtig gegenüber Iagni ist halt, wenn wir auf der Ebene bleiben, ist immer noch Persistence. Persistency means having to say I'm sorry.

01:38:50.300 --> 01:38:51.860
Also, wenn dieses

01:38:51.860 --> 01:38:53.580
you ain't gonna need it wird ein bisschen,

01:38:54.860 --> 01:38:56.180
kriegt ein Gegengewicht durch.

01:38:56.720 --> 01:38:58.160
Ja, aber alles, was du

01:38:58.160 --> 01:39:00.140
als persistente Daten wegschreibst, wird dir

01:39:00.140 --> 01:39:01.800
halt auf Gedeih und Verderb im Nacken hängen.

01:39:03.360 --> 01:39:04.360
Ja, Code ist flexibel.

01:39:04.820 --> 01:39:06.040
Code ist total easy. Kannst

01:39:06.040 --> 01:39:08.140
umbauen, kannst drehen, kannst wenden, solange das

01:39:08.140 --> 01:39:10.060
Interface das gleiche bleibt, alles super.

01:39:10.820 --> 01:39:11.900
Aber wenn du es einmal auf Platte

01:39:11.900 --> 01:39:12.640
geschrieben hast,

01:39:14.140 --> 01:39:16.300
dann kannst du aber wissen, dass das dich in 10 Jahren noch verfolgt.

01:39:18.120 --> 01:39:18.480
Ja.

01:39:19.040 --> 01:39:20.700
Ja, und wenn man das richtig gemacht hat, dann

01:39:20.700 --> 01:39:23.240
hat man halt

01:39:23.240 --> 01:39:25.240
sozusagen auch später noch großen Nutzen.

01:39:25.740 --> 01:39:27.220
Der schöne Spruch da an der Stelle

01:39:27.220 --> 01:39:28.980
ist ja immer irgendwie Daten,

01:39:29.300 --> 01:39:30.880
also gute Daten altern wie Wein.

01:39:31.140 --> 01:39:33.160
Das ist halt schön, wenn man irgendwie mehr gute Daten

01:39:33.160 --> 01:39:34.300
hat. Schlechte wie Milch.

01:39:36.000 --> 01:39:37.120
Ja, Applikationscode,

01:39:37.180 --> 01:39:39.000
wenn man gesagt hat, Applikationscode altert wie Fisch.

01:39:39.540 --> 01:39:41.160
Das ist halt...

01:39:41.160 --> 01:39:42.920
Genau.

01:39:43.880 --> 01:39:45.380
Genau. Wer hat das geschrieben?

01:39:45.380 --> 01:39:46.340
Oh, das war ich.

01:39:47.060 --> 01:39:48.620
Ja, da kann ich mir so ein paar Sachen erinnern.

01:39:49.040 --> 01:39:51.600
Ich habe letztens

01:39:51.600 --> 01:39:52.980
einen Anschluss gekriegt von Jochen.

01:39:53.520 --> 01:39:54.820
Unmöglich, nee, so kannst du das nicht machen.

01:39:55.420 --> 01:39:56.660
Furchtbar, was sieht das denn aus?

01:39:56.780 --> 01:39:58.760
Nee, das geht aber gar nicht. Jochen, das ist von dir.

01:40:00.080 --> 01:40:01.340
Ja, eigentlich

01:40:01.340 --> 01:40:02.540
gar nicht so schlecht, ja.

01:40:05.280 --> 01:40:07.080
Ja, naja, das

01:40:07.080 --> 01:40:09.460
passiert auch

01:40:09.460 --> 01:40:11.460
demnächst. Das passiert durchaus ab und zu.

01:40:11.980 --> 01:40:12.260
Jaja.

01:40:13.040 --> 01:40:15.660
Ich glaube an der Stelle auch, das ist halt der handwerkliche

01:40:15.660 --> 01:40:16.240
Teil wieder.

01:40:17.780 --> 01:40:38.540
Und jetzt mach ich mal die Schleife, wo ich gerade eben hin wollte, die Gang of Four-Leute, die haben alle ein extrem gutes Sprachverständnis selber gehabt von der Sprache, um die es eigentlich geht, mit warum ist das hier ein Problem und welche Mechanik der Sprache steht mir eigentlich im Weg und wie kann ich die halt counteren, sowas wie, wenn ich einen Konstruktor habe, dann bin ich halt auf den Typen festgelegt und kann ich das nicht machen, kann ich das nicht machen, nee, deswegen muss man...

01:40:38.540 --> 01:40:44.500
Und ein Beispiel ist halt bei Java das Getter-Setter-Pattern.

01:40:45.440 --> 01:40:48.000
Wenn du Leute ernsthaft Java-Code schreiben siehst,

01:40:48.080 --> 01:40:50.980
dann bauen die halt für jedes Attribut immer ein, keine Ahnung,

01:40:52.080 --> 01:40:55.020
Klasse Person, Geburtsdatum als Attribut

01:40:55.020 --> 01:40:57.960
und dann ein Set-Geburtsdatum, Get-Geburtsdatum.

01:40:58.560 --> 01:40:59.480
So, warum?

01:41:00.500 --> 01:41:04.480
Weil es in Java später, wenn du mal irgendwie meinst,

01:41:04.520 --> 01:41:05.620
du musst hier was ändern,

01:41:07.220 --> 01:41:16.380
dann hast du keine Chance mehr, wenn irgendwelcher Client-Code auf Attribute zugreift, jemals noch irgendwie dich dazwischen zu hängeln.

01:41:17.340 --> 01:41:27.880
Das ist ein reiner Future-Proofing-Aspekt und ich sehe immer wieder Leute, die aus der Java-Welt kommen, die in Python Code schreiben und dann für jedes Attribut eine Getter-Setter-Methode schreiben.

01:41:29.940 --> 01:41:31.280
Und du siehst sofort, das ist Java.

01:41:31.660 --> 01:41:36.780
Und wenn man dir irgendwann erzählt, nein, es gibt, du kannst im Nachhinein eine Property draus machen.

01:41:37.100 --> 01:41:38.720
Du kannst machen, was du willst, dann ist alles schick.

01:41:39.080 --> 01:41:41.560
Ja, aber, nee, nee.

01:41:43.920 --> 01:41:49.780
Das ist halt, da merkt man halt, es ist extrem wichtig zu verstehen, wie die Sprache selber mechanisch funktioniert.

01:41:50.460 --> 01:41:54.720
Weil nur dann diese ganzen Patterns tatsächlich irgendwie Sinn haben oder keinen Sinn haben.

01:41:57.480 --> 01:42:16.740
Und das ist glaube ich was, was ich halt an der Stelle wieder diesem handwerklichen und sich selber weiterentwickeln mitgeben würde, ist, wenn man halt so Patterns gerade aus anderen Sprachen halt nach Python transportiert, muss man schon immer nochmal extrem gut auf die Suche gehen von, hat es hier nicht irgendeine andere Mechanik in Python, die das schon überflüssig macht.

01:42:18.000 --> 01:42:19.940
Ja, wir haben die Dekoratoren,

01:42:20.460 --> 01:42:22.100
wir haben die Konstrukturen, wir haben New,

01:42:22.260 --> 01:42:24.440
wir haben Getter Setter,

01:42:24.580 --> 01:42:26.000
also wir haben Properties,

01:42:26.540 --> 01:42:27.420
die ganzen Sachen

01:42:27.420 --> 01:42:30.000
und die erschlagen viele von diesen

01:42:30.000 --> 01:42:30.960
anderen Sachen halt.

01:42:35.020 --> 01:42:36.180
Ja, okay.

01:42:36.900 --> 01:42:38.040
Also die Gang of Four Patterns

01:42:38.040 --> 01:42:39.860
habt ihr so einigermaßen einmal kurz

01:42:39.860 --> 01:42:41.020
eingekringelt und

01:42:41.020 --> 01:42:43.980
erwischt. Würde ich sagen.

01:42:43.980 --> 01:42:45.240
Ja, ja.

01:42:45.580 --> 01:42:47.620
Gibt es noch welche, über die ihr unbedingt reden möchtet?

01:42:48.800 --> 01:42:50.740
Naja, es gibt dann auch so ein paar, die halt

01:42:50.740 --> 01:42:52.820
später dazugekommen sind, beziehungsweise Sachen, wo man

01:42:52.820 --> 01:42:54.840
nicht so klar sagen kann, ist das jetzt eigentlich

01:42:54.840 --> 01:42:56.840
ein Design-Pattern oder sowas wie

01:42:56.840 --> 01:42:58.940
ja,

01:42:59.100 --> 01:43:01.260
MVC, weiß ich jetzt nicht, ist das ein Design-Pattern?

01:43:01.260 --> 01:43:03.140
Ja, nicht, ein bisschen größer, keine Ahnung.

01:43:04.160 --> 01:43:05.120
Model-View-Controller.

01:43:05.300 --> 01:43:06.140
Ja, genau, genau.

01:43:07.940 --> 01:43:09.320
Schwer zu sagen, oder sowas

01:43:09.320 --> 01:43:10.720
wie...

01:43:10.720 --> 01:43:12.080
Model-View-Controller ist älter.

01:43:13.780 --> 01:43:14.900
Das war nicht,

01:43:15.440 --> 01:43:16.440
also Model-View ist selber,

01:43:16.760 --> 01:43:19.020
Das ist eine Anwendungsarchitektur.

01:43:20.220 --> 01:43:20.920
Die kam aber

01:43:20.920 --> 01:43:24.640
82, 83 irgendwann.

01:43:26.600 --> 01:43:28.820
Also die war halt schon auch, bevor man sich mit dem Begriff

01:43:28.820 --> 01:43:30.880
Patterns auseinandergesetzt hatte an der Stelle.

01:43:31.340 --> 01:43:32.160
Ja, kann gut sein.

01:43:35.040 --> 01:43:36.900
Ja, oder halt

01:43:36.900 --> 01:43:38.920
so etwas wie, ich glaube, die kam aber dann

01:43:38.920 --> 01:43:39.640
tatsächlich später

01:43:39.640 --> 01:43:42.600
Datenbank, so ORM,

01:43:43.100 --> 01:43:44.480
so wie baue ich eigentlich ein ORM?

01:43:44.680 --> 01:43:46.500
so was, eben Active Record oder halt

01:43:46.500 --> 01:43:47.960
Datamapper-Pattern.

01:43:49.500 --> 01:43:50.700
Das ist halt auch so,

01:43:50.940 --> 01:43:51.180
tja,

01:43:52.420 --> 01:43:54.720
keine Ahnung, ob das

01:43:54.720 --> 01:43:56.460
Pattern sind oder...

01:43:56.460 --> 01:43:57.500
Was ist denn das jetzt schon wieder?

01:43:58.440 --> 01:44:00.640
Das ist halt die Frage, wie man

01:44:00.640 --> 01:44:01.780
sozusagen

01:44:01.780 --> 01:44:04.600
die Übersetzung macht zwischen Sachen,

01:44:04.600 --> 01:44:06.400
die jetzt in der Datenbank, vor allem in

01:44:06.400 --> 01:44:08.480
relationalen Datenbanken liegen und halt

01:44:08.480 --> 01:44:10.660
Objekten in Python

01:44:10.660 --> 01:44:12.640
beispielsweise und das sind halt

01:44:12.640 --> 01:44:14.420
diese beiden unterschiedlichen Dinge, also

01:44:14.420 --> 01:44:16.740
Active Record ist halt das, was Django macht

01:44:16.740 --> 01:44:18.220
oder halt auch Ruby on Rails

01:44:18.220 --> 01:44:20.700
und Data Mapper ist halt

01:44:20.700 --> 01:44:22.320
das, was SQL Alchemy macht

01:44:22.320 --> 01:44:23.720
und Hato.

01:44:26.240 --> 01:44:26.840
Und wo ist der Unterschied?

01:44:34.640 --> 01:44:35.480
Naja, also

01:44:35.480 --> 01:44:38.520
du hast

01:44:38.520 --> 01:44:38.860
du

01:44:38.860 --> 01:44:42.600
Kennst du dich

01:44:42.600 --> 01:44:44.720
Kennt sich jemand mit SQL-Alchemy gut aus?

01:44:45.540 --> 01:44:49.640
Ja, ich kenne mich halt mit SQL-Alchemy aus.

01:44:49.720 --> 01:44:51.380
Ich kenne mich wiederum mit Active Record nicht aus.

01:44:51.380 --> 01:44:51.820
Super gut.

01:44:53.400 --> 01:44:55.280
Ich lese jetzt gerade mal schnell mal wieder.

01:44:58.080 --> 01:45:00.020
Dann fangst du noch mit Active Record an, Jochen?

01:45:00.740 --> 01:45:02.080
Ja, also da ist es halt so,

01:45:02.200 --> 01:45:07.160
dass quasi jedes Objekt repräsentiert halt eine Zeile in einer Datenbank

01:45:07.160 --> 01:45:09.540
und die Attribute sind halt die Spalten.

01:45:10.600 --> 01:45:15.000
Und genau, wenn man halt irgendwie Dinge aus der Datenbank holt,

01:45:15.060 --> 01:45:16.760
dann hat man halt eine Liste von diesen Objekten.

01:45:17.040 --> 01:45:19.500
Und wenn man der Attribute ändert, dann speichert das halt die,

01:45:19.680 --> 01:45:21.660
kann man halt sagen, auf dem Objekt, auf der Zeile halt,

01:45:22.380 --> 01:45:24.560
speichert das und dann geht das halt zurück in die Datenbank.

01:45:24.560 --> 01:45:30.180
Und ja, genau, so sieht das halt ungefähr aus.

01:45:32.580 --> 01:45:34.600
Und normalerweise hat man halt eine Klasse, die,

01:45:35.440 --> 01:45:37.600
jedenfalls, ich sage jetzt mal so, wie es mit Django ist,

01:45:38.040 --> 01:45:41.600
hast du halt eine Klasse, die definiert,

01:45:41.820 --> 01:45:46.080
welche Spalten es halt in dieser Tabelle gibt.

01:45:46.080 --> 01:45:50.020
Also du hast pro Tabelle eine Klasse

01:45:50.020 --> 01:45:54.500
und die Spalten sind halt Attribute auf dieser Klasse,

01:45:55.060 --> 01:45:55.680
die halt so ein bisschen,

01:45:55.960 --> 01:45:57.740
das ist halt diese Deskriptoren-Geschichte,

01:45:58.320 --> 01:46:00.780
ein bisschen eigenartig definiert sind.

01:46:01.660 --> 01:46:04.480
Und dann kann man halt auch aus diesen Klassen

01:46:04.480 --> 01:46:05.940
die Tabellen direkt erzeugen,

01:46:06.100 --> 01:46:11.140
Auch die Relationen zwischen den Tabellen

01:46:11.140 --> 01:46:13.200
sind in den Attributen enthalten.

01:46:14.140 --> 01:46:18.580
Das heißt, ich kann, wenn ich mir diese Tabellen hindefiniert habe,

01:46:18.580 --> 01:46:21.980
auch komplett mein Datenbankschema aus den Dingern erzeugen.

01:46:25.000 --> 01:46:28.900
Immer wenn einzelne Sachen passieren sollen auf einer Zeile,

01:46:28.980 --> 01:46:33.260
dann sind das Methoden auf dieser Klasse.

01:46:34.400 --> 01:46:36.480
eine einzelne Instanz ist eben eine konkrete Zeile

01:46:36.480 --> 01:46:38.440
und wenn etwas alle

01:46:38.440 --> 01:46:40.400
Sachen betreffen soll oder viele Zeilen,

01:46:40.500 --> 01:46:42.380
dann sind das halt sogenannte, also in Django heißen die

01:46:42.380 --> 01:46:42.940
Model Manager,

01:46:43.940 --> 01:46:46.320
die dann halt irgendwie

01:46:46.320 --> 01:46:48.240
eine ganze Reihe von Sachen updaten oder halt

01:46:48.240 --> 01:46:48.960
irgendwie

01:46:48.960 --> 01:46:52.600
eine Reihe von Zeilen

01:46:52.600 --> 01:46:54.480
löschen und so kann man

01:46:54.480 --> 01:46:56.340
das dann halt aufteilen und alle Methoden, die irgendwie

01:46:56.340 --> 01:46:58.040
auf einer einzelnen Zeile was machen sollen,

01:46:58.180 --> 01:47:00.320
gehen halt in die Klasse und

01:47:00.320 --> 01:47:02.340
alle Methoden, die halt auf vielen Sachen

01:47:02.340 --> 01:47:03.860
was machen, gehen halt in den Manager auch,

01:47:04.300 --> 01:47:05.820
die jetzt irgendwas filtern oder so.

01:47:06.340 --> 01:47:07.900
Und dann, ja, genau.

01:47:08.200 --> 01:47:09.040
So funktioniert es ungefähr.

01:47:10.840 --> 01:47:11.820
Und jetzt kommt Psycholagmy.

01:47:12.580 --> 01:47:14.340
Ja, Datamapper.

01:47:15.300 --> 01:47:16.200
Genau, ich habe jetzt selber

01:47:16.200 --> 01:47:18.140
erstmal noch mir die Active Record-Sachen

01:47:18.140 --> 01:47:20.320
angeguckt. Das Interessante bei Active Record ist ja,

01:47:20.380 --> 01:47:21.880
dass du relativ klar

01:47:21.880 --> 01:47:24.300
Tabelle und Klasse aufeinander

01:47:24.300 --> 01:47:26.440
mappst. Und beim Datamapper

01:47:26.440 --> 01:47:28.500
ist es tatsächlich so, du entkoppelst es komplett

01:47:28.500 --> 01:47:30.460
und die Objekte

01:47:30.460 --> 01:47:32.340
müssen halt, also beim Active Record hat

01:47:32.340 --> 01:47:34.400
zum Beispiel die Klasse gerne

01:47:34.400 --> 01:47:36.280
irgendwie eine Save-Methode, wo du

01:47:36.280 --> 01:47:38.340
sagen kannst, ich äh, ändere ein paar

01:47:38.340 --> 01:47:40.380
Attribute und dann kannst du irgendwie Save aufrufen

01:47:40.380 --> 01:47:41.640
und dann ist die irgendwie in der Datenbank.

01:47:42.260 --> 01:47:44.120
Ähm, das ist zumindest das klassische Pattern dafür,

01:47:44.340 --> 01:47:46.100
äh, wie es bei Django jetzt gerade aussieht, weiß ich nicht.

01:47:46.340 --> 01:47:48.180
Ja, ja, doch, ist genauso, ja. So, genau,

01:47:48.280 --> 01:47:50.360
und bei Secret Alchemist ist es so, dass im Prinzip

01:47:50.360 --> 01:47:52.460
deine Klassen von der Datenbank

01:47:52.460 --> 01:47:53.160
überhaupt nichts wissen.

01:47:54.380 --> 01:47:55.760
Ähm, es gibt

01:47:55.760 --> 01:47:58.180
einen deklarativen Stil, bei dem du tatsächlich

01:47:58.180 --> 01:48:00.160
dann wieder innerhalb, da kannst du wieder sagen,

01:48:00.160 --> 01:48:02.200
doch, die Klasse weiß was davon, weil du es

01:48:02.200 --> 01:48:04.800
halt eng aneinander koppeln möchtest, um solche Effekte zu haben,

01:48:04.920 --> 01:48:09.260
wie dass du deine Datenbank anhand deiner Klassendefinition halt ableiten kannst.

01:48:09.640 --> 01:48:12.160
Aber im Prinzip gibt es dann zwei getrennte Schichten von einmal,

01:48:12.160 --> 01:48:16.660
okay, ich beschreibe hier Tabellen und ich beschreibe Klassen

01:48:16.660 --> 01:48:20.160
und jetzt beschreibe ich, wie diese Tabellen auf Klassen gemappt werden.

01:48:20.260 --> 01:48:21.880
Und da können halt auch alles mögliche reinspielen,

01:48:21.980 --> 01:48:25.940
dass irgendwelche Attribute über komplexere Queries erst zustande kommen

01:48:25.940 --> 01:48:30.000
und dass da irgendwelche komplexen Relationen zu sind und etc.

01:48:30.240 --> 01:48:32.380
und SQL Alchemy bricht das auch extrem

01:48:32.380 --> 01:48:34.480
abstrakt runter, dass du halt mit den Objekten

01:48:34.480 --> 01:48:36.500
nativ arbeitest, ohne irgendwie über die Datenbank

01:48:36.500 --> 01:48:38.520
nachzudenken, und

01:48:38.520 --> 01:48:40.380
dann baut

01:48:40.380 --> 01:48:42.320
der sich, und du brauchst kein separates,

01:48:42.940 --> 01:48:44.480
wenn du viele Aktionen machst, kannst

01:48:44.480 --> 01:48:46.420
du auch einfach auf 100 Objekten rumrechnen,

01:48:47.600 --> 01:48:48.380
und er fasst das

01:48:48.380 --> 01:48:49.780
nach hinten automatisch in die

01:48:49.780 --> 01:48:52.240
optimierten SQL-Statements zum Beispiel zusammen,

01:48:52.320 --> 01:48:54.420
dass er weiß, okay, der Herr hat

01:48:54.420 --> 01:48:56.140
hier 100 Objekte angefasst, jetzt machen wir ein

01:48:56.140 --> 01:48:58.460
großes Update-Statement, was irgendwie einmal sinnvoll aussieht,

01:48:59.040 --> 01:49:00.780
bumm, anstatt halt

01:49:00.780 --> 01:49:02.980
dann die eher naiveren Varianten

01:49:02.980 --> 01:49:04.800
von, okay, jedes Mal safe drücken

01:49:04.800 --> 01:49:06.540
ist jedes Mal irgendwie einmal

01:49:06.540 --> 01:49:08.620
zur Datenbank laufen und speichern drücken oder so.

01:49:10.020 --> 01:49:10.860
Und da

01:49:10.860 --> 01:49:12.760
ist es halt einfach viel, viel flexibler, wenn

01:49:12.760 --> 01:49:14.740
du das Datenbankmodell entkoppeln möchtest.

01:49:15.080 --> 01:49:16.460
Das ist zum Beispiel auch dann, wenn du

01:49:16.460 --> 01:49:18.680
konfrontiert wirst mit, ich habe hier eine fertige

01:49:18.680 --> 01:49:20.640
Datenbank, die besteht seit 20 Jahren, die muss

01:49:20.640 --> 01:49:22.680
jetzt hier irgendwie mal rein. Und dann

01:49:22.680 --> 01:49:24.940
kannst du mit dem Datameter...

01:49:24.940 --> 01:49:26.860
Blala, es ist Zeit fürs

01:49:26.860 --> 01:49:27.160
Bett.

01:49:29.040 --> 01:49:33.340
dann kannst du mal einen Data-Mapper-Pattern

01:49:33.340 --> 01:49:34.920
nämlich

01:49:34.920 --> 01:49:36.940
beliebige Transformationen machen,

01:49:37.420 --> 01:49:38.460
um zu sagen,

01:49:38.920 --> 01:49:40.680
okay, die Datenbank sieht aus wie Kraut und Rüben,

01:49:40.820 --> 01:49:42.780
aber ich habe vorne ein ordentliches

01:49:42.780 --> 01:49:43.600
Object-Model dran.

01:49:45.280 --> 01:49:46.680
So, und bei SQL Alchemy ist das Ganze

01:49:46.680 --> 01:49:48.860
sozusagen, wie heißt es denn da, so schön

01:49:48.860 --> 01:49:50.340
auf 11 gedreht.

01:49:51.940 --> 01:49:52.820
Da ist es so richtig

01:49:52.820 --> 01:49:54.760
laut, da sind die Abstraktionen

01:49:54.760 --> 01:49:56.640
so gut gemacht und die haben sich so viel Mühe

01:49:56.640 --> 01:49:58.700
gegeben, was Performance angeht, dass so Zeug von

01:49:58.700 --> 01:50:19.540
Du machst komplexere Abfragen und er weiß irgendwie, okay, wenn ich das jetzt mache, dann lade ich schon mal irgendwie die nächsten Relations mit und falte irgendwie die Relation-Objekte schon mal in die originale Seqquery mit rein, damit ich nur einmal einen großen Bulk-Transfer am Anfang habe, anstatt nachher bei jedem Attributzugriff nochmal zur Datenbank zu laufen oder so. Und das kannst du da extrem genau aussteuern.

01:50:19.540 --> 01:50:21.120
Das macht ein Django-Manager, oder?

01:50:22.060 --> 01:50:24.540
Ja, in Django ist das, aber da gibt's

01:50:24.540 --> 01:50:26.380
das auch, da werden halt die Sachen,

01:50:28.500 --> 01:50:28.720
also

01:50:28.720 --> 01:50:29.880
das, was man halt nicht will,

01:50:30.480 --> 01:50:32.340
das droht bei Active Record natürlich, ist, dass

01:50:32.340 --> 01:50:34.080
wenn du jetzt zum Beispiel

01:50:34.080 --> 01:50:36.340
irgendwie ein Objekt hast

01:50:36.340 --> 01:50:38.220
und das hat halt irgendwie einen Foreign Key,

01:50:38.460 --> 01:50:40.340
ist halt mit einem anderen Objekt verknüpft

01:50:40.340 --> 01:50:42.180
und dann greifst du auf ein Attribut von dem

01:50:42.180 --> 01:50:44.220
verknüpften Objekt zu und das am besten

01:50:44.220 --> 01:50:46.380
in einer Liste irgendwie von Dingen,

01:50:46.580 --> 01:50:48.380
auf so einer Webseite, wo du halt eine Listenansicht hast

01:50:48.380 --> 01:50:50.340
und dann hast du halt irgendwie, zeigst du halt

01:50:50.340 --> 01:50:52.540
eine Tabelle zum Beispiel an oder halt

01:50:52.540 --> 01:50:54.800
eine Liste von Dingen und nimmst dann halt

01:50:54.800 --> 01:50:56.160
das Attribut von einer verknüpften

01:50:56.160 --> 01:50:58.760
anderen Geschichte, zum Beispiel einen Username

01:50:58.760 --> 01:51:01.080
oder so, der halt an einem von diesen Listenobjekten

01:51:01.080 --> 01:51:02.640
dranhängt, dann kann es halt

01:51:02.640 --> 01:51:04.880
sein, dass du halt, wenn du das naiv machst,

01:51:04.960 --> 01:51:05.480
kriegst du halt

01:51:05.480 --> 01:51:08.280
N plus 1 Queries

01:51:08.280 --> 01:51:10.440
gegen die Datenbank

01:51:10.440 --> 01:51:12.360
und das ist natürlich extrem

01:51:12.360 --> 01:51:14.680
fies und ein Haufen Performance-Probleme

01:51:14.680 --> 01:51:16.580
kommen genau deswegen, aber also in Django

01:51:16.580 --> 01:51:18.080
sagt man dann halt Select Related

01:51:18.080 --> 01:51:19.860
oder so, ja. Genau, dann

01:51:19.860 --> 01:51:22.160
zieht sie, oder Prefetch-Related

01:51:22.160 --> 01:51:23.060
für N

01:51:23.060 --> 01:51:25.960
zu M-Relationen und so, also das geht

01:51:25.960 --> 01:51:27.800
auch alles, man muss halt ein bisschen aufpassen. Machst du das am Model

01:51:27.800 --> 01:51:29.380
oder musst du das irgendwann in der Query machen?

01:51:29.500 --> 01:51:30.860
Das machst du an der Query.

01:51:31.860 --> 01:51:34.120
Genau, bei SQL-Icon, wie kannst du das im Prinzip modellieren?

01:51:34.660 --> 01:51:35.780
Da kannst du halt diese ganzen

01:51:35.780 --> 01:51:37.240
Relationen alle ausdefinieren,

01:51:38.180 --> 01:51:39.780
so mit diesem, auch so richtig mit

01:51:39.780 --> 01:51:41.900
Vor- und Rückreferenzen

01:51:41.900 --> 01:51:43.960
will ich die irgendwie als Listen oder Dicts kriegen

01:51:43.960 --> 01:51:45.500
oder als Attribute oder

01:51:45.500 --> 01:51:47.820
so ein Zeug und kannst dann halt sagen, so und

01:51:47.820 --> 01:51:49.560
irgendwie die Richtung, die machst du bitte als

01:51:49.560 --> 01:51:51.600
Eager-Load und die bitte nicht und folgende 10

01:51:51.600 --> 01:51:53.860
Attribute bitte im Eager-Load wieder rauslassen

01:51:53.860 --> 01:51:55.580
und das kannst du halt so alles

01:51:55.580 --> 01:51:57.560
zurecht tunen, damit du halt dann möglichst

01:51:57.560 --> 01:51:59.460
dummen, konkreten Query-Code

01:51:59.460 --> 01:52:01.480
schreiben kannst, der über so ein Zeug

01:52:01.480 --> 01:52:02.280
nicht mehr nachdenkt.

01:52:04.140 --> 01:52:05.620
Und du kannst bei SQL

01:52:05.620 --> 01:52:06.920
Alchemy auch sehr dynamisch,

01:52:07.280 --> 01:52:09.260
die haben halt auch eine voll getrennte Schicht zwischen,

01:52:09.340 --> 01:52:11.800
ich hab erstmal dieses Object-Mapping-Ding

01:52:11.800 --> 01:52:13.680
und dann hat der nochmal eine komplette

01:52:13.680 --> 01:52:15.560
Abstraktion über SQL drüber, das heißt

01:52:15.560 --> 01:52:17.480
der kann dann halt die ganzen SQL-Dialekte

01:52:17.480 --> 01:52:19.360
halt auch noch nach unten hin.

01:52:19.360 --> 01:52:20.920
Der hat im Prinzip einmal SQL

01:52:20.920 --> 01:52:23.360
in Form von diesem Bilder-Pattern.

01:52:24.160 --> 01:52:25.240
Ja, da kannst du auch sagen, ich hätte gerne eine

01:52:25.240 --> 01:52:27.480
Query, also Query, Klammer auf,

01:52:27.940 --> 01:52:29.300
von folgendem gemappten

01:52:29.300 --> 01:52:31.360
Objekt und dann Punkt

01:52:31.360 --> 01:52:32.480
ähm

01:52:32.480 --> 01:52:33.600
Filter

01:52:33.600 --> 01:52:36.900
Punkt Join, Punkt

01:52:36.900 --> 01:52:39.380
hast du nicht gesehen, immer so Funktions-Chains

01:52:39.380 --> 01:52:41.340
hintendran und er baut dir

01:52:41.340 --> 01:52:43.400
dann nachher tatsächlich einen für die Datenbank,

01:52:43.500 --> 01:52:45.500
die du eigentlich hast, also Postgres und MySQL

01:52:45.500 --> 01:52:47.260
ein syntaktisch korrektes und

01:52:47.260 --> 01:52:48.840
optimiertes Query halt auf

01:52:48.840 --> 01:52:51.240
unter Berücksichtigung von allem, was er über diese

01:52:51.240 --> 01:52:53.340
Mapper weiß, was er gleich noch als irgendwie eager load

01:52:53.340 --> 01:52:55.420
oder nicht machen soll und du kannst

01:52:55.420 --> 01:52:57.340
halt mittendrin immer wieder die Ebenen

01:52:57.340 --> 01:52:59.400
wechseln, ja, du kannst irgendwie im Object Mapping Teil

01:52:59.400 --> 01:53:01.380
sein, drei Zeichen dann

01:53:01.380 --> 01:53:03.300
von diesem generativen, also dann irgendeine Query mit

01:53:03.300 --> 01:53:05.200
dem generativen SQL machen, da dann aber wieder

01:53:05.200 --> 01:53:07.320
gemappte Objekte reinstecken und der kriegt das immer

01:53:07.320 --> 01:53:09.080
so vor und zurück und vor und zurück

01:53:09.080 --> 01:53:11.620
hat halt das Problem

01:53:11.620 --> 01:53:13.240
wenn es, also es tut

01:53:13.240 --> 01:53:15.340
sehr selten nicht, aber man muss sich halt dann

01:53:15.340 --> 01:53:17.240
schon relativ viel mit, schon gut

01:53:17.240 --> 01:53:19.040
mit dem relationalen Datenmodell auskennen,

01:53:19.140 --> 01:53:21.320
um mit dieser Komplexität dann auch umgehen zu können.

01:53:21.820 --> 01:53:23.380
Weil wenn es dir dann mal um die Ohren fliegt,

01:53:23.460 --> 01:53:24.920
dann kommen da halt auch Fehler raus mit so,

01:53:25.000 --> 01:53:25.980
was will der jetzt von mir?

01:53:28.360 --> 01:53:28.720
Ja.

01:53:30.440 --> 01:53:30.840
Naja.

01:53:30.940 --> 01:53:33.160
Wir haben das in Projekten

01:53:33.160 --> 01:53:34.840
eingesetzt, wo es halt teilweise um richtig, richtig

01:53:34.840 --> 01:53:37.060
große Datenmengen ging und da

01:53:37.060 --> 01:53:39.040
dann halt wirklich an diesen Stellen

01:53:39.040 --> 01:53:40.780
alle Stellschrauben zu haben,

01:53:41.180 --> 01:53:42.440
um das gerade zu ziehen,

01:53:43.020 --> 01:53:44.840
das ist halt dann in dem Moment

01:53:44.840 --> 01:53:45.660
extrem viel wert.

01:53:47.240 --> 01:53:49.700
und umgekehrt das Active Record wiederum

01:53:49.700 --> 01:53:52.300
du fängst halt an und hast sofort was, was du präsentieren

01:53:52.300 --> 01:53:52.640
kannst

01:53:52.640 --> 01:53:56.260
das entwickelt sich halt sehr schnell, das ist halt

01:53:56.260 --> 01:53:56.540
super

01:53:56.540 --> 01:54:00.120
ja und dann, ich meine, das geht

01:54:00.120 --> 01:54:02.000
bei SQL Alchemy, ja auch

01:54:02.000 --> 01:54:03.620
ich meine, man kann ja auch immer noch dann einfach auf

01:54:03.620 --> 01:54:05.680
groß SQLs rückfallen, wenn halt

01:54:05.680 --> 01:54:07.920
irgendwas, wenn man irgendwas Spezielles machen

01:54:07.920 --> 01:54:08.880
unbedingt, ja

01:54:08.880 --> 01:54:09.500
ja

01:54:09.500 --> 01:54:13.660
da haben wir

01:54:13.660 --> 01:54:15.760
alle Patterns durch, tatsächlich

01:54:15.760 --> 01:54:17.700
Also du wolltest noch irgendwas zu Datenbanken sagen.

01:54:17.800 --> 01:54:19.720
Ich glaube, da gibt es noch so ein Solid-Modell

01:54:19.720 --> 01:54:20.220
oder sowas.

01:54:21.300 --> 01:54:23.740
Achso, nee, das ist dann nicht Datenbanken, aber das ist auch so

01:54:23.740 --> 01:54:25.580
genau...

01:54:25.580 --> 01:54:27.520
Ja, ich weiß nicht, ob das Patterns sind. Das ist eher so

01:54:27.520 --> 01:54:29.620
was sollte man, wenn man Dinge macht,

01:54:29.720 --> 01:54:31.660
sowieso beachten vielleicht.

01:54:32.380 --> 01:54:33.800
Das ist halt auch so eine ganz bekannte

01:54:33.800 --> 01:54:35.760
Geschichte. Ich weiß gar nicht, ob man es unter Pattern...

01:54:36.920 --> 01:54:38.080
Design-Prinzipien.

01:54:38.100 --> 01:54:38.580
Ja, ja.

01:54:39.640 --> 01:54:40.460
Was ist das denn?

01:54:41.240 --> 01:54:43.620
Ja, das ist

01:54:43.620 --> 01:54:45.520
auch etwas, was...

01:54:45.520 --> 01:54:50.820
Es gibt ja dieses Buch Clean Code von Robert Martin, Uncle Bob.

01:54:51.440 --> 01:54:52.280
Gibt es sowas auch in Python?

01:54:52.900 --> 01:54:54.080
Das ist, nee, das ist...

01:54:54.080 --> 01:54:59.040
Ich meine, ehrlich gesagt, ich bin ja ein bisschen peinlich berührt,

01:54:59.100 --> 01:55:00.920
wenn ich dann irgendwie so Observer-Pattern,

01:55:01.120 --> 01:55:02.940
keine Ahnung, habe ich schon mal gehört oder so.

01:55:03.480 --> 01:55:04.720
Bei den meisten Patterns ist es so,

01:55:04.740 --> 01:55:06.980
ich habe die schon mal gesehen, vielleicht irgendwann mal oder auch mal.

01:55:07.500 --> 01:55:10.320
Aber so wirklich viel zu tun habe ich mit denen ja eigentlich nicht.

01:55:10.460 --> 01:55:12.820
Also dieses ganze Thema kommt eigentlich eher

01:55:12.820 --> 01:55:15.260
aus so ein bisschen anderen Ecke der Softwareentwicklung.

01:55:16.100 --> 01:55:17.740
Und während das

01:55:17.740 --> 01:55:19.660
jetzt bei so Java-Geschichten oder so halt so

01:55:19.660 --> 01:55:21.060
ist, eben, da ist also

01:55:21.060 --> 01:55:23.600
für Juniorstellen irgendwie, wenn man

01:55:23.600 --> 01:55:25.620
sich da, wenn man dann im Vorstellungsgespräch ist,

01:55:25.740 --> 01:55:27.680
dann wird halt erwartet, dass man die alle kennt

01:55:27.680 --> 01:55:29.520
und ja,

01:55:29.800 --> 01:55:31.540
das wäre dann schon sehr peinlich, wenn man

01:55:31.540 --> 01:55:33.060
sagt, also ich habe keine Ahnung, was das eigentlich ist.

01:55:33.840 --> 01:55:35.420
Aber ja, zum Glück

01:55:35.420 --> 01:55:36.060
mache ich ja kein Java.

01:55:36.980 --> 01:55:40.020
Ja, das Interessante ist auch, man kann

01:55:40.020 --> 01:55:41.520
das Zeug ja im Alltag eben nicht

01:55:41.520 --> 01:55:42.300
so benutzen wie

01:55:42.300 --> 01:55:45.420
bei jeder Zeile Code, die ich schreibe, gehe ich

01:55:45.420 --> 01:55:47.460
nochmal alle mir bekannten Patterns und Prinzipien

01:55:47.460 --> 01:55:48.860
durch, ob ich die jetzt ja nicht verletze.

01:55:49.380 --> 01:55:50.720
So funktioniert es halt nicht.

01:55:51.680 --> 01:55:53.300
Und deswegen ist Pattern, glaube ich, auch für unsere

01:55:53.300 --> 01:55:54.840
Kognition eigentlich ganz interessant.

01:55:55.420 --> 01:55:57.540
Du willst aber, dass dein Gehirn eine ausreichende

01:55:57.540 --> 01:55:59.440
Menge von so einem Zeug so dran trainiert hat,

01:55:59.980 --> 01:56:01.600
dass wenn da irgendwie die roten Warnlämpchen

01:56:01.600 --> 01:56:03.460
angehen, du halt weißt, Moment,

01:56:03.600 --> 01:56:05.360
jetzt muss ich nochmal nachdenken, warum geht das hier schief?

01:56:05.940 --> 01:56:07.400
Damit du dann halt wenigstens weißt, wo

01:56:07.400 --> 01:56:08.120
du googeln musst.

01:56:09.480 --> 01:56:11.340
Ich habe über Solid jetzt auch,

01:56:11.420 --> 01:56:13.420
ich habe über Solid jetzt gerade nochmal schnell drüber geguckt

01:56:13.420 --> 01:56:16.040
oh, das ist aber schon ganz schön alte Schule teilweise.

01:56:17.240 --> 01:56:18.040
Also wenn ich halt

01:56:18.040 --> 01:56:19.840
Liskov Substitution höre,

01:56:19.920 --> 01:56:21.160
dann so, oh ja,

01:56:22.020 --> 01:56:23.180
das Akademikerherz.

01:56:24.260 --> 01:56:25.740
Das ist das L in Solid, ja,

01:56:25.760 --> 01:56:26.480
das Liskov Substitution.

01:56:27.340 --> 01:56:29.460
Es ist halt auch alles relativ

01:56:29.460 --> 01:56:31.960
alte Geschichte und das macht halt in diesem

01:56:31.960 --> 01:56:33.560
Kontext von so statisch typisierten

01:56:33.560 --> 01:56:35.620
Programmiersprachen, macht das auch alles irgendwie

01:56:35.620 --> 01:56:38.080
gewisserweise schon Sinn,

01:56:38.240 --> 01:56:39.640
also durchaus und auch mehr Sinn halt

01:56:39.640 --> 01:56:41.860
vielleicht als bei Python, weil da viele

01:56:41.860 --> 01:56:43.580
Dinge einfach automatisch erfüllt sind, ne, also

01:56:43.580 --> 01:56:44.820
eben, ich würde sagen

01:56:44.820 --> 01:56:49.640
ja, ich würde

01:56:49.640 --> 01:56:52.020
Lischkows Substitution Principle

01:56:52.020 --> 01:56:53.760
Ne, das ist ein Design-Thema

01:56:53.760 --> 01:56:56.080
das musst du selber als Programmierer richtig umsetzen

01:56:56.080 --> 01:56:57.700
Das ist

01:56:57.700 --> 01:56:59.720
Typtheorie und das ist die

01:56:59.720 --> 01:57:00.640
Aussage, dass

01:57:00.640 --> 01:57:03.380
Objekte in einem Programm

01:57:03.380 --> 01:57:06.020
also aller Programmcode, der Objekte verwendet

01:57:06.020 --> 01:57:08.020
also mit Objekten arbeitet

01:57:08.020 --> 01:57:09.140
sollte

01:57:09.140 --> 01:57:11.380
immer in der Lage sein, alle

01:57:11.380 --> 01:57:13.360
Subtypen dieser Objekte zu

01:57:13.360 --> 01:57:15.180
akzeptieren, ohne die Korrektheit des

01:57:15.180 --> 01:57:16.020
Programms zu verletzen.

01:57:17.420 --> 01:57:19.140
Genau, also ich würde jetzt mal so als

01:57:19.140 --> 01:57:20.840
konkretes Beispiel, wäre

01:57:20.840 --> 01:57:22.360
jetzt für mich sowas wie,

01:57:22.960 --> 01:57:24.700
man macht eine Vorschleife über Mitarbeiter

01:57:24.700 --> 01:57:26.140
und wenn man

01:57:26.140 --> 01:57:28.640
in der Vorschleife so

01:57:28.640 --> 01:57:30.740
Fallunterscheidungen macht, also

01:57:30.740 --> 01:57:32.460
nehmen wir an, man hat eine Typarchie,

01:57:33.620 --> 01:57:34.800
es gibt halt irgendwie eine

01:57:34.800 --> 01:57:36.600
Oberklasse Mitarbeiter und dann

01:57:36.600 --> 01:57:38.880
gibt es halt Konkretere, die

01:57:38.880 --> 01:57:40.640
halt irgendwie davon erben, also weiß ich nicht, irgendwie

01:57:40.640 --> 01:57:43.080
keine Ahnung, CEO

01:57:43.080 --> 01:57:45.280
oder irgendwie Senior Vice President

01:57:45.280 --> 01:57:46.740
Facility Management oder sowas

01:57:46.740 --> 01:57:47.640
und

01:57:47.640 --> 01:57:50.840
wenn man jetzt aber in der Vorschleife

01:57:50.840 --> 01:57:53.140
iteriert über alle und weiß jetzt nicht genau, welchen

01:57:53.140 --> 01:57:55.080
konkreten Typen man hat, man weiß nur, es sind halt schon

01:57:55.080 --> 01:57:57.360
irgendwie Mitarbeiter und macht dann Fallunterscheidungen

01:57:57.360 --> 01:57:59.140
wie, also, wenn das jetzt

01:57:59.140 --> 01:58:01.260
irgendwie, keine Ahnung,

01:58:01.480 --> 01:58:03.220
der CEO ist, dann machen wir aber folgende

01:58:03.220 --> 01:58:04.900
Ausnahmegeschichten, wenn wir jetzt zum Beispiel

01:58:04.900 --> 01:58:07.120
Gehalt auszahlen, wir rufen

01:58:07.120 --> 01:58:08.920
nicht einfach Gehaltauszahlen-Methode auf, sondern

01:58:08.920 --> 01:58:13.820
Wir sagen nochmal, okay, wir machen Speziallogik, je nachdem, was das denn für ein Typ ist.

01:58:14.260 --> 01:58:17.920
Also du weißt schon, dass der Senior Vice President Facility Management ein ziemlich stiller Witz ist.

01:58:19.280 --> 01:58:21.420
Wieso? Das ist doch voll wichtig.

01:58:25.940 --> 01:58:32.640
Also dann hätte man sozusagen, aus meiner Perspektive, hätte man jetzt eben Lischkoffs Substitution Principle verletzt.

01:58:32.640 --> 01:58:41.100
Weil eben der Code nicht funktioniert, unabhängig davon, was das für ein Typ ist, sondern weil man da noch überprüft wird.

01:58:41.100 --> 01:59:01.600
Ja, noch nicht so ganz. Also Spezialfälle zu erlauben ist ja kein Problem, es muss bloß die Korrektheit gewährleistet sein. Aber Beispiel, wenn man zum Beispiel sagt, und Korrektheit ist tatsächlich auch immer eine spannende Frage von, das gehört eigentlich auch für mich dazu, im Sinne von erfüllt tatsächlich auch nachher für den User was Sinnvolles.

01:59:02.340 --> 01:59:20.560
Und du sagst zum Beispiel, alle Mitarbeiter müssen eine private Telefonnummer haben und bei den CEOs legt man dann fest, nee, da ist die immer null, weil die privaten Nummern der CEOs werden nicht rausgegeben und das würde einem Subtyp entsprechen.

01:59:21.580 --> 01:59:39.900
dann hättest du halt in dem Moment das verletzt, im Sinne von, ja jetzt machen wir hier mal für Weihnachten die Telefonliste der Mitarbeiter fertig und machen die Secret Centers für hier und den kannst du anrufen, um noch ein bisschen was abzufragen und plötzlich kommen bei den CEOs halt da keine Telefonnummern raus.

01:59:39.900 --> 01:59:42.220
Ja, nee, das war jetzt halt kaputt.

01:59:42.820 --> 01:59:44.540
Und das ist eine Designanforderung

01:59:44.540 --> 01:59:46.180
nicht von dem Client-Code, der damit

01:59:46.180 --> 01:59:48.600
arbeitet, sondern das ist eine Designanforderung

01:59:48.600 --> 01:59:50.220
von Objekten, von

01:59:50.220 --> 01:59:52.060
Unterobjekten, von Unterklassen.

01:59:53.400 --> 01:59:53.980
Von Subklassen.

01:59:54.280 --> 01:59:55.460
Dass eine Subklasse

01:59:55.460 --> 01:59:57.680
den Raum

01:59:57.680 --> 02:00:00.360
der Möglichkeiten erweitern, aber nicht einschränken

02:00:00.360 --> 02:00:00.640
darf.

02:00:05.500 --> 02:00:06.440
Okay, das ist L.

02:00:07.500 --> 02:00:07.980
Jetzt haben wir noch

02:00:07.980 --> 02:00:09.020
S-O-I-D.

02:00:09.900 --> 02:00:11.080
Das würde ich gerne

02:00:11.080 --> 02:00:11.540
verschieben.

02:00:14.680 --> 02:00:16.460
Ich habe vorhin schon meinen

02:00:16.460 --> 02:00:18.160
Zungenbrecher

02:00:18.160 --> 02:00:21.020
gehabt und wir haben heute etwas

02:00:21.020 --> 02:00:23.140
Zeit, wir haben ja relativ gut

02:00:23.140 --> 02:00:25.000
zeitig angefangen, mit dem

02:00:25.000 --> 02:00:26.960
Nachteil, dass meine Technik heute ein bisschen

02:00:26.960 --> 02:00:29.380
Ja, du hast inzwischen durchführlich alleine geredet.

02:00:29.380 --> 02:00:31.320
Ja, und auch bis wir zum Reden gekommen

02:00:31.320 --> 02:00:32.640
sind, weil irgendwie hier

02:00:32.640 --> 02:00:35.260
alle gegen mich gearbeitet haben. Wir machen das einfach zu selten, wir müssen

02:00:35.260 --> 02:00:35.860
das häufiger machen.

02:00:36.440 --> 02:00:38.940
Das stimmt. Sehr gerne.

02:00:39.140 --> 02:00:40.140
wie gesagt, von meiner Seite

02:00:40.140 --> 02:00:43.100
immer gerne. Wir müssen einfach immer sofort

02:00:43.100 --> 02:00:44.680
den nächsten Termin ansetzen. Ja, das machen wir.

02:00:44.680 --> 02:00:47.040
In drei Monaten. Schön, dass ihr aber

02:00:47.040 --> 02:00:48.580
alle wieder eingeschaltet habt heute. Ja, genau.

02:00:48.740 --> 02:00:50.900
An der Stelle müssen wir uns eigentlich auch entschuldigen. Wir haben im letzten Monat

02:00:50.900 --> 02:00:52.900
irgendwie verbasselt, aber ich meine, es war viel zu tun

02:00:52.900 --> 02:00:54.900
und so. Ja, es war viel zu tun und zwar ein bisschen

02:00:54.900 --> 02:00:56.660
sehr. Corona. Ja.

02:00:57.600 --> 02:00:58.860
Ja, eigentlich wollten wir auch zwei aufnehmen,

02:00:58.940 --> 02:01:00.480
da ist wieder was ausgefallen und so. Ja, ja.

02:01:01.240 --> 02:01:03.000
Die Termin-Findungs-Koordinations-

02:01:03.000 --> 02:01:05.160
Schwierigkeiten kommen noch übrigens dazu.

02:01:05.180 --> 02:01:06.920
Ja, aber wir geloben Besserung, das kriegen wir auch schon

02:01:06.920 --> 02:01:07.880
irgendwie hin. Genau.

02:01:09.080 --> 02:01:10.260
Genau, nee, dann am besten,

02:01:10.620 --> 02:01:12.520
ja, wir haben ja auch schon echt viel Zeug gemacht,

02:01:12.740 --> 02:01:14.640
dann verschieben wir das mal. Solid ist

02:01:14.640 --> 02:01:15.360
ein gutes Thema.

02:01:16.560 --> 02:01:18.700
Ja, und halt auch noch so diverse Architektur-Patterns,

02:01:18.840 --> 02:01:20.480
halt so Repository-Pattern,

02:01:20.660 --> 02:01:22.700
Unit of Work, weiß ich nicht. Es gibt da ein

02:01:22.700 --> 02:01:24.840
schönes Buch, das sei dann schon sozusagen Vorbereitung aufs nächste Mal.

02:01:25.860 --> 02:01:26.880
CosmicPython.com

02:01:26.880 --> 02:01:28.700
Ich glaube, das heißt

02:01:28.700 --> 02:01:30.160
dann auch tatsächlich, wenn man es als Buch kauft,

02:01:30.500 --> 02:01:31.620
also kann man da online lesen.

02:01:32.400 --> 02:01:33.860
Ja, es ist halt auch

02:01:33.860 --> 02:01:35.980
Architectural Patterns for Python

02:01:35.980 --> 02:01:36.640
oder irgendwie sowas.

02:01:38.200 --> 02:01:41.020
Ist von dem, na, wie heißt er noch?

02:01:42.700 --> 02:01:44.860
Der auch Obey the Testing Goat geschrieben hat.

02:01:47.060 --> 02:01:48.120
Und einem anderen.

02:01:48.680 --> 02:01:49.080
Verdammt.

02:01:49.680 --> 02:01:51.340
Okay, weiß nicht mehr genau.

02:01:52.840 --> 02:01:55.560
Da kann ich eigentlich auch sofort nachgucken.

02:01:56.800 --> 02:01:57.240
Percival.

02:01:57.420 --> 02:01:58.960
Percival, ja.

02:02:00.220 --> 02:02:01.720
Kosmos ist die Opposite of Chaos.

02:02:02.000 --> 02:02:04.780
Aha, Kosmos ist die Opposite of Chaos.

02:02:06.860 --> 02:02:29.500
Genau, das ist auch einer der Gründe, warum ich dieses Pattern-Thema überhaupt irgendwie interessant fand, mal darüber zu sprechen, weil ich gerade momentan halt auch zum ersten Mal irgendwie so ein bisschen eine größere Geschichte habe, wo es einfach nicht reicht, einfach nur so Django-Modelle zu haben oder irgendwie so, sondern wo man das vielleicht trennen muss, irgendwie Business-Logik von.

02:02:32.400 --> 02:02:34.360
Ja, das kannte ich noch nicht und das sieht aber tatsächlich

02:02:34.360 --> 02:02:36.440
gut aus. Das sind so tatsächlich die Patterns,

02:02:36.480 --> 02:02:37.600
die ich auch kenne, die in Python

02:02:37.600 --> 02:02:40.220
gerne kommen. Unit of Work

02:02:40.220 --> 02:02:42.280
ist so ein SQL-Alchemy-Ding auch, Event-Driven

02:02:42.280 --> 02:02:44.340
und Message-Bus klingt gut,

02:02:44.440 --> 02:02:45.440
Commands klingt gut,

02:02:46.320 --> 02:02:47.560
Dependency-Injection ist super.

02:02:48.540 --> 02:02:50.120
Das klingt interessant, das kommt in die Leseliste.

02:02:50.960 --> 02:02:51.920
Super, dann haben wir auf jeden Fall

02:02:51.920 --> 02:02:54.360
auch noch eine Menge Stoff für den nächsten, für den zweiten Teil.

02:02:55.660 --> 02:02:55.980
Okay.

02:02:55.980 --> 02:02:57.900
Ja, wir haben einige zweite Teile noch offen übrigens.

02:02:58.380 --> 02:02:59.980
Ja, ja, Async muss man auch unbedingt

02:02:59.980 --> 02:03:00.300
nochmal dran.

02:03:01.700 --> 02:03:05.160
Ja, vielen Dank, dass du wieder da warst, Christian, Conny.

02:03:06.020 --> 02:03:06.920
Danke, dass ich dir bei sein durfte.

02:03:07.340 --> 02:03:07.760
Na klar.

02:03:08.340 --> 02:03:09.960
Und ja, schön, dass ihr reingeschaltet habt.

02:03:10.240 --> 02:03:13.060
Und gute Nacht, guten Morgen, guten Abend, gute und so weiter.

02:03:13.140 --> 02:03:14.140
Dann bis zum nächsten Mal.

02:03:14.160 --> 02:03:14.440
Bis dann.

02:03:14.620 --> 02:03:14.980
Tschüss.

02:03:15.180 --> 02:03:15.500
Ciao, ciao.
