WEBVTT

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

00:00:04.100 --> 00:00:07.320
Wir reden heute über Types, Typings und Typescript.

00:00:07.320 --> 00:00:08.420
Hallihallo.

00:00:08.420 --> 00:00:10.980
Hallihallo, willkommen Dominik und...

00:00:10.980 --> 00:00:11.500
Hallo Johannes.

00:00:11.500 --> 00:00:12.140
Hallo Johannes.

00:00:12.140 --> 00:00:13.180
Hallo zusammen.

00:00:13.180 --> 00:00:14.320
Und hallo Stefan.

00:00:14.320 --> 00:00:15.140
Genau.

00:00:15.140 --> 00:00:16.040
Ja, hallo Stefan.

00:00:16.040 --> 00:00:17.660
Auch ein Gast heute.

00:00:17.660 --> 00:00:18.040
Genau.

00:00:18.040 --> 00:00:23.820
Ja, wir freuen uns sehr, dass ihr alle da seid und fangen einfach mit News an, wie sonst auch immer.

00:00:23.820 --> 00:00:25.600
Ja, würde ich schon sagen.

00:00:25.600 --> 00:00:26.560
Was gab es denn Schönes?

00:00:26.560 --> 00:00:28.400
Wer möchte anfangen, soll ich?

00:00:28.400 --> 00:00:29.260
Ja, fang du mal an.

00:00:29.540 --> 00:00:33.840
Na gut, ja, also ehrlich gesagt, das letzte Mal war nicht so lange her, daher habe ich

00:00:33.840 --> 00:00:34.800
ja nicht so viel gesammelt.

00:00:34.800 --> 00:00:35.780
Python 3.12.1.

00:00:35.780 --> 00:00:40.340
Genau, das ist natürlich irgendwie, es stand irgendwie dabei, so 400 Bugfixes und so, also

00:00:40.340 --> 00:00:45.120
ja, sollte man wahrscheinlich mal installieren und meine Frage dazu wäre halt, bist du jetzt

00:00:45.120 --> 00:00:49.320
schon umgestiegen auf 3.12., weil du wolltest ja immer nur die erste meiner Version abwarten,

00:00:49.320 --> 00:00:50.680
aber dann auch, ja?

00:00:50.680 --> 00:00:53.540
Ja, also noch nicht mit allen Sachen, aber mit vielen Sachen.

00:00:53.540 --> 00:00:54.460
Okay.

00:00:54.460 --> 00:00:59.200
Also 3.12.1 ist draufgekommen und jetzt in meinem Systeminterpreter zum Beispiel ist das

00:00:59.200 --> 00:00:59.500
Auftritt.

00:00:59.540 --> 00:01:00.540
3.12.1.

00:01:00.540 --> 00:01:01.340
Hervorragend.

00:01:01.340 --> 00:01:06.540
Ja, aber ich glaube, da war nichts, also außer Bugs ist da nichts irgendwie passiert.

00:01:06.540 --> 00:01:11.340
Ja, mein Hauptproblem im Moment ist halt PyTorch oder sowas, wo es auch im Dezember einen Release

00:01:11.340 --> 00:01:12.800
gab, dass es jetzt endlich mit 3.11.1 funktioniert.

00:01:12.800 --> 00:01:13.880
Ah, ja, ja.

00:01:13.880 --> 00:01:14.540
Ja, aber.

00:01:14.540 --> 00:01:21.880
Ja, ansonsten genau neue Releases, es gab einen neuen Ruby on Rails Release, ich gucke

00:01:21.880 --> 00:01:27.060
da ab und zu mal so rüber, weil ich halt interessant finde, wie viel tolles Zeug da

00:01:27.060 --> 00:01:28.800
passiert und das ist jetzt deutlich.

00:01:29.540 --> 00:01:33.100
Also es ist jetzt schneller geworden, hat irgendwie einen eingebauten Dustin-Time-Compiler

00:01:33.100 --> 00:01:38.960
und verwendet jetzt einen ähnlichen Ansatz für den Parser, wie Python halt auch.

00:01:38.960 --> 00:01:45.720
Python ist ja jetzt mit irgendwie 3.9 auf dem Pack-Parser umgestiegen und das ist, Ruby

00:01:45.720 --> 00:01:50.600
verwendet da jetzt was ganz ähnliches, ist auch so ein rekursives Dings da, Parsen, ich

00:01:50.600 --> 00:01:54.060
weiß nicht, ich habe es wieder vergessen, wie das genau heißt, so ähnlich und sie

00:01:54.060 --> 00:01:56.740
sind auch umgestiegen von Bison, also dem Parser-Generator auf den Ansatz.

00:01:56.740 --> 00:01:58.160
Ich finde das schon ganz oft.

00:01:58.160 --> 00:01:58.540
Rup.

00:01:58.780 --> 00:02:00.400
Lob für Ruby gehört, muss ich ehrlich sagen.

00:02:00.400 --> 00:02:06.980
Ja, und auch bei dieser ganzen Justin-Time-Compile-Geschichte, da ist, glaube ich, einer der Hauptsponsoren

00:02:06.980 --> 00:02:12.380
auch Shopify, ja, genau, also die basieren, also es gibt ja viele, viele große Unternehmen,

00:02:12.380 --> 00:02:18.140
die halt hauptsächlich auf Ruby on Rails Moduliten basieren und da kommt halt auch

00:02:18.140 --> 00:02:19.380
eine Menge Geld rein.

00:02:19.380 --> 00:02:20.300
Okay, okay.

00:02:20.300 --> 00:02:25.960
Und ja, Python ist ja jetzt auch dran mit diesem Justin-Time-Compiler-Thema, da in

00:02:25.960 --> 00:02:26.420
drei, drei Sekunden.

00:02:26.420 --> 00:02:27.980
Das wäre meine News gewesen, ja.

00:02:28.020 --> 00:02:28.580
Ach so, sorry.

00:02:28.580 --> 00:02:30.600
Dann schieb's mal los.

00:02:30.600 --> 00:02:37.820
Ja, im Dezember, Ende Dezember ist wohl ein Patch in den 3.13-Branch reingekommen, wo ein

00:02:37.820 --> 00:02:39.500
JIT-Compiler drin ist für Python.

00:02:39.500 --> 00:02:44.020
Also es ist jetzt richtig im Plan drin, dass Python in 3.13 einen JIT-Compiler hat, einen

00:02:44.020 --> 00:02:48.060
Copy-and-Patch-JIT-Compiler, was auch immer das bedeuten mag.

00:02:48.060 --> 00:02:51.500
Da gab es auch angeblich eine wundervolle Diskussion auf Reddit zu…

00:02:52.120 --> 00:02:59.060
Ja, also es gibt einmal die, ich kann empfehlen, es gibt Core-PUI, das ist so ein Podcast, wo

00:02:59.060 --> 00:03:01.440
zwei der Core-Entwickler irgendwie drüber reden.

00:03:01.440 --> 00:03:05.080
Da gibt es eine Episode zum Justin-Time-Compiler und dann…

00:03:05.080 --> 00:03:06.180
Wer sind dabei?

00:03:06.180 --> 00:03:07.980
Shannon und Sean oder wie ist das?

00:03:07.980 --> 00:03:19.480
Nee, das sind Pablo Galindo Salgado, der Release-Manager auch für 3.13 und Lukas Schlanger.

00:03:19.480 --> 00:03:20.400
Ah ja.

00:03:20.400 --> 00:03:21.080
Genau.

00:03:21.080 --> 00:03:21.980
Genau.

00:03:21.980 --> 00:03:27.820
Und genau, die haben da einmal drüber geredet und daher weiß ich auch, dass das basiert

00:03:27.820 --> 00:03:32.040
hauptsächlich, also warum man das jetzt nochmal in Angriff nimmt, auf Geschichten, die in

00:03:32.040 --> 00:03:32.920
Lua passiert sind.

00:03:32.920 --> 00:03:37.660
Da gab es jetzt auch irgendwelche, ich habe jetzt wieder die Details vergessen, aber so

00:03:37.660 --> 00:03:41.740
Papers, die sehr, sehr interessant aussahen und die halt vermuten lassen, dass man es

00:03:41.740 --> 00:03:44.120
relativ leicht irgendwie auch für Python verwenden kann.

00:03:44.120 --> 00:03:49.560
Und ja, das ist halt ein InPython in Ruby, da werden überall diese Dinger jetzt gerade

00:03:49.560 --> 00:03:49.960
eingebaut.

00:03:49.960 --> 00:03:51.840
Und hier der…

00:03:51.840 --> 00:03:58.880
Der wegen dem PyPy auch hier war schon, der meinte auch so, oh, er muss jetzt mal sein

00:03:58.880 --> 00:04:03.240
Commit-Bit wieder hochfahren.

00:04:03.240 --> 00:04:05.280
Wieder quasi aus…

00:04:05.280 --> 00:04:08.780
Ja, es gab ja immer, dass die neuen Versionen deutlich einfacher zu implementieren sind

00:04:08.780 --> 00:04:14.620
bei PyPy, wenn das drin ist, was da in C-Extensions irgendwie dazukommen sollte, wollte, wenn

00:04:14.620 --> 00:04:15.600
ich das richtig verstanden hatte damals.

00:04:15.600 --> 00:04:21.220
Ja, also jedenfalls, der macht da jetzt auch mit und das wird auf jeden Fall spannend.

00:04:21.680 --> 00:04:22.940
Ja, schnelles Python.

00:04:22.940 --> 00:04:25.520
Ja, genau.

00:04:25.520 --> 00:04:32.980
Ja, ansonsten hätte ich jetzt noch das, ich habe ja jetzt mich auch hier an dieser Stelle

00:04:32.980 --> 00:04:37.660
schon irgendwie ein paar Mal beschwert über irgendwie sehr holprige Updates von Python.

00:04:37.660 --> 00:04:38.080
Über mich, nein.

00:04:38.080 --> 00:04:38.600
Ach so, Entschuldigung.

00:04:38.600 --> 00:04:39.480
Ja, gut.

00:04:39.480 --> 00:04:43.400
Über Pydantic 2, über den Umstieg von Pydantic 1 auf 2.

00:04:43.400 --> 00:04:47.660
Und jetzt haben das andere Leute auch gemacht, irgendwie Simon Willison hat da in letzter

00:04:47.660 --> 00:04:50.740
Zeit relativ viel zu gepostet, dass er das irgendwie ungünstig fand.

00:04:51.520 --> 00:04:56.740
Habe ich dann auch so Sachen gesehen, wie es gab da ein Issue zu, wo dann einer von Netflix

00:04:56.740 --> 00:05:01.100
oder so in relativ freundlichem Ton zunächst schrieb, irgendwie so, ja, also das macht bei

00:05:01.100 --> 00:05:04.560
uns sehr viel Arbeit und irgendwie, das war jetzt alles irgendwie nicht so günstig.

00:05:04.560 --> 00:05:07.320
Und ich habe dann geguckt, der hat dann auch irgendwann beschrieben, welche Issues, die

00:05:07.320 --> 00:05:07.920
da reingelaufen sind.

00:05:07.920 --> 00:05:12.620
Und das war halt zum Beispiel auch einer von den Dingern, in die ich da reingerannt bin.

00:05:12.620 --> 00:05:19.960
Und ja, genau, der meinte dann so, tja, also sauberer wäre es gewesen, wenn man das Paket

00:05:19.960 --> 00:05:21.080
irgendwie umbenannt hätte oder so.

00:05:21.360 --> 00:05:21.520
Mhm.

00:05:21.520 --> 00:05:23.180
Und das wollten sie aber nicht machen.

00:05:23.180 --> 00:05:25.840
Und dann haben sie gesagt, nee, das geht auch so oder geht so.

00:05:25.840 --> 00:05:26.600
Aber es ging alles nicht.

00:05:26.600 --> 00:05:27.700
Und es war relativ furchtbar.

00:05:27.700 --> 00:05:32.000
Also gerade, wenn man eine Library ist, hat man damit halt ein großes Problem, weil man

00:05:32.000 --> 00:05:36.960
nicht kontrollieren kann, was in der Applikation, die einen benutzt, halt irgendwie für eine

00:05:36.960 --> 00:05:37.900
Pydantic-Version ist.

00:05:37.900 --> 00:05:40.980
Und zum Beispiel FastAPI hat damit auch ein Riesenproblem gehabt.

00:05:40.980 --> 00:05:44.400
Und wie die das dann letztendlich gemacht haben, ist, sie haben halt so einen Flag

00:05:44.400 --> 00:05:51.200
eingeführt, Pydantic V2, und machen dann jetzt gerade sowas wie, if Pydantic V2, 500

00:05:51.200 --> 00:05:54.140
Zeilen eingerückt, irgendwie Kompatibilitäts-Layer.

00:05:54.140 --> 00:05:56.220
Und dann Else und dann sonst.

00:05:56.220 --> 00:05:57.840
Und das haben sie an mehreren Stellen.

00:05:57.840 --> 00:05:59.100
Das ist wirklich absolut schrecklich.

00:05:59.100 --> 00:06:01.340
Naja, aber so sieht es halt aus.

00:06:01.340 --> 00:06:07.260
Also das war, dieses Update war nicht, nicht wirklich reibungslos, sondern da haben viele

00:06:07.260 --> 00:06:10.020
Leute irgendwie eine Menge Schweiß gelassen.

00:06:10.020 --> 00:06:11.840
Naja, also nicht durch.

00:06:11.840 --> 00:06:12.800
Okay.

00:06:12.800 --> 00:06:13.280
Ja.

00:06:13.280 --> 00:06:14.840
Also gut, wenn man es nicht zu sehr drin hat.

00:06:14.840 --> 00:06:18.740
Ich habe da tatsächlich auch zwischendurch noch auf eins dependen müssen, weil da so

00:06:18.740 --> 00:06:20.660
bei zwei Sachen nicht so ging, was jetzt irgendwie geht.

00:06:21.040 --> 00:06:23.800
Und ja, ein bisschen nervig.

00:06:23.800 --> 00:06:25.400
Johannes, hast du noch was?

00:06:25.400 --> 00:06:29.520
Nee, also in der TypeScript-Welt gibt es sowas nicht.

00:06:29.520 --> 00:06:32.500
Aber jetzt können wir uns über TypeScript-Versionen unterhalten.

00:06:32.500 --> 00:06:36.780
Apropos, ich habe gehört, dass ein neues Buch erschienen in der TypeScript-Welt.

00:06:36.780 --> 00:06:37.840
Echt, was?

00:06:37.840 --> 00:06:39.540
Ja, das ist mir ganz neu.

00:06:39.540 --> 00:06:41.420
Ja, ich glaube, das muss der Stefan mal so ein bisschen erzählen.

00:06:41.420 --> 00:06:43.680
Ist das jetzt mein Intro, oder was?

00:06:43.680 --> 00:06:44.680
Ja, du darfst das gerne antworten.

00:06:44.680 --> 00:06:45.800
Das war jetzt die softeste Überleitung.

00:06:45.800 --> 00:06:46.660
Ja, genau.

00:06:46.660 --> 00:06:48.780
Das war der softeste Übergang, den der Dominik macht.

00:06:48.780 --> 00:06:50.880
Ich habe das jetzt total spannend gefunden, weil...

00:06:50.880 --> 00:06:59.320
Also, es wird ja immer so gemunkert, dass im Web-Bereich gibt es ja quasi alle drei Minuten

00:06:59.320 --> 00:07:03.880
irgendeinen neuen Fachbegriff oder irgendeinen neuen Bibliothekennamen oder irgendein neues

00:07:03.880 --> 00:07:10.220
JavaScript-Framework, das irgendeinen abstrusen Namen hat, mit dem sich alle nachher irgendwie

00:07:10.220 --> 00:07:11.220
auseinandersetzen müssen.

00:07:11.220 --> 00:07:16.120
Und das ist jetzt das zweite Mal, dass ich so in diese Python-Ecke reinschaue und denke

00:07:16.120 --> 00:07:18.300
mir, hey, komm, das ist ja da genau das Gleiche.

00:07:18.300 --> 00:07:20.720
Den ersten Namen, den ich...

00:07:20.720 --> 00:07:25.620
Den ich erkannt habe, das war fast API, weil tatsächlich ist es, das ist spannend, ich

00:07:25.620 --> 00:07:31.720
bin jetzt mit, seit vier, fünf Monaten bei uns in der Firma mit einer Gruppe Python-Developern

00:07:31.720 --> 00:07:38.140
unterwegs, Data-Scientists, ganz klassisch, du hast einen Data-Scientist und das Tool

00:07:38.140 --> 00:07:42.980
der Wahl ist Python, die Bibliotheken sind da, das Übliche mit Langchain, Pipapo für

00:07:42.980 --> 00:07:50.060
diese ganze LLM-Sache, und das war so mein erstes Intro in dieser Python-Welt und ich

00:07:50.060 --> 00:07:55.000
bin schon massiv gescheitert daran, dass ich den Package-Manager auswähle, der passt,

00:07:55.000 --> 00:08:01.380
weil da gibt es ja dann Conda, Anaconda, Pipo, da sind das ganz andere, keine Ahnung, also

00:08:01.380 --> 00:08:06.240
wie gesagt, das ist ja schon wieder vorbei, aber ich weiß, dass ich fast API nach langen

00:08:06.240 --> 00:08:10.640
langen Gesprächen mit unseren Python-Devs in unser Architektur-Diagramm eingetragen

00:08:10.640 --> 00:08:13.600
habe für irgendeinen Server, den wir gemacht haben, genau.

00:08:13.600 --> 00:08:17.100
Also das war eben das Erste, wo ich mir gedacht habe, so, da kenne ich mich jetzt aus, bei

00:08:17.100 --> 00:08:18.400
fast API, da kann ich mitreden.

00:08:19.900 --> 00:08:24.540
Also es funktioniert multithreaded, aber nicht async, ist das richtig?

00:08:24.540 --> 00:08:29.480
Nee, also kann man wahrscheinlich so betreiben, wenn man wirklich will, aber nee, es ist tatsächlich

00:08:29.480 --> 00:08:35.060
async, also unter fast API liegt normalerweise, so würde ich jetzt mal sagen, wenn man das

00:08:35.060 --> 00:08:41.660
so betreibt, wie es gedacht ist, Stalett, beziehungsweise UV-Corn, und das ist halt

00:08:41.660 --> 00:08:46.940
sozusagen die LibUV, also das ist halt eine Adaption von LinUV, was halt auch unter der

00:08:46.940 --> 00:08:49.560
Event-Loop bei Node.js liegt.

00:08:49.740 --> 00:08:55.520
Das ist halt für Python, ja, und also ist halt quasi genauso schnell dann auch und ist

00:08:55.520 --> 00:08:56.180
async, ja.

00:08:56.180 --> 00:08:57.260
Cool.

00:08:57.260 --> 00:09:05.000
Das war die, die zweite war dann, dass ich, dass ich versucht habe, über PyO3 eine Brücke

00:09:05.000 --> 00:09:08.180
zwischen async-rust und async-python einmal zu schreiben.

00:09:08.180 --> 00:09:08.880
Das war spannend.

00:09:08.880 --> 00:09:09.860
Das war richtig cool.

00:09:09.860 --> 00:09:10.460
Ja.

00:09:10.460 --> 00:09:15.580
Also was mich da beeindruckt hat, und mit dem habe ich nicht gerechnet, ist, dass das

00:09:15.580 --> 00:09:19.580
vollen Frankischen Interface von Python ja fantastisch ist, also du hast da, du hast

00:09:19.580 --> 00:09:24.600
dort dein, dein kompiliertes SO-Modul dazu und du kannst auf die, auf die, auf die Objektliste

00:09:24.600 --> 00:09:29.440
zugreifen und kannst die Identifier rauslesen, also das war, also das Kompilieren vom Rust-Code

00:09:29.440 --> 00:09:33.900
war auf jeden Fall anspruchsvoller, als wir nachher die Symbole in, in Python zu loben

00:09:33.900 --> 00:09:38.560
und zu verwenden, das war richtig, richtig beeindruckend, also, ähm, coole Sache, möchte

00:09:38.560 --> 00:09:39.460
ich mir auf jeden Fall mehr anschauen.

00:09:39.460 --> 00:09:43.120
Aber das, das ist es, also das, das sind meine Python-Kenntnisse und.

00:09:43.120 --> 00:09:47.100
Ja, weil, also ich finde auch, das Benutzen von Python ist halt das, was so Spaß macht,

00:09:47.100 --> 00:09:47.360
dann, ne?

00:09:47.360 --> 00:09:47.860
Ja.

00:09:47.860 --> 00:09:49.420
Also High-Level-Interface.

00:09:49.420 --> 00:09:50.940
High-Level-Interface, ich glaube, ist sehr gut geeignet.

00:09:50.940 --> 00:09:54.060
PS3 auch ein cooles Beispiel, da gibt es die meisten Sachen, die es irgendwie kann.

00:09:54.060 --> 00:09:58.340
Ich glaube, was es nicht kann, ist irgendwie, äh, Iteratoren ausspucken richtig oder so

00:09:58.340 --> 00:09:59.480
oder Generatoren ergeben muss, aber.

00:09:59.480 --> 00:10:00.940
Ja, das wird wahrscheinlich schwierig sein, ja.

00:10:00.940 --> 00:10:02.480
Das kann man kurz vorstellen.

00:10:02.480 --> 00:10:03.540
Keine Ahnung.

00:10:03.540 --> 00:10:07.180
Da ist dieses Typsystem von Rust halt doch sehr, sehr eigen und, und sehr schwierig,

00:10:07.180 --> 00:10:11.920
in andere, ähm, ähm, Sprachen zu, zu integrieren, nehme ich mal an.

00:10:11.920 --> 00:10:14.900
Ja, aber, ähm, ich hatte ja als News ja auch quasi noch ein bisschen Werbung gemacht für

00:10:14.900 --> 00:10:16.940
dein Buch, vielleicht willst du dazu noch irgendwie kurz was sagen?

00:10:16.940 --> 00:10:17.580
Mhm.

00:10:17.580 --> 00:10:18.760
Ähm, ja, dankeschön.

00:10:18.820 --> 00:10:20.000
Danke für, für diese Überleitung.

00:10:20.000 --> 00:10:26.100
Ähm, ich habe tatsächlich in den letzten Jahren, ähm, TypeScript-Bücher geschrieben.

00:10:26.100 --> 00:10:31.360
Ähm, das erste Buch, das ich geschrieben habe, war, war in 2020, äh, TypeScript in

00:10:31.360 --> 00:10:38.200
50 Lessons, das beim Smashing Magazine Verlag rausgekommen ist, das als, ähm, angenehmer,

00:10:38.200 --> 00:10:43.860
unaufgeregter Einstieg in TypeScript als Typsystem auf JavaScript gedacht ist.

00:10:43.860 --> 00:10:48.180
Das heißt, die, die, das Zielpublikum waren Entwicklerinnen und Entwickler, die, ähm,

00:10:48.180 --> 00:10:48.700
ähm, JavaScript.

00:10:48.820 --> 00:10:52.640
schon kennen, sich dort auch schon, schon wohlfühlen und jetzt merken, jetzt, jetzt

00:10:52.640 --> 00:10:57.260
müssen sie TypeScript verwenden, äh, brauchen die Info, warum man das erstens überhaupt

00:10:57.260 --> 00:11:01.220
haben will und zweitens, wie das jetzt so richtig funktioniert und warum es da so viel

00:11:01.220 --> 00:11:06.420
Syntax gibt und warum die so, so kompliziert ausschaut und versucht, das, das grundlegende

00:11:06.420 --> 00:11:12.160
System, Typsystem runterzubrechen auf einfach zu verdauende, ähm, Lektionen.

00:11:12.160 --> 00:11:17.380
Ähm, genau, das war, das war das Ziel von, von dem Buch, das war, habe ich dann zufälligerweise

00:11:17.380 --> 00:11:18.260
in 50, ähm.

00:11:18.820 --> 00:11:23.800
Ähm, Lektionen, ähm, geschafft, das war, äh, Riesenspaß, das war quasi mein, mein Corona-Projekt,

00:11:23.800 --> 00:11:27.300
mein, mein erstes Lockdown-Projekt, wobei, stimmt nicht, ich habe es zwischen dem ersten

00:11:27.300 --> 00:11:31.140
und dem zweiten Lockdown, habe ich tatsächlich das meiste geschrieben, dazwischen war ich

00:11:31.140 --> 00:11:32.200
einfach ein totales Chaos.

00:11:32.200 --> 00:11:35.220
Das sieht auch super aus, also von außen, wenn du in den Schrank stellen und, ähm.

00:11:35.220 --> 00:11:38.620
Wir, wir wissen das, weil wir, weil wir das, weil wir dieses Buch auch alle haben.

00:11:38.620 --> 00:11:38.960
Ja, tatsächlich.

00:11:38.960 --> 00:11:42.300
Zwar als Python-Entwickler, was natürlich auch schon was heißt, wenn wir schon mal

00:11:42.300 --> 00:11:45.420
in die Kamera gehalten, das macht mich, das macht mich irrsinnig happy, ihr kennt sich

00:11:45.420 --> 00:11:48.780
das nicht vorstellen, das ist, das sind diese, diese unglaublich schönen Momente,

00:11:48.820 --> 00:11:53.560
wo man sieht, ähm, dass das Buch tatsächlich auch an Leute kommt und Leute das verwenden,

00:11:53.560 --> 00:11:55.880
also die Lesebändchen gesehen herrlich spitze, oder?

00:11:55.880 --> 00:12:00.300
Und, ähm, die Optik ist wirklich ganz, ganz besonders, weil, ähm, das, das war eigentlich,

00:12:00.300 --> 00:12:04.760
ähm, auch ein Grund, warum ich mit Smashing Magazine zusammenarbeiten wollte, die, äh,

00:12:04.760 --> 00:12:09.540
haben einfach irrsinnig viel Liebe zum Detail und versuchen wirklich, äh, sehr individuelle

00:12:09.540 --> 00:12:13.660
Bücher zu machen, haben eine wunderschöne Typografie, das sauber zu lesen ist und, und

00:12:13.660 --> 00:12:17.660
verzetteln sie dann in kleinen Finessten so stark und, ähm, ihr habt zum Beispiel,

00:12:17.660 --> 00:12:21.700
das Cover wurde gestaltet von, von Rob Draper, den habe ich tatsächlich in Düsseldorf

00:12:21.700 --> 00:12:28.100
kennengelernt, auf der, auf der Björn Tellerrand, ähm, der als, als Künstler, ähm, die Intro-Grafiken

00:12:28.100 --> 00:12:32.980
zu den Golden Globes gemacht hat, äh, für, für Nike und BMX, äh, Fahrräder, beziehungsweise

00:12:32.980 --> 00:12:37.040
Schuhe designt hat, äh, und der mich gefragt hat, hey, so, ne, E-Mail geschrieben, hey,

00:12:37.040 --> 00:12:39.460
der Arbeit ist cool, möchtest, möchtest du mein Buch designen?

00:12:39.460 --> 00:12:42.360
Der, ja, passt, und ich war doch, hey, wow, cool, ne, ich hoffe, er kostet jetzt nicht

00:12:42.360 --> 00:12:47.340
eine Million oder so, ne, und er hat tatsächlich dann, ähm, dann unser Buch, also das Buch

00:12:47.340 --> 00:12:53.500
gestaltet war, war, ähm, also, also versucht er mit diesem Kapitel, ähm, äh, in Lays

00:12:53.500 --> 00:12:57.780
ein bisschen das Ganze zugänglich zu machen, freundlich zu machen, ne, das ist, war, war

00:12:57.780 --> 00:13:02.220
uns ganz, ganz wichtig und die Person, die nachher, also die, die Ari, die nachher das

00:13:02.220 --> 00:13:07.080
Ganze gesetzt hat und versucht hat, aus, ein Produkt rauszumachen, hat dann auch recherchiert

00:13:07.080 --> 00:13:11.240
und hat zum Beispiel das Lesebändchen, das rote Lesebändchen in der Farbe bestellt von

00:13:11.240 --> 00:13:16.520
den roten Unterlinien in Visual Studio Code, das heißt, ähm, das ist, das ist der gleiche

00:13:16.520 --> 00:13:16.940
Farbton.

00:13:17.020 --> 00:13:22.580
Und, und so tief ins Detail geht's dort und das ist halt einfach absolut herrlich für,

00:13:22.580 --> 00:13:26.820
für mich, der praktisch nur den Text beigetragen hat, dass du siehst, wie andere Leute sich

00:13:26.820 --> 00:13:33.180
so, so investieren in dieses Projekt und versuchen, gemeinsam da irgendwas Cooles draus zu machen,

00:13:33.180 --> 00:13:37.340
das, also da krieg ich heute noch Gänsehaut, das ist ja für mich so, ähm, ich weiß, es

00:13:37.340 --> 00:13:41.380
ist mein Buch, aber es ist nicht nur mein Buch, also da sind so viele Leute dran beteiligt

00:13:41.380 --> 00:13:45.700
gewesen, es war ein irrsinnig cooler Effort von, von so vielen Menschen und das macht

00:13:45.700 --> 00:13:46.760
mich einfach jedes Mal wieder glücklich.

00:13:46.900 --> 00:13:51.180
Wenn ich, wenn ich dann sehe, dass das, ähm, Leute auch so sehen, sie das in die Bücherregale

00:13:51.180 --> 00:13:55.800
stellen oder, ähm, das Beste, was du machen kannst, hast du einen Zoom-Call, stell's in

00:13:55.800 --> 00:13:58.580
den Hintergrund und schick mir ein Foto von dem Zoom-Call, das ist das allerbeste, das

00:13:58.580 --> 00:14:02.400
macht mir die größte, größte Freude und es hat eine Freundin für mich gemacht, wie

00:14:02.400 --> 00:14:06.920
er, wie er ein Interview für sein, sein Startup gemacht hat, auf einmal sehe ich, hey, da

00:14:06.920 --> 00:14:11.660
ist mein Buch im Hintergrund, äh, herrlich, also, macht Riesenspaß, genau.

00:14:11.660 --> 00:14:15.000
Das war das erste TypeScript-Buch, ich hab dann noch ein zweites TypeScript-Buch geschrieben,

00:14:15.000 --> 00:14:16.880
das ist erst im September rausgekommen.

00:14:16.880 --> 00:14:21.300
Also, das ist noch ganz, ganz frisch, ähm, das ist das TypeScript-Cookbook, ähm, das

00:14:21.300 --> 00:14:26.060
jetzt mit O'Reilly veröffentlicht worden ist, ähm, das war, das war praktisch eine

00:14:26.060 --> 00:14:29.940
Auftragsarbeit, also, O'Reilly hat, hat so diese Acquisition-Editors, die suchen halt

00:14:29.940 --> 00:14:33.640
noch potenziellen Autoren, schlagen denen Buchprojekte vor oder schlagen vor, hey, möchtest

00:14:33.640 --> 00:14:37.680
du zu dem Thema was schreiben, ähm, und sie haben gesagt, sie wollen ein TypeScript-Buch

00:14:37.680 --> 00:14:41.940
veröffentlichen in diesem Stil wie TypeScript in Fifty Lessons, ob ich mir vorstellen kann,

00:14:41.940 --> 00:14:45.740
noch ein solches zu schreiben, ähm, und am Anfang haben wir gedacht, nein, das geht

00:14:45.740 --> 00:14:46.740
nicht, ich hab jetzt schon ein Buch geschrieben.

00:14:46.860 --> 00:14:51.420
Ich, ich hab halt einfach, ja, eine gewisse Ansicht, eine gewisse, eine gewisse Stimme,

00:14:51.420 --> 00:14:56.340
eine gewisse Idee zu dem Ganzen, hab aber gedacht, naja, meine Saison O'Reilly, probierst

00:14:56.340 --> 00:15:00.320
du da mal, dass du kurz ein Inhaltsverzeichnis unterschreibst, wie du dir ein zweites Buch

00:15:00.320 --> 00:15:05.020
vorstellen kannst, und, äh, grad hab ich, hab ich 100 weitere Einträge gehabt innerhalb

00:15:05.020 --> 00:15:08.160
von drei Stunden, also, ich bin mir am Nachmittag hingesetzt und hab gedacht, ups, wow, da ist

00:15:08.160 --> 00:15:12.720
ein Buch da, ähm, und bin mit denen in einen Vertrag gegangen und hab halt dann versucht,

00:15:12.720 --> 00:15:16.480
den, den Nachfolger vom, vom TypeScript in Fifty Lessons Buch zu schreiben.

00:15:16.840 --> 00:15:20.880
Wenn du in TypeScript in Fifty Lessons lernst, wie das Typsystem funktioniert, lernst du

00:15:20.880 --> 00:15:25.980
im TypeScript-Quick-Book alle Dinge, die schiefgehen können, Dinge, die, wenn du wirklich Programme

00:15:25.980 --> 00:15:30.020
damit schreibst, wo du merkst, hey, da passt grad was nicht, da, da, du spielst das Typsystem

00:15:30.020 --> 00:15:34.540
nicht so mit, wie ich mir das denke, beziehungsweise brauche ich halt irgendeine Technik oder irgendein

00:15:34.540 --> 00:15:39.360
Prinzip oder irgendein, äh, Pattern, das ich anwenden kann, um einem gewissen Problem

00:15:39.360 --> 00:15:39.500
in den Gegenzug zu kommen.

00:15:39.500 --> 00:15:42.800
Im Moment, äh, ich dachte jetzt, äh, so Typen hast du damit nichts mehr schiefgehen

00:15:42.800 --> 00:15:46.740
kann, und mit Typen, äh, mit sicheren statischen Typen sind die Sprachen immer besser.

00:15:46.820 --> 00:15:47.480
Ganz besonders gut.

00:15:47.480 --> 00:15:51.900
Genau, da beschreibt man nur mehr Programme, die nur mehr funktionieren, und man hat keine

00:15:51.900 --> 00:15:54.260
Bugs mehr, und es ist super-happy, genau.

00:15:54.260 --> 00:15:55.140
Ja, ja, genau, ja.

00:15:55.140 --> 00:15:59.800
Ja, also ich, ich bin jetzt eine super Überleitung tatsächlich auf das Thema, was wir heute

00:15:59.800 --> 00:16:00.320
machen wollen, oder?

00:16:00.320 --> 00:16:01.300
Ja.

00:16:01.300 --> 00:16:06.360
Weil, also, ähm, ganz herzlichen Dank, dass du heute da bist, Stefan, das, äh, freut

00:16:06.360 --> 00:16:10.500
uns sehr, und von, in Peißen haben wir ja von Typen auch schon das eine, andere Mal

00:16:10.500 --> 00:16:11.180
so am Rande gehört.

00:16:11.180 --> 00:16:14.820
Ja, wir haben diese Episode immer lange vor uns hergeschoben, weil wir uns nie ausreichend

00:16:14.820 --> 00:16:16.800
vorbereitet gefühlt haben dafür, aber das ist halt so großartig.

00:16:16.800 --> 00:16:20.180
Das ist ein großes Thema, es gibt auch eine ganz große, ähm, Anti-Fan-Gemeinde in Peißen

00:16:20.180 --> 00:16:21.060
für Types, irgendwie.

00:16:21.060 --> 00:16:23.480
Ja, es gibt auch viele, die das nicht so mögen, ja.

00:16:23.480 --> 00:16:26.460
Ähm, wie, wie seid ihr da so, so drauf?

00:16:26.460 --> 00:16:30.140
Ähm, also, also habt ihr jetzt Typen schon in eurem Python-Code drinnen, oder ist das

00:16:30.140 --> 00:16:33.360
eher nur so das Buch mit, mit sieben Siegeln, das ihr nicht, nicht öffnen wollt?

00:16:33.360 --> 00:16:37.560
Annotationen nutze ich persönlich sehr gerne, insbesondere dann, wenn ich mit anderen Menschen

00:16:37.560 --> 00:16:40.640
arbeite, um einfach so zu dokumentieren, was macht das denn überhaupt.

00:16:40.640 --> 00:16:43.760
Ähm, das heißt aber nicht, dass das immer stimmt, was da steht.

00:16:46.780 --> 00:16:48.420
Ist aber gefährlich damit.

00:16:48.420 --> 00:16:48.940
Ja.

00:16:48.940 --> 00:16:50.240
Das ist ein gefährliches Spiel.

00:16:50.240 --> 00:16:50.700
Ja.

00:16:50.700 --> 00:16:56.640
Ja, also ich, ich verwende sie auch schon und ich habe halt ein, ein, ein Projekt mal so

00:16:56.640 --> 00:17:00.920
komplett irgendwie annotiert, einfach nur auch, weil ich wissen wollte, wie schwierig

00:17:00.920 --> 00:17:03.880
ist es denn nun, wie, wie, wie weh tut es denn, äh, irgendwie.

00:17:03.880 --> 00:17:09.980
Äh, äh, und, ähm, ja, das, das ging schon, aber es war auch, also, ich, ich habe da jetzt

00:17:09.980 --> 00:17:16.380
nicht so wahnsinnig viel, äh, irgendwie Nutzen rausziehen können, aber ich hatte auch vorher

00:17:16.380 --> 00:17:21.060
neben Dingen halt auch schon 100% Test-Coverage, insofern, ähm, war da einfach wahrscheinlich

00:17:21.060 --> 00:17:25.740
nicht mehr so viel zu, zu, äh, ja, auch das habe ich ja gemacht, um, um, um es mal gemacht

00:17:25.740 --> 00:17:27.240
zu haben, als, äh, dass es halt wirklich Nutzen hat.

00:17:27.240 --> 00:17:31.340
Ich habe tatsächlich in den Projekten bei mir jetzt Enforced, äh, MyPi, äh, Precommit

00:17:31.340 --> 00:17:35.160
Hook, das ist auch schon, das, damit gehe ich ziemlich vielen Leuten auf die Nerven, ähm,

00:17:35.160 --> 00:17:35.520
aber.

00:17:35.520 --> 00:17:37.300
Ja, da kannst du überall Objekt hinschreiben, oder?

00:17:37.300 --> 00:17:38.400
Das, das zählt doch auch.

00:17:38.400 --> 00:17:41.540
Ja, okay, also, da sind die meisten übrigens noch nicht draufgekommen.

00:17:41.540 --> 00:17:44.700
Oh, da habe ich jetzt ein Geheimnis verraten, hups, Entschuldigung.

00:17:46.360 --> 00:17:53.500
Also, ich bin, ich bin beeindruckt von der 100% Test-Coverage, also, äh, ich bin, ich

00:17:53.500 --> 00:18:00.480
bin, leider Gottes, der faulste Tester, äh, diesseits der Donau, also, das ist, ähm,

00:18:00.480 --> 00:18:04.120
ähm, ich sage immer, also, ich habe diesen, diesen, diesen Spruch gehabt, wie nur in einer

00:18:04.120 --> 00:18:07.260
Agentur gearbeitet, da habe ich gesagt, ja, getestet wird beim Kunden, wenn es in Production

00:18:07.260 --> 00:18:13.640
ist, es soll reichen, aber, aber, ähm, aber ich, ich, keine Ahnung, liegt, liegt es an

00:18:13.640 --> 00:18:15.700
der Software, die ich schreibe, oder an der Rolle, in der ich bin?

00:18:16.340 --> 00:18:21.320
Ähm, ich bin sehr, sehr selten jemand, der, der wirklich ausgiebige Tests sweet schreibt

00:18:21.320 --> 00:18:25.980
und da, da, also, das ist, glaube ich, ähm, also, Arsch auf den Haupt, das ist, das ist,

00:18:25.980 --> 00:18:27.040
glaube ich, meine größte Schwäche.

00:18:27.040 --> 00:18:33.080
Ja, das ist ja, 100% Coverage ist auch schon sehr, äh, ja, aber, aber, ich finde es beeindruckend,

00:18:33.080 --> 00:18:33.280
wirklich.

00:18:33.280 --> 00:18:37.300
Ja, das haben wir in dem Projekt, in dem ich bin, auch 100%, also, 100% Branch Coverage

00:18:37.300 --> 00:18:37.600
sogar.

00:18:37.600 --> 00:18:38.140
Mhm.

00:18:38.140 --> 00:18:39.320
Und TypeScript.

00:18:39.320 --> 00:18:39.740
Oh.

00:18:39.740 --> 00:18:44.840
Also, es, es ist ja oft so, dass man das so ein bisschen als gegensätzliche Pole ansieht,

00:18:44.840 --> 00:18:45.300
sag ich mal.

00:18:45.300 --> 00:18:45.480
Ja.

00:18:45.480 --> 00:18:46.240
Die einen machen Typen.

00:18:46.320 --> 00:18:47.160
Die anderen machen Testing.

00:18:47.160 --> 00:18:50.480
Und das ist schön, Stefan, dass du das jetzt bestätigt hast, aber.

00:18:50.480 --> 00:18:55.560
Ich bin quasi das, das, das Typen-Paradebeispiel, ne?

00:18:55.560 --> 00:18:56.300
Ja.

00:18:56.300 --> 00:19:00.400
Ich meine, das Ding ist, das, ähm, äh, JavaScript und Python haben ja, haben ja, ähm, die gleiche

00:19:00.400 --> 00:19:05.560
Eigenschaft, dass beides, äh, in, in der Praxis dynamisch typisierte Sprachen sind.

00:19:05.560 --> 00:19:09.080
Sprich, natürlich gibt's Typen, sonst könntest du mit den ganzen Werten nichts anfangen.

00:19:09.080 --> 00:19:10.760
Es ist aber relativ egal, was das für ein ist.

00:19:10.760 --> 00:19:15.220
Du kannst dann, ähm, ähm, ähm, ein Number oder ein Integer einer, einer Variable zuweisen

00:19:15.220 --> 00:19:18.020
und im nächsten String, äh, Schritt dann String und keiner regt sie auf und keiner

00:19:18.020 --> 00:19:18.400
beschwert sie.

00:19:18.400 --> 00:19:19.580
Und das funktioniert halt einfach, ne?

00:19:19.580 --> 00:19:21.840
Ähm, oder du kannst verschiedene Typen mischen.

00:19:21.840 --> 00:19:23.600
Du kannst ein String mit einer Zahl kombinieren.

00:19:23.600 --> 00:19:24.500
Nee, das geht in Python nicht.

00:19:24.500 --> 00:19:24.840
Oder umgekehrt.

00:19:24.840 --> 00:19:25.640
Das geht nicht.

00:19:25.640 --> 00:19:26.040
Okay, cool.

00:19:26.040 --> 00:19:29.040
Wow, dann setzt ihr schon mal einen Riesenschritt weiter als, als in, in JavaScript.

00:19:29.040 --> 00:19:31.260
Ja, gut, das ist halt das große Problem an JavaScript, oder?

00:19:31.260 --> 00:19:33.760
Dass du solche implizite Konversionen drin hast.

00:19:33.760 --> 00:19:34.800
Ja, also.

00:19:34.800 --> 00:19:35.520
Genau, das gibt's ja.

00:19:35.520 --> 00:19:39.820
Das heißt dann immer weak getyped versus strong getyped, aber ich meine, ich weiß

00:19:39.820 --> 00:19:40.640
nicht, ob das irgendeinen Sinn da gibt.

00:19:40.640 --> 00:19:44.520
Aber diese ganzen Bezeichnungen sind ja auch alle nur so ein bisschen, ja.

00:19:44.520 --> 00:19:47.700
Also die schöneren Bezeichnungen sind meiner Meinung nach statisch und dynamisch,

00:19:47.700 --> 00:19:52.320
wo du einfach weißt, okay, ähm, definierst du den Typen im Vorhinein oder wird er

00:19:52.320 --> 00:19:53.500
definiert durch die Verwendung?

00:19:53.500 --> 00:19:59.200
Ähm, ähm, weak und strong, also schwach und stark ist, ist, sind, sind sehr schwache

00:19:59.200 --> 00:20:00.880
Bezeichnungen, meiner Meinung nach.

00:20:00.880 --> 00:20:01.180
Ja.

00:20:01.180 --> 00:20:05.660
C zum Beispiel hat ein, ein statisches Typsystem, aber ein sehr, sehr schwaches.

00:20:05.660 --> 00:20:08.600
Ob du jetzt einen Character hast oder ein Integer oder irgendwas anderes, es ist

00:20:08.600 --> 00:20:09.740
einfach komplett wurscht.

00:20:09.740 --> 00:20:10.140
Also.

00:20:10.640 --> 00:20:11.360
Kannst alles damit machen.

00:20:11.360 --> 00:20:14.340
Und kannst auch hin und her wechseln und kannst auch Bitfiddling mit allem möglichen

00:20:14.340 --> 00:20:14.880
Scheiß machen.

00:20:14.880 --> 00:20:16.240
Genau, genau, genau.

00:20:16.240 --> 00:20:16.900
Wundervolle Bezeichnung.

00:20:16.900 --> 00:20:20.560
Und vor dem, vor dem ist das, das Statische eigentlich das Wichtige, weil es ja ein bisschen

00:20:20.560 --> 00:20:25.820
eine andere, ähm, Herangehensweise ans Programmieren, ähm, voraussetzt.

00:20:25.820 --> 00:20:31.660
Du, du machst dir einfach mehr Gedanken über, ähm, über die, die mögliche Wertemenge

00:20:31.660 --> 00:20:34.660
einer Variable, bevor du einen Wert zuweist.

00:20:34.660 --> 00:20:38.720
Das schließt jetzt nicht aus, dass du sagen kannst, hey, du, du bekommst einen Typen

00:20:38.720 --> 00:20:39.640
durch Typ-Inferenz.

00:20:39.640 --> 00:20:40.480
Das mache ich sehr sehr gern.

00:20:40.560 --> 00:20:44.780
Aber ich sage, hey, diese Variable X ist 3 und dann weißt du, dass das ein Number oder

00:20:44.780 --> 00:20:45.840
Integer oder was auch immer ist.

00:20:45.840 --> 00:20:46.840
Das geht natürlich auch.

00:20:46.840 --> 00:20:51.560
Das machen auch moderne Programmiersprachen sehr, sehr, sehr gerne, ähm, ähm, grundlegend,

00:20:51.560 --> 00:20:53.420
dass du halt mit wenig Annotationen machen kannst.

00:20:53.420 --> 00:20:59.260
Nichtsdestotrotz, ähm, definierst du Verträge zwischen Bausteinen deines Codes, zwischen

00:20:59.260 --> 00:21:03.480
den Functions, zwischen Methoden in deinen Klassen etc., in denen du sagst, du erwartest

00:21:03.480 --> 00:21:05.560
aber jetzt diesen Wertebereich und nichts anderes.

00:21:05.560 --> 00:21:07.380
Und du lässt auch nichts anderes zu, ne.

00:21:07.380 --> 00:21:10.480
Und, ähm, TypeScript ist meiner Meinung nach doch sehr, sehr gut.

00:21:10.480 --> 00:21:10.960
Sehr, sehr spannend.

00:21:10.960 --> 00:21:18.400
Ähm, weil TypeScript halt versucht, eine sehr dynamische, dynamisch typisierte Programmiersprache

00:21:18.400 --> 00:21:22.340
und generell sehr dynamische Programmiersprache wie JavaScript in einer gewissen Art und Weise

00:21:22.340 --> 00:21:23.160
zu formalisieren.

00:21:23.160 --> 00:21:28.200
Also das Ziel ist ja jetzt nicht, dort eine komplett neue Programmiersprache zu definieren

00:21:28.200 --> 00:21:35.380
oder zu entwickeln, sondern auf Basis einer bestehenden irgendwie ein Regelwerk zu finden,

00:21:35.380 --> 00:21:39.980
damit alle beteiligten Programmierinnen und Programmierer irgendwas zu diskutieren haben

00:21:39.980 --> 00:21:40.400
und wissen, was sie tun.

00:21:40.400 --> 00:21:41.620
Was da eigentlich vor sich geht, ne.

00:21:41.620 --> 00:21:46.400
Nichts ist schlimmer, wenn du ein halbes Jahr, nachdem du dein Programm geschrieben hast,

00:21:46.400 --> 00:21:50.200
wieder zurückgehst und dich fragst, hey, was war denn diese Variable X nochmal, ne.

00:21:50.200 --> 00:21:51.640
Also was habe ich mir da eigentlich gedacht?

00:21:51.640 --> 00:21:54.960
Und dann hast du irgend so eine fette Wurst an Code und musst herauslesen, was du eigentlich

00:21:54.960 --> 00:21:55.540
damit machst.

00:21:55.540 --> 00:22:03.140
Und, also das ist was, was mich immer komplett verwirrt hat, wie, also ich habe da nie ein

00:22:03.140 --> 00:22:07.140
funktionales Programmierparadigmen nochmal ausprobiert, viel mit asynchronen Promises

00:22:07.140 --> 00:22:10.060
gearbeitet in Node, irgendwelche dynamischen Objekte gehabt.

00:22:10.320 --> 00:22:14.640
Ich habe ständig neue Keys hinzugefügt und wieder entfernt und das war kurz und effektiv

00:22:14.640 --> 00:22:18.240
und schnell und schön und drei Monate später habe ich nicht mehr gewusst, was ich dort

00:22:18.240 --> 00:22:19.240
mache.

00:22:19.240 --> 00:22:21.600
Wenn ich das Programm heute lese, ich kenne mich nicht aus und ich würde es auch heute

00:22:21.600 --> 00:22:28.000
nicht mehr so machen, einfach weil, weil, also gut österreichisch, sorry, Graut und

00:22:28.000 --> 00:22:33.000
Ruben einfach zusammenschmeißen und hoffe, dass am Ende alles funktioniert und das ist

00:22:33.000 --> 00:22:34.000
gut für kleine Skripte.

00:22:34.000 --> 00:22:39.200
Das ist gut, wenn du irgendwie geschwind was runterheckst, aber wenn ihr wirklich mit einem

00:22:39.200 --> 00:22:40.240
Team versucht, realisieren.

00:22:40.240 --> 00:22:43.680
Wenn du wirklich mit einem Team gearbeitet hast, dann ist das, glaube ich, die niedrigste

00:22:43.680 --> 00:22:48.880
Schwelle, die du hast, um zu dokumentieren, was jetzt von deiner Software und von den

00:22:48.880 --> 00:22:51.220
Nutzern deiner Software überhaupt erwartet wird.

00:22:51.220 --> 00:22:54.500
Und ich glaube, deswegen sind Typen so wichtig und deswegen, glaube ich, sind Typen auch

00:22:54.500 --> 00:22:58.780
in Python sehr, sehr interessant, weil du ja da die gleichen Voraussetzungen hast.

00:22:58.780 --> 00:23:04.740
Also du musst ja wissen, was erwartet jetzt deine Funktion dort und je mehr Bibliotheken

00:23:04.740 --> 00:23:05.200
das du hast.

00:23:05.200 --> 00:23:10.160
Wie gesagt, ich wäre schon gesagt, ich bin jetzt in diesem Lunchen und LLM-Wahnsinn irgendwie

00:23:10.160 --> 00:23:10.420
angefangen.

00:23:10.420 --> 00:23:12.920
Da hast du sehr, sehr komplexe Objekte, die du hin und her schickst, nicht?

00:23:12.920 --> 00:23:16.540
Woher sollst du wissen oder woher soll ich wissen, der keinen Python schreibt, sondern

00:23:16.540 --> 00:23:19.480
nur lest, was da jetzt eigentlich erwartet wird und was ich da rauskriege?

00:23:19.480 --> 00:23:20.060
Ja, das finde ich auch.

00:23:20.060 --> 00:23:24.060
Also das ist tatsächlich so als Dokumentationstyp für Python ist das, was ich auch am häufigsten

00:23:24.060 --> 00:23:24.900
gerne mag.

00:23:24.900 --> 00:23:29.320
Also in kleinen Closures, in kleinen Methoden oder Funktionen irgendwie die Argumente so

00:23:29.320 --> 00:23:33.420
zu annotieren, dass beim Lesen klar wird, was denn der Mensch da haben möchte, der

00:23:33.420 --> 00:23:38.080
diese API bereitstellt, dass ich das irgendwie zusammengebaut kriege oder so oder verstehe,

00:23:38.080 --> 00:23:39.260
was er denn da braucht oder sowas.

00:23:39.960 --> 00:23:40.660
Das sehe ich anders.

00:23:40.660 --> 00:23:41.940
Ja, ich weiß nicht so.

00:23:41.940 --> 00:23:46.820
Aber das hätte ich ja heute hier.

00:23:46.820 --> 00:23:47.720
Ja, genau.

00:23:47.720 --> 00:23:50.700
Lieber Johannes.

00:23:50.700 --> 00:23:55.900
Also ich finde, dass das Argument, was der Dominik bringt, das stimmt, wenn man nur

00:23:55.900 --> 00:23:57.020
simple Funktionen hat.

00:23:57.020 --> 00:24:00.560
Also wenn man wissen will, was, ob da jetzt ein Integer oder ein String rein muss.

00:24:00.560 --> 00:24:04.260
Und man hat vier Parameter und die haben alle simple Typen.

00:24:04.260 --> 00:24:08.840
Aber für mich fällt es auseinander, wenn die Typen komplex werden, weil dann hast du

00:24:09.760 --> 00:24:14.440
einen Typen, die irgendwelche interne Struktur haben, die völlig opak ist.

00:24:14.440 --> 00:24:16.840
Und dann hast du 17 verschiedene Varianten davon.

00:24:16.840 --> 00:24:21.020
Und am Ende weißt du genauso wenig, was da rein muss und was nicht.

00:24:21.020 --> 00:24:24.420
Und das hat alles so seine Grenzen.

00:24:24.420 --> 00:24:28.960
Ja, ich habe letzte Woche mit einem Freund telefoniert.

00:24:28.960 --> 00:24:31.800
Da haben wir uns auch kurz über Type Annotations unterhalten.

00:24:31.800 --> 00:24:33.540
Und er meinte so, ja, schön und gut.

00:24:33.540 --> 00:24:34.280
Und ich sehe die Vorteile.

00:24:34.280 --> 00:24:37.660
Und zwar, ich finde es einfach irgendwie hässlich, weil irgendwie.

00:24:39.560 --> 00:24:48.680
Die IDE kann ja mit was anfangen oder so.

00:24:48.680 --> 00:24:49.500
Wenn man das jetzt anguckt.

00:24:49.500 --> 00:24:53.120
Er meinte so, ja, dann hat man bei den ganzen modernen Libraries heutzutage, dann hast du

00:24:53.120 --> 00:24:59.200
da irgendwie Funktionen und da hast du pro Zeile einen Parameter, weil da kommt immer

00:24:59.200 --> 00:25:00.600
der Name des Parameters.

00:25:00.600 --> 00:25:04.140
Dann kommt halt die Type Annotation, die einem nicht viel sagt.

00:25:04.140 --> 00:25:07.120
Und dann kommt nochmal ein Kommentar, der erklärt, was die Type Annotation einem eigentlich

00:25:07.120 --> 00:25:09.520
sagen will und das dann so untereinander.

00:25:09.520 --> 00:25:09.540
Und dann kommt halt die Type Annotation, die einem nicht viel sagt.

00:25:09.540 --> 00:25:09.540
Und dann kommt nochmal ein Kommentar, der erklärt, was die Type Annotation einem eigentlich sagen will.

00:25:09.540 --> 00:25:09.540
Und das dann so untereinander.

00:25:09.540 --> 00:25:09.540
Und dann kommt nochmal ein Kommentar, der erklärt, was die Type Annotation einem eigentlich sagen will.

00:25:09.540 --> 00:25:09.540
Und das dann so untereinander.

00:25:09.540 --> 00:25:12.300
Und dann meinte er so, das erinnert mich total an C-Code aus den 80ern.

00:25:12.300 --> 00:25:14.300
Ich weiß nicht, ich mag das nicht.

00:25:14.300 --> 00:25:15.580
Das ist nicht Python.

00:25:15.580 --> 00:25:20.840
Ja, aber ich muss, also dieses Argument höre ich auch häufig, wenn man jetzt so bei den

00:25:20.840 --> 00:25:25.160
alten, zum Beispiel übernächste Woche wieder oder ist das nächste?

00:25:25.160 --> 00:25:25.560
Ich weiß nicht.

00:25:25.560 --> 00:25:26.380
Übernächste, ja.

00:25:26.380 --> 00:25:28.620
Auch hier aufs Python-User.

00:25:28.620 --> 00:25:29.580
Oder das nächste, nächste Mittwoch.

00:25:29.580 --> 00:25:30.900
Das nächste Woche, ja.

00:25:30.900 --> 00:25:31.440
Ja, ja.

00:25:31.440 --> 00:25:32.480
Genau, gehen.

00:25:32.480 --> 00:25:38.240
Da gibt es dann die alteingesessenen, die sagen auch immer so, ah.

00:25:38.240 --> 00:25:39.280
Immer nur achs, quaks.

00:25:39.520 --> 00:25:40.500
Sternchen, Sternchen.

00:25:40.500 --> 00:25:41.660
Nein, das nicht, aber.

00:25:41.660 --> 00:25:42.680
Ja, ja.

00:25:42.680 --> 00:25:45.080
Aber das ist schon so ein Punkt, mit dem viele Probleme haben, ja.

00:25:45.080 --> 00:25:49.160
Ich kenne genug Python, dass ich den Witz mit achs, quaks verstanden habe.

00:25:49.160 --> 00:25:52.700
Dann gehörst du schon zu den Oberen.

00:25:52.700 --> 00:25:55.240
Ja, nein, also gut.

00:25:55.240 --> 00:26:03.420
Ich bin immer sehr kritisch, wenn es darum geht, dass man die Ästhetik bewertet, weil

00:26:03.420 --> 00:26:05.060
ich schreibe sehr viel in Rust.

00:26:05.060 --> 00:26:07.120
Rust ist eine sehr unästhetische Sprache.

00:26:07.120 --> 00:26:09.500
Du hast quasi, hey, wie viel sind da?

00:26:09.500 --> 00:26:13.220
Ich habe übrigens keine Programmiersprache vertragen und Rust sagt ja, also her damit.

00:26:13.220 --> 00:26:19.120
Aber dafür ist mir halt in Rust zu jedem Zeitpunkt absolut hundertprozentig klar, was passiert.

00:26:19.120 --> 00:26:22.940
Und das ist halt auch ein Vorteil, den man nicht leugnen kann.

00:26:22.940 --> 00:26:23.900
Gerade, wenn man in Teams arbeitet.

00:26:23.900 --> 00:26:26.760
Und da nehme ich halt die paar Annotationen, die ich da habe, einfach hin.

00:26:26.760 --> 00:26:33.440
Und irgendwas hat jetzt da geblinkt, ich bin kurz rausgekommen.

00:26:33.440 --> 00:26:36.320
Und verstehe zumindest, was passiert.

00:26:36.320 --> 00:26:39.120
Und ich muss ganz ehrlich sagen, was ich rein jetzt sehe von dem, was.

00:26:39.500 --> 00:26:47.380
Wie Python Typings umsetzt, ist es sehr minimalistisch.

00:26:47.380 --> 00:26:49.600
Also da kann man sich noch weit, weit mehr verausgaben.

00:26:49.600 --> 00:26:52.080
Also ich finde das gar nicht einmal so hässlich.

00:26:52.080 --> 00:27:00.220
Ja, ich finde das Problem ist halt, dass diese Typsysteme oft zu weit getrieben werden.

00:27:00.220 --> 00:27:02.180
Und das treibt dann Blüten.

00:27:02.180 --> 00:27:04.300
Ja, also für alles und jedes und nochmal die letzte.

00:27:04.300 --> 00:27:05.140
Genau, für alles und jedes.

00:27:05.140 --> 00:27:06.900
Und das muss dann alles ein benannter Typ sein.

00:27:06.900 --> 00:27:08.260
Und das geht dann.

00:27:08.260 --> 00:27:09.460
Also ich habe hier.

00:27:09.500 --> 00:27:13.080
Ich habe hier ein Beispiel aus der Apple-Dokumentation.

00:27:13.080 --> 00:27:18.840
Da gibt es einen Typen, der heißt CN Label Contact Relation Younger Cousin Mother Siblings Daughter or Father Sisters Daughter.

00:27:18.840 --> 00:27:18.940
Ja.

00:27:18.940 --> 00:27:20.240
Das ist ein Typ.

00:27:20.240 --> 00:27:20.760
Wunderschön.

00:27:20.760 --> 00:27:22.760
Ja, ob man den jetzt braucht oder nicht.

00:27:22.760 --> 00:27:28.500
Auf der anderen Seite hier ein Beispiel aus der .NET-Bibliothek.

00:27:28.500 --> 00:27:30.140
Die Links sind dann alle in den Show Notes.

00:27:30.140 --> 00:27:31.920
Da gibt es eine Methode, die heißt Run.

00:27:31.920 --> 00:27:34.560
Die hat 30 Argumente.

00:27:34.560 --> 00:27:35.420
31.

00:27:35.420 --> 00:27:36.900
Das erste ist ein Object.

00:27:36.900 --> 00:27:37.780
Das heißt Makro.

00:27:37.780 --> 00:27:38.580
Das zweite ist ein Object.

00:27:38.580 --> 00:27:39.480
Das heißt Arc1.

00:27:39.500 --> 00:27:41.340
Das dritte ist ein Object.

00:27:41.340 --> 00:27:42.220
Das heißt Arc2.

00:27:42.220 --> 00:27:43.720
Und so geht es weiter bis Arc30.

00:27:43.720 --> 00:27:45.480
Grandios.

00:27:45.480 --> 00:27:46.560
Da bringen mir die Typen nichts.

00:27:46.560 --> 00:27:50.680
Da sagen mir die Typen nicht, was das macht.

00:27:50.680 --> 00:27:52.100
Und zwar in beide Richtungen nicht.

00:27:52.100 --> 00:27:53.340
Ja, besser wird man dadurch nicht mehr.

00:27:53.340 --> 00:27:56.880
Und es gibt halt da diese Fetischisten, die sagen, du musst aber überall benannte Typen drin haben.

00:27:56.880 --> 00:27:59.080
Und du musst das Typsystem vollständig aufbauen.

00:27:59.080 --> 00:28:00.930
ausnutzen. Und

00:28:00.930 --> 00:28:03.130
das geht mir genauso auf den Senkel wie die alten Herren,

00:28:03.130 --> 00:28:04.530
die dann sagen, nein,

00:28:04.530 --> 00:28:07.270
Typ-Annotationen ist ekelhaft

00:28:07.270 --> 00:28:08.510
und hässlich und wie in den 80ern.

00:28:08.510 --> 00:28:10.910
Irgendwo in der Mitte ist dieses Maß.

00:28:10.910 --> 00:28:13.290
Du hast mich gerade

00:28:13.290 --> 00:28:15.130
an etwas Wunderbares erinnert. Ich bin ja

00:28:15.130 --> 00:28:17.370
in einer Java-Welt

00:28:17.370 --> 00:28:18.450
groß geworden.

00:28:18.450 --> 00:28:21.150
Und habe gelitten dort.

00:28:21.150 --> 00:28:21.950
Ich auch.

00:28:21.950 --> 00:28:25.370
Ich komme aus der

00:28:25.370 --> 00:28:27.230
Nähe von Linz und direkt

00:28:27.230 --> 00:28:28.670
auf dem anderen Bergerl

00:28:28.670 --> 00:28:30.830
gegenüber wohnt

00:28:30.830 --> 00:28:33.410
einer der Erfinder vom Spring-Framework.

00:28:33.410 --> 00:28:35.190
Also wir kennen uns, unsere Kinder gehen

00:28:35.190 --> 00:28:36.470
gemeinsam in die Schule und solche Sachen.

00:28:36.470 --> 00:28:38.990
Und da gibt es eine Klasse, das ist die

00:28:38.990 --> 00:28:41.170
Has this type pattern tried to sneak in

00:28:41.170 --> 00:28:43.270
some generic or parameterized type pattern

00:28:43.270 --> 00:28:44.610
matching stuff anywhere visitor.

00:28:44.610 --> 00:28:47.110
Und das ist fantastisch.

00:28:47.110 --> 00:28:48.850
Also bei uns in der Firma

00:28:48.850 --> 00:28:49.870
haben die Java-Developer

00:28:49.870 --> 00:28:54.210
diese Weißkin-Monitore,

00:28:54.210 --> 00:28:55.390
aber nicht, dass sie irgendwie

00:28:55.390 --> 00:28:57.150
dort mehrere Fenster nebeneinander

00:28:57.150 --> 00:28:58.850
hinkriegen, sondern ich sage immer, das ist, damit sie die

00:28:58.850 --> 00:29:01.270
Klassennamen ohne Zeilen-Humbuch

00:29:01.270 --> 00:29:02.110
durchstehen können.

00:29:02.110 --> 00:29:05.150
Und das ist natürlich, das ist

00:29:05.150 --> 00:29:07.210
Mumpitz, das ist ganz klar. Also ich denke, man

00:29:07.210 --> 00:29:09.110
muss die ganzen Sachen immer ein bisschen

00:29:09.110 --> 00:29:10.110
pragmatischer sehen

00:29:10.110 --> 00:29:13.010
und halt auch einen richtigen Nutzen

00:29:13.010 --> 00:29:15.190
oder wissen, welchen Nutzen man daraus

00:29:15.190 --> 00:29:17.470
zieht. Das gilt für alles in der Softwareentwicklung

00:29:17.470 --> 00:29:18.090
meiner Meinung nach.

00:29:18.090 --> 00:29:20.290
Das ist der Anzug.

00:29:20.290 --> 00:29:23.110
Genau. Was ich am liebsten habe,

00:29:23.110 --> 00:29:25.130
zum Beispiel, also ich schreibe immer noch sehr, sehr viel

00:29:25.130 --> 00:29:27.070
Node und wenn ich starte damit,

00:29:27.070 --> 00:29:29.270
dann habe ich

00:29:29.270 --> 00:29:30.970
einmal keine Typen zu Beginn, weil ich ja selbst

00:29:30.970 --> 00:29:32.530
nicht weiß, wie meine Software am Ende ausschaut.

00:29:32.530 --> 00:29:34.770
Aber wenn ich dann fertig bin, wenn ich dann ein paar Funktionen

00:29:34.770 --> 00:29:37.190
extrahiert habe, dann lasse ich mir ein paar Typen

00:29:37.190 --> 00:29:39.010
einführen, einfach nur, dass ich festgelegt habe,

00:29:39.010 --> 00:29:41.130
was ich hier an dieser Stelle

00:29:41.130 --> 00:29:43.130
erwarte, damit, wenn ich zurückgehe

00:29:43.130 --> 00:29:44.850
oder wer von meinen Kolleginnen oder Kollegen

00:29:44.850 --> 00:29:47.270
zurückgeht, auch weiß,

00:29:47.270 --> 00:29:48.650
was dort zu erwarten war.

00:29:48.650 --> 00:29:50.930
Und um das geht es eigentlich. Und gerade in

00:29:50.930 --> 00:29:52.810
TypeScript, also gerade auch in meinem Buch gibt es

00:29:52.810 --> 00:29:53.950
ein paar Beispiele drinnen,

00:29:53.950 --> 00:29:55.850
da kann man sich schon

00:29:55.850 --> 00:29:57.050
richtig, richtig vorausgucken.

00:29:57.070 --> 00:29:58.890
Da gibt es irrsinnig mächtige Werkzeuge,

00:29:58.890 --> 00:30:00.510
wie String-Template-Literal-Types oder

00:30:00.510 --> 00:30:02.350
Tappel-Types, Variadic-Tappel-Types.

00:30:02.350 --> 00:30:04.850
Das sind Dinge, wo ich mir denke,

00:30:04.850 --> 00:30:07.030
Wahnsinn, dass das überhaupt geht.

00:30:07.030 --> 00:30:09.070
Also beeindruckend technisch, dass das geht.

00:30:09.070 --> 00:30:11.090
Aber die Use-Cases dafür

00:30:11.090 --> 00:30:12.950
sind halt stark limitiert und man muss wirklich überlegen,

00:30:12.950 --> 00:30:14.650
ob das dafür steht. Und ich habe dort

00:30:14.650 --> 00:30:17.290
drei Lektionen, wo wir

00:30:17.290 --> 00:30:19.030
ein funktionales

00:30:19.030 --> 00:30:20.770
Programmiertool wie

00:30:20.770 --> 00:30:22.910
Currying versuchen, auf drei

00:30:22.910 --> 00:30:24.830
sehr, sehr komplexe Orten umzusetzen und sagen,

00:30:24.830 --> 00:30:26.750
aber überlegt, ob diese

00:30:26.750 --> 00:30:28.790
Typen jetzt das gerechtfertigen, was du

00:30:28.790 --> 00:30:30.750
da als Funktion schreibst, oder ob du nicht

00:30:30.750 --> 00:30:32.770
lieber eine Funktion nimmst, die viel, viel weniger

00:30:32.770 --> 00:30:34.190
kann, aber

00:30:34.190 --> 00:30:36.750
genauso einfach zu verwenden ist und die

00:30:36.750 --> 00:30:38.810
einfach zu typisieren ist, mit der du

00:30:38.810 --> 00:30:40.590
besser die

00:30:40.590 --> 00:30:41.910
Typinformation rauskriegst.

00:30:41.910 --> 00:30:44.090
Und das stelle ich dann auch so zur Diskussion.

00:30:44.090 --> 00:30:46.270
Man muss halt immer abwägen können,

00:30:46.270 --> 00:30:47.850
wie rechtfertigst du

00:30:47.850 --> 00:30:50.850
den Einsatz dieses Werkzeugs und wie weit

00:30:50.850 --> 00:30:51.370
treibst du das?

00:30:51.370 --> 00:30:53.310
Ja, ich glaube, das ist tatsächlich

00:30:53.310 --> 00:30:54.330
gar nicht so einfach herauszufinden.

00:30:54.330 --> 00:30:55.710
Ja, und

00:30:55.710 --> 00:30:56.370
...

00:30:56.750 --> 00:30:58.590
Ich glaube aber, dass da noch ein anderes Problem dahinter ist.

00:30:58.590 --> 00:31:00.810
Ich bin sehr froh, Stefan, dass du

00:31:00.810 --> 00:31:02.450
da gesagt hast, dass du gegen

00:31:02.450 --> 00:31:04.530
Tests bist oder

00:31:04.530 --> 00:31:06.850
gegen große Testcoverage. Und du hast jetzt

00:31:06.850 --> 00:31:08.530
gerade eben so ein bisschen deinen Ansatz beschrieben,

00:31:08.530 --> 00:31:10.470
wie du Programme schreibst und

00:31:10.470 --> 00:31:12.830
du hast was gesagt, was meiner Meinung nach

00:31:12.830 --> 00:31:14.790
ganz wichtig ist. Du hast gesagt, du fängst

00:31:14.790 --> 00:31:16.890
an, ein Programm zu schreiben und weißt noch nicht, wie es am Ende

00:31:16.890 --> 00:31:17.490
ausschauen wird.

00:31:17.490 --> 00:31:20.770
Und das geht mir genauso.

00:31:20.770 --> 00:31:22.810
Und das ist einer der Gründe, warum

00:31:22.810 --> 00:31:23.070
ich

00:31:23.070 --> 00:31:26.470
Python mag,

00:31:26.750 --> 00:31:28.190
weil mir das die Freiheit gibt,

00:31:28.190 --> 00:31:30.470
da so explorativ rumzugehen, ohne

00:31:30.470 --> 00:31:32.370
mir groß Gedanken machen zu müssen,

00:31:32.370 --> 00:31:33.950
wie es denn jetzt sauber zusammenpasst.

00:31:33.950 --> 00:31:36.410
Und ich glaube, dass das ein Programmierstil ist.

00:31:36.410 --> 00:31:38.630
Das ist, ich nenne das, exploratives Programmieren.

00:31:38.630 --> 00:31:40.510
Ich muss so ein bisschen diesen Space

00:31:40.510 --> 00:31:41.750
erkunden, muss so ein bisschen sehen,

00:31:41.750 --> 00:31:44.210
was kann ich, was schaffe ich, was mache ich.

00:31:44.210 --> 00:31:46.330
Und das ist halt mein Stil.

00:31:46.330 --> 00:31:48.430
Ich gehe da rein und sage, jetzt machen wir erstmal irgendwas.

00:31:48.430 --> 00:31:50.550
Es gibt aber auch Leute, die da

00:31:50.550 --> 00:31:52.570
vielleicht mathematischer rangehen

00:31:52.570 --> 00:31:54.230
und die sagen, okay, ich habe hier einen Plan

00:31:54.230 --> 00:31:56.510
und eigentlich auf dem Papier habe ich es ja schon hingeschrieben.

00:31:56.750 --> 00:31:58.390
Und dann kann ich

00:31:58.390 --> 00:32:00.330
auch die Tests zuerst schreiben, weil ich weiß ja schon, was

00:32:00.330 --> 00:32:02.110
das machen soll. Ich weiß ja schon, wie es am Ende ausschaut.

00:32:02.110 --> 00:32:04.650
Oder ich kann gleich die richtigen Typen reinschreiben.

00:32:04.650 --> 00:32:06.210
Ja, da muss man sich ja das Akronym ändern

00:32:06.210 --> 00:32:08.390
und einfach Type-Driven-Development

00:32:08.390 --> 00:32:10.530
von einem neuen Stand starten.

00:32:10.530 --> 00:32:16.470
Ja, das sind, glaube ich,

00:32:16.470 --> 00:32:18.250
einfach zwei verschiedene Arten zu

00:32:18.250 --> 00:32:20.450
programmieren, die eben verschiedene Dinge

00:32:20.450 --> 00:32:21.850
eher bevorzugen.

00:32:21.850 --> 00:32:24.510
Es ist tatsächlich,

00:32:24.510 --> 00:32:26.410
glaube ich, auch ein bisschen von der Sprache abhängig, weil

00:32:26.410 --> 00:32:26.450
es ist ja auch ein bisschen von der Sprache abhängig, weil

00:32:26.450 --> 00:32:26.450
es ist ja auch ein bisschen von der Sprache abhängig, weil

00:32:26.450 --> 00:32:26.550
es ist ja auch ein bisschen von der Sprache abhängig, weil

00:32:26.550 --> 00:32:26.610
es ist ja auch ein bisschen von der Sprache abhängig, weil

00:32:26.610 --> 00:32:26.670
es ist ja auch ein bisschen von der Sprache abhängig, weil

00:32:26.670 --> 00:32:26.710
es ist ja auch ein bisschen von der Sprache abhängig, weil

00:32:26.710 --> 00:32:26.750
es ist ja auch ein bisschen von der Sprache abhängig, weil

00:32:26.750 --> 00:32:26.770
es ist ja auch ein bisschen von der Sprache abhängig, weil

00:32:26.770 --> 00:32:26.810
es ist ja auch ein bisschen von der Sprache abhängig, weil

00:32:26.810 --> 00:32:28.950
ich glaube, Python und JavaScript unterstützen

00:32:28.950 --> 00:32:30.790
ja diese Art des explorativen Programmierens

00:32:30.790 --> 00:32:32.550
sehr, sehr stark. Einfach eben in

00:32:32.550 --> 00:32:34.710
Gensity-Typen auch entfernen. Also du kannst

00:32:34.710 --> 00:32:36.610
wirklich einfach einmal herumprobieren und schauen, was

00:32:36.610 --> 00:32:38.650
rauskommt. Und schauen, wie

00:32:38.650 --> 00:32:40.810
weit du mit deinen Ideen

00:32:40.810 --> 00:32:41.170
kommst.

00:32:41.170 --> 00:32:44.550
Was ich spannend finde, also ich bin jetzt

00:32:44.550 --> 00:32:46.350
seit einigen Jahren auch sehr, sehr stark in Rust drin.

00:32:46.350 --> 00:32:48.610
Ich habe das jetzt schon erwähnt. Und sorry, das ist der klassische

00:32:48.610 --> 00:32:50.510
Rust-Nutzer. Nicht, dass ich ständig sage, dass

00:32:50.510 --> 00:32:52.630
er Rust verwendet, aber es ist halt

00:32:52.630 --> 00:32:54.610
wirklich so. Die Sprache macht einiges sehr, sehr richtig.

00:32:54.610 --> 00:32:56.610
Du hast in Rust eine sehr

00:32:56.610 --> 00:32:58.890
stark typisierte Programmiersprache

00:32:58.890 --> 00:33:00.850
mit einem fantastischen Typsystem.

00:33:00.850 --> 00:33:02.650
Das ist grandios, dass das

00:33:02.650 --> 00:33:04.790
so funktioniert, wie es funktioniert.

00:33:04.790 --> 00:33:06.590
Das heißt, du kannst dir gar nicht leisten, dass

00:33:06.590 --> 00:33:07.350
du einfach nur mal schaust,

00:33:07.350 --> 00:33:10.730
wo kommst

00:33:10.730 --> 00:33:12.450
du mit deinen Wertebereichen

00:33:12.450 --> 00:33:14.490
überhaupt am Ende hin. Aber trotzdem schafft

00:33:14.490 --> 00:33:16.530
es Rust, dass du explorativ

00:33:16.530 --> 00:33:18.470
arbeiten kannst, weil einfach die Mittel, die

00:33:18.470 --> 00:33:20.930
zur Verfügung gestellt werden, so zugänglich

00:33:20.930 --> 00:33:22.510
sein können, weil die Typen, die

00:33:22.510 --> 00:33:24.530
vor Hause schon drinnen sind, so

00:33:24.530 --> 00:33:26.450
entgegenkommen sind. Das heißt, du kommst mit ein paar

00:33:26.450 --> 00:33:28.210
Basistypen aus der Standardbibliothek

00:33:28.210 --> 00:33:30.550
und den üblichen Wertebereichen schon

00:33:30.550 --> 00:33:32.610
sehr, sehr weit, bevor du dir selbst deine eigenen

00:33:32.610 --> 00:33:34.590
Strukturen und

00:33:34.590 --> 00:33:38.370
Interfaces, nenne ich es jetzt einmal,

00:33:38.370 --> 00:33:40.210
heißen, anders überlegen musst.

00:33:40.210 --> 00:33:42.570
Und das ist sehr, sehr spannend. Es ist

00:33:42.570 --> 00:33:44.070
aber trotzdem ein anderer Wert des Programmierens.

00:33:44.070 --> 00:33:46.630
Das

00:33:46.630 --> 00:33:48.330
Endresultat schaut auch dann

00:33:48.330 --> 00:33:50.330
anders aus. Also ich mag das aber auch gerne.

00:33:50.330 --> 00:33:52.430
So Models oder so Dataclasses

00:33:52.430 --> 00:33:54.350
irgendwie zu bauen und dann zu gucken, hey, was sind

00:33:54.350 --> 00:33:56.270
das denn überhaupt für Objekte? Und dir halt dann direkt

00:33:56.270 --> 00:33:58.330
zur Annotation zu verwenden, das ist

00:33:58.330 --> 00:34:00.150
so strukturell sehr klar.

00:34:00.150 --> 00:34:02.490
Nein, es schließt sich auch nicht aus.

00:34:02.490 --> 00:34:03.250
Also es ist,

00:34:03.250 --> 00:34:06.230
ich denke mir,

00:34:06.230 --> 00:34:08.510
die

00:34:08.510 --> 00:34:10.330
Gefahr liegt wahrscheinlich, dass man sich auf eines

00:34:10.330 --> 00:34:12.010
komplett verschreibt.

00:34:12.010 --> 00:34:14.250
Auch das, was der Johannes

00:34:14.250 --> 00:34:15.910
wieder gesagt hat, ganz richtig ist,

00:34:15.910 --> 00:34:18.190
es ist am Ende des Tages, es ist

00:34:18.190 --> 00:34:20.250
ein Werkzeug, nicht? Und es muss irgendeinen Job

00:34:20.250 --> 00:34:21.230
erfüllen.

00:34:21.230 --> 00:34:24.230
Und wenn das gut funktioniert, dass du dir

00:34:24.230 --> 00:34:26.150
vorher Gedanken darüber machst, welche Daten, das du

00:34:26.150 --> 00:34:28.070
benötigst, dann ist das absolut legitim,

00:34:28.070 --> 00:34:29.790
meiner Meinung nach, nicht? Also ich finde

00:34:29.790 --> 00:34:31.450
gerade so

00:34:31.450 --> 00:34:33.990
angenehm. Wichtig ist, dass die

00:34:33.990 --> 00:34:35.550
Sprache, mit der du arbeitest, das unterstützt.

00:34:35.550 --> 00:34:37.610
Ja, ich glaube auch eben.

00:34:37.610 --> 00:34:40.170
Aber ich meine,

00:34:40.170 --> 00:34:42.210
das hat natürlich mal einen Preis, weil es halt zusätzliche

00:34:42.210 --> 00:34:44.090
Komplexität unter Umständen halt

00:34:44.090 --> 00:34:45.850
auch einführt und es dann halt vielleicht auch

00:34:45.850 --> 00:34:48.130
unzugänglicher macht. Also ich, worauf ich

00:34:48.130 --> 00:34:49.270
eigentlich hinaus will, ist,

00:34:49.270 --> 00:34:52.090
naja, je nach Use Case kann es

00:34:52.090 --> 00:34:54.130
halt unterschiedlich

00:34:54.130 --> 00:34:55.850
nützlich sein. Also wenn man halt zum Beispiel

00:34:55.850 --> 00:34:57.310
eben in einem Team

00:34:57.310 --> 00:35:00.110
einer großen Software schreibt, dann kann es halt sein,

00:35:00.110 --> 00:35:01.730
dass es sehr viel bringt, auch

00:35:01.730 --> 00:35:03.370
irgendwie möglichst viele Hürden

00:35:03.370 --> 00:35:06.030
zu errichten, bevor irgendwie

00:35:06.030 --> 00:35:07.870
Code... Du willst quasi gar nicht, dass die Entwickler

00:35:07.870 --> 00:35:10.090
irgendwas machen. Ja, das ist leider

00:35:10.090 --> 00:35:12.030
halt eine Strategie, das ist schwer

00:35:12.030 --> 00:35:13.570
zu unterscheiden von, irgendwie man

00:35:13.570 --> 00:35:15.810
versucht, Fehler zu vermeiden, bevor sie dann

00:35:15.810 --> 00:35:17.990
produktiv gehen, zu bloß nicht

00:35:17.990 --> 00:35:19.990
deployen, was dann halt auch viele Leute machen,

00:35:19.990 --> 00:35:21.930
was halt irgendwie auch blöde

00:35:21.930 --> 00:35:23.710
Konsequenzen hat unter Umständen dann, weil

00:35:23.710 --> 00:35:25.590
also viele Sachen, also man hat dann zum Beispiel nicht nur ein

00:35:25.590 --> 00:35:27.790
Staging-System, sondern noch so drei andere

00:35:27.790 --> 00:35:29.750
oder vier andere und führt immer mehr hinzu,

00:35:29.750 --> 00:35:31.750
sodass man bloß nicht nach Produktionen

00:35:31.750 --> 00:35:32.970
deployen muss. Ich habe zwei

00:35:32.970 --> 00:35:35.410
Abteilungen bei uns kennengelernt, die haben

00:35:35.410 --> 00:35:37.670
Employment-Release-Zyklus so alle sechs

00:35:37.670 --> 00:35:39.470
Monate. Ja, genau,

00:35:39.470 --> 00:35:41.650
in den sechs Monaten passiert halt auch nichts, aber

00:35:41.650 --> 00:35:43.970
ja, ist halt vielleicht auch irgendwie

00:35:43.970 --> 00:35:45.590
ein Konflikt mit anderen Zielen.

00:35:45.590 --> 00:35:47.930
Hast du etwa diesen Artikel über Move

00:35:47.930 --> 00:35:49.770
Fast-and-Break-Things gelesen, der kürzlich

00:35:49.770 --> 00:35:50.990
rausgekommen ist? Ja, genau.

00:35:50.990 --> 00:35:53.830
Ja, richtig. Und

00:35:53.830 --> 00:35:56.050
genau, also an der Stelle

00:35:56.050 --> 00:35:57.950
macht es ja vielleicht, wenn man

00:35:57.950 --> 00:35:59.930
in so einer Situation ist, sehr viel Sinn

00:35:59.930 --> 00:36:01.950
da, von den Leuten

00:36:01.950 --> 00:36:03.830
zu verlangen, dass sie sich erst Gedanken machen und dass halt man

00:36:03.830 --> 00:36:05.210
versucht, möglichst viele Fehler

00:36:05.210 --> 00:36:07.690
zu fangen, bevor sie halt in der Produktion

00:36:07.690 --> 00:36:09.890
aufschlagen, weil da ist es halt viel

00:36:09.890 --> 00:36:11.610
teurer, sie halt zu entfernen als

00:36:11.610 --> 00:36:13.850
aber es kann halt total anders

00:36:13.850 --> 00:36:15.830
sein, wenn jetzt jemand zum Beispiel, und das ist

00:36:15.830 --> 00:36:17.850
halt eine der Stärken bei Python,

00:36:17.870 --> 00:36:19.270
bei JavaScript auch

00:36:19.270 --> 00:36:20.530
ein bisschen anders,

00:36:20.530 --> 00:36:23.850
dass es halt vor allen Dingen auch von

00:36:23.850 --> 00:36:26.190
Leuten benutzt wird, die sich selber gar nicht als professionelle

00:36:26.190 --> 00:36:27.770
Programmierer sehen würden,

00:36:27.770 --> 00:36:29.730
sondern die eher sagen würden, naja, ich bin eigentlich eher so

00:36:29.730 --> 00:36:31.550
so Data Scientist oder

00:36:31.550 --> 00:36:33.550
Analyst oder sowas,

00:36:33.550 --> 00:36:35.790
oder halt irgendwie jemand, der

00:36:35.790 --> 00:36:37.670
irgendwie, keine Ahnung, Roboter irgendwie

00:36:37.670 --> 00:36:39.970
dazu bringt, irgendwie lustige Dinge zu machen oder sowas

00:36:39.970 --> 00:36:42.050
und ich will mich jetzt eigentlich... Oder Teilchenbeschleuniger.

00:36:42.050 --> 00:36:43.930
Oder Teilchenbeschleuniger, also solche

00:36:43.930 --> 00:36:45.910
Sachen, genau. Und ich will gar nicht

00:36:45.910 --> 00:36:47.370
jetzt irgendwie Typ,

00:36:47.810 --> 00:36:49.510
Typtheorie verstehen oder

00:36:49.510 --> 00:36:51.870
irgendwie, keine Ahnung, auch

00:36:51.870 --> 00:36:53.710
Unitests und da sind wir auch bei einem

00:36:53.710 --> 00:36:55.890
Ding, wo die Sachen so ein bisschen ähnlich sind.

00:36:55.890 --> 00:36:57.410
Also ich dachte auch lange Zeit irgendwie

00:36:57.410 --> 00:37:00.290
Unitests sind was ganz anderes

00:37:00.290 --> 00:37:01.950
und Typisierung

00:37:01.950 --> 00:37:03.850
ist ein

00:37:03.850 --> 00:37:06.070
anderen Ende von einem Spektrum und ich bin eher

00:37:06.070 --> 00:37:07.930
so Team Test, aber inzwischen denke ich so,

00:37:07.930 --> 00:37:09.890
naja, das ist schon relativ ähnlich auch. Ich meine,

00:37:09.890 --> 00:37:11.870
auch Unitesting ist halt so eine Sache, die man sich

00:37:11.870 --> 00:37:13.910
erst irgendwie erschließen muss und für

00:37:13.910 --> 00:37:15.890
manche Leute macht das einfach, wenn man

00:37:15.890 --> 00:37:17.610
halt irgendwie so in einem Jupyter Notebook

00:37:17.750 --> 00:37:18.310
Sachen macht,

00:37:18.310 --> 00:37:21.690
ja, manchmal macht es schon Sinn, das zu testen,

00:37:21.690 --> 00:37:23.690
aber für viele Leute ist es auch nicht, lohnt es sich,

00:37:23.690 --> 00:37:25.650
weiß ich nicht, ob es sich wirklich lohnt, da so

00:37:25.650 --> 00:37:27.730
tief einzusteigen und

00:37:27.730 --> 00:37:29.550
aber ich meine, klar, wenn man jetzt große Software

00:37:29.550 --> 00:37:31.690
im Team entwickelt, dann klar hat man

00:37:31.690 --> 00:37:33.710
Tests und eine CI-Pipeline

00:37:33.710 --> 00:37:35.350
und weiß ich nicht, diesen ganzen Kram halt, ne?

00:37:35.350 --> 00:37:37.970
Ja. Das Stichwort

00:37:37.970 --> 00:37:39.610
da ist doch Programming by Contract,

00:37:39.610 --> 00:37:41.530
oder? Und das ist halt eine Möglichkeit,

00:37:41.530 --> 00:37:42.870
so einen Contract zu schreiben, aber

00:37:42.870 --> 00:37:45.590
also ich bin da in so einem Zwiespalt, ja,

00:37:45.590 --> 00:37:47.650
einerseits bin ich total genervt von solchen Typsystemen,

00:37:47.690 --> 00:37:49.490
die dann sehr präzise sind und die dann,

00:37:49.490 --> 00:37:51.530
ich habe auch, ich bin auch mit Java

00:37:51.530 --> 00:37:53.710
aufgewachsen, Stefan, also ich zähle deinen Schmerz

00:37:53.710 --> 00:37:55.410
und dann

00:37:55.410 --> 00:37:57.730
wirkt man sich ab

00:37:57.730 --> 00:37:59.450
und macht ein Pair aus Int

00:37:59.450 --> 00:38:01.570
und String und dann weißt du aber nicht,

00:38:01.570 --> 00:38:03.270
wie du an den zweiten drankommst und

00:38:03.270 --> 00:38:04.510
ach, das ist alles ganz schön.

00:38:04.510 --> 00:38:06.770
Aber auf der anderen Seite

00:38:06.770 --> 00:38:09.690
gibt es nicht die Möglichkeit zu sagen,

00:38:09.690 --> 00:38:11.750
ganz triviale Sachen zu sagen, ja, zum Beispiel

00:38:11.750 --> 00:38:13.690
hier muss eine Zahl rauskommen, die immer größer ist als 0

00:38:13.690 --> 00:38:15.730
oder immer kleiner als 0, größer als 0

00:38:15.730 --> 00:38:17.630
geht ja tatsächlich noch, aber kleiner als 0

00:38:17.630 --> 00:38:19.550
ist 0, kannst du nicht sagen. Du kannst nicht sagen,

00:38:19.550 --> 00:38:21.590
hier muss was rauskommen, was zwischen 0 und 1 liegt.

00:38:21.590 --> 00:38:23.510
Und das ist irgendwie

00:38:23.510 --> 00:38:25.170
so eine weirde Sache,

00:38:25.170 --> 00:38:27.630
ich bin da in so einem Zwiespalt, ich hätte gerne

00:38:27.630 --> 00:38:29.650
keine Typsysteme, aber wenn ich Typsysteme

00:38:29.650 --> 00:38:31.710
hätte, hätte ich gerne so welche, die so exakt

00:38:31.710 --> 00:38:33.730
sind, dass ich sowas

00:38:33.730 --> 00:38:35.590
sagen kann und dass mir dann auch der Compiler sagen kann,

00:38:35.590 --> 00:38:37.290
ah, Moment, hier rufst du eine Funktion aus

00:38:37.290 --> 00:38:39.570
mit einer Zahl, die zwischen 0 und 1

00:38:39.570 --> 00:38:40.810
sein kann, aber die muss zwischen

00:38:40.810 --> 00:38:42.510
0 und minus 1 sein.

00:38:42.510 --> 00:38:45.110
Nee, das ist nicht Validierung, sondern das ist,

00:38:45.110 --> 00:38:47.570
nee, das sind sogenannte Value Types, das kannst

00:38:47.570 --> 00:38:49.450
du auch in ein Typsystem reingießen, wenn du das

00:38:49.450 --> 00:38:51.250
möchtest, das hat nur

00:38:51.250 --> 00:38:52.810
quasi keine Sprache.

00:38:52.810 --> 00:38:54.390
Ich glaube, ich habe eine mal gesehen.

00:38:54.390 --> 00:38:56.070
Eitris, ja genau.

00:38:56.070 --> 00:38:59.630
Also grundsätzlich im funktionalen Programmierbereich

00:38:59.630 --> 00:39:01.150
hast du das

00:39:01.150 --> 00:39:02.850
relativ häufig, aber

00:39:02.850 --> 00:39:06.270
ich würde mal

00:39:06.270 --> 00:39:07.810
annehmen, nicht in den

00:39:07.810 --> 00:39:09.670
populären oder weit

00:39:09.670 --> 00:39:11.730
verbreiteten Programmierungen. Nee, nicht in denen, die man benutzt

00:39:11.730 --> 00:39:13.750
irgendwo. Oder die man schon mal gehört hat.

00:39:13.750 --> 00:39:15.690
Aus einem ganz

00:39:15.690 --> 00:39:17.510
einfachen Grund, weil du halt unter den

00:39:17.510 --> 00:39:19.610
Wertebereichen von einer Zahl

00:39:19.610 --> 00:39:21.430
halt auch tatsächlich irgendwelche Bytes

00:39:21.430 --> 00:39:23.750
liegen, die von einer CPU ausgelesen

00:39:23.750 --> 00:39:24.650
werden. Also das,

00:39:24.650 --> 00:39:27.590
wenn dir

00:39:27.590 --> 00:39:29.430
das Typsystem das erlaubt, dass du dort

00:39:29.430 --> 00:39:31.330
irgendwas zwischen minus 1 und plus 1

00:39:31.330 --> 00:39:33.110
zum Beispiel definierst, oder mein Gott,

00:39:33.110 --> 00:39:35.550
eine ganze Zahl zwischen 25, was auch

00:39:35.550 --> 00:39:37.570
immer, dann schiebst du

00:39:37.570 --> 00:39:39.030
die Validierungen nur an eine andere Stelle.

00:39:39.030 --> 00:39:41.510
Ja gut,

00:39:41.510 --> 00:39:43.410
aber das machst du mit einem Typsystem generell, oder?

00:39:43.410 --> 00:39:45.330
Also ich meine, sobald der TypeScript-Compiler

00:39:45.330 --> 00:39:46.170
durch ist, ist er weg.

00:39:46.170 --> 00:39:47.250
Das ist,

00:39:47.450 --> 00:39:49.450
das ist sehr richtig, genau. Das ist sehr richtig.

00:39:49.450 --> 00:39:51.690
Ich glaube, in Python genauso, ne? Wenn ich mich nicht täusche.

00:39:51.690 --> 00:39:53.830
Ja, generell. In Python sind die

00:39:53.830 --> 00:39:55.690
Annotationen erstmal gar nichts. Genau, das ist

00:39:55.690 --> 00:39:57.710
in Python auch so leicht anders. Das wissen

00:39:57.710 --> 00:39:59.610
auch viele Leute. Ja, das ist ganz, das ist halt,

00:39:59.610 --> 00:40:01.530
wenn man zu den praktischen Dingen kommt, die halt

00:40:01.530 --> 00:40:03.370
damit problematisch sind, also ich bin ja häufiger auch

00:40:03.370 --> 00:40:04.930
irgendwie in unterschiedlichen

00:40:04.930 --> 00:40:07.570
Firmenkontexten da so unterwegs

00:40:07.570 --> 00:40:09.610
und das, was

00:40:09.610 --> 00:40:11.490
ich in letzter Zeit halt häufig sehe, ist halt

00:40:11.490 --> 00:40:13.730
sowas wie, Leute annotieren

00:40:13.730 --> 00:40:14.910
halt irgendwie ganz viel,

00:40:17.390 --> 00:40:19.670
sie haben keinen statischen Type-Checker,

00:40:19.670 --> 00:40:21.510
der da drüberlaufen würde und in Python ist halt auch keiner

00:40:21.510 --> 00:40:23.390
eingebaut, was vielleicht auch nicht so gut ist

00:40:23.390 --> 00:40:25.450
und man müsste da, und dann

00:40:25.450 --> 00:40:27.470
mache ich dann sowas wie, ich lasse mal

00:40:27.470 --> 00:40:29.330
MyPy drüberlaufen und die Leute verwenden

00:40:29.330 --> 00:40:31.350
alle TypeDict und sowas und denken halt,

00:40:31.350 --> 00:40:33.370
ja, das überprüft jetzt, ob meine ganzen Werte

00:40:33.370 --> 00:40:35.630
da so, also meine ganzen

00:40:35.630 --> 00:40:37.050
Werte in dem Dict halt so den

00:40:37.050 --> 00:40:39.410
richtigen Typ haben und so

00:40:39.410 --> 00:40:41.430
und Python selber macht

00:40:41.430 --> 00:40:43.190
da gar nichts. Das überprüft überhaupt nichts. Das

00:40:43.190 --> 00:40:45.110
ignoriert die Annotationen einfach.

00:40:45.110 --> 00:40:46.890
Ich lasse dann MyPy drüberlaufen und kriege dann so

00:40:46.890 --> 00:40:47.330
414.

00:40:47.330 --> 00:40:48.930
Fehler. Und dann denke ich mir so, okay,

00:40:48.930 --> 00:40:51.210
ja, also, du hast da schön deine Annahmen darüber,

00:40:51.210 --> 00:40:53.190
wie die ganzen Typen aussehen, dokumentiert, aber die sind halt

00:40:53.190 --> 00:40:55.250
leider alle falsch. Das stimmt überhaupt gar nicht.

00:40:55.250 --> 00:40:57.170
Und, ähm, ja, da ist dann,

00:40:57.170 --> 00:40:58.830
denkt man sich, warum hat man sich denn überhaupt die Mühe gemacht?

00:40:58.830 --> 00:41:00.890
Also, das ist halt irgendwie...

00:41:00.890 --> 00:41:03.050
Ja, wie ist denn der Zustand der

00:41:03.050 --> 00:41:04.990
Entwicklungsumgebungen in Python?

00:41:04.990 --> 00:41:07.490
Äh, kommt drauf an.

00:41:07.490 --> 00:41:09.110
Also, auch die hängen halt daran, ob du

00:41:09.110 --> 00:41:11.190
MyPy zum Beispiel als

00:41:11.190 --> 00:41:12.550
Static Type Shaper Extension

00:41:12.550 --> 00:41:15.110
richtig konfiguriert hast, ja, und

00:41:15.110 --> 00:41:17.270
ob dann auch MyPy die Stubs

00:41:17.270 --> 00:41:19.030
halt lesen kann, die halt

00:41:19.030 --> 00:41:20.530
da notwendig sind oder halt auch nicht.

00:41:20.530 --> 00:41:23.110
Die müssen halt alle dann... Aber viele IDEs behandeln das doch

00:41:23.110 --> 00:41:25.130
auch selber schon. Ja, ja, genau.

00:41:25.130 --> 00:41:27.210
Da gibt's ja auch dann, ähm, ich weiß gar nicht

00:41:27.210 --> 00:41:28.930
jetzt, äh, was bei VS Code

00:41:28.930 --> 00:41:30.690
dann normalerweise verwendet wird.

00:41:30.690 --> 00:41:33.010
MyPy ist Extension. Ja, aber

00:41:33.010 --> 00:41:34.790
ich meine, wenn jetzt zum Beispiel einfach nur das...

00:41:34.790 --> 00:41:36.990
Also, IntelliJ macht das selber. Ja, die machen das,

00:41:36.990 --> 00:41:38.990
die haben einen proprietären, dann gibt's irgendwie

00:41:38.990 --> 00:41:41.110
MyPy, klar, äh, und es gibt

00:41:41.110 --> 00:41:43.110
halt noch PyWrite und, ähm,

00:41:43.110 --> 00:41:44.890
der Language Server

00:41:44.890 --> 00:41:47.210
für Python, kann es sein, dass er selber in

00:41:47.210 --> 00:41:48.710
Type... von Microsoft, dass er in

00:41:48.710 --> 00:41:50.810
TypeScript geschrieben ist, ich glaube schon. Ich meine, schon, oder? Ja.

00:41:50.810 --> 00:41:53.090
Ja, es ist, ähm, es ist nämlich spannend,

00:41:53.090 --> 00:41:55.150
weil ich, ich, ich denke,

00:41:55.150 --> 00:41:57.090
TypeScript hat da einige

00:41:57.090 --> 00:41:59.010
richtige Entscheidungen getroffen auf dem Gebiet.

00:41:59.010 --> 00:42:01.090
Ähm, die, die ihr jetzt

00:42:01.090 --> 00:42:03.230
alle angesprochen habt, was, was kompliziert

00:42:03.230 --> 00:42:05.150
und was komplex in, in Python ist,

00:42:05.150 --> 00:42:06.990
ähm, nämlich,

00:42:06.990 --> 00:42:08.790
dass du, dass die Sprache dir zwar ein

00:42:08.790 --> 00:42:10.850
Typsystem anbietet,

00:42:10.850 --> 00:42:13.050
cool, aber eigentlich nichts damit macht,

00:42:13.050 --> 00:42:15.030
sondern du brauchst eh nur einen extra Typchecker und

00:42:15.030 --> 00:42:17.150
und anscheinend wie bei den Package Manager

00:42:17.150 --> 00:42:18.870
dann gibt es dort noch mehrere, die du, wo du

00:42:18.870 --> 00:42:21.050
dir dann noch aussuchen kannst, welcher gefällt dir jetzt

00:42:21.050 --> 00:42:23.110
und welcher passt zu dir

00:42:23.110 --> 00:42:24.970
und so weiter und ich finde das grandios, dass

00:42:24.970 --> 00:42:26.850
es Auswahl gibt, keine Frage, aber es erhöht

00:42:26.850 --> 00:42:28.950
natürlich auch die Komplexität. Ähm, und

00:42:28.950 --> 00:42:30.130
TypeScript hat, hat,

00:42:30.130 --> 00:42:32.990
TypeScript selbst ist ja eigentlich

00:42:32.990 --> 00:42:34.790
mehrere Dinge. Es ist zum einen mal

00:42:34.790 --> 00:42:36.830
ein Typsystem, cool, also wie werden

00:42:36.830 --> 00:42:38.810
Typen geschrieben, definiert, wie

00:42:38.810 --> 00:42:40.610
sind sie im Zusammenhang? Es ist auch ein

00:42:40.610 --> 00:42:42.890
Typchecker dabei, ähm, also,

00:42:42.890 --> 00:42:44.710
also der, der TypeScript Compiler

00:42:44.710 --> 00:42:47.090
TSC macht in erster Linie mal Typechecking,

00:42:47.090 --> 00:42:48.970
aber kompiliert

00:42:48.970 --> 00:42:50.830
dann auch tatsächlich JavaScript-Code, den

00:42:50.830 --> 00:42:52.970
du ausführen kannst. Also wir, es gibt so jetzt Proposals,

00:42:52.970 --> 00:42:54.890
dass du auch Typernotationen

00:42:54.890 --> 00:42:56.790
irgendwann einmal in JavaScript schreiben können

00:42:56.790 --> 00:42:58.810
solltest, ähnlich wie in Python, wir sind dort einfach von der

00:42:58.810 --> 00:43:00.970
Runtime ignoriert, ähm, aber da

00:43:00.970 --> 00:43:02.810
sind wir noch nicht, also da kommen wir erst hin.

00:43:02.810 --> 00:43:04.730
Das heißt, du brauchst auch den Compiler, das heißt, wir haben

00:43:04.730 --> 00:43:06.990
Typsystem, Typchecker, Compiler und noch auch ganz, ganz

00:43:06.990 --> 00:43:08.530
wichtig, eine Integration

00:43:08.530 --> 00:43:10.990
in Editoren und Entwicklungsumgebungen,

00:43:10.990 --> 00:43:12.930
ne? Ähm, und das war eigentlich,

00:43:12.930 --> 00:43:15.090
also, dieser, dieser gesamte

00:43:15.090 --> 00:43:17.030
Tooling-Aspekt rundherum, nicht nur

00:43:17.030 --> 00:43:18.870
das Typsystem anzubieten, sondern auch

00:43:18.870 --> 00:43:20.870
Werkzeuge anzubieten,

00:43:20.870 --> 00:43:23.070
dass du nachher zu validem JavaScript-Code kommst

00:43:23.070 --> 00:43:24.850
und du deine Fehler siehst

00:43:24.850 --> 00:43:26.790
und die Fehler auch sofort in deinem Editor und

00:43:26.790 --> 00:43:28.390
deiner IDE dargestellt werden,

00:43:28.390 --> 00:43:30.770
sind meiner Meinung nach genau

00:43:30.770 --> 00:43:32.790
die Punkte, die noch auch den, den

00:43:32.790 --> 00:43:34.710
unter Anführungszeichen Ziegelszug

00:43:34.710 --> 00:43:36.690
von, von TypeScript auch, ähm,

00:43:36.690 --> 00:43:37.690
ähm,

00:43:37.690 --> 00:43:39.990
zu verantworten gehabt haben, ne?

00:43:39.990 --> 00:43:42.190
Ähm, weil ohne dem hast du halt

00:43:42.190 --> 00:43:44.790
nur die Hälfte der Dinge, du brauchst halt irgendwie

00:43:44.790 --> 00:43:46.970
alles, damit du sauber, ähm,

00:43:46.970 --> 00:43:47.950
ähm, entwickeln kannst.

00:43:47.950 --> 00:43:50.870
Ähm, und wenn ich mir denke, dass ich Visual Studio Code

00:43:50.870 --> 00:43:52.730
aufmache, wo TypeScript schon, schon drinnen ist

00:43:52.730 --> 00:43:54.850
und ich mache irgendein JavaScript-File auf

00:43:54.850 --> 00:43:56.590
und es läuft im Hintergrund schon der

00:43:56.590 --> 00:43:58.750
TypeScript-Compiler und checkt meinen JavaScript-Code

00:43:58.750 --> 00:44:00.690
und versucht zu inferieren

00:44:00.690 --> 00:44:02.590
und zu verstehen, was ich schon geschrieben habe,

00:44:02.590 --> 00:44:04.510
ohne einzige Typ-Annotation

00:44:04.510 --> 00:44:06.810
und ich kriege aus dem raus schon

00:44:06.810 --> 00:44:08.770
Autocomplete und die

00:44:08.770 --> 00:44:10.630
ersten Warnings, dass vielleicht irgendwas nicht ganz

00:44:10.630 --> 00:44:12.470
schief, äh, nicht ganz, nicht ganz

00:44:12.470 --> 00:44:14.710
rund läuft und schief geht, das ist

00:44:14.710 --> 00:44:16.730
so viel wert, ohne dass ich eine Zeile

00:44:16.730 --> 00:44:18.530
TypeScript schreibe, wo ich mir denke, ja,

00:44:18.530 --> 00:44:20.670
das ist eigentlich eine richtig gute Idee

00:44:20.670 --> 00:44:22.010
gewesen. Ja.

00:44:22.010 --> 00:44:24.610
Naja, absolut. Da kann, da kann Python

00:44:24.610 --> 00:44:26.610
sich, glaube ich, auch noch eine Scheibe abschneiden davon,

00:44:26.610 --> 00:44:28.750
weil da gibt's noch so ein paar Löcher.

00:44:28.750 --> 00:44:30.670
Ja, oder was? Also wenn ich jetzt sage,

00:44:30.670 --> 00:44:32.650
ich installiere PyCharm oder, oder wie auch

00:44:32.650 --> 00:44:34.710
immer, welche Idee, und die kommt

00:44:34.710 --> 00:44:36.910
schon mit einem Typ-Interpreter

00:44:36.910 --> 00:44:37.930
oder einem Type-Checker mit,

00:44:37.930 --> 00:44:40.530
das wäre natürlich göttlich nett, dass du einfach sagst,

00:44:40.530 --> 00:44:42.570
hey, du brauchst nicht mehr die Typ-Annotation schreiben,

00:44:42.570 --> 00:44:44.490
aber die Idee hat

00:44:44.490 --> 00:44:46.610
irgendein Type-Checker schon bei Default

00:44:46.610 --> 00:44:48.470
drinnen. Wahrscheinlich schreiben sie ihn selbst, weil

00:44:48.470 --> 00:44:50.230
JetBrains schreibt das irgendwie selbst.

00:44:50.230 --> 00:44:52.290
Haben sie. Dann werde ich schon

00:44:52.290 --> 00:44:53.410
krank. Genau, der von JetBrains ist,

00:44:53.410 --> 00:44:56.430
der von JetBrains ist, ja, aber die,

00:44:56.430 --> 00:44:58.210
der ist supergut.

00:44:58.210 --> 00:45:00.450
Das ist einer der Gründe, warum man

00:45:00.450 --> 00:45:02.450
PyCharm verwendet, weil die halt da die

00:45:02.450 --> 00:45:04.410
beste Typ-Inferenz haben und die besten.

00:45:04.410 --> 00:45:06.390
Ich meine, man merkt schon, dass das

00:45:06.390 --> 00:45:07.450
Java ist, ja, aber.

00:45:07.450 --> 00:45:10.430
Aber das können sie, also da sind sie richtig, richtig

00:45:10.430 --> 00:45:12.450
gut. Ja, das ist super. Schon wieder Rust,

00:45:12.450 --> 00:45:14.350
für Rust haben sie auch einen eigenen geschrieben, also

00:45:14.350 --> 00:45:16.090
die ganze Welt verwendet Rust Analyzer.

00:45:16.490 --> 00:45:18.310
Außer du nimmst Rust

00:45:18.310 --> 00:45:20.170
Rover von JetBrains, dann ist

00:45:20.170 --> 00:45:22.170
da ein eigener drinnen und sie

00:45:22.170 --> 00:45:23.890
haben auch Recht damit. Also

00:45:23.890 --> 00:45:25.290
das ist halt

00:45:25.290 --> 00:45:28.070
alles richtig gut integriert in die Werkzeuge, die sie

00:45:28.070 --> 00:45:28.850
zur Verfügung stellen.

00:45:28.850 --> 00:45:32.150
Ja, auch ein zusätzlicher Effekt, den das

00:45:32.150 --> 00:45:34.170
hat, dass halt quasi bei Python halt

00:45:34.170 --> 00:45:36.210
der statische Type-Checker

00:45:36.210 --> 00:45:37.850
halt nicht so wirklich zur Sprache dazugehört,

00:45:37.850 --> 00:45:40.110
ist halt auch, dass bei TypeScript ist es halt

00:45:40.110 --> 00:45:41.550
so, dass was sich sozusagen

00:45:41.550 --> 00:45:44.210
in der TypeScript-Sprache tut,

00:45:44.210 --> 00:45:45.890
auch immer sofort verfügbar ist.

00:45:46.370 --> 00:45:48.330
Und halt dann, und das ist bei Python

00:45:48.330 --> 00:45:50.330
nicht so, weil die statischen

00:45:50.330 --> 00:45:51.730
Type-Checker vor allen Dingen von den großen

00:45:51.730 --> 00:45:54.190
Gebaut werden, halt nicht

00:45:54.190 --> 00:45:56.290
MyPy, Dropbox, ich weiß nicht, ob die immer

00:45:56.290 --> 00:45:58.070
noch da so hauptsächlich dran sind, aber dann gibt's noch

00:45:58.070 --> 00:45:59.370
einen von Google, es gibt noch Pyright.

00:45:59.370 --> 00:46:02.230
Die hängen sowieso immer

00:46:02.230 --> 00:46:04.010
so ein bisschen in den Versionen hinterher,

00:46:04.010 --> 00:46:06.190
weil sie ihre Code-Basis

00:46:06.190 --> 00:46:08.250
sowieso nicht an der aktuellsten Version halten können,

00:46:08.250 --> 00:46:10.390
weil sie das gar nicht schaffen, weil das einfach zu viel Arbeit ist.

00:46:10.390 --> 00:46:12.590
Das heißt, normalerweise

00:46:12.590 --> 00:46:14.390
bei MyPy hängst du halt immer so eine

00:46:14.390 --> 00:46:16.250
Version irgendwie von dem, was die Sprache

00:46:16.250 --> 00:46:18.170
eigentlich kann, zurück, was halt auch

00:46:18.170 --> 00:46:19.330
total doof ist einfach.

00:46:19.330 --> 00:46:21.930
Du musst ja auch noch darauf einigen,

00:46:21.930 --> 00:46:24.070
welches Subset des Typsystems du jetzt

00:46:24.070 --> 00:46:24.610
verwendest.

00:46:24.610 --> 00:46:27.290
Ja, genau.

00:46:27.290 --> 00:46:29.350
Da kann ja gar nichts schief gehen.

00:46:29.350 --> 00:46:34.210
Ja, aber TypeScript-Versionen gibt's ja jetzt auch.

00:46:34.210 --> 00:46:38.530
Ja, also TypeScript-Versionen-Management

00:46:38.530 --> 00:46:39.670
ist ja stark in der Kritik,

00:46:39.670 --> 00:46:40.570
ist ja keine Frage.

00:46:40.570 --> 00:46:43.970
Jedes Release ist ja bei KeyChange.

00:46:43.970 --> 00:46:46.130
Ja, und

00:46:46.130 --> 00:46:47.810
das ist aber einfach ein schwieriges Problem.

00:46:47.810 --> 00:46:50.110
Also ich glaube tatsächlich, dass TypeScript einfach

00:46:50.110 --> 00:46:52.170
dadurch, dass es eine jüngere Sprache ist,

00:46:52.170 --> 00:46:54.010
gewisse Fehler

00:46:54.010 --> 00:46:55.510
vermeiden konnte, die man halt

00:46:55.510 --> 00:46:58.110
vor 20 oder 25 oder 30

00:46:58.110 --> 00:47:00.030
Jahren machen musste mit diesen, mit den ganzen

00:47:00.030 --> 00:47:00.690
alten Sprachen.

00:47:00.690 --> 00:47:04.110
Aber manche Sachen sind halt immer noch nicht gelöst

00:47:04.110 --> 00:47:06.290
und Version Hell gehört halt dazu.

00:47:06.290 --> 00:47:08.050
Wobei ja

00:47:08.050 --> 00:47:09.910
sagen wir, TypeScript ist schon historisch gewachsen.

00:47:09.910 --> 00:47:11.930
Also du merkst schon

00:47:11.930 --> 00:47:14.130
die dunklen Flecken der Vergangenheit

00:47:14.130 --> 00:47:16.010
und versuchst sie zu ignorieren, das ist

00:47:16.010 --> 00:47:17.550
ja so, das passiert halt.

00:47:17.550 --> 00:47:19.290
So wie Sachen verwendet werden,

00:47:19.290 --> 00:47:21.170
hast du noch die Probleme.

00:47:21.170 --> 00:47:24.410
Ja, und das muss sich ja auch an JavaScript orientieren.

00:47:24.410 --> 00:47:26.190
Also es muss ja JavaScript-kompatibel

00:47:26.190 --> 00:47:27.670
sein und da kriegst du halt viel,

00:47:27.670 --> 00:47:28.730
sag ich mal.

00:47:28.730 --> 00:47:30.570
Ja, auch da kriegst du halt viel Historie.

00:47:30.570 --> 00:47:32.990
Wenn ich es sehr freundlich ausdrücken will.

00:47:32.990 --> 00:47:35.650
Ein kleines bisschen Programmiersprachen-Historie mitgeliefert.

00:47:35.650 --> 00:47:36.370
Ja.

00:47:36.370 --> 00:47:37.510
Ja.

00:47:37.510 --> 00:47:40.970
Ja, aber

00:47:40.970 --> 00:47:44.070
ich wollte gerade nochmal auf Java ein, wo wir das gerade hatten.

00:47:44.070 --> 00:47:45.790
Es ist leider schon ein bisschen drüber,

00:47:45.890 --> 00:47:47.750
aber davon wieder weg.

00:47:47.750 --> 00:47:49.750
Aber da hatte ich nämlich auch noch so eine

00:47:49.750 --> 00:47:51.590
schöne, da habe ich letztens was

00:47:51.590 --> 00:47:52.490
sehr, sehr Schönes

00:47:52.490 --> 00:47:54.390
gelesen,

00:47:54.390 --> 00:47:57.050
dass halt

00:47:57.050 --> 00:47:59.030
einer der Autoren,

00:47:59.030 --> 00:48:01.550
auch von der Sprachspezifikation

00:48:01.550 --> 00:48:03.350
von Java, hat halt

00:48:03.350 --> 00:48:05.570
irgendwann mal so geschrieben zu den

00:48:05.570 --> 00:48:07.930
Generics, also dass sie die Generics eingeführt

00:48:07.930 --> 00:48:09.230
haben. Also ja,

00:48:09.230 --> 00:48:11.350
das war irgendwie ein Fehler.

00:48:11.350 --> 00:48:13.830
Nein, das ist...

00:48:13.830 --> 00:48:15.770
Und dann

00:48:15.770 --> 00:48:17.730
hat er irgendwie noch, in dem Buch

00:48:17.730 --> 00:48:19.390
selber findet man auch irgendwo so eine sehr schöne

00:48:19.390 --> 00:48:21.290
Fußnote.

00:48:21.290 --> 00:48:25.350
Ja, wo

00:48:25.350 --> 00:48:26.890
halt quasi die

00:48:26.890 --> 00:48:29.690
Annotation von Inam,

00:48:29.690 --> 00:48:31.730
Inam ist auch ein Partner

00:48:31.730 --> 00:48:33.910
ein Problem, aber in Java halt auch.

00:48:33.910 --> 00:48:35.810
Und Inam ist

00:48:35.810 --> 00:48:37.950
halt irgendwie definiert

00:48:37.950 --> 00:48:39.450
als, ich suche gerade, ob ich das hier finde,

00:48:39.450 --> 00:48:41.770
ah ja, genau, ist eine

00:48:41.770 --> 00:48:43.430
generische Klasse definiert als

00:48:43.430 --> 00:48:45.650
Inam, Spitze Klammer T, Extents Inam,

00:48:45.650 --> 00:48:47.550
Inam, Spitze Klammer T, Klammer zu,

00:48:47.550 --> 00:48:48.970
Klammer zu. Also diese

00:48:48.970 --> 00:48:51.550
rekursive Definition ist halt so ein bisschen

00:48:51.550 --> 00:48:53.650
schwierig

00:48:53.650 --> 00:48:55.490
zu verstehen. Wir haben inzwischen aufgegeben,

00:48:55.490 --> 00:48:56.750
es zu versuchen, Leuten zu erklären.

00:48:56.750 --> 00:48:59.610
Es gibt irgendwie Spezialisten, die uns

00:48:59.610 --> 00:49:01.130
versichert haben, über

00:49:01.130 --> 00:49:03.430
Typtheorie, die uns versichert haben, dass das schon alles

00:49:03.430 --> 00:49:05.490
okay ist und kein Problem. Und wir sollen uns

00:49:05.490 --> 00:49:07.510
einfach nicht so viel Gedanken drüber machen,

00:49:07.510 --> 00:49:09.370
was wir sehr gerne annehmen.

00:49:09.370 --> 00:49:12.570
Und...

00:49:12.570 --> 00:49:13.970
Die Spannung ist ja bei den

00:49:13.970 --> 00:49:15.530
Java-Generics, dass

00:49:15.530 --> 00:49:17.530
die als einziges

00:49:17.530 --> 00:49:19.730
Element im Typsystem von Java

00:49:19.730 --> 00:49:21.210
keine

00:49:21.210 --> 00:49:23.230
Auswirkungen auf

00:49:23.230 --> 00:49:25.450
die Gestaltung der Laufzeitobjekte haben.

00:49:25.450 --> 00:49:27.930
Also das sind auch so...

00:49:27.930 --> 00:49:29.470
Nach dem Compile-Schritt wird das

00:49:29.470 --> 00:49:31.410
einfach entfernt und nie wieder

00:49:31.410 --> 00:49:33.570
angesehen. Und das ist halt das

00:49:33.570 --> 00:49:35.490
Beeindruckende daran. Also das war halt auch so,

00:49:35.490 --> 00:49:37.550
oh shit, das brauchen wir jetzt, wir müssen das

00:49:37.550 --> 00:49:39.250
jetzt machen im Release 1.5, glaube ich war das.

00:49:39.250 --> 00:49:41.650
Und das war die einfachste und

00:49:41.650 --> 00:49:43.450
unproblematischste Art, wie wir

00:49:43.450 --> 00:49:44.010
dazu kommen.

00:49:45.410 --> 00:49:47.550
Und alle Implikationen,

00:49:47.550 --> 00:49:49.150
die das hat, die werden bis heute mitgezogen.

00:49:49.150 --> 00:49:51.310
Du kannst quasi generische Klassen

00:49:51.310 --> 00:49:53.470
nie wirklich optimieren. Geht einfach

00:49:53.470 --> 00:49:55.370
nicht. Was halt spannend ist, weil die hast du

00:49:55.370 --> 00:49:57.350
halt überall, du hast überall Generics

00:49:57.350 --> 00:49:58.950
drin. Deswegen

00:49:58.950 --> 00:50:00.490
werden auch

00:50:00.490 --> 00:50:03.570
oft nur in der Standardbibliothek

00:50:03.570 --> 00:50:05.410
das generische Object

00:50:05.410 --> 00:50:07.310
verwendet, anstatt dass du einen generischen Typ-Parameter

00:50:07.310 --> 00:50:09.170
hast. Und was ich mit

00:50:09.170 --> 00:50:11.330
Innam sein kann, weiß ich sowieso nicht. Also ich habe das

00:50:11.330 --> 00:50:13.510
gesehen bei unseren Kollegen und das ist

00:50:13.510 --> 00:50:15.290
kein Innam. Das ist ein...

00:50:15.290 --> 00:50:17.530
Also ich finde, das ist

00:50:17.530 --> 00:50:19.350
eigentlich jetzt ein guter Zeitpunkt, um noch

00:50:19.350 --> 00:50:21.350
mal so ein bisschen zu erklären, worum es

00:50:21.350 --> 00:50:23.330
überhaupt geht und was da alles so drin ist. Wir sind jetzt auch schon

00:50:23.330 --> 00:50:25.390
auf so einem relativ hohen Fluglevel unterwegs.

00:50:25.390 --> 00:50:26.230
Aber wir haben auch

00:50:26.230 --> 00:50:29.430
viele Menschen, die uns zuhören,

00:50:29.430 --> 00:50:31.530
die vielleicht noch gar nicht wissen, was denn ein Generic

00:50:31.530 --> 00:50:33.410
überhaupt ist. Und vielleicht

00:50:33.410 --> 00:50:35.650
sollten wir das einmal kurz...

00:50:35.650 --> 00:50:36.390
Ja...

00:50:36.390 --> 00:50:39.290
Aber jetzt kriegen sie es halt mal gesagt.

00:50:39.290 --> 00:50:43.070
Ich habe gesehen, es gibt auch Generics

00:50:43.070 --> 00:50:43.810
in Python.

00:50:45.170 --> 00:50:45.490
Ja, genau.

00:50:45.490 --> 00:50:48.530
Ja, aber wovon geht da an?

00:50:48.530 --> 00:50:51.370
Ja, aber also das ist ja...

00:50:51.370 --> 00:50:52.910
Also diese Generics in den

00:50:52.910 --> 00:50:54.350
Typ-Annotationen, das ist ja

00:50:54.350 --> 00:50:56.610
wirklich nur sehr instruktiv.

00:50:56.610 --> 00:50:57.870
Es ist nur sehr so

00:50:57.870 --> 00:50:59.470
vage gesagt.

00:50:59.470 --> 00:51:02.950
Das ist keine... Da ist die Erasure ja noch

00:51:02.950 --> 00:51:03.490
viel größer.

00:51:03.490 --> 00:51:06.830
Johannes,

00:51:06.830 --> 00:51:09.050
was ist denn bitte ein Generic?

00:51:09.050 --> 00:51:11.430
Ein Generic

00:51:11.430 --> 00:51:13.070
ist eine Spezialisierung eines

00:51:13.070 --> 00:51:15.050
Typen anhand eines anderen Typs.

00:51:15.170 --> 00:51:16.750
Und das klassische Beispiel ist da die

00:51:16.750 --> 00:51:18.870
Java-Liste. In Python

00:51:18.870 --> 00:51:20.990
hast du ja eine Liste, die, sag ich mal,

00:51:20.990 --> 00:51:22.870
dynamisch typisiert ist. Das heißt, wenn du eine Liste hast,

00:51:22.870 --> 00:51:24.730
kannst du da eine Zahl reintun und einen String und

00:51:24.730 --> 00:51:27.290
eine komplexe Zahl

00:51:27.290 --> 00:51:28.790
und ein Objekt und noch eine Liste.

00:51:28.790 --> 00:51:30.910
Das ist immer sehr unterhaltsam, wenn man das

00:51:30.910 --> 00:51:32.350
in den... Wenn ich das in den

00:51:32.350 --> 00:51:34.650
Seminaren mache, wenn ich den Leuten Programmieren

00:51:34.650 --> 00:51:36.890
beibringe, die vielleicht schon mal eine Programmiersprache

00:51:36.890 --> 00:51:38.930
gesehen haben oder die schon was

00:51:38.930 --> 00:51:40.850
davon gehört haben, dann sage ich hier so, jetzt kannst du da...

00:51:40.850 --> 00:51:42.790
Du kannst noch eine Liste auch reintun oder Dictionary

00:51:42.790 --> 00:51:44.990
kannst du auch einfach in deine Liste reintun.

00:51:45.690 --> 00:51:46.870
Und in Java geht

00:51:46.870 --> 00:51:48.670
das nicht. In Java hat jede Liste

00:51:48.670 --> 00:51:51.130
einen Typen. Das heißt, du kannst...

00:51:51.130 --> 00:51:52.830
Wenn du einfach nur List sagst, dann

00:51:52.830 --> 00:51:54.870
meinst du Liste von Objekt. Das heißt, alles, was

00:51:54.870 --> 00:51:56.930
du da reintun kannst, ist Objekt. Aber

00:51:56.930 --> 00:51:58.930
du kannst diese Liste

00:51:58.930 --> 00:52:00.790
spezieller gestalten, indem

00:52:00.790 --> 00:52:03.250
du eben diesen Generic-Mechanismus

00:52:03.250 --> 00:52:04.930
verwendest und sagst, du hast jetzt nicht eine Liste

00:52:04.930 --> 00:52:06.770
von Objekt, sondern du hast eine Liste von

00:52:06.770 --> 00:52:09.050
String. Das heißt, der Compiler

00:52:09.050 --> 00:52:10.670
weiß an bestimmten Stellen, dass

00:52:10.670 --> 00:52:12.790
dieser Typ, den du da hingeschrieben hast,

00:52:12.790 --> 00:52:14.490
der vorher vielleicht nur ein Platzhalter war,

00:52:15.170 --> 00:52:16.810
in TypeScript verwendet man

00:52:16.810 --> 00:52:18.750
dann oft T oder K oder V. Das ist

00:52:18.750 --> 00:52:20.050
auch in Stefans Buch

00:52:20.050 --> 00:52:21.770
kommt es mehrmals vor,

00:52:21.770 --> 00:52:24.770
dass du dann eben zu einem bestimmten

00:52:24.770 --> 00:52:26.530
Zeitpunkt diesen generischen

00:52:26.530 --> 00:52:27.950
Typen ersetzt durch einen konkreten

00:52:27.950 --> 00:52:30.350
Typen und sagst, okay, ich habe jetzt hier

00:52:30.350 --> 00:52:32.390
nicht eine Liste von Objekt, sondern ich habe ganz

00:52:32.390 --> 00:52:34.150
klar eine Liste von String.

00:52:34.150 --> 00:52:36.590
Und dann kann der Compiler oder eben

00:52:36.590 --> 00:52:37.950
das Typsystem überprüfen,

00:52:37.950 --> 00:52:40.570
dass du da tatsächlich lauter

00:52:40.570 --> 00:52:41.330
Strings drin hast.

00:52:41.330 --> 00:52:43.650
Der Code, den du da ausführst,

00:52:43.650 --> 00:52:44.710
ist genau der gleiche.

00:52:45.170 --> 00:52:47.190
Aber du hast jetzt eben einen spezifischen

00:52:47.190 --> 00:52:48.710
Typen für eine Liste von Strings gemacht.

00:52:48.710 --> 00:52:50.790
Und das hat gewisse Vorteile.

00:52:50.790 --> 00:52:52.590
Zum Beispiel, wenn du da ein Objekt rausholst,

00:52:52.590 --> 00:52:54.970
kriegst du dann halt eben nicht nur ein

00:52:54.970 --> 00:52:56.970
generisches Objekt zurück, sondern du kriegst

00:52:56.970 --> 00:52:58.710
dann tatsächlich einen String zurück.

00:52:58.710 --> 00:53:00.710
Das ist der große Vorteil, den du in Java

00:53:00.710 --> 00:53:02.710
davon hast, dass du diese Accessor-Methoden hast,

00:53:02.710 --> 00:53:04.430
die dir die spezifischen Sachen

00:53:04.430 --> 00:53:06.230
rausgeben.

00:53:06.230 --> 00:53:09.210
War das korrekt erklärt, Stefan?

00:53:09.210 --> 00:53:10.390
Ist cool.

00:53:10.390 --> 00:53:11.410
Super, genau das.

00:53:11.410 --> 00:53:13.770
Also, gut, Experte.

00:53:13.770 --> 00:53:14.370
Bestätigt.

00:53:15.170 --> 00:53:17.410
Experte, wenn einfach nur lauf genug und schreibt den ganzen Mist auf.

00:53:17.410 --> 00:53:19.970
Ja, gut, aber das macht dich zum Experte.

00:53:19.970 --> 00:53:21.630
Aber nein, das beschreibt es ziemlich gut.

00:53:21.630 --> 00:53:22.710
Du kannst halt mit

00:53:22.710 --> 00:53:26.070
Typparametern dir die Entscheidung

00:53:26.070 --> 00:53:28.310
auf den tatsächlichen Typen

00:53:28.310 --> 00:53:29.330
für später aufheben.

00:53:29.330 --> 00:53:30.670
Das ist das, was dort passiert.

00:53:30.670 --> 00:53:33.730
Und eben, du sagst, dann wird das halt eine Array-List

00:53:33.730 --> 00:53:35.790
von String oder eine Array-List von

00:53:35.790 --> 00:53:36.230
Integer.

00:53:36.230 --> 00:53:39.490
Und du substituierst diesen Typparameter

00:53:39.490 --> 00:53:40.650
mit einem konkreten Typen

00:53:40.650 --> 00:53:42.330
und kriegst nachher auch

00:53:42.330 --> 00:53:44.610
solche konkreten Typen wieder.

00:53:45.170 --> 00:53:46.890
Also, in manchen Programmiersprachen

00:53:46.890 --> 00:53:48.490
kannst du dann auch noch so Dinge wie

00:53:48.490 --> 00:53:50.930
Constraints oder Bounds angeben,

00:53:50.930 --> 00:53:52.830
wo du eben sagst, hey, du hast dort

00:53:52.830 --> 00:53:54.550
jetzt einen beliebigen Typparameter, ja,

00:53:54.550 --> 00:53:56.850
aber er muss einem gewissen

00:53:56.850 --> 00:53:58.530
Subtypen entsprechen. Das heißt, er muss

00:53:58.530 --> 00:54:00.870
eine gewisse Funktionalität zur Verfügung haben

00:54:00.870 --> 00:54:01.810
oder muss,

00:54:01.810 --> 00:54:03.530
also,

00:54:03.530 --> 00:54:05.530
TypeScript ist ja

00:54:05.530 --> 00:54:07.630
strukturell typisiert,

00:54:07.630 --> 00:54:10.450
was bedeutet, dass du einfach sagst, hey, solange die

00:54:10.450 --> 00:54:12.610
Methoden dort sind und solange die

00:54:12.610 --> 00:54:14.550
Properties dort sind, passt schon,

00:54:14.550 --> 00:54:16.410
muss nicht den gleichen Namen haben, muss nicht in irgendeiner

00:54:16.410 --> 00:54:17.610
Hierarchie sein, sondern Hauptsache

00:54:17.610 --> 00:54:20.010
schaut irgendwie so aus, wie

00:54:20.010 --> 00:54:21.830
das eine, was ich da erwarten würde.

00:54:21.830 --> 00:54:24.110
Und dann haut das schon hin. Und dann kriegst du halt

00:54:24.110 --> 00:54:26.450
zum einen die Sicherheit,

00:54:26.450 --> 00:54:28.510
dass du nicht irgendwelche Typen reingibst, die nicht damit

00:54:28.510 --> 00:54:30.290
funktionieren würden.

00:54:30.290 --> 00:54:32.870
Und zum anderen

00:54:32.870 --> 00:54:34.470
kriegst du halt noch mehr

00:54:34.470 --> 00:54:36.470
Informationen über deinen Typ noch heraus, wenn du

00:54:36.470 --> 00:54:38.210
ihn dann vermeidest. Wie macht man das denn in Python?

00:54:38.210 --> 00:54:40.670
Protokolle? Doch, das ist in Python

00:54:40.670 --> 00:54:42.390
seit drei, achtem Gründer auch

00:54:42.390 --> 00:54:44.150
so, oder kann man das so machen? Man kann auch

00:54:44.150 --> 00:54:46.270
nominal typisiert das Ganze

00:54:46.270 --> 00:54:48.110
machen, aber da geht das jetzt auch, genau,

00:54:48.110 --> 00:54:50.010
mit Typing-Protokolls

00:54:50.010 --> 00:54:52.090
geht das auch.

00:54:52.090 --> 00:54:54.430
Ja, genau, und dann

00:54:54.430 --> 00:54:55.930
Habt ihr das schon mal irgendwo gesehen?

00:54:55.930 --> 00:54:57.050
Ja, ich verwende das.

00:54:57.050 --> 00:55:00.150
Also ich finde das eine großartige Idee, aber ich

00:55:00.150 --> 00:55:01.650
habe es noch nie irgendwo verwendet gesehen.

00:55:01.650 --> 00:55:03.270
Ja, ja, doch, also

00:55:03.270 --> 00:55:06.590
ich kenne es auch vor allen Dingen aus dem

00:55:06.590 --> 00:55:07.970
Fluent Python

00:55:07.970 --> 00:55:10.030
Buch von

00:55:10.030 --> 00:55:11.970
Luciano Ramalou.

00:55:11.970 --> 00:55:13.950
Und

00:55:13.950 --> 00:55:15.350
der hat sich auch mit diesem

00:55:15.350 --> 00:55:17.710
Typisierungsthema stark beschäftigt

00:55:17.710 --> 00:55:18.870
und hat dann diverse Fehler

00:55:18.870 --> 00:55:20.790
in der Typeschat

00:55:20.790 --> 00:55:23.350
Repository, wo halt die ganzen,

00:55:23.350 --> 00:55:25.070
wo auch die Standardbibliothek von Python

00:55:25.070 --> 00:55:27.850
genau annotiert

00:55:27.850 --> 00:55:29.650
ist, hat er da gefunden

00:55:29.650 --> 00:55:31.690
und viele davon konnte er

00:55:31.690 --> 00:55:32.250
fixen mit

00:55:32.250 --> 00:55:35.350
diesem Structural Typing Ansatz.

00:55:35.350 --> 00:55:37.710
Und also Fehler

00:55:37.710 --> 00:55:39.530
im Sinne von halt die

00:55:39.530 --> 00:55:41.650
Annotationen waren halt irgendwie, da waren halt

00:55:41.650 --> 00:55:43.750
False Positives oder halt False Negatives

00:55:43.750 --> 00:55:45.530
möglich. Auch sehr interessant,

00:55:45.530 --> 00:55:47.550
wenn man sich halt anguckt, welche

00:55:47.550 --> 00:55:48.350
Fehler sind häufiger.

00:55:48.350 --> 00:55:51.550
False Positives sind viel, viel

00:55:51.550 --> 00:55:53.450
häufiger bei Typ-Annotationen als False

00:55:53.450 --> 00:55:55.410
Negatives. Also in der

00:55:55.410 --> 00:55:57.490
Python-Standard-Bibliothek waren es irgendwie achtmal

00:55:57.490 --> 00:55:58.150
so häufig.

00:55:58.150 --> 00:56:12.870
Was halt auch ein Hinweis darauf ist, dass es halt für Leute wichtiger ist, dass halt die, also falls positiv heißt, eine Annotation hat gesagt, nee, du kommst hier nicht rein, du bist nicht der richtige Typ, dein Typ ist hier nicht gefragt.

00:56:12.870 --> 00:56:27.870
Sozusagen, obwohl es eigentlich doch okay gewesen wäre. Und also offenbar ist es halt irgendwie so mehr opportun, irgendwie auf der Seite von strikter zu sein, zu irren als umgekehrt.

00:56:27.870 --> 00:56:38.150
Was ja auch so ein bisschen vielleicht damit zusammenhängt, für welche Leute das halt vor allen Dingen gut ist, nämlich die, die halt versuchen wollen, möglichst viel da draußen zu halten.

00:56:38.150 --> 00:56:42.850
Und wenn sie ein bisschen zu viel draußen halten, ist es besser, als was durchzulassen, was halt dann irgendwie knallt.

00:56:42.870 --> 00:56:56.210
Zur Laufzeit. Das wäre dann voll snaggert. Ja, genau. Und ja, der hat das also lange erklärt in dem Buch und da habe ich das halt quasi her.

00:56:56.210 --> 00:57:02.870
Und ja, ich finde das eigentlich sehr nett, weil damit kann man im Grunde genau das gleiche machen wie ein Typescript mit diesen Intersection und Union Types.

00:57:02.870 --> 00:57:12.810
Was ja auch irgendwie so, das ist halt so sehr cool eigentlich, dass das geht. Und das geht halt, wenn man jetzt so mit Abstract Base Classes.

00:57:12.870 --> 00:57:15.510
Das Ganze macht. Und nominal geht das halt nicht so richtig.

00:57:15.510 --> 00:57:25.470
Das Problem ist, wenn du nominal arbeitest, du baust da auf dem Schlag eine Hierarchie auf, wenn die implizit ist durch die Basistypen, die du definierst.

00:57:25.470 --> 00:57:37.110
Und das kannst du sehr, sehr schön und elegant umschiffen, indem du sagst, hey, alles, was ich erwarte, ist einfach nur, dass das Ding so ausschaut oder diese Werte und Eigenschaften hat, die ich an dieser Stelle erwarte.

00:57:37.110 --> 00:57:41.890
Methodennamen, Rückgabe-Werte, Property-Typen etc.

00:57:42.870 --> 00:57:58.750
Und ich sage mal, Programmiersprache wie JavaScript wäre gar nicht anders zu typisieren gewesen oder es wäre gar nicht möglich gewesen, die anders zu typisieren als mit einem strukturellen Typsystem, weil sonst praktisch kein Code mehr funktioniert hätte, den du irgendwie geschrieben hast.

00:57:58.750 --> 00:58:12.750
Und das war eben auch so ein Designprinzip von Typescript, dass sie sagen, hey, wir wollen bestehenden JavaScript-Code unterstützen und mögliche Fehler herausfinden und nicht einfach nur aufgrund von Abitur geschaffenen Hierarchie-Konstruktionen.

00:58:12.870 --> 00:58:42.850
Und das war eben auch so ein Designprinzip von Typescript, dass sie sagen, hey, wir wollen bestehenden JavaScript-Code unterstützen und mögliche Fehler herausfinden und nicht einfach nur aufgrund von Abitur geschaffenen Hierarchie-Konstruktionen.

00:58:42.850 --> 00:59:12.830
Und das war eben auch so ein Designprinzip von Typescript, dass sie sagen, hey, wir wollen bestehenden JavaScript-Code unterstützen und mögliche Fehler herausfinden und nicht einfach nur aufgrund von Abitur geschaffenen Hierarchie-Konstruktionen.

00:59:12.830 --> 00:59:42.810
Und das war eben auch so ein Designprinzip von Typescript, dass sie sagen, hey, wir wollen bestehenden JavaScript-Code unterstützen und mögliche Fehler herausfinden und nicht einfach nur aufgrund von Abitur geschaffenen Hierarchie-Konstruktionen.

00:59:42.810 --> 01:00:01.450
Und das, was ich gesehen habe, nur durchs drüberfliegen, ist dieses New-Type-Konstrukt, wo du sagen kannst, hey, es gibt schon einen bestehenden Typen und der ist vielleicht sehr, sehr freigiebig, der ist vielleicht ein Integer-Jurist oder was auch immer, aber da kannst du ihm noch dieses eine Label verschaffen, damit du jetzt nicht irgendwelche unterschiedlichen Integer-Werte durcheinander kriegst oder irgendwelche Objektwerte, die ähnlich sind, durcheinander kriegst.

01:00:01.450 --> 01:00:12.470
Weil strukturelle Typsysteme funktionieren halt immer bis zu dem Grad, wo du sagen musst, hey, aber dieses eine Ding will ich da jetzt nicht herinnen haben, weil ich erwarte doch etwas anderes und kann das durch das Typsystem nicht so ausdrücken.

01:00:12.810 --> 01:00:24.350
Mach das New-Type, dann wird es explizit und dann kannst du genauso, hey, an dieser Stelle erwartest du etwas, was so ausschaut, aber es muss doch etwas anderes sein. Und das finde ich eigentlich ganz, ganz, ganz brauchbar.

01:00:24.350 --> 01:00:42.790
Das ist, genau, das benutze ich, das benutze ich genau für diesen Use-Case, dass man halt oft quasi sowas, zum Beispiel Integer möchte man einschränken von der Range, aber das kann man im Typsystem nicht so richtig ausdrücken und ich finde, dann reicht oft schon, um den gleichen Effekt zu haben, im New-Type einzuführen, also wo ich das dann halt zum Beispiel,

01:00:42.790 --> 01:01:12.770
aktuell brauche, ist halt, ich habe halt ein Jahr und ich weiß, dieses Jahr ist halt nur von 2025 bis 2040 oder irgendwie sowas und mir reicht im Grunde, ich mache das gar nicht über das Typsystem, dass diese Range dann sozusagen abgesichert wird, aber allein dadurch, dass ich sage, ich definiere den New-Type hier, der halt eigentlich ein Int ist, kann mir der Type-Checker sagen, wenn ich irgendwie mal ein anderes Int da reingesteckt habe, was ich nicht mal als Ja irgendwo anders deklariert habe,

01:01:12.770 --> 01:01:32.610
und kriege dann sozusagen den Effekt, dass, wenn da irgendjemand irgendwas reinsteckt, was kein Ja ist, dann gibt es halt auch ein, sagt der Type-Checker halt schon, okay, nee, das sieht nicht gut aus und so kann man sich halt das sozusagen so ein bisschen, ja, herbeiemulieren, dass man irgendwie damit auch überprüft, ob das inhaltlich Sinn macht, ja.

01:01:32.610 --> 01:01:36.910
Aber noch cooler wäre es natürlich, wenn du auch die Werte angeben könntest.

01:01:36.910 --> 01:01:38.550
Entschuldigung, Stefan.

01:01:38.550 --> 01:01:39.790
Hast du?

01:01:42.750 --> 01:02:01.950
Also gerade mit dem, also in TypeScript kannst du das ein bisschen, du kannst teilweise Werte oder geringere Wertbereiche definieren, also in TypeScript ist es das Spannende, wie in jedem Typsystem, du hast Wertemengen und du definierst ja nur, ob dieser eine Wert, den du hast, jetzt in diese Menge passt oder nicht.

01:02:01.950 --> 01:02:06.950
Das sind sehr große Mengen zum Teil, String, Number oder alle Objects.

01:02:06.950 --> 01:02:12.730
Zum Teil sind sie halt auf deine Objekttypen heruntergebrochen, wo du sagst, diese Kombination.

01:02:12.730 --> 01:02:17.170
Die Kombination an Properties, die gewisse Typen haben, erlaubst du dort oder nicht.

01:02:17.170 --> 01:02:28.730
Du kannst aber auch sagen, hey, dieser einzige oder einzelne konkrete Wert, die Zahl 1, der String Stefan, was auch immer, kann auch als Typ gelten.

01:02:28.730 --> 01:02:36.430
Das heißt, du kannst einen Wert haben, wo du sagst, alles, was diese Variable annehmen darf, ist der Wert 1.

01:02:36.430 --> 01:02:42.250
Und das klingt am Anfang doof, weil was machst du mit einer Variable, die nur 1 sein kann?

01:02:42.710 --> 01:02:43.310
Du kannst es schenken.

01:02:43.310 --> 01:02:58.010
Aber du kannst noch diese Literaltypes oder Value-Types, wie du es benannt hast, Johannes, kombinieren mit anderen Value-Types und kannst dann zum Beispiel alle validen Augenzahlen eines Würfels darstellen.

01:02:58.010 --> 01:03:00.410
1 oder 2 oder 3 oder 4 oder 5 oder 6.

01:03:00.410 --> 01:03:12.690
Also damit hast du schon einen sehr engen Wertebereich definiert und weißt noch aus, wenn ein Wert da reinkommt, dann hat er garantiert eine.

01:03:12.690 --> 01:03:18.650
Und das ist spannend. Das kannst du auch mit Strings machen.

01:03:18.650 --> 01:03:23.530
Und was halt dann wirklich elegant ist, ist, dass du zum Beispiel Strings mit gewissen Pattern definieren kannst.

01:03:23.530 --> 01:03:34.950
Du kannst sagen, hey, du erlaubst alle Strings, die mit ON anfangen, weil du gerade dein Eventsystem implementierst und du hast halt ON-Click, ON-Key-Down, ON-Key-Press, was auch immer.

01:03:34.950 --> 01:03:40.070
Das heißt, es muss mit ON anfangen und nachher muss der erste Buchstabe unbedingt ein Großbuchstabe sein.

01:03:40.070 --> 01:03:42.670
Solche Strings akzeptierst du, andere akzeptierst du nicht.

01:03:42.670 --> 01:04:00.030
Da kannst du wirklich sehr elegant Wertebereiche definieren, mit denen du korrekte Werte angibst, mit denen du auch über deine Werte diverse Aussagen treffen kannst, die dir nachher helfen, die aber jetzt nicht so übermäßig komplex sind.

01:04:00.030 --> 01:04:06.810
Dass du jetzt sagst, hey, das ist jetzt viel zu viel Aufwand, das zu definieren.

01:04:06.810 --> 01:04:11.910
Mein Lieblingsbeispiel ist immer noch HTTP-Methoden.

01:04:12.650 --> 01:04:14.830
Get, Post, Delete, was auch immer.

01:04:14.830 --> 01:04:21.430
Oder HTTP-Error-Codes, da gibt es 70 um den Dreh.

01:04:21.430 --> 01:04:27.510
Ich weiß jetzt nicht, ob es 201 gibt, ob es 217 noch gibt, weiß ich nicht.

01:04:27.510 --> 01:04:30.150
Das kann mir dieser Union-Typ sehr, sehr schön sagen.

01:04:30.150 --> 01:04:41.850
Und dann bin ich mir sicher, dass ich den richtigen HTTP-Status-Code meiner Response schicke und brauche nicht großartig überlegen, ob ich noch im richtigen Wertebereich bin oder nicht.

01:04:42.630 --> 01:04:47.010
Ich muss mich einmal korrigieren. Ich habe eben nachgelesen, Value-Types ist nicht das richtige Wort.

01:04:47.010 --> 01:04:53.810
Das bezieht sich auch auf etwas anderes. Das wird als Abgrenzung zum Reference-Type verwendet.

01:04:53.810 --> 01:05:01.830
Also ob man einen Wert oder eine Referenz hat. Aber das Konzept, das hast du gerade sehr schön erklärt. Vielen Dank, Steffen.

01:05:01.830 --> 01:05:06.470
Das ist auch in Kapitel 4 beschrieben von meinem Buch und da bist du ja noch nicht.

01:05:06.470 --> 01:05:10.450
Das haben wir vorhin schon festgestellt, ich habe noch nicht weit genug gelesen.

01:05:10.450 --> 01:05:12.470
Aber ich habe es jetzt wieder rausgeguckt.

01:05:12.630 --> 01:05:17.950
Ich habe es wieder rausgeholt und jetzt lege ich es mir unter das Kopfkissen und werde das per Diffusion aufnehmen.

01:05:17.950 --> 01:05:24.310
Gut, das ist so wie die Matura geschafft mit dem Mathematikbuch unter dem Kopfkissen. Funktioniert.

01:05:24.310 --> 01:05:24.590
Sehr gut.

01:05:24.590 --> 01:05:33.790
Ich finde, wir müssen noch ein bisschen darüber reden, wie man das so in Python dann machen kann noch und wie man das Typing-Modul vielleicht noch so ein bisschen benutzt.

01:05:33.790 --> 01:05:36.810
Wir hatten jetzt ein New-Type, was irgendwie ganz cool ist. Wir hatten die Generics.

01:05:36.810 --> 01:05:39.210
Ja, so Generics. Achso, genau.

01:05:39.210 --> 01:05:42.190
Für meinen Typ gibt es gar keine Generics.

01:05:42.610 --> 01:05:47.490
Da dachte ich mir so, oh mein Gott, wenn hoffentlich fragt das keiner, deswegen frage ich das jetzt mal.

01:05:47.490 --> 01:05:53.310
Kann mir einer vielleicht erklären, was der Unterschied zwischen Co-Variant, Kontra-Variant und In-Variant und so ist?

01:05:53.310 --> 01:05:53.650
Ja, genau.

01:05:53.650 --> 01:05:58.530
Weil das kann man nämlich auch mit angeben und ich dachte mir so, okay, ich kann es ja angeben, aber oh Gott, was bedeutet das eigentlich?

01:05:58.530 --> 01:05:59.950
Und was macht dann Bound und so?

01:05:59.950 --> 01:06:00.310
Ja.

01:06:00.310 --> 01:06:05.050
Ich kann es aus einer Typ-Theorie sagen, was Co- und Kontra-Variant ist.

01:06:05.050 --> 01:06:07.970
Ich weiß aber nicht, ob das so auf Python auch zutrifft.

01:06:07.970 --> 01:06:11.310
Aber ich versuche es jetzt mal so zu erklären.

01:06:11.310 --> 01:06:12.590
Co-Variant.

01:06:12.590 --> 01:06:14.970
Co-Variant ist, wenn du...

01:06:14.970 --> 01:06:16.990
Schnell die Petitfragen.

01:06:16.990 --> 01:06:20.070
Nein, es ist irrsinnig schwierig zu erklären.

01:06:20.070 --> 01:06:22.450
Lass mich kurz mein zweites Buch aufmachen, weil da wäre Zeichnung.

01:06:22.450 --> 01:06:29.990
Also bevor ich jetzt allgemeine Beschreibungen erkläre, sage ich es lieber mal so.

01:06:29.990 --> 01:06:36.330
In einer Co-Varianten-Beziehung hast du zum Beispiel einen Typ, der ist String oder Number.

01:06:36.330 --> 01:06:42.570
Was bedeutet, dass wenn du einen Wert hast, der Number ist, dann kannst du den auf jeden Fall auf diesen einen Typ

01:06:42.570 --> 01:06:44.270
zuweisen, der String oder Number sein kann.

01:06:44.270 --> 01:06:52.630
Das heißt, je enger dieser Wertebereich wird, hat kein Effekt drauf, kannst du weiterhin darauf zuweisen.

01:06:52.630 --> 01:06:54.770
Kontra-Variant ist genau umgekehrt.

01:06:54.770 --> 01:06:59.850
Du kannst zum Beispiel jetzt nicht eine Funktion, die als ersten Parameter String oder Number

01:06:59.850 --> 01:07:05.350
oder einen Funktionstypen, der als ersten Parameter String oder Number erwartet, kannst

01:07:05.350 --> 01:07:12.550
jetzt nicht eine echte Funktion zuweisen, die nur String erwartet, weil ja der Fall, dass auch eine Number

01:07:12.550 --> 01:07:14.770
als Parameter sein kann, nicht dadurch abgedeckt wird.

01:07:14.770 --> 01:07:19.230
Das heißt, du hast der Typ zwar auch ein Subtyp, der Parametertyp ist ein Subtyp vom anderen,

01:07:19.230 --> 01:07:25.470
aber nachdem der in einer Funktion steht, sind die nicht zueinander kompatibel, sondern nur umgekehrt.

01:07:25.470 --> 01:07:29.090
Das heißt, du kannst eine Funktion, einen Funktionstypen definieren, der als ersten Parameter

01:07:29.090 --> 01:07:33.750
eine Number angibt, was bedeutet, dass du auch Funktionen zuweisen kannst, die String oder Number

01:07:33.750 --> 01:07:37.290
erwarten, weil eben dieser eine Fall abgedeckt ist.

01:07:37.290 --> 01:07:39.510
Und das ist der Unterschied zwischen Co-Variant und Kontra-Variant.

01:07:39.510 --> 01:07:42.530
Brauchst du eigentlich nie, macht du dir irgendwelche komischen Fehlermeldungen, meinst du,

01:07:42.530 --> 01:07:44.630
irgendwelche Sachen zuweisen, willst du die dann nicht so funktionieren.

01:07:44.630 --> 01:07:50.430
Ist aber, glaube ich, in der Typtheorie die korrekte Beschreibung.

01:07:50.430 --> 01:07:54.450
Ist nicht kompliziert, ich möchte euch da für die Shownotes eine Grafik zur Verfügung stellen,

01:07:54.450 --> 01:07:55.850
die das wunderschön erklärt.

01:07:55.850 --> 01:07:59.990
Und da suche ich mir den Link jetzt wirklich raus aus meinem Buch, weil das habe ich genau

01:07:59.990 --> 01:08:02.010
aus dem Grund habe ich es da reingetan.

01:08:02.010 --> 01:08:03.750
Weil das sind die Sachen, die merke ich mir selber nie genau.

01:08:03.750 --> 01:08:05.790
Das ist was man immer nachlesen muss.

01:08:05.790 --> 01:08:09.690
Also in welche Richtung kann man was irgendwie doch voneinander erben, wenn ich das richtig verstehe?

01:08:09.690 --> 01:08:11.250
Und das allgemeiner annotieren?

01:08:12.510 --> 01:08:17.370
Also generisieren. Also ich habe es jetzt hier auch gerade, wenn jemand anders spricht, kann ich ja googeln.

01:08:17.370 --> 01:08:28.350
Also so wie ich das jetzt hier verstehe, das bezieht sich direkt auf Python hier und Qualitätsquelle Stack Overflow kann man ja auch verlegen.

01:08:28.350 --> 01:08:34.670
Es wird hier so erklärt, du hast zwei Klassen, Basisklasse und eine abgeleitete Klasse.

01:08:34.670 --> 01:08:35.290
Die derived.

01:08:35.290 --> 01:08:40.270
Genau. B und D. Also Basisklasse und abgeleitete Klasse.

01:08:40.270 --> 01:08:42.430
Und du hast irgendeine generischen Typenliste mit.

01:08:42.490 --> 01:08:43.630
Irgendeinem Typen drin.

01:08:43.630 --> 01:08:56.670
Und jetzt ist die Frage, wenn du eine Liste hast, die den Typen B hat, also den Basistypen, kannst du die dann da verwenden, wo du eine Liste vom Typen D erwartest?

01:08:56.670 --> 01:08:58.050
Also eine abgeleitete Klasse.

01:08:58.050 --> 01:08:59.890
Oder ist es andersrum?

01:08:59.890 --> 01:09:02.550
Das wäre dann Co-Variant oder Kontra-Variant.

01:09:02.550 --> 01:09:05.430
Genau. Und das eine ist Co-Variant und das andere ist Kontra-Variant.

01:09:05.430 --> 01:09:12.470
Weil du eben sagst, okay, wenn du den als Generic verwendest, dann geht die Beziehung in die eine Richtung oder die Beziehung geht in die andere Richtung.

01:09:12.470 --> 01:09:17.250
Und das ist natürlich schön, dass man da zwei Worte genommen hat, die exakt gleich klingen.

01:09:17.250 --> 01:09:26.350
Also Co-Variant ist, wenn man quasi annotiert mit der Implementierung und Kontra-Variant ist, wenn man mit der Basis annotiert.

01:09:26.350 --> 01:09:34.570
Und In-Variant wäre dann, wenn man nicht beides verwenden darf, weil der sagt halt nö, das ist nicht genau das, was ich erwarte.

01:09:34.570 --> 01:09:40.790
Ja, irgendwie so. Für genauere Sachen muss man PEP484 lesen. Das haben wir ja sicherlich alle schon gemacht.

01:09:42.450 --> 01:09:46.050
Da muss man gar nicht genauer drauf eingehen.

01:09:46.050 --> 01:09:49.250
Ich packe die Grafik in die Show Notes und dann schauen wir mal.

01:09:49.250 --> 01:09:50.170
Genau.

01:09:50.170 --> 01:09:51.850
Schauen wir mal, ob das hilft.

01:09:51.850 --> 01:10:00.670
Ja, aber genau. Ich dachte auch so, man kann das ja angeben und dann dachte ich so, ich habe das noch nie verwendet.

01:10:00.670 --> 01:10:03.550
Ist das irgendwie, habe ich was, passe ich was oder?

01:10:03.550 --> 01:10:04.930
Und was macht dann Bound?

01:10:04.930 --> 01:10:10.190
Also weil das macht man ja irgendwie auch bei den Kontra-Variants oder ist das schon das?

01:10:10.190 --> 01:10:10.610
Ich weiß nicht.

01:10:11.710 --> 01:10:13.970
Steht zumindest in der Types, Picing, Typing.

01:10:13.970 --> 01:10:17.910
Tatsächlich ist in dem PEP484 eine sehr schöne Erklärung drin.

01:10:17.910 --> 01:10:21.050
Mit Employees und Managers.

01:10:21.050 --> 01:10:29.630
Wenn du eine Liste, wenn du eine Funktion hast, die eine Liste von Employee nimmst, solltest du da, kannst du da eine Liste von Managers reingeben.

01:10:29.630 --> 01:10:40.190
Und für manche Funktionen kann das ja sein, wenn du halt sagst, okay, wir müssen Gehalt auszahlen, das müssen Angestellte kriegen und wenn die Angestellten Manager sind, dann ist es halt so.

01:10:41.690 --> 01:10:56.910
Kann aber auch Nein sein, dass du zum Beispiel, keine Ahnung, alle die Angestellten aufsetzt, die, genau, zum Beispiel, dass du die, nee, aber dass du zum Beispiel jemanden hinzufügst zu dieser Liste.

01:10:56.910 --> 01:11:03.910
Und wenn du sagst, okay, die Funktion nimmt eine Liste, die die Angestellte enthält, dann kannst du in diese Liste auch einen Angestellten reintun.

01:11:03.910 --> 01:11:07.910
Wenn du aber eine Liste von Managern reingegeben hast, dann geht das nicht.

01:11:07.910 --> 01:11:11.670
Und das ist jetzt eben genau so eine Frage.

01:11:11.670 --> 01:11:25.090
Wo du beide Optionen haben kannst, also so eine Situation, wo du beide haben kannst und das tatsächlich auch eigentlich beantworten können musst, ob du da eine abgeleitete oder eine Basisklasse reingeben darfst.

01:11:25.090 --> 01:11:33.610
Das ist eine Co-Variante, eine Contra-Variante. Und der Bound ist dann quasi tatsächlich die, wenn dann erst die Manager gefallen, weil das die spezialisiertere Variante ist.

01:11:33.610 --> 01:11:41.590
Ja, wir haben noch mehr von dem Piping-Modul, damit wir uns noch mehr schöne Sachen dazu erzählen können und mehr ergänzen können.

01:11:41.650 --> 01:11:47.610
Mit präzisem Fachwissen. Und zwar den Type-Alias und die Type-Var, die da noch irgendwie dazu können.

01:11:47.610 --> 01:11:52.430
Also was ist denn der Unterschied? Und man kann ja auch noch das schöne Keyword Type dazu schreiben und sowas.

01:11:52.430 --> 01:11:58.490
Na, ich meine, bei Type-Alias, das kannst du auch einfach so hinschreiben. Das ist nur eine explizitere Darstellung.

01:11:58.490 --> 01:12:06.950
Und manchmal ist es halt problematisch, wenn du zum Beispiel einfach einen String verwendest, den du ja auch quasi benutzen kannst, statt, und manchmal muss man das ja auch, um zyklische Imports zu vermeiden und so.

01:12:06.950 --> 01:12:10.770
Und dann ist halt unklar, was gemeint ist, wenn man den nicht Type-Alias davor schreibt.

01:12:10.770 --> 01:12:11.630
Also beispielsweise, wenn ich jetzt...

01:12:11.630 --> 01:12:17.650
Wenn ich jetzt irgendwie eine Union habe, das kann jetzt mehrere Sachen sein, dann kann ich dann Type-Alias dafür verwenden, dass das damit gemeinsam einen Namen gibt.

01:12:17.650 --> 01:12:24.850
Ja, aber du könntest ja auch einfach hinschreiben, myUnion gleich und dann irgendwie der Typ, Pipe-Symbol, der andere.

01:12:24.850 --> 01:12:30.270
Das ist dann ein Type-Alias schon. Das heißt, das selber kann ich annotieren mit... Nein, ist es nicht?

01:12:30.270 --> 01:12:40.730
Ja, also du könntest damit dann wieder annotieren. Aber wenn du jetzt zum Beispiel da Strings verwenden wollen würdest für die Typen, dann geht es halt nicht mehr so richtig.

01:12:41.610 --> 01:12:45.410
Ähm, macht... Also Type-Alias macht das dann halt explizit, dass das halt sozusagen...

01:12:45.410 --> 01:12:46.330
Der Alias, das ist okay.

01:12:46.330 --> 01:12:47.710
Ja, ähm...

01:12:47.710 --> 01:13:00.050
Und die Type war, das hatten wir eben, TVK, TKV, was, warum TKV jetzt da im besonderen Sinne, weil ich diese kurzen Dinge, also einer der Gründe, warum ich Go nicht leiten kann, sind diese Ein-Charakter-Variablen-Namen, aber, ähm, ja.

01:13:00.050 --> 01:13:02.130
Ja, das sind halt die Generics, oder, die wir vorhin hatten.

01:13:02.130 --> 01:13:02.510
Ja, genau, genau.

01:13:02.510 --> 01:13:04.790
Stefan, du hast angesetzt. Erklär uns, was Type war.

01:13:04.790 --> 01:13:09.330
Also, ja, ja, also ich hab jetzt ganz kurz diesen PEP-4-4 aufgemacht und der ist, der ist wunderschön.

01:13:09.330 --> 01:13:11.330
Also, also, äh...

01:13:11.330 --> 01:13:11.590
Der ist super.

01:13:11.590 --> 01:13:21.070
Eine Type-Variable, also ich sag immer, ich sag immer Type-Parameter dazu, aber das ist im Grunde genau das Gleiche, das ist eben diese, ähm, äh, ein Typ, der später durch einen konkreten Typ ersetzt wird.

01:13:21.070 --> 01:13:41.570
Das heißt, du kannst jetzt sagen, hey, du hast diese, diese Typ-Variable in diesem Beispiel vom PEP-4-4 ist das ST, Seist-Type wird das heißen dort, weil da geht's um Seist, ähm, wo du sagst, hey, du machst jetzt eine Funktion, die erlaubt, ähm, x-beliebige Typen, allerdings kannst du sie, ähm, durch irgendeinen Bound,

01:13:41.570 --> 01:13:46.630
das ist das Zweite dort, ähm, der zweite Parameter, ähm, einschränken.

01:13:46.630 --> 01:13:55.690
Also, ein Bound sagt dir, ähm, also, oder der generelle Typ-Parameter sagt dir, alle möglichen Werte, aber später nur ein konkreter.

01:13:55.690 --> 01:14:02.550
Ähm, und der Bound sagt dir, alle möglichen Werte, die auch diese Eigenschaften erfüllen, später ein konkreter.

01:14:02.550 --> 01:14:11.550
Und das ist dort in diesem Beispiel recht gut, weil da wird Seist als Bound definiert, was bedeutet, dass du, ähm, ähm, äh, Länge, äh,

01:14:11.550 --> 01:14:31.710
äh, definieren können musst oder Länge lesen können, können musst, ähm, in Python hast du nur diese, diese Hilfsfunktion, du hast ja selten Methoden auf, auf Klassen, soweit ich das, das weiß, ähm, deswegen brauchst du halt überall diese, diese Bounds, ähm, andererseits könntest du ja sagen, du hast irgendeine, irgendeine Subklasse oder so.

01:14:31.710 --> 01:14:32.670
Oder Protokoll.

01:14:32.670 --> 01:14:41.530
Aber, aber Bound ist auch etwas, das, das kennen wir in anderen Programmiersprachen auch, ähm, in TypeScript wird das als Konstrant bezeichnet, aber im Grund geht's darum, dass du einfach vor,

01:14:41.530 --> 01:14:55.710
vor definierst, du hast ein paar Eigenschaften, die du sicherstellen willst, in dem Fall, was dort in meinem PEP484 ist, mit diesem Upper Bound, sagst du einfach, du willst die Möglichkeit haben, eine Länge zu berechnen, du willst einfach wissen, hey, da gibt's eine Seist, das hat, hat eine gewisse Längegröße, was auch immer.

01:14:55.710 --> 01:15:00.610
Ähm, spannend wäre so, ob ich dort einen String reingeben kann, weil man kann ja die Länge von einem String definieren.

01:15:00.610 --> 01:15:01.130
Ja, kannst du.

01:15:01.130 --> 01:15:02.250
Ähm, genau.

01:15:02.250 --> 01:15:11.510
Alles, alles, was Len von irgendwas hat, ist Seist.

01:15:11.510 --> 01:15:14.490
Also, also, String muss auch eine Länge rauskriegen, ne?

01:15:14.490 --> 01:15:16.030
Ja.

01:15:16.030 --> 01:15:17.410
Ja.

01:15:17.410 --> 01:15:35.130
Und, äh, das ist auch sehr interessant hier, weil, also diese, diese Type Variable, die gerade in diesem Beispiel, ich hab's zufällig auch gerade offen, äh, benutzt wird, die wird in dieser Funktion, da wird eine Funktion definiert, die heißt Longer, und die nimmt zwei, äh, Variablen, X und Y, und die sind beide vom Typ ST, und der Rückgabewert ist ebenfalls ST.

01:15:35.130 --> 01:15:36.410
Mhm.

01:15:36.410 --> 01:15:45.450
Und das ist eine sehr interessante Sache, weil das eben bedeutet, du kannst hier zwei Sachen reingeben, die vom, von der gleichen Sorte sind, und kriegst wieder eins raus, was wieder von der gleichen Sorte ist.

01:15:45.450 --> 01:15:46.230
Mhm, mhm.

01:15:46.230 --> 01:15:56.170
Aber wir sagen gar nicht genau, was das für eine Sorte ist, sondern wir sagen nur, das muss als Anforderung haben, das Minimum, was es erfüllen muss, ja, das ist der Bound, ich muss davon die Länge abrufen können.

01:15:56.170 --> 01:15:56.970
Mhm.

01:15:57.850 --> 01:16:14.070
Und, ähm, und das hat diese Funktion schon sehr genau spezifiziert, ja, die Spezifikation dieser Funktion, also Longer XY ist ja erstmal sehr lose, und jetzt durch diese Typ-Variablen und durch den Bound ist es doch relativ genau spezifiziert, und auch sehr exakt, würde ich sagen.

01:16:14.070 --> 01:16:27.670
Was ich sehr spannend finde an dem Beispiel, und das ist wahrscheinlich jetzt so ein Python-Eigenwort, aber im ersten Aufruf wird dort dieser generische Typ-Ramit oder diese Type-Var ersetzt durch eine List.

01:16:27.850 --> 01:16:35.410
Das ist, glaube ich, die eckigen Klammern, nicht? Im zweiten Aufruf, da hast du geschwungene Klammern, wird es durch ein Set ersetzt, also der Typ wird durch ein Set ersetzt.

01:16:35.410 --> 01:16:50.710
Aber im dritten, da ist im ersten Aufruf eckige Klammern, im zweiten Parameter sind geschwungene Klammern, da wird der Parent-Type davon eine Collection verwendet, wo du sagst, hey, okay, ist eine List, ist eine Set, also es könnte beides sein, du nimmst einfach was, was beide beschreibt.

01:16:50.710 --> 01:16:56.030
Finde ich cool, dass das das Typ-System so macht, normalerweise würde TypeScript dir da vielleicht einen Fehler werfen.

01:16:56.030 --> 01:16:57.710
TypeScript würde da sagen, hey, ähm.

01:16:57.850 --> 01:17:08.090
Wenn du das einmal durch einen Typ ersetzt, dann musst du auch im zweiten Parameter den gleichen Typ verwenden und so findest du aber in der Hierarchie tatsächlich einen Parent-Type, den du nutzen kannst.

01:17:08.090 --> 01:17:08.770
Das ist ziemlich geil.

01:17:08.770 --> 01:17:11.790
Also, richtig cool.

01:17:11.790 --> 01:17:13.110
Ja, das ist ziemlich schön.

01:17:13.110 --> 01:17:19.310
Also, nämlich auch so, dass ich das jetzt verwenden möchte, muss ich ganz ehrlich sagen.

01:17:19.310 --> 01:17:20.950
Ich glaube, ich habe das so weit.

01:17:20.950 --> 01:17:23.250
Sehr gut.

01:17:23.250 --> 01:17:27.250
Viele Programmsprachen-Features kommen ja durch Knight umgesetzt.

01:17:27.850 --> 01:17:31.090
Das ist bei Python und auch nicht anders.

01:17:31.090 --> 01:17:34.250
Viele Sachen sind einfach aus Knight durch andere Sprachen entstanden.

01:17:34.250 --> 01:17:39.270
Also, den größten Knight habe ich ja durch die Input-Signatur.

01:17:39.270 --> 01:17:41.550
Das macht einfach so viel einfacher.

01:17:41.550 --> 01:17:43.490
In JavaScript ist es umgekehrt.

01:17:43.490 --> 01:17:49.190
Du importierst zuerst die Einzelelemente aus dem Paket und das ist reine Ästhetik.

01:17:49.190 --> 01:17:50.390
So ist es viel klarer.

01:17:50.390 --> 01:17:53.890
Du spezifisierst zuerst das Paket und dann importierst du die Sachen draus.

01:17:53.890 --> 01:17:56.070
Jeder Editor freut sich, wenn er das so kriegen kann.

01:17:56.070 --> 01:17:56.930
Mhm.

01:17:56.930 --> 01:17:57.170
Ja.

01:17:57.850 --> 01:17:58.170
Ja.

01:17:58.170 --> 01:18:03.570
Was mich noch interessieren würde hier an der Stelle ist diese Overloads, die da mit drin stehen.

01:18:03.570 --> 01:18:08.330
Das ist ja auch so eine Sache, die man nur bei den Type Annotations findet oder auch woanders,

01:18:08.330 --> 01:18:11.990
wo halt derselbe Methodenname mehrfach hintereinander definiert wird.

01:18:11.990 --> 01:18:13.650
Was macht denn das genau?

01:18:13.650 --> 01:18:18.430
Schreibst du in Python dort dann beide Methoden aus?

01:18:18.430 --> 01:18:20.210
Also, implementierst du da beide Methoden?

01:18:20.210 --> 01:18:22.830
Ah, in Python musst du dich da anstrengen dafür.

01:18:22.830 --> 01:18:23.690
Oder sind das nur die Signaturen?

01:18:23.690 --> 01:18:26.390
In Python musst du dich da anstrengen dafür.

01:18:26.390 --> 01:18:27.770
Das hat ja nicht mal viel mit.

01:18:28.670 --> 01:18:34.770
Ja, es hat vielleicht schon was mit Types zu tun, aber, also so richtiges Overloading gibt es ja gar nicht in Python.

01:18:34.770 --> 01:18:38.490
Du fügst eine weitere Signatur hinzu zur Methode.

01:18:38.490 --> 01:18:38.810
Ja, genau.

01:18:38.810 --> 01:18:39.490
Was macht denn das?

01:18:39.490 --> 01:18:40.170
Warum macht man denn das?

01:18:40.170 --> 01:18:42.690
Aber du hast doch nicht zwei Funktionen, du hast zwei Signaturen.

01:18:42.690 --> 01:18:53.170
Du hast eine Funktion, die, also es ist so, der ganz grundlegende Prozess ist, dass eine Funktion in Python eine Variable ist,

01:18:53.170 --> 01:18:57.070
die halt ein Funktionsobjekt enthält.

01:18:57.650 --> 01:19:01.410
Und diese Variable hat einen Namen und diesen Namen, der ist eindeutig, den kannst du nur einmal geben.

01:19:01.410 --> 01:19:03.670
Und zu diesem Namen kannst du auch nur diese eine Funktion geben.

01:19:03.670 --> 01:19:09.370
Was du jetzt aber machst, um Überladung zu machen, und das, ich erkläre es gleich noch für die Zuhörer, ja,

01:19:09.370 --> 01:19:16.370
ist, dass du sagst, du definierst eine Basismethode und der fügst du dann eine weitere Signatur hinzu.

01:19:16.370 --> 01:19:23.990
Und wenn diese, da ist dann eben so ein, durch Dekoratoren hast du so einen Mechanismus, der diese Signaturen entsprechend überprüft.

01:19:23.990 --> 01:19:26.870
So, was ist Überladung überhaupt und was erreicht man damit?

01:19:27.650 --> 01:19:39.030
Überladung ist, wenn du eine Funktion, also ganz klassisch aus dem Java-Umfeld, ja, wenn du eine Funktion hast, die heißt add und die definierst du für float und float und dann kommt hinterher wieder ein float raus.

01:19:39.030 --> 01:19:49.890
Dann funktioniert die ganz einwandfrei für floats, aber du kannst damit nicht int adden, ja, kannst keine Integer addieren, weil der Compiler dir sagt, ja, ich hab so, ich hab die Funktion gefunden, aber die geht nur für floats.

01:19:49.890 --> 01:19:57.050
Was du jetzt in Java machst, ist, du schreibst eine zweite Funktion, die auch add heißt, aber die eine andere Signatur hat.

01:19:57.450 --> 01:20:01.450
Und die wird durch das Kompilat eher zu einer anderen Funktion.

01:20:01.450 --> 01:20:09.870
Das heißt, zum Zeitpunkt des Kompilierens kann der Compiler sagen, ah, du meintest diese Funktion mit der Signatur oder du meintest diese Funktion mit der Signatur.

01:20:09.870 --> 01:20:22.490
Und das geht auch in TypeScript, wenn ich mich recht erinnere, dass du überladene Methoden hast, die dann eben durch den Compiler zum Zeitpunkt des Kompilens die richtige Zuweisung bekommen.

01:20:22.490 --> 01:20:26.470
Die sind dann im JavaScript-Kompilat heißen die dann unterschiedlich, weil die eben da unterschiedlich sind.

01:20:26.470 --> 01:20:27.250
Das ist genau das.

01:20:27.250 --> 01:20:28.230
Das ist genau der Unterschied.

01:20:28.230 --> 01:20:28.890
Heißt nicht unterschiedlich.

01:20:28.890 --> 01:20:40.090
Nein, ein Overload in TypeScript ist im Grund nur eine andere Funktionssignatur auf Basis, über der tatsächlichen.

01:20:40.090 --> 01:20:51.130
Du musst mindestens zwei angeben, eine, die dem Typsystem mitgeteilt wird als Nutzungssignatur und eine, die du verwenden kannst, um tatsächlich die Funktion zu implementieren.

01:20:51.130 --> 01:20:56.130
Und dann kannst du so viele Overload schreiben, wie du willst und du hast dann einfach unterschiedliche Aufrufe.

01:20:57.050 --> 01:20:58.210
Durch die du durchgehen kannst.

01:20:58.210 --> 01:21:02.890
Aber im Endeffekt wird nur eine Methode aufgerufen oder eine Funktion aufgerufen.

01:21:02.890 --> 01:21:09.250
Deswegen habe ich genauso nachgefragt, weil ich bin mir nicht sicher, wie das jetzt in Python funktioniert, weil es ist spannend.

01:21:09.250 --> 01:21:12.150
Es ist so Führungslieder.

01:21:12.150 --> 01:21:13.150
Okay.

01:21:13.150 --> 01:21:13.710
Genau.

01:21:13.710 --> 01:21:15.530
In Python ist es ein bisschen anders.

01:21:15.530 --> 01:21:20.110
In Python musst du das eben über Dekoratoren machen, weil du diesen Namen nicht mehrfach haben darfst.

01:21:20.110 --> 01:21:27.010
Und was da im Wesentlichen passiert ist, du sagst, wenn die Methode aufgerufen wird mit zwei.

01:21:27.010 --> 01:21:34.690
Mit zwei Variablen oder mit Argumenten, die dieser Signatur entsprechen, dann rufe bitte diese Subsignatur auf.

01:21:34.690 --> 01:21:39.350
Also du fügst da quasi eine weitere Funktion hinzu, die nur in bestimmten Fällen aufgerufen wird.

01:21:39.350 --> 01:21:41.490
Aber das ist was, was zur Laufzeit passiert.

01:21:41.490 --> 01:21:49.070
Also zur Laufzeit wird dann entschieden, welche Submethode aufgerufen wird.

01:21:49.070 --> 01:21:54.130
Das ist im Wesentlichen ein Match Case, der da vorsteht.

01:21:54.130 --> 01:21:56.970
Nein, aber ich weiß nicht, ob das im Typing-Zusammenhang nicht was anderes ist.

01:21:56.970 --> 01:22:03.970
Es gibt diese Overload-Geschichten vielleicht in Klassen, aber ich meine hier auch bei Funktionen.

01:22:03.970 --> 01:22:09.550
Wenn ich jetzt einfach das sozusagen für diese Typ-Annotation verwenden will, dann ist es, soweit ich sehen kann, auch so.

01:22:09.550 --> 01:22:18.570
Es gibt die Funktion einmal, aber ich kann halt viele sozusagen mit Overload dekorierten Funktionen haben, die keine Implementation haben.

01:22:18.570 --> 01:22:26.710
Aber wo ich sozusagen nur quasi die unterschiedlichen möglichen Arten, wie das aufgerufen werden kann,

01:22:26.930 --> 01:22:30.290
anottiere, weil ich das nicht in eine Annotation schreiben kann, weil geht halt nicht.

01:22:30.290 --> 01:22:32.370
Und ja.

01:22:32.370 --> 01:22:34.070
Ach so, okay.

01:22:34.070 --> 01:22:37.570
Da gibt es zwei, also es gibt da, dann habe ich, also es gibt zwei verschiedene Dinge.

01:22:37.570 --> 01:22:39.850
Es gibt mehrere Overload-Dinge, denke ich.

01:22:39.850 --> 01:22:43.490
Genau, also das, das, das ist blöd, ja.

01:22:43.490 --> 01:22:46.830
Es ist blöd, dass es die, dass diese Sachen in unterschiedlichen Sprachen unterschiedliche Dinge bedeuten.

01:22:46.830 --> 01:22:52.710
Und es ist, also wenn ich der Kaiser wäre, dann wäre das anders.

01:22:52.710 --> 01:22:53.190
Ja.

01:22:56.890 --> 01:22:59.690
Dieser, also das ist tatsächlich was, was ich vermisst habe, ja, an Python.

01:22:59.690 --> 01:23:01.490
Als ich zu Python gekommen bin, aus Java.

01:23:01.490 --> 01:23:10.070
In Java kannst du sagen, ich habe hier eine Funktion, die heißt Add und die nimmt Integer und ich habe eine Funktion Add, die nimmt Strings und ich habe eine Funktion Add, die nimmt, was weiß ich, ja, Listen.

01:23:10.070 --> 01:23:14.990
Und die machen sehr unterschiedliche Dinge, aber im Endeffekt das gleiche Semantische, die fügen die aneinander.

01:23:14.990 --> 01:23:18.070
Und die heißen gleich, weil die das gleiche machen.

01:23:18.070 --> 01:23:25.150
Und sowas gibt es in Python nicht, weil in Python musst du jedes Mal eine neue, neuen Namen haben dafür oder einen neuen Scope oder so.

01:23:26.850 --> 01:23:27.850
Single Dispatch.

01:23:27.850 --> 01:23:31.470
Ja, das hat, ja.

01:23:31.470 --> 01:23:36.930
Also weißt du, warum das in Java überhaupt möglich ist, dass du den gleichen Namen mehrmals vergeben kannst?

01:23:36.930 --> 01:23:41.430
Ja, weil die beim Kompilieren die Namen, weil die Namen weg sind beim Kompilieren.

01:23:41.430 --> 01:23:44.290
Nein, nein, weil die, weil die Funktionssignatur und Typen haben.

01:23:44.290 --> 01:23:56.270
Weil die Funktionssignatur und Typen haben, weil Java die Typen, Typen, also erfordert und dadurch ist einfach genug Unterschied da, um das zu identifizieren können.

01:23:56.810 --> 01:24:26.790
Vertraue und glaube, es hilft, es heilt die göttliche Kraft!

01:24:26.790 --> 01:23:58.670
Genau, es sind unterschiedliche Funktionen.

01:23:58.670 --> 01:24:01.230
Also die Funktion addIntInt ist eine andere Funktion

01:24:01.230 --> 01:24:03.190
als die Funktion addFloatFloat.

01:24:03.190 --> 01:24:09.050
Und darum ist natürlich in JavaScript und Python

01:24:09.050 --> 01:24:11.810
halt komplett anders, weil im Endeffekt hast du halt nur

01:24:11.810 --> 01:24:13.330
eine Funktion mit ein paar Parametern.

01:24:13.330 --> 01:24:15.450
Und die Typen sind ja, wie wir mitbekommen haben,

01:24:15.450 --> 01:24:17.030
eigentlich wurscht.

01:24:17.030 --> 01:24:17.850
Die sind dann weg.

01:24:17.850 --> 01:24:20.090
Ja, zur Laufzeit auf jeden Fall.

01:24:20.090 --> 01:24:23.130
Aber diesen Mechanismus, den kriegst du hin,

01:24:23.130 --> 01:24:24.270
der heißt Single Dispatch.

01:24:24.270 --> 01:24:27.030
From Functools import Single Dispatch.

01:24:27.110 --> 01:24:27.870
PEP 443.

01:24:27.870 --> 01:24:32.010
Das, was ihr beschrieben habt, das heißt Overload,

01:24:32.010 --> 01:24:33.850
das ist ja was ganz anderes.

01:24:33.850 --> 01:24:35.110
Python Lang Util.

01:24:35.110 --> 01:24:37.770
Okay.

01:24:37.770 --> 01:24:40.810
Ich habe es jetzt hier aus From Typing.

01:24:40.810 --> 01:24:43.710
Also so wie ich das gesehen habe,

01:24:43.710 --> 01:24:45.190
es gibt auch ein sehr schönes Beispiel dafür.

01:24:45.190 --> 01:24:47.170
Das ist auch aus dem Fluent Python Buch.

01:24:47.170 --> 01:24:48.990
Habe ich das da.

01:24:48.990 --> 01:24:52.130
Also das ist halt so ein Beispiel für Methoden,

01:24:52.130 --> 01:24:54.970
die halt eigentlich in, also die hat auch so ein Problem,

01:24:54.970 --> 01:24:56.990
dass man mit Type Annotation

01:24:56.990 --> 01:24:59.110
halt so hat, beschreiben, nämlich,

01:24:59.110 --> 01:25:01.830
dass man, dass halt die Type Annotation nicht so,

01:25:01.830 --> 01:25:03.550
also die ist ja auch eine Sprache,

01:25:03.550 --> 01:25:05.290
ist halt eine andere Art, das hinzuschreiben.

01:25:05.290 --> 01:25:07.990
Und die ist halt nicht so expressiv wie Python selber.

01:25:07.990 --> 01:25:09.530
Das heißt, wenn ich jetzt Funktionen habe,

01:25:09.530 --> 01:25:11.130
wie zum Beispiel Min und Max,

01:25:11.130 --> 01:25:11.830
jetzt weiß ich gar nicht,

01:25:11.830 --> 01:25:14.450
ob es das in der JavaScript-Welt auch so gibt,

01:25:14.450 --> 01:25:18.410
aber die kann ich halt sehr schön in Python hinschreiben.

01:25:18.410 --> 01:25:21.330
So in irgendwie so 20 Zeilen oder sowas.

01:25:21.330 --> 01:25:25.110
Und ist sehr schön zu lesen, ist nicht kompliziert.

01:25:26.870 --> 01:25:29.930
Die Type Annotation dafür ist aber sehr, sehr schwer,

01:25:29.930 --> 01:25:31.330
weil das halt so super generisch ist.

01:25:31.330 --> 01:25:33.550
Und dann kann man noch ein Callback übergeben,

01:25:33.550 --> 01:25:36.610
das halt irgendwie zum Sortieren verwendet wird und sowas.

01:25:36.610 --> 01:25:42.150
Und ja, die korrekten Type Annotationen für Min und Max

01:25:42.150 --> 01:25:44.210
sind halt sehr viel länger als die Implementation.

01:25:44.210 --> 01:25:46.750
Und das ist halt, liegt halt daran,

01:25:46.750 --> 01:25:50.610
dass man das in dieser neuen Annotationssprache

01:25:50.610 --> 01:25:51.730
halt nicht so gut hinschreiben kann.

01:25:51.730 --> 01:25:54.270
Und dafür, also da hast du dann halt so irgendwie,

01:25:54.270 --> 01:25:55.970
ich weiß nicht, zig Overloads, weil,

01:25:56.750 --> 01:26:00.530
du kannst das sowieso immer nur quasi für einen Teil der,

01:26:00.530 --> 01:26:02.670
wie man das aufrufen kann, halt annotieren.

01:26:02.670 --> 01:26:03.970
Und dann musst du das halt,

01:26:03.970 --> 01:26:06.190
musst halt zehn Dinger übereinander häufen,

01:26:06.190 --> 01:26:09.010
um das halt irgendwie abgebildet zu kriegen.

01:26:09.010 --> 01:26:11.930
Und ja, und auch in diesen Dingern sind dann halt,

01:26:11.930 --> 01:26:14.450
waren halt lange Fehler drin.

01:26:14.450 --> 01:26:16.810
Und die sind halt auch echt schwer zu finden.

01:26:16.810 --> 01:26:17.910
Also ja.

01:26:17.910 --> 01:26:20.630
Und die machen ja auch überhaupt gar nichts,

01:26:20.630 --> 01:26:21.810
diese Fehler, jetzt mal ganz ehrlich.

01:26:21.810 --> 01:26:23.890
Ja gut, na gut.

01:26:23.890 --> 01:26:25.890
Also irgendjemand hat dann halt,

01:26:26.630 --> 01:26:30.350
es kann ja sein, du rufst das halt auf,

01:26:30.350 --> 01:26:31.910
lässt das auf eine bestimmte Art

01:26:31.910 --> 01:26:33.830
und dann läuft dein Type-Checker drüber

01:26:33.830 --> 01:26:36.030
und der sagt, der spuckt dir dann halt irgendeine Fehlermeldung aus,

01:26:36.030 --> 01:26:37.250
die vollkommen unverständlich ist.

01:26:37.250 --> 01:26:39.290
Und das verdirbt dir halt den Vormittag oder so,

01:26:39.290 --> 01:26:41.030
weil du verstehst gar nicht, wo das Problem ist.

01:26:41.030 --> 01:26:42.890
Und dann war es halt nicht mal wirklich ein Problem,

01:26:42.890 --> 01:26:44.070
sondern es ist einfach nur etwas,

01:26:44.070 --> 01:26:46.930
was halt in den Annotationen kaputt war.

01:26:46.930 --> 01:26:48.570
Und du hast es korrekt aufgerufen,

01:26:48.570 --> 01:26:49.570
das ist ja schon ärgerlich.

01:26:49.570 --> 01:26:54.170
Also ich meine, ja, also, ja, gut.

01:26:54.170 --> 01:26:56.170
Zugegeben, ja.

01:26:56.510 --> 01:26:56.870
Aber.

01:26:56.870 --> 01:27:00.430
Aber was war jetzt die Lösung, Jochen?

01:27:00.430 --> 01:27:01.990
Weil ich habe dich jetzt unterbrochen,

01:27:01.990 --> 01:27:03.450
aber gibt es da jetzt eine Lösung dafür?

01:27:03.450 --> 01:27:04.530
Kann ich jetzt da Overload sagen?

01:27:04.530 --> 01:27:06.630
Genau, und du kannst jetzt sozusagen,

01:27:06.630 --> 01:27:09.150
wenn du eine Funktion annotieren möchtest,

01:27:09.150 --> 01:27:11.770
aber das halt die Annotation nicht einfach so hinschreiben kannst,

01:27:11.770 --> 01:27:14.090
dann kannst du die möglichen Arten,

01:27:14.090 --> 01:27:16.570
wie das halt, also wenn es halt mehrere,

01:27:16.570 --> 01:27:20.330
wenn du mehrere Annotationen hinschreiben musst

01:27:20.330 --> 01:27:22.490
für die Funktion, kannst du das per Overload hinschreiben.

01:27:22.490 --> 01:27:24.850
Hast dann halt der Methoden-Body

01:27:24.850 --> 01:27:26.390
oder Funktions-Body ist dann so,

01:27:26.390 --> 01:27:28.670
sondern ist einfach Ellipsis, also Punkt, Punkt, Punkt.

01:27:28.670 --> 01:27:32.350
Und genau, dann kannst du halt alle Arten,

01:27:32.350 --> 01:27:34.550
wie man das Ding halt getypt aufrufen kann,

01:27:34.550 --> 01:27:35.370
halt hinschreiben.

01:27:35.370 --> 01:27:38.330
So richtig schön sieht das aber auch nicht aus.

01:27:38.330 --> 01:27:39.190
Nee, das sieht nicht schön aus.

01:27:39.190 --> 01:27:46.410
Ich würde es zum Beispiel in TypeScript

01:27:46.410 --> 01:27:48.190
auch nicht immer verwenden.

01:27:48.190 --> 01:27:49.630
Meistens ist das ein Codespell,

01:27:49.630 --> 01:27:52.950
wenn du Methoden oder Funktionen hast,

01:27:52.950 --> 01:27:54.930
die mehr können soll.

01:27:56.270 --> 01:27:57.590
Was sie beschreibt, ja.

01:27:57.590 --> 01:27:59.030
Ja, so ein bisschen so eine Krücke, ne?

01:27:59.030 --> 01:27:59.930
Warum machen wir das dann nicht?

01:27:59.930 --> 01:28:02.730
Vielleicht, wenn man so ein Public-API-Interface hat,

01:28:02.730 --> 01:28:04.230
was unbedingt benutzt bleiben muss,

01:28:04.230 --> 01:28:05.010
aus irgendwelchen Gründen.

01:28:05.010 --> 01:28:07.470
Vielleicht für Legacy oder sowas.

01:28:07.470 --> 01:28:08.430
Ja, also in TypeScript gibt es es,

01:28:08.430 --> 01:28:11.990
weil du halt in TypeScript

01:28:11.990 --> 01:28:14.210
Parameter weglassen kannst

01:28:14.210 --> 01:28:16.530
oder

01:28:16.530 --> 01:28:20.490
Parameter in unterschiedlichen Positionen

01:28:20.490 --> 01:28:21.470
auch was anderes heißen.

01:28:21.470 --> 01:28:24.930
Und da hat halt TypeScript irgendeine Methode braucht,

01:28:24.930 --> 01:28:25.670
um das darzustellen.

01:28:26.270 --> 01:28:27.830
Und deswegen haben wir es.

01:28:27.830 --> 01:28:31.250
Ja, gut, wenn man Sternchen, Komma, Quark schreibt oder sowas, ja.

01:28:31.250 --> 01:28:33.310
Also gerade dieses Add-Beispiel von Johannes,

01:28:33.310 --> 01:28:35.830
das würde ich eigentlich jetzt in TypeScript

01:28:35.830 --> 01:28:38.770
mit Generics umsetzen, oder?

01:28:38.770 --> 01:28:40.630
Ja, gut.

01:28:40.630 --> 01:28:44.950
Wenn du jetzt die Methode Add für Integer

01:28:44.950 --> 01:28:46.530
und eine Methode Add für Stringen hast,

01:28:46.530 --> 01:28:49.690
musst du ja schon zwei unterschiedliche Implementierungen haben auch.

01:28:49.690 --> 01:28:53.010
Also an irgendeiner Stelle musst du ja deine Implementierung verzweigen.

01:28:56.150 --> 01:28:58.590
Ja, wenn du Plus verwendest, okay.

01:28:58.590 --> 01:29:00.450
Aber dann musst du das Plus irgendwo hin verzweigen,

01:29:00.450 --> 01:29:02.010
weil das macht ja sehr unterschiedliche Dinge.

01:29:02.010 --> 01:29:03.350
Ja.

01:29:03.350 --> 01:29:06.130
Dann kann ich das dann netto überschreiben.

01:29:06.130 --> 01:29:08.050
Ja, ja.

01:29:08.050 --> 01:29:10.130
Ja.

01:29:10.130 --> 01:29:12.990
Was mir noch fehlt,

01:29:12.990 --> 01:29:14.390
wir haben schon relativ viel gesagt,

01:29:14.390 --> 01:29:16.830
ich glaube, es ist eben schon einmal gefallen,

01:29:16.830 --> 01:29:18.410
sowas wie rekursive Types oder sowas.

01:29:18.410 --> 01:29:20.350
Wenn ich zum Beispiel einen JSON-Type definiere.

01:29:20.350 --> 01:29:22.030
Oh, sag doch nicht sowas.

01:29:22.030 --> 01:29:22.430
Oh Gott.

01:29:22.430 --> 01:29:25.510
Kapitel 7.

01:29:26.150 --> 01:29:30.210
Du bist ja noch weit entfernt von Kapitel 7.

01:29:30.210 --> 01:29:38.190
Ja, also rekursive Types ist schon nötig.

01:29:38.190 --> 01:29:40.570
Wenn du jetzt zum Beispiel irgendwie eine Liste definieren willst,

01:29:40.570 --> 01:29:41.830
eine einfach verkettete Liste,

01:29:41.830 --> 01:29:43.830
dann hast du dort nur einen Knoten

01:29:43.830 --> 01:29:46.390
und du verweist auf den nächsten Knoten.

01:29:46.390 --> 01:29:49.950
Aber das ist eigentlich nur ein Typsystem.

01:29:49.950 --> 01:29:53.350
Du musst halt irgendwie die Möglichkeit haben,

01:29:53.350 --> 01:29:54.730
dass du Typen definieren kannst,

01:29:54.730 --> 01:29:55.010
die,

01:29:56.030 --> 01:29:57.790
die sich selbst referenzieren können,

01:29:57.790 --> 01:29:59.070
wenn nötig.

01:29:59.070 --> 01:30:01.890
Also wie JSON-Objekte oder sowas zum Beispiel tatsächlich.

01:30:01.890 --> 01:30:03.350
Zum Beispiel, ja, genau.

01:30:03.350 --> 01:30:05.390
Also in JSON kannst du ja auch sehen,

01:30:05.390 --> 01:30:05.770
dass du,

01:30:05.770 --> 01:30:07.990
naja,

01:30:07.990 --> 01:30:09.050
schwierig.

01:30:09.050 --> 01:30:10.830
Ja, eine Liste von Objekten habe,

01:30:10.830 --> 01:30:11.990
in denen andere Listen stecken,

01:30:11.990 --> 01:30:13.690
die wieder irgendwie Teugs haben oder so.

01:30:13.690 --> 01:30:14.150
Ja, genau.

01:30:14.150 --> 01:30:16.170
Oder in Array von Arrays.

01:30:16.170 --> 01:30:17.190
Ja.

01:30:17.190 --> 01:30:18.190
Wenn du schon dabei bist, ne.

01:30:18.190 --> 01:30:20.390
Aber ich habe eben einmal mit,

01:30:20.390 --> 01:30:22.350
mit jemandem vom TypeScript-Team gesprochen,

01:30:22.350 --> 01:30:23.590
bezüglich rekursiven Typen.

01:30:23.590 --> 01:30:24.790
Ähm,

01:30:25.790 --> 01:30:27.370
das ist meistens ein Implementierungsdatei,

01:30:27.370 --> 01:30:29.410
wie tief der Compiler dort denn gehen kann.

01:30:29.410 --> 01:30:30.530
Also was, was sind die,

01:30:30.530 --> 01:30:31.710
ähm,

01:30:31.710 --> 01:30:32.450
wie,

01:30:32.450 --> 01:30:33.990
wie ist der Compiler entwickelt,

01:30:33.990 --> 01:30:35.270
äh,

01:30:35.270 --> 01:30:36.810
dass er bald genug sagen kann,

01:30:36.810 --> 01:30:38.370
hey, da stoppe ich jetzt und passe nicht mehr weiter.

01:30:38.370 --> 01:30:40.230
Also wie, wie geht der Compiler mit der Rekursion?

01:30:40.230 --> 01:30:41.150
Ja, es gibt irgendwie so ein,

01:30:41.150 --> 01:30:42.190
Typ-Systeme können das eigentlich.

01:30:42.190 --> 01:30:44.310
Ja, da auch in der IDE irgendwie,

01:30:44.310 --> 01:30:44.710
ich weiß nicht,

01:30:44.710 --> 01:30:45.830
bei JSON-Type oder sowas,

01:30:45.830 --> 01:30:48.910
wie, bis wie viel Level tief darf der denn gucken,

01:30:48.910 --> 01:30:49.710
ob das noch stimmt.

01:30:49.710 --> 01:30:50.850
Genau, genau.

01:30:50.850 --> 01:30:53.510
Und da werden es auch immer besser.

01:30:53.510 --> 01:30:54.350
Das ist der Mathematik-Egal.

01:30:54.350 --> 01:30:55.070
Der TypeScript-Compiler ist schon recht,

01:30:55.070 --> 01:30:58.910
das ist der Mathematik-Egal,

01:30:58.910 --> 01:30:59.690
die guckt, ähm.

01:30:59.690 --> 01:31:04.630
Ja, genau.

01:31:04.630 --> 01:31:07.550
Ja, das kommt dann wieder darauf an,

01:31:07.550 --> 01:31:08.530
welche Art von Mathematik, ne,

01:31:08.530 --> 01:31:11.530
wenn man den konstruktiven Zweig anhängt.

01:31:11.530 --> 01:31:13.150
Das gibt es gar nicht.

01:31:13.150 --> 01:31:14.050
JSON-Dastro-Typik.

01:31:14.050 --> 01:31:17.530
Wenn du schon in der Grundvorlesung,

01:31:17.530 --> 01:31:20.810
also ich habe ja eine mathematische Ausbildung genossen

01:31:20.810 --> 01:31:21.690
an der Universität,

01:31:21.690 --> 01:31:24.390
da werden dann die natürlichen Zahlen nochmal definiert

01:31:24.390 --> 01:31:24.830
und die werden rekursiert.

01:31:24.830 --> 01:31:24.890
Ja, ja.

01:31:24.890 --> 01:31:25.030
Ja, ja.

01:31:25.030 --> 01:31:25.050
Ja, ja.

01:31:25.070 --> 01:31:27.290
Da gibt es eigentlich nur eine natürliche Zahl,

01:31:27.290 --> 01:31:28.370
das ist die 0 oder die 1,

01:31:28.370 --> 01:31:29.330
je nachdem, wo du anfangen willst.

01:31:29.330 --> 01:31:31.830
Und dann sagt man einfach,

01:31:31.830 --> 01:31:33.150
jede Zahl hat einen Nachfolger

01:31:33.150 --> 01:31:35.510
und zack, hast du alle natürlichen Zahlen beisammen.

01:31:35.510 --> 01:31:38.750
Also es geht schon weit rein mit der Rekursion

01:31:38.750 --> 01:31:41.490
und die geht auch weit genug in der Mathematik.

01:31:41.490 --> 01:31:43.370
Ja.

01:31:43.370 --> 01:31:45.350
Ja, ja, ja.

01:31:45.350 --> 01:31:47.130
Ja, ich weiß nicht, haben wir noch,

01:31:47.130 --> 01:31:48.570
ah, oh, was mir noch einfällt, genau.

01:31:48.570 --> 01:31:52.930
Das schließt so ein bisschen an das Pedantik-Thema von eben an.

01:31:52.930 --> 01:31:54.850
Ich meine, das ist ja jetzt etwas,

01:31:54.890 --> 01:32:00.350
was man, also die Typen werden ja zur Laufzeit ignoriert in Python,

01:32:00.350 --> 01:32:03.430
aber nicht immer und man müsste es auch nicht,

01:32:03.430 --> 01:32:06.010
weil im Grunde kann man rausfinden,

01:32:06.010 --> 01:32:07.410
wie die Annotationen sind.

01:32:07.410 --> 01:32:09.770
Und es gibt halt auch Software, die das macht,

01:32:09.770 --> 01:32:11.030
wie zum Beispiel Pedantik.

01:32:11.030 --> 01:32:13.370
Ja, oder MyPy.

01:32:13.370 --> 01:32:14.950
Oder FastAPI.

01:32:14.950 --> 01:32:16.350
Oder FastAPI.

01:32:16.350 --> 01:32:17.830
Ja, genau.

01:32:17.830 --> 01:32:20.250
Gibt es sowas eigentlich in TypeScript auch?

01:32:20.250 --> 01:32:23.590
Weil ich meine, gut, das wird ja kompiliert zu JavaScript,

01:32:23.590 --> 01:32:24.510
aber es gibt ja jetzt auch,

01:32:24.710 --> 01:32:27.750
glaube ich, Interpreter, die direkt TypeScript interpretieren,

01:32:27.750 --> 01:32:29.510
so Deno oder sowas, macht das, glaube ich,

01:32:29.510 --> 01:32:30.170
ich weiß nicht so genau,

01:32:30.170 --> 01:32:31.750
könnte das ja im Grunde dann tun.

01:32:31.750 --> 01:32:35.350
Das ist ja ein weitverbreiteter,

01:32:35.350 --> 01:32:38.230
ich glaube, dass Deno direkt TypeScript interpretiert.

01:32:38.230 --> 01:32:38.450
Ach so.

01:32:38.450 --> 01:32:41.050
Deno hat nur einen TypeScript-Compiler inkludiert,

01:32:41.050 --> 01:32:43.690
also kompiliert TypeScript, bevor er das JavaScript ausführt.

01:32:43.690 --> 01:32:45.430
Also tatsächlich,

01:32:45.430 --> 01:32:48.850
ich sage mal, im JavaScript-Bereich reden wir eher

01:32:48.850 --> 01:32:51.010
von unterschiedlichen Typsystemen, die existieren.

01:32:51.010 --> 01:32:54.330
Wie Flow-Type ist zum Beispiel eins,

01:32:54.330 --> 01:32:56.410
das sehr, sehr optisch sehr, sehr ähnlich ist zu dem,

01:32:56.410 --> 01:32:58.850
was TypeScript zur Verfügung stellt,

01:32:58.850 --> 01:33:01.170
aber halt in den Nansen unterschiedlich ist.

01:33:01.170 --> 01:33:02.910
Oder eben TypeScript,

01:33:02.910 --> 01:33:05.530
und das sind auch schon die populärsten.

01:33:05.530 --> 01:33:07.450
Der Clojure-Compiler hat einmal ähnlich funktioniert,

01:33:07.450 --> 01:33:09.430
also wie Typ definiert werden.

01:33:09.430 --> 01:33:09.950
CoffeeScript gab es früher.

01:33:09.950 --> 01:33:12.730
Ja, CoffeeScript ist aber sogar eigene Programmiersprache.

01:33:12.730 --> 01:33:15.310
Also wie Typ definiert werden.

01:33:15.310 --> 01:33:16.270
Ja, aber kompiliert, also ich meine, ja.

01:33:16.270 --> 01:33:20.830
Gleiche Historie.

01:33:20.830 --> 01:33:23.190
Ähnlich, ähnlich.

01:33:24.150 --> 01:33:25.690
Da gibt es auch einen wichtigen Punkt,

01:33:25.690 --> 01:33:27.930
weil wie Typen definiert werden in JavaScript,

01:33:27.930 --> 01:33:32.210
das ist ja eigentlich nicht dem TypeScript-Team zu verdanken,

01:33:32.210 --> 01:33:34.630
sondern dem ECMAScript-4-Standard,

01:33:34.630 --> 01:33:38.610
der schon viel, viel älter ist, der nie umgesetzt wurde,

01:33:38.610 --> 01:33:41.410
an den sich aber alle Typsysteme jetzt irgendwie dranhalten

01:33:41.410 --> 01:33:43.250
bei der Definition des eigenen Typsystems.

01:33:43.250 --> 01:33:46.250
Ich würde eher sogar sagen, dass ActionScript,

01:33:46.250 --> 01:33:50.470
also die Flash-Programmiersprache noch eher ähnlicher

01:33:50.470 --> 01:33:52.870
oder verwandter mit TypeScript und Flow-Type ist.

01:33:53.770 --> 01:33:56.950
Aber das ist es dann auch.

01:33:56.950 --> 01:33:59.330
Also du hast entweder unterschiedliche Typsysteme,

01:33:59.330 --> 01:34:01.470
dann entscheidest du dich in den meisten Fällen

01:34:01.470 --> 01:34:02.810
heutzutage eh für TypeScript

01:34:02.810 --> 01:34:04.890
und dann bietet dir TypeScript eigentlich alles,

01:34:04.890 --> 01:34:05.990
was du dort dann dafür brauchst.

01:34:05.990 --> 01:34:08.550
Also du laufst da gar nicht in Gefahr,

01:34:08.550 --> 01:34:13.330
dass du irgendwie ein anderes Werkzeug nimmst.

01:34:13.330 --> 01:34:16.010
Und TypeScript versteht halt auch komplett JavaScript.

01:34:16.010 --> 01:34:19.090
Das heißt, du kannst halt dort noch mit JavaScript-Code anfangen

01:34:19.090 --> 01:34:20.690
und dich nur einmal auf die Typ-Inferenz

01:34:20.690 --> 01:34:22.550
vom TypeScript-Type-Checker verlassen.

01:34:22.550 --> 01:34:23.490
Dass er sagt,

01:34:23.590 --> 01:34:27.890
ich weiß jetzt, welche Typen du verwendest,

01:34:27.890 --> 01:34:30.090
rein in der Verwendung deines Codes.

01:34:30.090 --> 01:34:33.670
Dass du jetzt so eine retroaktive Typ-Annotation machst,

01:34:33.670 --> 01:34:36.410
macht man eher nicht.

01:34:36.410 --> 01:34:37.470
Es gibt ein paar Werkzeuge,

01:34:37.470 --> 01:34:40.730
ich könnte aber jetzt nicht den Namen dazu sagen,

01:34:40.730 --> 01:34:42.390
macht man aber aus dem Grund nicht,

01:34:42.390 --> 01:34:45.910
weil der TypeScript-Type-Checker eh gut genug ist,

01:34:45.910 --> 01:34:47.450
dass er schon sehr, sehr viel herausfindet,

01:34:47.450 --> 01:34:49.630
bevor du überhaupt irgendeine Annotation machen musst.

01:34:49.630 --> 01:34:53.570
Was ein gutes Migrations-Sol ist,

01:34:53.570 --> 01:34:54.990
ist JS-Doc,

01:34:54.990 --> 01:34:57.730
das ist halt eine Typ-Annotation im Kommentar,

01:34:57.730 --> 01:34:58.830
wo du einfach sagst,

01:34:58.830 --> 01:34:59.850
hey, du hast diese Funktion,

01:34:59.850 --> 01:35:01.170
die hat drei Parameter,

01:35:01.170 --> 01:35:05.330
du definierst den Typen im Kommentar

01:35:05.330 --> 01:35:07.390
und nicht im Code.

01:35:07.390 --> 01:35:09.690
Und das machen viele Bibliotheken,

01:35:09.690 --> 01:35:12.970
das machen sehr viele alte JavaScript-Bibliotheken,

01:35:12.970 --> 01:35:15.570
wie zum Beispiel Lodash oder Underscore schon.

01:35:15.570 --> 01:35:17.250
Und TypeScript kann mit dem umgehen.

01:35:17.250 --> 01:35:19.030
Also TypeScript kann auch Typ-Informationen

01:35:19.030 --> 01:35:20.270
aus diesen Kommentaren lesen

01:35:20.270 --> 01:35:23.550
und hat halt so weit mehr Komplizität,

01:35:23.550 --> 01:35:26.090
Komplizität mit dem gesamten Ökosystem,

01:35:26.090 --> 01:35:27.610
als wenn sie darauf bestehen würden,

01:35:27.610 --> 01:35:28.830
dass sie nur die Typen verwenden,

01:35:28.830 --> 01:35:29.650
die du annotierst.

01:35:29.650 --> 01:35:34.350
Okay, aber so ein richtiges Äquivalent zu dem,

01:35:34.350 --> 01:35:37.430
was der Jochen gefragt oder gesagt hat,

01:35:37.430 --> 01:35:38.210
gibt es nicht wirklich.

01:35:38.210 --> 01:35:41.530
Zur Laufzeit hast du nicht wirklich mehr die Typ-Informationen.

01:35:41.530 --> 01:35:43.910
Also zur Laufzeit,

01:35:43.910 --> 01:35:47.730
es gibt Bibliotheken,

01:35:47.730 --> 01:35:51.170
die fügen Typ-Informationen zur Laufzeit hinzu

01:35:51.170 --> 01:35:53.530
und leiten dadurch TypeScript-Typen,

01:35:53.530 --> 01:35:55.570
aber das ist es dann schon.

01:35:55.570 --> 01:35:58.690
Also es gibt auch ein paar so Reflection-Geschichten.

01:35:58.690 --> 01:36:00.290
Achso, okay, dass du so rumgehst.

01:36:00.290 --> 01:36:01.390
Das ist aber alles Mumpitz.

01:36:01.390 --> 01:36:03.910
Also das möchte ich nicht einmal erwähnen,

01:36:03.910 --> 01:36:05.230
weil es einfach Schwachsinn ist.

01:36:05.230 --> 01:36:07.230
Eine Sache, die aber gut ist, zum Beispiel,

01:36:07.230 --> 01:36:07.830
das ist SOD.

01:36:07.830 --> 01:36:09.570
Wenn du jetzt sagst, du brauchst jetzt

01:36:09.570 --> 01:36:11.130
Typ-Informationen zur Laufzeit auch,

01:36:11.130 --> 01:36:15.310
dann kannst du über die SOD-Bibliothek

01:36:15.310 --> 01:36:17.510
dir deinen Typen in JavaScript definieren.

01:36:17.510 --> 01:36:18.990
Das ist aber nicht TypeScript,

01:36:18.990 --> 01:36:19.630
das ist JavaScript.

01:36:19.630 --> 01:36:22.170
Und kannst dann, wenn du diesen Typen

01:36:22.170 --> 01:36:23.510
weiter im TypeScript-Code

01:36:23.510 --> 01:36:24.470
verwenden willst, sagen,

01:36:24.470 --> 01:36:28.730
hey, leite mir jetzt aus diesem JavaScript-Konstrukt,

01:36:28.730 --> 01:36:29.570
das ich gebaut habe,

01:36:29.570 --> 01:36:31.010
das einen Typen darstellen soll,

01:36:31.010 --> 01:36:33.050
leite mir von diesem JavaScript-Konstrukt

01:36:33.050 --> 01:36:34.730
doch einen TypeScript-Typen ab,

01:36:34.730 --> 01:36:35.550
den ich weiterverwende.

01:36:35.550 --> 01:36:38.850
Und du bekommst dann zum einen einen Typen,

01:36:38.850 --> 01:36:41.330
klassischer TypeScript-Typ,

01:36:41.330 --> 01:36:42.730
den du in deinen Methodensignaturen

01:36:42.730 --> 01:36:43.390
verwenden kannst,

01:36:43.390 --> 01:36:45.750
den du annotieren kannst,

01:36:45.750 --> 01:36:47.030
wo du Type-Checking hast,

01:36:47.030 --> 01:36:48.410
das funktioniert, das ist grandios gut.

01:36:48.410 --> 01:36:50.350
Parallel dazu hast du aber immer noch

01:36:50.350 --> 01:36:52.350
dieses JavaScript-Konstrukt mit der Validierung

01:36:52.350 --> 01:36:53.450
erfahren kannst. Das heißt, du kannst

01:36:53.450 --> 01:36:55.190
sagen, hey, du kriegst jetzt ein Chasen von einem Backend,

01:36:55.190 --> 01:36:58.090
steckst es in den Validator rein

01:36:58.090 --> 01:36:59.510
und kriegst entweder Ergebnisse, die es nachher

01:36:59.510 --> 01:37:01.530
dem Typen entspricht, super, oder

01:37:01.530 --> 01:37:02.930
Fehlermeldungen, mit der du umgehen kannst.

01:37:02.930 --> 01:37:05.410
Und das ist eine grandiose

01:37:05.410 --> 01:37:06.450
Bibliothek.

01:37:06.450 --> 01:37:09.650
Erstens ist sie

01:37:09.650 --> 01:37:11.550
so nah an TypeScript, dass du wirklich sämtliche

01:37:11.550 --> 01:37:13.070
Dinge, die du in TypeScript schreiben kannst,

01:37:13.070 --> 01:37:15.070
auch damit umsetzen kannst.

01:37:15.070 --> 01:37:16.810
Und zweitens ist sie schnell,

01:37:16.810 --> 01:37:19.550
sie macht robustere Code, ich bin total glücklich

01:37:19.550 --> 01:37:21.130
mit der, die kann ich sehr, sehr gut empfehlen.

01:37:21.130 --> 01:37:23.330
Also unbedingt. Aber prinzipiell

01:37:23.330 --> 01:37:25.070
gilt als Methoden. Okay, cool. Also ein ähnliches

01:37:25.070 --> 01:37:26.950
Verfahren. Sehr ähnlich.

01:37:26.950 --> 01:37:28.590
In SOD ist es aber so, dass du

01:37:28.590 --> 01:37:30.750
halt die Typen dann

01:37:30.750 --> 01:37:32.870
anfängst zu schreiben in dieser

01:37:32.870 --> 01:37:34.970
JavaScript-Welt

01:37:34.970 --> 01:37:36.970
mit den dort

01:37:36.970 --> 01:37:39.170
vorhandenen Methoden und Funktionen.

01:37:39.170 --> 01:37:41.110
Und das ist halt umgekehrt zu dem, was du

01:37:41.110 --> 01:37:42.990
normalerweise in TypeScript auch hast, dass du sagst,

01:37:42.990 --> 01:37:44.830
du schreibst deine Typen und die sind nach dem

01:37:44.830 --> 01:37:46.990
Kompilator einfach weg. Also TypeScript ist so eine

01:37:46.990 --> 01:37:48.630
Erased-to-JavaScript-Sprache,

01:37:48.630 --> 01:37:51.270
was auch bedeutet, wenn du es nicht zur Laufzeit haben willst,

01:37:51.270 --> 01:37:53.210
musst du in JavaScript anfangen und musst halt dem anderen

01:37:53.210 --> 01:37:53.730
Weg gehen.

01:37:53.730 --> 01:37:57.030
Ja, okay, aber da steht ja nicht, würde ja nicht

01:37:57.030 --> 01:37:59.230
prinzipiell was dagegen sprechen, oder?

01:37:59.230 --> 01:38:01.170
Dass du von TypeScript-Typen zu

01:38:01.170 --> 01:38:03.210
JavaScript-Typen gehst. Das ist nur jetzt halt

01:38:03.210 --> 01:38:04.870
das Tooling, das existiert nicht.

01:38:04.870 --> 01:38:07.130
Ja, okay, aber das ist doch cool. Also du hast auf jeden Fall

01:38:07.130 --> 01:38:08.130
das Gleiche. Unbedingt zu empfehlen.

01:38:08.130 --> 01:38:10.810
Ja, unbedingt zu empfehlen.

01:38:10.810 --> 01:38:12.430
Also das ist richtig, richtig cool. Finde ich super spannend.

01:38:12.430 --> 01:38:14.270
Könnte auch für mich nützlich sein.

01:38:14.270 --> 01:38:16.930
Also gerade wenn du mit

01:38:16.930 --> 01:38:19.270
Backends arbeiten musst, denen du nicht trauen kannst,

01:38:19.270 --> 01:38:21.150
herrlich. Ja, oder

01:38:21.150 --> 01:38:23.090
mit Inputs von Benutzern

01:38:23.090 --> 01:38:25.150
und ich meine, da musst du eh immer Validierung

01:38:25.150 --> 01:38:25.930
machen, aber das

01:38:25.930 --> 01:38:28.610
kann einem ja in dem Sinne

01:38:28.610 --> 01:38:30.050
die Arbeit ein bisschen abnehmen.

01:38:30.050 --> 01:38:33.050
Naja, also man definiert halt, wie man gerne

01:38:33.050 --> 01:38:34.950
hätte, dass die eigene Datenstruktur

01:38:34.950 --> 01:38:37.030
aussieht und benutzt dann diese Information

01:38:37.030 --> 01:38:38.530
halt auch zur Validierung dagegen.

01:38:38.530 --> 01:38:40.730
Das ist natürlich, also ja,

01:38:40.730 --> 01:38:42.930
das ist genau eigentlich der Use Case von

01:38:42.930 --> 01:38:43.650
Pydentic auch.

01:38:43.650 --> 01:38:47.130
Ja, ja. Muss man das Pydentic noch genau

01:38:47.130 --> 01:38:49.410
anschauen. Also das hört zum

01:38:49.410 --> 01:38:50.750
Zeitmehr, ob es heute gehört,

01:38:50.750 --> 01:38:51.870
wie wir begonnen haben.

01:38:52.970 --> 01:38:54.610
Und jetzt wieder. Erklär mal,

01:38:54.610 --> 01:38:56.770
Jochen, erzähl mal den Unterschied zwischen FastAPI

01:38:56.770 --> 01:38:58.530
und Pydentic. Ach, ja,

01:38:58.530 --> 01:39:00.670
FastAPI ist sozusagen ein

01:39:00.670 --> 01:39:02.730
Repetiface, was

01:39:02.730 --> 01:39:04.810
Pydentic, ja, genau.

01:39:04.810 --> 01:39:06.350
Automatisierung bereitstellen. Pydentic

01:39:06.350 --> 01:39:08.730
ist eine Bibliothek, die benutzt wird von

01:39:08.730 --> 01:39:10.910
FastAPI und

01:39:10.910 --> 01:39:12.610
die halt sozusagen

01:39:12.610 --> 01:39:13.910
ermöglicht, wenn man halt

01:39:13.910 --> 01:39:16.570
mit Typannotationen sozusagen oder

01:39:16.570 --> 01:39:18.650
der Syntax, es gibt noch mehr, weil man kann halt auch noch

01:39:18.650 --> 01:39:20.790
mehr machen als nur die Sachen, die mit

01:39:20.790 --> 01:39:22.850
Annotationen möglich sind. Man kann halt auch Validations

01:39:22.850 --> 01:39:24.850
Validierungsfunktionen

01:39:24.850 --> 01:39:27.070
haben und Upper Limits

01:39:27.070 --> 01:39:28.710
und Lower Limits und weiß ich nicht

01:39:28.710 --> 01:39:30.530
und ganz viel kompliziertes Zeugs halt auch mit dazu

01:39:30.530 --> 01:39:32.330
schreiben. Das geht mit den

01:39:32.330 --> 01:39:34.510
Typannotationen natürlich nicht, aber wenn man einfach nur

01:39:34.510 --> 01:39:36.550
die Typannotationen hinschreibt, dann passiert

01:39:36.550 --> 01:39:37.950
das halt auch, dass dann sozusagen

01:39:37.950 --> 01:39:40.570
man einen JSON nehmen kann und

01:39:40.570 --> 01:39:42.630
man hat halt eine Objektstruktur definiert

01:39:42.630 --> 01:39:44.570
mit den Typen und dann sagt man halt, hier ist

01:39:44.570 --> 01:39:45.050
das JSON,

01:39:45.050 --> 01:39:48.570
passt das mal und validiert das mal.

01:39:48.570 --> 01:39:50.610
Und wenn es nicht, dann kriegst du 422 zurück, weil

01:39:50.610 --> 01:39:52.730
da fehlt irgendwas. Wenn es nicht

01:39:52.730 --> 01:39:54.570
okay ist, kriegt man halt schöne Fehlermeldungen auch

01:39:54.570 --> 01:39:56.550
zurück, wo dann genau gesagt wird, so an

01:39:56.550 --> 01:39:58.590
der Stelle hast du gesagt, das

01:39:58.590 --> 01:40:00.530
soll ein Number sein, aber da ist eigentlich

01:40:00.530 --> 01:40:02.550
da ist ein String oder das ist

01:40:02.550 --> 01:40:04.530
halt irgendwie, das passt sonst wie nicht, das soll eine Liste

01:40:04.530 --> 01:40:06.330
sein, aber das ist halt nicht, ja

01:40:06.330 --> 01:40:08.590
und das ist natürlich nett. Okay, also es ist

01:40:08.590 --> 01:40:10.070
also es ist quasi

01:40:10.070 --> 01:40:12.730
das, woraus FastAPI

01:40:12.730 --> 01:40:13.890
gebaut wird. FastAPI ist

01:40:13.890 --> 01:40:15.790
Identik via

01:40:15.790 --> 01:40:18.170
HTTP. Ja,

01:40:18.170 --> 01:40:20.250
plus es sind noch so ein paar Sachen

01:40:20.250 --> 01:40:22.530
zusätzlich dabei. Starlet ist halt

01:40:22.530 --> 01:40:24.230
irgendwie sozusagen das alles, was HTTP

01:40:24.230 --> 01:40:26.370
angeht oder so macht, da drunter

01:40:26.370 --> 01:40:27.990
die Bibliothek von Tom Christie.

01:40:27.990 --> 01:40:29.830
Also FastAPI ist schon so ein bisschen,

01:40:29.830 --> 01:40:31.470
ist halt so irgendwie

01:40:31.470 --> 01:40:34.330
drei sehr coole oder drei, vier sehr

01:40:34.330 --> 01:40:36.050
coole Open-Source-Bibliotheken in einem French-Code

01:40:36.050 --> 01:40:38.090
irgendwie quasi. Noch so Routing,

01:40:38.090 --> 01:40:40.250
das hat man halt irgendwie von Flask früher

01:40:40.250 --> 01:40:42.250
kannte, als Dekorator oben. Ja, Flask war auch

01:40:42.250 --> 01:40:44.230
sehr, ja genau, das ist natürlich auch sehr

01:40:44.230 --> 01:40:44.790
alt. Also

01:40:44.790 --> 01:40:48.370
Stefan, wenn du FastAPI schon kennst, dann

01:40:48.370 --> 01:40:50.330
weißt du auch, wie Pedantic funktioniert. Nur halt

01:40:50.330 --> 01:40:50.910
innerhalb. Okay.

01:40:52.410 --> 01:40:54.530
Genau. Also wie gesagt, ich habe den Namen

01:40:54.530 --> 01:40:56.510
in Architektur-Diagramm geschrieben, also das ist

01:40:56.510 --> 01:40:57.730
meine Erfahrung damit, aber

01:40:57.730 --> 01:40:59.970
reicht anscheinend.

01:40:59.970 --> 01:41:01.930
Ist schon mehr damit gemacht als viele andere.

01:41:01.930 --> 01:41:04.390
Genau.

01:41:04.390 --> 01:41:05.330
Ja.

01:41:05.330 --> 01:41:08.350
Genau, also ja, das ist auf jeden Fall auch so

01:41:08.350 --> 01:41:10.390
noch ein ganz interessanter Ding, dass man, weil

01:41:10.390 --> 01:41:12.630
ich meine, das ist ja tatsächlich so, wie viele Leute das benutzen.

01:41:12.630 --> 01:41:14.450
Viele Leute benutzen dann TypeDict und denken,

01:41:14.450 --> 01:41:16.610
das würde passieren, dass es validiert wird, aber es passiert halt nicht.

01:41:16.610 --> 01:41:17.770
Ja.

01:41:17.770 --> 01:41:20.610
Genau. Ja, ansonsten,

01:41:20.610 --> 01:41:22.250
ich weiß es nicht, haben wir noch irgendwas Großes

01:41:22.290 --> 01:41:23.210
vergessen oder so, aber ich glaube,

01:41:23.210 --> 01:41:26.310
ansonsten, ich habe hier fast nichts

01:41:26.310 --> 01:41:27.730
mehr, was ich noch irgendwie unbedingt

01:41:27.730 --> 01:41:29.850
gerne wissen wollte. Ja.

01:41:29.850 --> 01:41:32.370
Nach anderthalb Stunden

01:41:32.370 --> 01:41:33.230
alles über

01:41:33.230 --> 01:41:36.050
Typsysteme und Typen gesagt.

01:41:36.050 --> 01:41:38.030
Das ging ja relativ schnell jetzt.

01:41:38.030 --> 01:41:40.270
Ja. Für meinen Typen

01:41:40.270 --> 01:41:41.830
habt ihr immer noch keine Erklärung gefunden, aber sonst.

01:41:41.830 --> 01:41:42.610
Ja.

01:41:42.610 --> 01:41:45.910
So Typen wie dich, Dominik,

01:41:45.910 --> 01:41:46.950
ist schwer zu beschreiben.

01:41:46.950 --> 01:41:49.070
Ja.

01:41:49.070 --> 01:41:51.010
No space enough.

01:41:52.170 --> 01:41:52.690
Ja.

01:41:52.690 --> 01:41:56.150
Wirklich, ich finde es schön. Stefan, hast du noch was, was du

01:41:56.150 --> 01:41:57.190
unbedingt loswerden wolltest?

01:41:57.190 --> 01:42:00.010
Ich glaube, ich habe jetzt noch ein anschauliches Beispiel

01:42:00.010 --> 01:42:02.010
gefunden zu Co-Varianz und Kontra-Varianz.

01:42:02.010 --> 01:42:03.970
Oh ja. Nachdem ich mir die Grafik so lange angeschaut habe.

01:42:03.970 --> 01:42:04.930
Ich hoffe, ich kann es erklären.

01:42:04.930 --> 01:42:07.110
Co-Varianz ist

01:42:07.110 --> 01:42:09.710
in Wirklichkeit, was wir als

01:42:09.710 --> 01:42:12.050
Subtyping verstehen. Angenommen,

01:42:12.050 --> 01:42:14.230
du hast ein Lebewesen, dann hast du ein Subtyp davon,

01:42:14.230 --> 01:42:16.370
das ist ein Pflanzenfresser, dann hast du ein Subtyp

01:42:16.370 --> 01:42:18.050
davon, das ist eine Kuh. Das heißt, du wirst immer

01:42:18.050 --> 01:42:19.610
konkreter und konkreter und konkreter.

01:42:19.610 --> 01:42:21.930
Was bedeutet, wenn du irgendwo ein Lebewesen

01:42:21.930 --> 01:42:24.050
erwartest, kannst du dort einen Pflanzenfresser reinschmeißen,

01:42:24.050 --> 01:42:25.830
kannst du aber auch Kühe reinschmeißen oder Schafe

01:42:25.830 --> 01:42:26.610
reinschmeißen oder

01:42:26.610 --> 01:42:29.170
Veganer.

01:42:29.170 --> 01:42:30.170
Von mir aus, nicht?

01:42:30.170 --> 01:42:33.510
Und das ist Co-Varianz.

01:42:33.510 --> 01:42:35.570
Das heißt, du kannst

01:42:35.570 --> 01:42:37.110
etwas sehr Breites akzeptieren

01:42:37.110 --> 01:42:39.750
und kannst was sehr Konkretes reinstopfen,

01:42:39.750 --> 01:42:40.890
wenn der Subtyp...

01:42:40.890 --> 01:42:43.790
Das heißt, ich erwarte ein Lebewesen als Type Annotation quasi.

01:42:43.790 --> 01:42:44.910
Genau, genau, genau.

01:42:44.910 --> 01:42:47.790
Jetzt hast du aber zum Beispiel

01:42:47.790 --> 01:42:49.830
eine andere Co-Varianz, nämlich du hast

01:42:49.830 --> 01:42:51.910
jetzt eine Pflanze und davon abgeleitet,

01:42:51.930 --> 01:42:53.990
Gras und davon abgeleitet vielleicht

01:42:53.990 --> 01:42:55.390
Heuer oder so. Und jetzt

01:42:55.390 --> 01:42:57.330
willst du

01:42:57.330 --> 01:42:59.750
eine Funktion zur Verfügung stellen,

01:42:59.750 --> 01:43:01.970
die akzeptiert Grasesser,

01:43:01.970 --> 01:43:03.450
dann kannst du dort

01:43:03.450 --> 01:43:05.890
bei den Grasessern Kühe, aber

01:43:05.890 --> 01:43:07.630
auch Pflanzenfresser reinschmeißen.

01:43:07.630 --> 01:43:09.890
Wenn du jetzt aber sagst, du akzeptierst

01:43:09.890 --> 01:43:10.350
jetzt

01:43:10.350 --> 01:43:14.030
du akzeptierst jetzt

01:43:14.030 --> 01:43:17.290
Pflanzen, also

01:43:17.290 --> 01:43:19.350
alle die Pflanzen

01:43:19.350 --> 01:43:21.750
oder Funktionen, die

01:43:21.750 --> 01:43:21.910
Pflanzen haben, dann kannst du

01:43:21.910 --> 01:43:23.450
von Entitäten, die

01:43:23.450 --> 01:43:25.650
alle Pflanzen essen können, alle Pflanzen,

01:43:25.650 --> 01:43:27.790
dann kannst du dort keine Kühe

01:43:27.790 --> 01:43:29.410
reingeben, weil Kühe können nur Gras essen.

01:43:29.410 --> 01:43:31.590
Und das ist Kontrovarianz.

01:43:31.590 --> 01:43:33.690
Das heißt, du hast zwar auch einen Subtypen, du hast einen

01:43:33.690 --> 01:43:35.850
sehr breiten Typen, ich akzeptiere ja

01:43:35.850 --> 01:43:37.870
Pflanzenfresser, allerdings kannst

01:43:37.870 --> 01:43:40.010
du keine Kühe reingeben, weil Kühe nur Gras essen dürfen.

01:43:40.010 --> 01:43:42.010
Okay, und Invarianz

01:43:42.010 --> 01:43:43.770
ist dann ganz festgesetzt, dass halt nur den

01:43:43.770 --> 01:43:45.790
einen speziellen Typ... Genau, Invarianz geht

01:43:45.790 --> 01:43:46.310
in beide Richtungen.

01:43:46.310 --> 01:43:49.290
Also ich hoffe, dass das nochmal

01:43:49.290 --> 01:43:51.410
veranschaulicht. Ich glaube, wir gucken,

01:43:51.410 --> 01:43:53.530
ich lebe dein Bild nochmal an. Ich hoffe, das Bild ist so

01:43:53.530 --> 01:43:55.350
anschaulich für die

01:43:55.350 --> 01:43:57.110
Leute, die ausgestiegen sind, ja.

01:43:57.110 --> 01:43:59.370
Ja, super.

01:43:59.370 --> 01:44:01.290
Da werden wir sicherlich ganz viele E-Mails kriegen und das

01:44:01.290 --> 01:44:02.850
in den nächsten vier Folgen alles nochmal

01:44:02.850 --> 01:44:05.170
genau erklären. Ja, ist ja auch okay,

01:44:05.170 --> 01:44:07.350
wenn da eine Erklärung

01:44:07.350 --> 01:44:08.630
dabei ist, die... Hallo bei

01:44:08.630 --> 01:44:11.250
peistenpodcast.de. Genau. Wir haben

01:44:11.250 --> 01:44:13.230
aber noch gar nicht ganz fertig, weil wir möchten

01:44:13.230 --> 01:44:15.230
noch unseren Pick der Woche, glaube ich,

01:44:15.230 --> 01:44:16.450
auswählen. Oh ja.

01:44:16.450 --> 01:44:19.090
Ich fang mal an, ich nimm... Stefan,

01:44:19.090 --> 01:44:20.270
weißt du denn, was ein Pick ist?

01:44:20.270 --> 01:44:21.250
Ja.

01:44:21.410 --> 01:44:23.210
Also müssen wir jetzt irgendeinen Link raussuchen,

01:44:23.210 --> 01:44:25.030
den er total grandios findet. Ja, genau.

01:44:25.030 --> 01:44:27.230
Irgendwas Schönes zeigen.

01:44:27.230 --> 01:44:29.230
Ja, meistens nennen wir Python-Module, aber

01:44:29.230 --> 01:44:31.230
ich nimm tatsächlich, ja,

01:44:31.230 --> 01:44:33.050
auch nicht immer. Ich nimm tatsächlich diesmal

01:44:33.050 --> 01:44:35.130
eins von Simon Willison,

01:44:35.130 --> 01:44:37.170
und zwar das LLM. Ich glaube, das haben wir bei einer der

01:44:37.170 --> 01:44:39.230
Machine Learning-Folgen... Ach, das Kommando-Zahlen-Tool.

01:44:39.230 --> 01:44:41.230
...zwar schon irgendwo gehabt, aber

01:44:41.230 --> 01:44:43.190
es ist tatsächlich, bei mir

01:44:43.190 --> 01:44:45.250
ist vermehrt in Benutzung, im MonkeyPatch

01:44:45.250 --> 01:44:47.190
schon immer das Default, aber sonst ist es sehr,

01:44:47.190 --> 01:44:49.290
sehr schön, weil du halt ganz viele

01:44:49.290 --> 01:44:51.290
Templates und Chains von Templates direkt

01:44:51.290 --> 01:44:51.390
benutzt.

01:44:51.410 --> 01:44:53.490
...benutzen kannst in deiner Kommando-Zeile,

01:44:53.490 --> 01:44:55.550
um halt mit den verschiedenen Modellen zu sprechen

01:44:55.550 --> 01:44:57.430
direkt, die du da haben

01:44:57.430 --> 01:44:59.450
willst. Und es ist

01:44:59.450 --> 01:45:01.330
toll, wenn man harte Instruktionen gibt,

01:45:01.330 --> 01:45:03.710
dann so die Standard-Persönlichkeit

01:45:03.710 --> 01:45:05.130
des antwortenden

01:45:05.130 --> 01:45:06.570
LLMs irgendwie

01:45:06.570 --> 01:45:09.330
so ein bisschen gerade zu rücken auf das, was man selber

01:45:09.330 --> 01:45:10.630
gerne als Antwort hätte.

01:45:10.630 --> 01:45:13.470
Such irgendwie die Leute

01:45:13.470 --> 01:45:15.390
genug gut aus, mit denen du sprichst,

01:45:15.390 --> 01:45:16.590
das wollte ich damit sagen, und

01:45:16.590 --> 01:45:19.410
deswegen... Und dann lädst du

01:45:19.410 --> 01:45:20.170
uns ein, Dominik.

01:45:21.290 --> 01:45:23.310
Weiter hätte viel Spaß bei den nächsten

01:45:23.310 --> 01:45:24.450
Picks, wollte ich noch sagen, ja.

01:45:24.450 --> 01:45:27.050
Ja.

01:45:27.050 --> 01:45:29.070
Ja, was hast du denn gepickt, Jochen?

01:45:29.070 --> 01:45:31.130
Was wollte ich? Ah, genau, ich

01:45:31.130 --> 01:45:33.230
dachte mir so, naja, vielleicht auch ein Buch

01:45:33.230 --> 01:45:35.330
mal, und zwar eins, das ich

01:45:35.330 --> 01:45:36.410
nicht gelesen habe.

01:45:36.410 --> 01:45:38.870
Aber wo man das alles nachlesen kann,

01:45:38.870 --> 01:45:40.610
kann man auch die Antworten,

01:45:40.610 --> 01:45:43.210
wenn man drauf gekommen ist, wie das sein muss,

01:45:43.210 --> 01:45:44.450
an uns schicken, und zwar

01:45:44.450 --> 01:45:47.230
The Little Typer ist ein

01:45:47.230 --> 01:45:48.850
Buch, das, ich hab's versucht zu lesen,

01:45:48.850 --> 01:45:50.910
das ist irgendwie, ich hab dann zwischendurch aufgegeben.

01:45:51.290 --> 01:45:52.970
Das muss ich sagen, wie Experiment

01:45:52.970 --> 01:45:54.250
mit Types entbeißen.

01:45:54.250 --> 01:45:56.930
Ja, aber da

01:45:56.930 --> 01:45:59.030
steht, da steht das, glaub ich, alles ganz genau drin,

01:45:59.030 --> 01:46:00.910
wenn man das wissen will. Und, ah gut,

01:46:00.910 --> 01:46:02.670
vielleicht nochmal was Praktisches, weil

01:46:02.670 --> 01:46:04.170
ja,

01:46:04.170 --> 01:46:06.790
das ist ja doch nicht irgendwie

01:46:06.790 --> 01:46:08.730
was für alle wahrscheinlich.

01:46:08.730 --> 01:46:10.810
Doku ist ganz nett,

01:46:10.810 --> 01:46:12.990
auch nicht Python, sondern Go.

01:46:12.990 --> 01:46:14.250
Geschichte,

01:46:14.250 --> 01:46:17.110
Heroku hatte ja in letzter Zeit so ein bisschen

01:46:17.110 --> 01:46:19.010
Probleme, und

01:46:19.010 --> 01:46:21.270
ähm, ist nicht mehr so richtig,

01:46:21.290 --> 01:46:23.230
äh, irgendwie der Platz, wo man vielleicht so mal so,

01:46:23.230 --> 01:46:25.190
wenn man, also früher hat man das ja irgendwie, wenn man irgendwas

01:46:25.190 --> 01:46:27.350
mal eben deployen wollte, hat man

01:46:27.350 --> 01:46:28.890
das oft dann bei Heroku oder so

01:46:28.890 --> 01:46:31.370
getan, weil das halt sehr einfach war,

01:46:31.370 --> 01:46:33.290
aber das, äh, das geht

01:46:33.290 --> 01:46:35.190
irgendwie nicht mehr. Und, ähm,

01:46:35.190 --> 01:46:37.330
das kann man auch in Selbstmord... Wo würdest du das jetzt machen, Jochen?

01:46:37.330 --> 01:46:39.050
Äh, also meine, meine,

01:46:39.050 --> 01:46:41.190
meine Lösung dafür ist ja, dass ich das halt einfach,

01:46:41.190 --> 01:46:42.830
ich hab da so meine Standard, äh,

01:46:42.830 --> 01:46:44.790
Ansible, äh, Dinger...

01:46:44.790 --> 01:46:46.550
Ja, okay, gut. Also du, ja.

01:46:46.550 --> 01:46:49.210
Du bist vom, dir ist Heroku zu

01:46:49.210 --> 01:46:51.270
kompliziert geworden, und deshalb hast du jetzt,

01:46:51.310 --> 01:46:52.990
äh, deine eigene Hosting-Lösung gebaut, aber das...

01:46:52.990 --> 01:46:55.310
Ja, leider, ja. Ist natürlich keine Option,

01:46:55.310 --> 01:46:57.110
die jetzt viele dazu haben. Genau, also,

01:46:57.110 --> 01:46:59.250
das kann ich auch nicht unbedingt empfehlen, das ist,

01:46:59.250 --> 01:47:01.050
äh, das unerwartet, äh,

01:47:01.050 --> 01:47:03.270
kompliziert, aber bei mir geht's jetzt daher,

01:47:03.270 --> 01:47:04.990
hab ich das Problem nicht mehr, ähm,

01:47:04.990 --> 01:47:07.110
und ich mach ja auch keinen Docker oder so, sondern, äh,

01:47:07.110 --> 01:47:08.630
ich deploye dann direkt irgendwie,

01:47:08.630 --> 01:47:11.350
ähm... Knallhart, bare metal.

01:47:11.350 --> 01:47:12.410
Ja, genau.

01:47:12.410 --> 01:47:14.790
Und, ähm, äh,

01:47:14.790 --> 01:47:17.090
bei, bei Doku hat man dann halt irgendwie

01:47:17.090 --> 01:47:19.130
sowas, wo man dann so ähnlich wie mit

01:47:19.130 --> 01:47:21.270
Heroku einfach, man hat halt so ein Pog-File,

01:47:21.290 --> 01:47:22.810
und dann kann man das einfach direkt,

01:47:22.810 --> 01:47:25.230
und da auch, also wenn man Docker-Container

01:47:25.230 --> 01:47:27.230
bauen kann, kann man direkt Docker-Container dahin deployen,

01:47:27.230 --> 01:47:29.510
und die laufen dann unter Subdomain

01:47:29.510 --> 01:47:31.230
direkt mit HTTPS und so. Arbeitet das sogar

01:47:31.230 --> 01:47:32.370
mit Heroku, also Doku?

01:47:32.370 --> 01:47:35.070
Äh, nee, nee, das ist also, aber du,

01:47:35.070 --> 01:47:37.210
du musst halt das Doku auf einem

01:47:37.210 --> 01:47:39.270
von, von, von, irgendwo auf nem,

01:47:39.270 --> 01:47:41.210
weiß ich nicht, auf einer virtuellen Maschine

01:47:41.210 --> 01:47:43.470
irgendeinem Dings halt deployed haben,

01:47:43.470 --> 01:47:45.030
oder auf der anderen Seite. Self-hosted Heroku. Genau,

01:47:45.030 --> 01:47:47.030
self-hosted Heroku quasi, ja.

01:47:47.030 --> 01:47:49.230
Und, ähm, genau,

01:47:49.230 --> 01:47:51.230
das ist, glaube ich, manchmal ganz hilfreich, sowas zu haben.

01:47:51.290 --> 01:47:52.910
Ah, ja.

01:47:52.910 --> 01:47:55.450
Okay, dann, ähm, dann schließe

01:47:55.450 --> 01:47:57.110
mich da direkt mal an, weil in dem Fall

01:47:57.110 --> 01:47:59.070
habe ich drei Picks. Ah, okay.

01:47:59.070 --> 01:48:00.990
Der erste ist, äh,

01:48:00.990 --> 01:48:03.570
Vercel. Oh, cool.

01:48:03.570 --> 01:48:05.310
Das ist, äh, das ist wie Heroku, nur cooler.

01:48:05.310 --> 01:48:07.110
Ähm,

01:48:07.110 --> 01:48:08.890
der zweite wäre Fly.io.

01:48:08.890 --> 01:48:10.630
Das ist quasi, äh,

01:48:10.630 --> 01:48:13.670
Docker-Sachen auf Hosted-Infrastruktur

01:48:13.670 --> 01:48:15.450
überall hin, ähm,

01:48:15.450 --> 01:48:17.230
machen, und die machen krasses technisches

01:48:17.230 --> 01:48:18.930
Zeugs damit. Also du, du schickst dir den

01:48:18.930 --> 01:48:21.010
Docker-Container, aber die zerlegen den, und

01:48:21.010 --> 01:48:21.270
äh,

01:48:21.290 --> 01:48:23.390
und, ähm, bauen sich da

01:48:23.390 --> 01:48:25.210
eigene Sachen draus. Das, äh, ist auch

01:48:25.210 --> 01:48:27.250
technologisch sehr interessant. Äh,

01:48:27.250 --> 01:48:29.270
das war jetzt aber der opportunistische

01:48:29.270 --> 01:48:31.250
Pick, äh, nur um da die,

01:48:31.250 --> 01:48:33.390
die Alternativen zu

01:48:33.390 --> 01:48:35.710
Heroku und self-hosted

01:48:35.710 --> 01:48:36.330
einmal gesagt zu haben.

01:48:36.330 --> 01:48:38.790
Jetzt sind wir ganz tief in den Pop-Rätchen, ja.

01:48:38.790 --> 01:48:41.230
Genau, mein, mein eigentlicher Pick

01:48:41.230 --> 01:48:43.210
ist was ganz anderes, äh, und zwar,

01:48:43.210 --> 01:48:45.330
äh, das ZDF

01:48:45.330 --> 01:48:46.990
hat ja eine Mediathek, und, äh,

01:48:46.990 --> 01:48:49.170
auf dieser Mediathek kann man Sachen ansehen, und wenn man

01:48:49.170 --> 01:48:51.130
ein paar Sachen angesehen hat, dann versucht das ZDF

01:48:51.130 --> 01:48:53.250
da Recommendations, äh,

01:48:53.250 --> 01:48:55.310
draus zu machen. Wow, das ist das

01:48:55.310 --> 01:48:57.250
erste Mal seit Ewigkeiten,

01:48:57.250 --> 01:48:59.250
dass ich von Fernsehen etwas höre.

01:48:59.250 --> 01:49:01.410
Du meinst das ZDF, meinst du das tatsächliche

01:49:01.410 --> 01:49:02.450
Fernsehen, was, ja, ähm,

01:49:02.450 --> 01:49:04.830
das, äh, das, äh,

01:49:04.830 --> 01:49:07.670
das zweite deutsche Fernsehen, meine ich, ähm,

01:49:07.670 --> 01:49:09.450
und, äh,

01:49:09.450 --> 01:49:11.130
die, also nur die Mediathek.

01:49:11.130 --> 01:49:13.230
Und, ähm,

01:49:13.230 --> 01:49:15.470
weil das ZDF ja in öffentlich-rechtlicher

01:49:15.470 --> 01:49:17.190
Hand ist, haben die sich gesagt, eigentlich müssen

01:49:17.190 --> 01:49:19.110
wir das ja den Leuten zurückgeben, und das haben sie tatsächlich

01:49:19.110 --> 01:49:20.690
gemacht. Die haben ihr Recommendation-System,

01:49:20.970 --> 01:49:23.030
ähm, auf GitHub

01:49:23.030 --> 01:49:24.730
gepackt, und man kann das jetzt ansehen.

01:49:24.730 --> 01:49:27.070
Und dann GitHub ZDF minus

01:49:27.070 --> 01:49:28.870
Open Source, äh,

01:49:28.870 --> 01:49:30.970
gibt's auch jetzt schon ein Repository drunter,

01:49:30.970 --> 01:49:32.830
das heißt Recommendations PA Base,

01:49:32.830 --> 01:49:35.210
ähm, und da sind,

01:49:35.210 --> 01:49:37.450
da ist das Recommendation-System

01:49:37.450 --> 01:49:39.170
vom ZDF drin, und fand ich einfach spannend,

01:49:39.170 --> 01:49:41.310
ähm, das mal anzusehen,

01:49:41.310 --> 01:49:42.790
weil da ja doch, ähm,

01:49:42.790 --> 01:49:45.010
auch einiges an Arbeit drinsteckt,

01:49:45.010 --> 01:49:47.270
und weil's da auch viele Firmen gibt, die sowas gerne hätten.

01:49:47.270 --> 01:49:52.610
Genau, das war's von mir.

01:49:52.610 --> 01:49:54.590
Stefan, hast du noch was für uns dabei?

01:49:54.590 --> 01:49:56.510
Ja, ich hab noch was rausgefunden, das ist schon

01:49:56.510 --> 01:49:58.430
ein älterer Artikel, ähm, vom

01:49:58.430 --> 01:50:00.790
Bob Nystrom aus dem Jahre 2015,

01:50:00.790 --> 01:50:01.910
ähm, heißt

01:50:01.910 --> 01:50:03.350
What Color Is Your Function?

01:50:03.350 --> 01:50:05.990
Und Bob Nystrom ist, ähm, einer der, der

01:50:05.990 --> 01:50:07.470
Sprachdesigner, ähm,

01:50:07.470 --> 01:50:10.050
der jetzt aktuell an Dart arbeitet,

01:50:10.050 --> 01:50:12.250
ähm, und das ist sehr spannend,

01:50:12.250 --> 01:50:13.930
weil er versucht zu erklären,

01:50:13.930 --> 01:50:15.750
anhand von, von Farben,

01:50:15.750 --> 01:50:17.110
ähm,

01:50:17.110 --> 01:50:18.270
wie, wie sich

01:50:18.270 --> 01:50:21.390
normale Funktionen und asynchrone Funktionen

01:50:21.390 --> 01:50:22.950
in, im Sprachdesign

01:50:22.950 --> 01:50:24.750
unterscheiden. Also rein

01:50:24.750 --> 01:50:27.390
aus der Perspektive von, welche Herausforderungen

01:50:27.390 --> 01:50:29.150
kriegst du als Sprachdesigner, wenn du

01:50:29.150 --> 01:50:31.170
so ein Async-Await-Konstrukt

01:50:31.170 --> 01:50:32.170
gestalten musst.

01:50:32.170 --> 01:50:34.930
Ähm, und wie gesagt, der ist schon ewig alt, aber er ist

01:50:34.930 --> 01:50:36.770
vor kurzem wieder bei uns in, in, äh,

01:50:36.770 --> 01:50:38.990
in der Firma aufgeprobt, kann ich sehr empfehlen.

01:50:38.990 --> 01:50:41.050
Ähm, versuch das so zu erklären,

01:50:41.050 --> 01:50:42.750
dass du das, die, die, die

01:50:42.750 --> 01:50:44.790
Ergebnisse, ähm,

01:50:44.790 --> 01:50:46.950
oder die Erkenntnisse in, in Python

01:50:46.950 --> 01:50:48.130
genauso anwenden kannst.

01:50:48.130 --> 01:50:50.850
Und hab ich, finde ich immer wieder sehr

01:50:50.850 --> 01:50:51.950
interessant. Gehe sehr oft

01:50:51.950 --> 01:50:53.450
wieder drauf zu.

01:50:53.450 --> 01:50:56.570
Für die Programmiersprachen Interessierten.

01:50:56.570 --> 01:50:58.830
Ja, ne, sehr cool.

01:50:58.830 --> 01:51:00.790
Also ich den, äh, quasi diese Analogie oder

01:51:00.790 --> 01:51:02.750
diese Metapher hab ich auch schon häufig gehört. Ich wusste

01:51:02.750 --> 01:51:04.750
aber nicht, wo sie herkommt und, äh, ja, das muss ich

01:51:04.750 --> 01:51:06.690
auch hier nochmal lesen. Ne, da gibt's tatsächlich noch was

01:51:06.690 --> 01:51:08.130
Älteres. What color are your bits?

01:51:08.130 --> 01:51:10.990
Äh, ist von 2004.

01:51:10.990 --> 01:51:12.870
Da geht's um die Herkunft

01:51:12.870 --> 01:51:14.830
von, äh, von

01:51:14.830 --> 01:51:16.790
Bits. Also ob deine Bits, äh,

01:51:16.790 --> 01:51:18.530
äh, urheberrechtlich geschützt sind oder nicht.

01:51:18.530 --> 01:51:20.790
Okay. Was du damit

01:51:20.790 --> 01:51:22.710
machen kannst, um die Farbe, damit sie die Farbe

01:51:22.710 --> 01:51:24.590
ändern. Aber das ist, äh, ja.

01:51:24.590 --> 01:51:26.630
Also ich, äh, musste da auch zuerst dran denken. Also es

01:51:26.630 --> 01:51:28.750
scheint eine gute Metapher zu sein. Wir können

01:51:28.750 --> 01:51:30.070
das ja beides verlinken. Ja.

01:51:30.070 --> 01:51:32.430
Sehr gern. Ja.

01:51:32.430 --> 01:51:34.730
Ja, vielen Dank. Cool. Ich würde sagen,

01:51:34.730 --> 01:51:36.650
herzlichen Dank, dass ihr heute alle wieder da wart.

01:51:36.650 --> 01:51:38.730
Herzlichen Dank, Stefan. Herzlichen Dank, Johannes.

01:51:38.730 --> 01:51:40.750
Ja, danke für die Einladung. Freut mich sehr.

01:51:40.750 --> 01:51:42.810
Sehr gern. Und dann, ja, ähm,

01:51:42.810 --> 01:51:44.530
bleibt uns gewogen, schaltet uns wieder ein,

01:51:44.530 --> 01:51:46.670
hört uns, wo immer ihr gerade seid, morgens, mittags, nachts,

01:51:46.670 --> 01:51:48.610
abends, tagsüber zum Schlafen,

01:51:48.610 --> 01:51:50.470
zum Einschlafen. Ähm,

01:51:50.470 --> 01:51:52.070
einen wunderschönen Tag.

01:51:52.070 --> 01:51:54.390
Bis bald. Tschüss.

01:51:54.390 --> 01:51:55.910
Ciao. Tschüss.
