Transcript: Typescript und Typisierung

· Back to episode

Full episode transcript. Timestamps refer to the audio playback.

Dominik

Ja, hallo, liebe Hörerinnen und Hörer, willkommen beim Python-Podcast, heute Episode 54.

Dominik

Wir reden heute über Types, Typings und Typescript.

Dominik

Hallihallo.

Jochen

Hallihallo, willkommen Dominik und...

Jochen

Hallo Johannes.

Jochen

Hallo Johannes.

Jochen

Hallo zusammen.

Jochen

Und hallo Stefan.

Jochen

Genau.

Jochen

Ja, hallo Stefan.

Jochen

Auch ein Gast heute.

Jochen

Genau.

Dominik

Ja, wir freuen uns sehr, dass ihr alle da seid und fangen einfach mit News an, wie sonst auch immer.

Jochen

Ja, würde ich schon sagen.

Jochen

Was gab es denn Schönes?

Jochen

Wer möchte anfangen, soll ich?

Jochen

Ja, fang du mal an.

Jochen

Na gut, ja, also ehrlich gesagt, das letzte Mal war nicht so lange her, daher habe ich

Jochen

ja nicht so viel gesammelt.

Jochen

Python 3.12.1.

Jochen

Genau, das ist natürlich irgendwie, es stand irgendwie dabei, so 400 Bugfixes und so, also

Jochen

ja, sollte man wahrscheinlich mal installieren und meine Frage dazu wäre halt, bist du jetzt

Jochen

schon umgestiegen auf 3.12., weil du wolltest ja immer nur die erste meiner Version abwarten,

Jochen

aber dann auch, ja?

Dominik

Ja, also noch nicht mit allen Sachen, aber mit vielen Sachen.

Dominik

Okay.

Dominik

Also 3.12.1 ist draufgekommen und jetzt in meinem Systeminterpreter zum Beispiel ist das

Dominik

Auftritt.

Dominik

3.12.1.

Dominik

Hervorragend.

Jochen

Ja, aber ich glaube, da war nichts, also außer Bugs ist da nichts irgendwie passiert.

Dominik

Ja, mein Hauptproblem im Moment ist halt PyTorch oder sowas, wo es auch im Dezember einen Release

Dominik

gab, dass es jetzt endlich mit 3.11.1 funktioniert.

Dominik

Ah, ja, ja.

Dominik

Ja, aber.

Jochen

Ja, ansonsten genau neue Releases, es gab einen neuen Ruby on Rails Release, ich gucke

Jochen

da ab und zu mal so rüber, weil ich halt interessant finde, wie viel tolles Zeug da

Jochen

passiert und das ist jetzt deutlich.

Jochen

Also es ist jetzt schneller geworden, hat irgendwie einen eingebauten Dustin-Time-Compiler

Jochen

und verwendet jetzt einen ähnlichen Ansatz für den Parser, wie Python halt auch.

Jochen

Python ist ja jetzt mit irgendwie 3.9 auf dem Pack-Parser umgestiegen und das ist, Ruby

Jochen

verwendet da jetzt was ganz ähnliches, ist auch so ein rekursives Dings da, Parsen, ich

Jochen

weiß nicht, ich habe es wieder vergessen, wie das genau heißt, so ähnlich und sie

Jochen

sind auch umgestiegen von Bison, also dem Parser-Generator auf den Ansatz.

Jochen

Ich finde das schon ganz oft.

Jochen

Rup.

Dominik

Lob für Ruby gehört, muss ich ehrlich sagen.

Jochen

Ja, und auch bei dieser ganzen Justin-Time-Compile-Geschichte, da ist, glaube ich, einer der Hauptsponsoren

Jochen

auch Shopify, ja, genau, also die basieren, also es gibt ja viele, viele große Unternehmen,

Jochen

die halt hauptsächlich auf Ruby on Rails Moduliten basieren und da kommt halt auch

Jochen

eine Menge Geld rein.

Jochen

Okay, okay.

Jochen

Und ja, Python ist ja jetzt auch dran mit diesem Justin-Time-Compiler-Thema, da in

Jochen

drei, drei Sekunden.

Johannes

Das wäre meine News gewesen, ja.

Johannes

Ach so, sorry.

Johannes

Dann schieb's mal los.

Johannes

Ja, im Dezember, Ende Dezember ist wohl ein Patch in den 3.13-Branch reingekommen, wo ein

Johannes

JIT-Compiler drin ist für Python.

Johannes

Also es ist jetzt richtig im Plan drin, dass Python in 3.13 einen JIT-Compiler hat, einen

Johannes

Copy-and-Patch-JIT-Compiler, was auch immer das bedeuten mag.

Dominik

Da gab es auch angeblich eine wundervolle Diskussion auf Reddit zu…

Jochen

Ja, also es gibt einmal die, ich kann empfehlen, es gibt Core-PUI, das ist so ein Podcast, wo

Jochen

zwei der Core-Entwickler irgendwie drüber reden.

Jochen

Da gibt es eine Episode zum Justin-Time-Compiler und dann…

Jochen

Wer sind dabei?

Dominik

Shannon und Sean oder wie ist das?

Jochen

Nee, das sind Pablo Galindo Salgado, der Release-Manager auch für 3.13 und Lukas Schlanger.

Jochen

Ah ja.

Jochen

Genau.

Jochen

Genau.

Jochen

Und genau, die haben da einmal drüber geredet und daher weiß ich auch, dass das basiert

Jochen

hauptsächlich, also warum man das jetzt nochmal in Angriff nimmt, auf Geschichten, die in

Jochen

Lua passiert sind.

Jochen

Da gab es jetzt auch irgendwelche, ich habe jetzt wieder die Details vergessen, aber so

Jochen

Papers, die sehr, sehr interessant aussahen und die halt vermuten lassen, dass man es

Jochen

relativ leicht irgendwie auch für Python verwenden kann.

Jochen

Und ja, das ist halt ein InPython in Ruby, da werden überall diese Dinger jetzt gerade

Jochen

eingebaut.

Jochen

Und hier der…

Jochen

Der wegen dem PyPy auch hier war schon, der meinte auch so, oh, er muss jetzt mal sein

Jochen

Commit-Bit wieder hochfahren.

Jochen

Wieder quasi aus…

Dominik

Ja, es gab ja immer, dass die neuen Versionen deutlich einfacher zu implementieren sind

Dominik

bei PyPy, wenn das drin ist, was da in C-Extensions irgendwie dazukommen sollte, wollte, wenn

Dominik

ich das richtig verstanden hatte damals.

Jochen

Ja, also jedenfalls, der macht da jetzt auch mit und das wird auf jeden Fall spannend.

Jochen

Ja, schnelles Python.

Jochen

Ja, genau.

Jochen

Ja, ansonsten hätte ich jetzt noch das, ich habe ja jetzt mich auch hier an dieser Stelle

Jochen

schon irgendwie ein paar Mal beschwert über irgendwie sehr holprige Updates von Python.

Jochen

Über mich, nein.

Jochen

Ach so, Entschuldigung.

Jochen

Ja, gut.

Jochen

Über Pydantic 2, über den Umstieg von Pydantic 1 auf 2.

Jochen

Und jetzt haben das andere Leute auch gemacht, irgendwie Simon Willison hat da in letzter

Jochen

Zeit relativ viel zu gepostet, dass er das irgendwie ungünstig fand.

Jochen

Habe ich dann auch so Sachen gesehen, wie es gab da ein Issue zu, wo dann einer von Netflix

Jochen

oder so in relativ freundlichem Ton zunächst schrieb, irgendwie so, ja, also das macht bei

Jochen

uns sehr viel Arbeit und irgendwie, das war jetzt alles irgendwie nicht so günstig.

Jochen

Und ich habe dann geguckt, der hat dann auch irgendwann beschrieben, welche Issues, die

Jochen

da reingelaufen sind.

Jochen

Und das war halt zum Beispiel auch einer von den Dingern, in die ich da reingerannt bin.

Jochen

Und ja, genau, der meinte dann so, tja, also sauberer wäre es gewesen, wenn man das Paket

Jochen

irgendwie umbenannt hätte oder so.

Jochen

Mhm.

Jochen

Und das wollten sie aber nicht machen.

Jochen

Und dann haben sie gesagt, nee, das geht auch so oder geht so.

Jochen

Aber es ging alles nicht.

Jochen

Und es war relativ furchtbar.

Jochen

Also gerade, wenn man eine Library ist, hat man damit halt ein großes Problem, weil man

Jochen

nicht kontrollieren kann, was in der Applikation, die einen benutzt, halt irgendwie für eine

Jochen

Pydantic-Version ist.

Jochen

Und zum Beispiel FastAPI hat damit auch ein Riesenproblem gehabt.

Jochen

Und wie die das dann letztendlich gemacht haben, ist, sie haben halt so einen Flag

Jochen

eingeführt, Pydantic V2, und machen dann jetzt gerade sowas wie, if Pydantic V2, 500

Jochen

Zeilen eingerückt, irgendwie Kompatibilitäts-Layer.

Jochen

Und dann Else und dann sonst.

Jochen

Und das haben sie an mehreren Stellen.

Jochen

Das ist wirklich absolut schrecklich.

Jochen

Naja, aber so sieht es halt aus.

Jochen

Also das war, dieses Update war nicht, nicht wirklich reibungslos, sondern da haben viele

Jochen

Leute irgendwie eine Menge Schweiß gelassen.

Jochen

Naja, also nicht durch.

Jochen

Okay.

Jochen

Ja.

Dominik

Also gut, wenn man es nicht zu sehr drin hat.

Dominik

Ich habe da tatsächlich auch zwischendurch noch auf eins dependen müssen, weil da so

Dominik

bei zwei Sachen nicht so ging, was jetzt irgendwie geht.

Dominik

Und ja, ein bisschen nervig.

Dominik

Johannes, hast du noch was?

Johannes

Nee, also in der TypeScript-Welt gibt es sowas nicht.

Johannes

Aber jetzt können wir uns über TypeScript-Versionen unterhalten.

Dominik

Apropos, ich habe gehört, dass ein neues Buch erschienen in der TypeScript-Welt.

Dominik

Echt, was?

Dominik

Ja, das ist mir ganz neu.

Dominik

Ja, ich glaube, das muss der Stefan mal so ein bisschen erzählen.

Stefan

Ist das jetzt mein Intro, oder was?

Stefan

Ja, du darfst das gerne antworten.

Stefan

Das war jetzt die softeste Überleitung.

Stefan

Ja, genau.

Stefan

Das war der softeste Übergang, den der Dominik macht.

Stefan

Ich habe das jetzt total spannend gefunden, weil...

Stefan

Also, es wird ja immer so gemunkert, dass im Web-Bereich gibt es ja quasi alle drei Minuten

Stefan

irgendeinen neuen Fachbegriff oder irgendeinen neuen Bibliothekennamen oder irgendein neues

Stefan

JavaScript-Framework, das irgendeinen abstrusen Namen hat, mit dem sich alle nachher irgendwie

Stefan

auseinandersetzen müssen.

Stefan

Und das ist jetzt das zweite Mal, dass ich so in diese Python-Ecke reinschaue und denke

Stefan

mir, hey, komm, das ist ja da genau das Gleiche.

Stefan

Den ersten Namen, den ich...

Stefan

Den ich erkannt habe, das war fast API, weil tatsächlich ist es, das ist spannend, ich

Stefan

bin jetzt mit, seit vier, fünf Monaten bei uns in der Firma mit einer Gruppe Python-Developern

Stefan

unterwegs, Data-Scientists, ganz klassisch, du hast einen Data-Scientist und das Tool

Stefan

der Wahl ist Python, die Bibliotheken sind da, das Übliche mit Langchain, Pipapo für

Stefan

diese ganze LLM-Sache, und das war so mein erstes Intro in dieser Python-Welt und ich

Stefan

bin schon massiv gescheitert daran, dass ich den Package-Manager auswähle, der passt,

Stefan

weil da gibt es ja dann Conda, Anaconda, Pipo, da sind das ganz andere, keine Ahnung, also

Stefan

wie gesagt, das ist ja schon wieder vorbei, aber ich weiß, dass ich fast API nach langen

Stefan

langen Gesprächen mit unseren Python-Devs in unser Architektur-Diagramm eingetragen

Stefan

habe für irgendeinen Server, den wir gemacht haben, genau.

Stefan

Also das war eben das Erste, wo ich mir gedacht habe, so, da kenne ich mich jetzt aus, bei

Stefan

fast API, da kann ich mitreden.

Stefan

Also es funktioniert multithreaded, aber nicht async, ist das richtig?

Jochen

Nee, also kann man wahrscheinlich so betreiben, wenn man wirklich will, aber nee, es ist tatsächlich

Jochen

async, also unter fast API liegt normalerweise, so würde ich jetzt mal sagen, wenn man das

Jochen

so betreibt, wie es gedacht ist, Stalett, beziehungsweise UV-Corn, und das ist halt

Jochen

sozusagen die LibUV, also das ist halt eine Adaption von LinUV, was halt auch unter der

Jochen

Event-Loop bei Node.js liegt.

Jochen

Das ist halt für Python, ja, und also ist halt quasi genauso schnell dann auch und ist

Jochen

async, ja.

Jochen

Cool.

Stefan

Das war die, die zweite war dann, dass ich, dass ich versucht habe, über PyO3 eine Brücke

Stefan

zwischen async-rust und async-python einmal zu schreiben.

Stefan

Das war spannend.

Stefan

Das war richtig cool.

Stefan

Ja.

Stefan

Also was mich da beeindruckt hat, und mit dem habe ich nicht gerechnet, ist, dass das

Stefan

vollen Frankischen Interface von Python ja fantastisch ist, also du hast da, du hast

Stefan

dort dein, dein kompiliertes SO-Modul dazu und du kannst auf die, auf die, auf die Objektliste

Stefan

zugreifen und kannst die Identifier rauslesen, also das war, also das Kompilieren vom Rust-Code

Stefan

war auf jeden Fall anspruchsvoller, als wir nachher die Symbole in, in Python zu loben

Stefan

und zu verwenden, das war richtig, richtig beeindruckend, also, ähm, coole Sache, möchte

Stefan

ich mir auf jeden Fall mehr anschauen.

Stefan

Aber das, das ist es, also das, das sind meine Python-Kenntnisse und.

Dominik

Ja, weil, also ich finde auch, das Benutzen von Python ist halt das, was so Spaß macht,

Dominik

dann, ne?

Dominik

Ja.

Dominik

Also High-Level-Interface.

Dominik

High-Level-Interface, ich glaube, ist sehr gut geeignet.

Dominik

PS3 auch ein cooles Beispiel, da gibt es die meisten Sachen, die es irgendwie kann.

Dominik

Ich glaube, was es nicht kann, ist irgendwie, äh, Iteratoren ausspucken richtig oder so

Dominik

oder Generatoren ergeben muss, aber.

Dominik

Ja, das wird wahrscheinlich schwierig sein, ja.

Dominik

Das kann man kurz vorstellen.

Dominik

Keine Ahnung.

Stefan

Da ist dieses Typsystem von Rust halt doch sehr, sehr eigen und, und sehr schwierig,

Stefan

in andere, ähm, ähm, Sprachen zu, zu integrieren, nehme ich mal an.

Dominik

Ja, aber, ähm, ich hatte ja als News ja auch quasi noch ein bisschen Werbung gemacht für

Dominik

dein Buch, vielleicht willst du dazu noch irgendwie kurz was sagen?

Dominik

Mhm.

Dominik

Ähm, ja, dankeschön.

Dominik

Danke für, für diese Überleitung.

Stefan

Ähm, ich habe tatsächlich in den letzten Jahren, ähm, TypeScript-Bücher geschrieben.

Stefan

Ähm, das erste Buch, das ich geschrieben habe, war, war in 2020, äh, TypeScript in

Stefan

50 Lessons, das beim Smashing Magazine Verlag rausgekommen ist, das als, ähm, angenehmer,

Stefan

unaufgeregter Einstieg in TypeScript als Typsystem auf JavaScript gedacht ist.

Stefan

Das heißt, die, die, das Zielpublikum waren Entwicklerinnen und Entwickler, die, ähm,

Stefan

ähm, JavaScript.

Stefan

schon kennen, sich dort auch schon, schon wohlfühlen und jetzt merken, jetzt, jetzt

Stefan

müssen sie TypeScript verwenden, äh, brauchen die Info, warum man das erstens überhaupt

Stefan

haben will und zweitens, wie das jetzt so richtig funktioniert und warum es da so viel

Stefan

Syntax gibt und warum die so, so kompliziert ausschaut und versucht, das, das grundlegende

Stefan

System, Typsystem runterzubrechen auf einfach zu verdauende, ähm, Lektionen.

Stefan

Ähm, genau, das war, das war das Ziel von, von dem Buch, das war, habe ich dann zufälligerweise

Stefan

in 50, ähm.

Stefan

Ähm, Lektionen, ähm, geschafft, das war, äh, Riesenspaß, das war quasi mein, mein Corona-Projekt,

Stefan

mein, mein erstes Lockdown-Projekt, wobei, stimmt nicht, ich habe es zwischen dem ersten

Stefan

und dem zweiten Lockdown, habe ich tatsächlich das meiste geschrieben, dazwischen war ich

Stefan

einfach ein totales Chaos.

Dominik

Das sieht auch super aus, also von außen, wenn du in den Schrank stellen und, ähm.

Jochen

Wir, wir wissen das, weil wir, weil wir das, weil wir dieses Buch auch alle haben.

Jochen

Ja, tatsächlich.

Jochen

Zwar als Python-Entwickler, was natürlich auch schon was heißt, wenn wir schon mal

Stefan

in die Kamera gehalten, das macht mich, das macht mich irrsinnig happy, ihr kennt sich

Stefan

das nicht vorstellen, das ist, das sind diese, diese unglaublich schönen Momente,

Stefan

wo man sieht, ähm, dass das Buch tatsächlich auch an Leute kommt und Leute das verwenden,

Stefan

also die Lesebändchen gesehen herrlich spitze, oder?

Stefan

Und, ähm, die Optik ist wirklich ganz, ganz besonders, weil, ähm, das, das war eigentlich,

Stefan

ähm, auch ein Grund, warum ich mit Smashing Magazine zusammenarbeiten wollte, die, äh,

Stefan

haben einfach irrsinnig viel Liebe zum Detail und versuchen wirklich, äh, sehr individuelle

Stefan

Bücher zu machen, haben eine wunderschöne Typografie, das sauber zu lesen ist und, und

Stefan

verzetteln sie dann in kleinen Finessten so stark und, ähm, ihr habt zum Beispiel,

Stefan

das Cover wurde gestaltet von, von Rob Draper, den habe ich tatsächlich in Düsseldorf

Stefan

kennengelernt, auf der, auf der Björn Tellerrand, ähm, der als, als Künstler, ähm, die Intro-Grafiken

Stefan

zu den Golden Globes gemacht hat, äh, für, für Nike und BMX, äh, Fahrräder, beziehungsweise

Stefan

Schuhe designt hat, äh, und der mich gefragt hat, hey, so, ne, E-Mail geschrieben, hey,

Stefan

der Arbeit ist cool, möchtest, möchtest du mein Buch designen?

Stefan

Der, ja, passt, und ich war doch, hey, wow, cool, ne, ich hoffe, er kostet jetzt nicht

Stefan

eine Million oder so, ne, und er hat tatsächlich dann, ähm, dann unser Buch, also das Buch

Stefan

gestaltet war, war, ähm, also, also versucht er mit diesem Kapitel, ähm, äh, in Lays

Stefan

ein bisschen das Ganze zugänglich zu machen, freundlich zu machen, ne, das ist, war, war

Stefan

uns ganz, ganz wichtig und die Person, die nachher, also die, die Ari, die nachher das

Stefan

Ganze gesetzt hat und versucht hat, aus, ein Produkt rauszumachen, hat dann auch recherchiert

Stefan

und hat zum Beispiel das Lesebändchen, das rote Lesebändchen in der Farbe bestellt von

Stefan

den roten Unterlinien in Visual Studio Code, das heißt, ähm, das ist, das ist der gleiche

Stefan

Farbton.

Stefan

Und, und so tief ins Detail geht's dort und das ist halt einfach absolut herrlich für,

Stefan

für mich, der praktisch nur den Text beigetragen hat, dass du siehst, wie andere Leute sich

Stefan

so, so investieren in dieses Projekt und versuchen, gemeinsam da irgendwas Cooles draus zu machen,

Stefan

das, also da krieg ich heute noch Gänsehaut, das ist ja für mich so, ähm, ich weiß, es

Stefan

ist mein Buch, aber es ist nicht nur mein Buch, also da sind so viele Leute dran beteiligt

Stefan

gewesen, es war ein irrsinnig cooler Effort von, von so vielen Menschen und das macht

Stefan

mich einfach jedes Mal wieder glücklich.

Stefan

Wenn ich, wenn ich dann sehe, dass das, ähm, Leute auch so sehen, sie das in die Bücherregale

Stefan

stellen oder, ähm, das Beste, was du machen kannst, hast du einen Zoom-Call, stell's in

Stefan

den Hintergrund und schick mir ein Foto von dem Zoom-Call, das ist das allerbeste, das

Stefan

macht mir die größte, größte Freude und es hat eine Freundin für mich gemacht, wie

Stefan

er, wie er ein Interview für sein, sein Startup gemacht hat, auf einmal sehe ich, hey, da

Stefan

ist mein Buch im Hintergrund, äh, herrlich, also, macht Riesenspaß, genau.

Stefan

Das war das erste TypeScript-Buch, ich hab dann noch ein zweites TypeScript-Buch geschrieben,

Stefan

das ist erst im September rausgekommen.

Stefan

Also, das ist noch ganz, ganz frisch, ähm, das ist das TypeScript-Cookbook, ähm, das

Stefan

jetzt mit O'Reilly veröffentlicht worden ist, ähm, das war, das war praktisch eine

Stefan

Auftragsarbeit, also, O'Reilly hat, hat so diese Acquisition-Editors, die suchen halt

Stefan

noch potenziellen Autoren, schlagen denen Buchprojekte vor oder schlagen vor, hey, möchtest

Stefan

du zu dem Thema was schreiben, ähm, und sie haben gesagt, sie wollen ein TypeScript-Buch

Stefan

veröffentlichen in diesem Stil wie TypeScript in Fifty Lessons, ob ich mir vorstellen kann,

Stefan

noch ein solches zu schreiben, ähm, und am Anfang haben wir gedacht, nein, das geht

Stefan

nicht, ich hab jetzt schon ein Buch geschrieben.

Stefan

Ich, ich hab halt einfach, ja, eine gewisse Ansicht, eine gewisse, eine gewisse Stimme,

Stefan

eine gewisse Idee zu dem Ganzen, hab aber gedacht, naja, meine Saison O'Reilly, probierst

Stefan

du da mal, dass du kurz ein Inhaltsverzeichnis unterschreibst, wie du dir ein zweites Buch

Stefan

vorstellen kannst, und, äh, grad hab ich, hab ich 100 weitere Einträge gehabt innerhalb

Stefan

von drei Stunden, also, ich bin mir am Nachmittag hingesetzt und hab gedacht, ups, wow, da ist

Stefan

ein Buch da, ähm, und bin mit denen in einen Vertrag gegangen und hab halt dann versucht,

Stefan

den, den Nachfolger vom, vom TypeScript in Fifty Lessons Buch zu schreiben.

Stefan

Wenn du in TypeScript in Fifty Lessons lernst, wie das Typsystem funktioniert, lernst du

Stefan

im TypeScript-Quick-Book alle Dinge, die schiefgehen können, Dinge, die, wenn du wirklich Programme

Stefan

damit schreibst, wo du merkst, hey, da passt grad was nicht, da, da, du spielst das Typsystem

Stefan

nicht so mit, wie ich mir das denke, beziehungsweise brauche ich halt irgendeine Technik oder irgendein

Stefan

Prinzip oder irgendein, äh, Pattern, das ich anwenden kann, um einem gewissen Problem

Stefan

in den Gegenzug zu kommen.

Dominik

Im Moment, äh, ich dachte jetzt, äh, so Typen hast du damit nichts mehr schiefgehen

Dominik

kann, und mit Typen, äh, mit sicheren statischen Typen sind die Sprachen immer besser.

Dominik

Ganz besonders gut.

Stefan

Genau, da beschreibt man nur mehr Programme, die nur mehr funktionieren, und man hat keine

Stefan

Bugs mehr, und es ist super-happy, genau.

Stefan

Ja, ja, genau, ja.

Dominik

Ja, also ich, ich bin jetzt eine super Überleitung tatsächlich auf das Thema, was wir heute

Dominik

machen wollen, oder?

Dominik

Ja.

Dominik

Weil, also, ähm, ganz herzlichen Dank, dass du heute da bist, Stefan, das, äh, freut

Dominik

uns sehr, und von, in Peißen haben wir ja von Typen auch schon das eine, andere Mal

Dominik

so am Rande gehört.

Jochen

Ja, wir haben diese Episode immer lange vor uns hergeschoben, weil wir uns nie ausreichend

Jochen

vorbereitet gefühlt haben dafür, aber das ist halt so großartig.

Jochen

Das ist ein großes Thema, es gibt auch eine ganz große, ähm, Anti-Fan-Gemeinde in Peißen

Jochen

für Types, irgendwie.

Jochen

Ja, es gibt auch viele, die das nicht so mögen, ja.

Stefan

Ähm, wie, wie seid ihr da so, so drauf?

Stefan

Ähm, also, also habt ihr jetzt Typen schon in eurem Python-Code drinnen, oder ist das

Stefan

eher nur so das Buch mit, mit sieben Siegeln, das ihr nicht, nicht öffnen wollt?

Dominik

Annotationen nutze ich persönlich sehr gerne, insbesondere dann, wenn ich mit anderen Menschen

Dominik

arbeite, um einfach so zu dokumentieren, was macht das denn überhaupt.

Dominik

Ähm, das heißt aber nicht, dass das immer stimmt, was da steht.

Dominik

Ist aber gefährlich damit.

Dominik

Ja.

Dominik

Das ist ein gefährliches Spiel.

Dominik

Ja.

Jochen

Ja, also ich, ich verwende sie auch schon und ich habe halt ein, ein, ein Projekt mal so

Jochen

komplett irgendwie annotiert, einfach nur auch, weil ich wissen wollte, wie schwierig

Jochen

ist es denn nun, wie, wie, wie weh tut es denn, äh, irgendwie.

Jochen

Äh, äh, und, ähm, ja, das, das ging schon, aber es war auch, also, ich, ich habe da jetzt

Jochen

nicht so wahnsinnig viel, äh, irgendwie Nutzen rausziehen können, aber ich hatte auch vorher

Jochen

neben Dingen halt auch schon 100% Test-Coverage, insofern, ähm, war da einfach wahrscheinlich

Jochen

nicht mehr so viel zu, zu, äh, ja, auch das habe ich ja gemacht, um, um, um es mal gemacht

Jochen

zu haben, als, äh, dass es halt wirklich Nutzen hat.

Dominik

Ich habe tatsächlich in den Projekten bei mir jetzt Enforced, äh, MyPi, äh, Precommit

Dominik

Hook, das ist auch schon, das, damit gehe ich ziemlich vielen Leuten auf die Nerven, ähm,

Dominik

aber.

Johannes

Ja, da kannst du überall Objekt hinschreiben, oder?

Johannes

Das, das zählt doch auch.

Dominik

Ja, okay, also, da sind die meisten übrigens noch nicht draufgekommen.

Johannes

Oh, da habe ich jetzt ein Geheimnis verraten, hups, Entschuldigung.

Stefan

Also, ich bin, ich bin beeindruckt von der 100% Test-Coverage, also, äh, ich bin, ich

Stefan

bin, leider Gottes, der faulste Tester, äh, diesseits der Donau, also, das ist, ähm,

Stefan

ähm, ich sage immer, also, ich habe diesen, diesen, diesen Spruch gehabt, wie nur in einer

Stefan

Agentur gearbeitet, da habe ich gesagt, ja, getestet wird beim Kunden, wenn es in Production

Stefan

ist, es soll reichen, aber, aber, ähm, aber ich, ich, keine Ahnung, liegt, liegt es an

Stefan

der Software, die ich schreibe, oder an der Rolle, in der ich bin?

Stefan

Ähm, ich bin sehr, sehr selten jemand, der, der wirklich ausgiebige Tests sweet schreibt

Stefan

und da, da, also, das ist, glaube ich, ähm, also, Arsch auf den Haupt, das ist, das ist,

Stefan

glaube ich, meine größte Schwäche.

Stefan

Ja, das ist ja, 100% Coverage ist auch schon sehr, äh, ja, aber, aber, ich finde es beeindruckend,

Stefan

wirklich.

Johannes

Ja, das haben wir in dem Projekt, in dem ich bin, auch 100%, also, 100% Branch Coverage

Johannes

sogar.

Johannes

Mhm.

Johannes

Und TypeScript.

Johannes

Oh.

Johannes

Also, es, es ist ja oft so, dass man das so ein bisschen als gegensätzliche Pole ansieht,

Johannes

sag ich mal.

Johannes

Ja.

Johannes

Die einen machen Typen.

Johannes

Die anderen machen Testing.

Johannes

Und das ist schön, Stefan, dass du das jetzt bestätigt hast, aber.

Stefan

Ich bin quasi das, das, das Typen-Paradebeispiel, ne?

Stefan

Ja.

Stefan

Ich meine, das Ding ist, das, ähm, äh, JavaScript und Python haben ja, haben ja, ähm, die gleiche

Stefan

Eigenschaft, dass beides, äh, in, in der Praxis dynamisch typisierte Sprachen sind.

Stefan

Sprich, natürlich gibt's Typen, sonst könntest du mit den ganzen Werten nichts anfangen.

Stefan

Es ist aber relativ egal, was das für ein ist.

Stefan

Du kannst dann, ähm, ähm, ähm, ein Number oder ein Integer einer, einer Variable zuweisen

Stefan

und im nächsten String, äh, Schritt dann String und keiner regt sie auf und keiner

Stefan

beschwert sie.

Stefan

Und das funktioniert halt einfach, ne?

Stefan

Ähm, oder du kannst verschiedene Typen mischen.

Stefan

Du kannst ein String mit einer Zahl kombinieren.

Stefan

Nee, das geht in Python nicht.

Stefan

Oder umgekehrt.

Stefan

Das geht nicht.

Stefan

Okay, cool.

Stefan

Wow, dann setzt ihr schon mal einen Riesenschritt weiter als, als in, in JavaScript.

Johannes

Ja, gut, das ist halt das große Problem an JavaScript, oder?

Johannes

Dass du solche implizite Konversionen drin hast.

Johannes

Ja, also.

Johannes

Genau, das gibt's ja.

Jochen

Das heißt dann immer weak getyped versus strong getyped, aber ich meine, ich weiß

Jochen

nicht, ob das irgendeinen Sinn da gibt.

Johannes

Aber diese ganzen Bezeichnungen sind ja auch alle nur so ein bisschen, ja.

Stefan

Also die schöneren Bezeichnungen sind meiner Meinung nach statisch und dynamisch,

Stefan

wo du einfach weißt, okay, ähm, definierst du den Typen im Vorhinein oder wird er

Stefan

definiert durch die Verwendung?

Stefan

Ähm, ähm, weak und strong, also schwach und stark ist, ist, sind, sind sehr schwache

Stefan

Bezeichnungen, meiner Meinung nach.

Stefan

Ja.

Stefan

C zum Beispiel hat ein, ein statisches Typsystem, aber ein sehr, sehr schwaches.

Stefan

Ob du jetzt einen Character hast oder ein Integer oder irgendwas anderes, es ist

Stefan

einfach komplett wurscht.

Stefan

Also.

Stefan

Kannst alles damit machen.

Johannes

Und kannst auch hin und her wechseln und kannst auch Bitfiddling mit allem möglichen

Johannes

Scheiß machen.

Johannes

Genau, genau, genau.

Johannes

Wundervolle Bezeichnung.

Stefan

Und vor dem, vor dem ist das, das Statische eigentlich das Wichtige, weil es ja ein bisschen

Stefan

eine andere, ähm, Herangehensweise ans Programmieren, ähm, voraussetzt.

Stefan

Du, du machst dir einfach mehr Gedanken über, ähm, über die, die mögliche Wertemenge

Stefan

einer Variable, bevor du einen Wert zuweist.

Stefan

Das schließt jetzt nicht aus, dass du sagen kannst, hey, du, du bekommst einen Typen

Stefan

durch Typ-Inferenz.

Stefan

Das mache ich sehr sehr gern.

Stefan

Aber ich sage, hey, diese Variable X ist 3 und dann weißt du, dass das ein Number oder

Stefan

Integer oder was auch immer ist.

Stefan

Das geht natürlich auch.

Stefan

Das machen auch moderne Programmiersprachen sehr, sehr, sehr gerne, ähm, ähm, grundlegend,

Stefan

dass du halt mit wenig Annotationen machen kannst.

Stefan

Nichtsdestotrotz, ähm, definierst du Verträge zwischen Bausteinen deines Codes, zwischen

Stefan

den Functions, zwischen Methoden in deinen Klassen etc., in denen du sagst, du erwartest

Stefan

aber jetzt diesen Wertebereich und nichts anderes.

Stefan

Und du lässt auch nichts anderes zu, ne.

Stefan

Und, ähm, TypeScript ist meiner Meinung nach doch sehr, sehr gut.

Stefan

Sehr, sehr spannend.

Stefan

Ähm, weil TypeScript halt versucht, eine sehr dynamische, dynamisch typisierte Programmiersprache

Stefan

und generell sehr dynamische Programmiersprache wie JavaScript in einer gewissen Art und Weise

Stefan

zu formalisieren.

Stefan

Also das Ziel ist ja jetzt nicht, dort eine komplett neue Programmiersprache zu definieren

Stefan

oder zu entwickeln, sondern auf Basis einer bestehenden irgendwie ein Regelwerk zu finden,

Stefan

damit alle beteiligten Programmierinnen und Programmierer irgendwas zu diskutieren haben

Stefan

und wissen, was sie tun.

Stefan

Was da eigentlich vor sich geht, ne.

Stefan

Nichts ist schlimmer, wenn du ein halbes Jahr, nachdem du dein Programm geschrieben hast,

Stefan

wieder zurückgehst und dich fragst, hey, was war denn diese Variable X nochmal, ne.

Stefan

Also was habe ich mir da eigentlich gedacht?

Stefan

Und dann hast du irgend so eine fette Wurst an Code und musst herauslesen, was du eigentlich

Stefan

damit machst.

Stefan

Und, also das ist was, was mich immer komplett verwirrt hat, wie, also ich habe da nie ein

Stefan

funktionales Programmierparadigmen nochmal ausprobiert, viel mit asynchronen Promises

Stefan

gearbeitet in Node, irgendwelche dynamischen Objekte gehabt.

Stefan

Ich habe ständig neue Keys hinzugefügt und wieder entfernt und das war kurz und effektiv

Stefan

und schnell und schön und drei Monate später habe ich nicht mehr gewusst, was ich dort

Stefan

mache.

Stefan

Wenn ich das Programm heute lese, ich kenne mich nicht aus und ich würde es auch heute

Stefan

nicht mehr so machen, einfach weil, weil, also gut österreichisch, sorry, Graut und

Stefan

Ruben einfach zusammenschmeißen und hoffe, dass am Ende alles funktioniert und das ist

Stefan

gut für kleine Skripte.

Stefan

Das ist gut, wenn du irgendwie geschwind was runterheckst, aber wenn ihr wirklich mit einem

Stefan

Team versucht, realisieren.

Stefan

Wenn du wirklich mit einem Team gearbeitet hast, dann ist das, glaube ich, die niedrigste

Stefan

Schwelle, die du hast, um zu dokumentieren, was jetzt von deiner Software und von den

Stefan

Nutzern deiner Software überhaupt erwartet wird.

Stefan

Und ich glaube, deswegen sind Typen so wichtig und deswegen, glaube ich, sind Typen auch

Stefan

in Python sehr, sehr interessant, weil du ja da die gleichen Voraussetzungen hast.

Stefan

Also du musst ja wissen, was erwartet jetzt deine Funktion dort und je mehr Bibliotheken

Stefan

das du hast.

Stefan

Wie gesagt, ich wäre schon gesagt, ich bin jetzt in diesem Lunchen und LLM-Wahnsinn irgendwie

Stefan

angefangen.

Stefan

Da hast du sehr, sehr komplexe Objekte, die du hin und her schickst, nicht?

Stefan

Woher sollst du wissen oder woher soll ich wissen, der keinen Python schreibt, sondern

Stefan

nur lest, was da jetzt eigentlich erwartet wird und was ich da rauskriege?

Stefan

Ja, das finde ich auch.

Dominik

Also das ist tatsächlich so als Dokumentationstyp für Python ist das, was ich auch am häufigsten

Dominik

gerne mag.

Dominik

Also in kleinen Closures, in kleinen Methoden oder Funktionen irgendwie die Argumente so

Dominik

zu annotieren, dass beim Lesen klar wird, was denn der Mensch da haben möchte, der

Dominik

diese API bereitstellt, dass ich das irgendwie zusammengebaut kriege oder so oder verstehe,

Dominik

was er denn da braucht oder sowas.

Dominik

Das sehe ich anders.

Dominik

Ja, ich weiß nicht so.

Dominik

Aber das hätte ich ja heute hier.

Dominik

Ja, genau.

Dominik

Lieber Johannes.

Johannes

Also ich finde, dass das Argument, was der Dominik bringt, das stimmt, wenn man nur

Johannes

simple Funktionen hat.

Johannes

Also wenn man wissen will, was, ob da jetzt ein Integer oder ein String rein muss.

Johannes

Und man hat vier Parameter und die haben alle simple Typen.

Johannes

Aber für mich fällt es auseinander, wenn die Typen komplex werden, weil dann hast du

Johannes

einen Typen, die irgendwelche interne Struktur haben, die völlig opak ist.

Johannes

Und dann hast du 17 verschiedene Varianten davon.

Johannes

Und am Ende weißt du genauso wenig, was da rein muss und was nicht.

Johannes

Und das hat alles so seine Grenzen.

Jochen

Ja, ich habe letzte Woche mit einem Freund telefoniert.

Jochen

Da haben wir uns auch kurz über Type Annotations unterhalten.

Jochen

Und er meinte so, ja, schön und gut.

Jochen

Und ich sehe die Vorteile.

Jochen

Und zwar, ich finde es einfach irgendwie hässlich, weil irgendwie.

Jochen

Die IDE kann ja mit was anfangen oder so.

Jochen

Wenn man das jetzt anguckt.

Jochen

Er meinte so, ja, dann hat man bei den ganzen modernen Libraries heutzutage, dann hast du

Jochen

da irgendwie Funktionen und da hast du pro Zeile einen Parameter, weil da kommt immer

Jochen

der Name des Parameters.

Jochen

Dann kommt halt die Type Annotation, die einem nicht viel sagt.

Jochen

Und dann kommt nochmal ein Kommentar, der erklärt, was die Type Annotation einem eigentlich

Jochen

sagen will und das dann so untereinander.

Jochen

Und dann kommt halt die Type Annotation, die einem nicht viel sagt.

Jochen

Und dann kommt nochmal ein Kommentar, der erklärt, was die Type Annotation einem eigentlich sagen will.

Jochen

Und das dann so untereinander.

Jochen

Und dann kommt nochmal ein Kommentar, der erklärt, was die Type Annotation einem eigentlich sagen will.

Jochen

Und das dann so untereinander.

Jochen

Und dann meinte er so, das erinnert mich total an C-Code aus den 80ern.

Jochen

Ich weiß nicht, ich mag das nicht.

Jochen

Das ist nicht Python.

Jochen

Ja, aber ich muss, also dieses Argument höre ich auch häufig, wenn man jetzt so bei den

Jochen

alten, zum Beispiel übernächste Woche wieder oder ist das nächste?

Jochen

Ich weiß nicht.

Jochen

Übernächste, ja.

Jochen

Auch hier aufs Python-User.

Jochen

Oder das nächste, nächste Mittwoch.

Jochen

Das nächste Woche, ja.

Jochen

Ja, ja.

Jochen

Genau, gehen.

Jochen

Da gibt es dann die alteingesessenen, die sagen auch immer so, ah.

Jochen

Immer nur achs, quaks.

Jochen

Sternchen, Sternchen.

Jochen

Nein, das nicht, aber.

Jochen

Ja, ja.

Jochen

Aber das ist schon so ein Punkt, mit dem viele Probleme haben, ja.

Stefan

Ich kenne genug Python, dass ich den Witz mit achs, quaks verstanden habe.

Johannes

Dann gehörst du schon zu den Oberen.

Johannes

Ja, nein, also gut.

Stefan

Ich bin immer sehr kritisch, wenn es darum geht, dass man die Ästhetik bewertet, weil

Stefan

ich schreibe sehr viel in Rust.

Stefan

Rust ist eine sehr unästhetische Sprache.

Stefan

Du hast quasi, hey, wie viel sind da?

Stefan

Ich habe übrigens keine Programmiersprache vertragen und Rust sagt ja, also her damit.

Stefan

Aber dafür ist mir halt in Rust zu jedem Zeitpunkt absolut hundertprozentig klar, was passiert.

Stefan

Und das ist halt auch ein Vorteil, den man nicht leugnen kann.

Stefan

Gerade, wenn man in Teams arbeitet.

Stefan

Und da nehme ich halt die paar Annotationen, die ich da habe, einfach hin.

Stefan

Und irgendwas hat jetzt da geblinkt, ich bin kurz rausgekommen.

Stefan

Und verstehe zumindest, was passiert.

Stefan

Und ich muss ganz ehrlich sagen, was ich rein jetzt sehe von dem, was.

Stefan

Wie Python Typings umsetzt, ist es sehr minimalistisch.

Stefan

Also da kann man sich noch weit, weit mehr verausgaben.

Stefan

Also ich finde das gar nicht einmal so hässlich.

Johannes

Ja, ich finde das Problem ist halt, dass diese Typsysteme oft zu weit getrieben werden.

Johannes

Und das treibt dann Blüten.

Dominik

Ja, also für alles und jedes und nochmal die letzte.

Dominik

Genau, für alles und jedes.

Johannes

Und das muss dann alles ein benannter Typ sein.

Johannes

Und das geht dann.

Johannes

Also ich habe hier.

Johannes

Ich habe hier ein Beispiel aus der Apple-Dokumentation.

Johannes

Da gibt es einen Typen, der heißt CN Label Contact Relation Younger Cousin Mother Siblings Daughter or Father Sisters Daughter.

Johannes

Ja.

Johannes

Das ist ein Typ.

Johannes

Wunderschön.

Johannes

Ja, ob man den jetzt braucht oder nicht.

Johannes

Auf der anderen Seite hier ein Beispiel aus der .NET-Bibliothek.

Johannes

Die Links sind dann alle in den Show Notes.

Johannes

Da gibt es eine Methode, die heißt Run.

Johannes

Die hat 30 Argumente.

Johannes

31.

Johannes

Das erste ist ein Object.

Johannes

Das heißt Makro.

Johannes

Das zweite ist ein Object.

Johannes

Das heißt Arc1.

Johannes

Das dritte ist ein Object.

Johannes

Das heißt Arc2.

Johannes

Und so geht es weiter bis Arc30.

Stefan

Grandios.

Stefan

Da bringen mir die Typen nichts.

Johannes

Da sagen mir die Typen nicht, was das macht.

Johannes

Und zwar in beide Richtungen nicht.

Johannes

Ja, besser wird man dadurch nicht mehr.

Johannes

Und es gibt halt da diese Fetischisten, die sagen, du musst aber überall benannte Typen drin haben.

Johannes

Und du musst das Typsystem vollständig aufbauen.

Johannes

ausnutzen. Und

Johannes

das geht mir genauso auf den Senkel wie die alten Herren,

Johannes

die dann sagen, nein,

Johannes

Typ-Annotationen ist ekelhaft

Johannes

und hässlich und wie in den 80ern.

Johannes

Irgendwo in der Mitte ist dieses Maß.

Johannes

Du hast mich gerade

Stefan

an etwas Wunderbares erinnert. Ich bin ja

Stefan

in einer Java-Welt

Stefan

groß geworden.

Stefan

Und habe gelitten dort.

Stefan

Ich auch.

Stefan

Ich komme aus der

Stefan

Nähe von Linz und direkt

Stefan

auf dem anderen Bergerl

Stefan

gegenüber wohnt

Stefan

einer der Erfinder vom Spring-Framework.

Stefan

Also wir kennen uns, unsere Kinder gehen

Stefan

gemeinsam in die Schule und solche Sachen.

Stefan

Und da gibt es eine Klasse, das ist die

Stefan

Has this type pattern tried to sneak in

Stefan

some generic or parameterized type pattern

Stefan

matching stuff anywhere visitor.

Stefan

Und das ist fantastisch.

Stefan

Also bei uns in der Firma

Stefan

haben die Java-Developer

Stefan

diese Weißkin-Monitore,

Stefan

aber nicht, dass sie irgendwie

Stefan

dort mehrere Fenster nebeneinander

Stefan

hinkriegen, sondern ich sage immer, das ist, damit sie die

Stefan

Klassennamen ohne Zeilen-Humbuch

Stefan

durchstehen können.

Stefan

Und das ist natürlich, das ist

Stefan

Mumpitz, das ist ganz klar. Also ich denke, man

Stefan

muss die ganzen Sachen immer ein bisschen

Stefan

pragmatischer sehen

Stefan

und halt auch einen richtigen Nutzen

Stefan

oder wissen, welchen Nutzen man daraus

Stefan

zieht. Das gilt für alles in der Softwareentwicklung

Stefan

meiner Meinung nach.

Stefan

Das ist der Anzug.

Stefan

Genau. Was ich am liebsten habe,

Stefan

zum Beispiel, also ich schreibe immer noch sehr, sehr viel

Stefan

Node und wenn ich starte damit,

Stefan

dann habe ich

Stefan

einmal keine Typen zu Beginn, weil ich ja selbst

Stefan

nicht weiß, wie meine Software am Ende ausschaut.

Stefan

Aber wenn ich dann fertig bin, wenn ich dann ein paar Funktionen

Stefan

extrahiert habe, dann lasse ich mir ein paar Typen

Stefan

einführen, einfach nur, dass ich festgelegt habe,

Stefan

was ich hier an dieser Stelle

Stefan

erwarte, damit, wenn ich zurückgehe

Stefan

oder wer von meinen Kolleginnen oder Kollegen

Stefan

zurückgeht, auch weiß,

Stefan

was dort zu erwarten war.

Stefan

Und um das geht es eigentlich. Und gerade in

Stefan

TypeScript, also gerade auch in meinem Buch gibt es

Stefan

ein paar Beispiele drinnen,

Stefan

da kann man sich schon

Stefan

richtig, richtig vorausgucken.

Stefan

Da gibt es irrsinnig mächtige Werkzeuge,

Stefan

wie String-Template-Literal-Types oder

Stefan

Tappel-Types, Variadic-Tappel-Types.

Stefan

Das sind Dinge, wo ich mir denke,

Stefan

Wahnsinn, dass das überhaupt geht.

Stefan

Also beeindruckend technisch, dass das geht.

Stefan

Aber die Use-Cases dafür

Stefan

sind halt stark limitiert und man muss wirklich überlegen,

Stefan

ob das dafür steht. Und ich habe dort

Stefan

drei Lektionen, wo wir

Stefan

ein funktionales

Stefan

Programmiertool wie

Stefan

Currying versuchen, auf drei

Stefan

sehr, sehr komplexe Orten umzusetzen und sagen,

Stefan

aber überlegt, ob diese

Stefan

Typen jetzt das gerechtfertigen, was du

Stefan

da als Funktion schreibst, oder ob du nicht

Stefan

lieber eine Funktion nimmst, die viel, viel weniger

Stefan

kann, aber

Stefan

genauso einfach zu verwenden ist und die

Stefan

einfach zu typisieren ist, mit der du

Stefan

besser die

Stefan

Typinformation rauskriegst.

Stefan

Und das stelle ich dann auch so zur Diskussion.

Stefan

Man muss halt immer abwägen können,

Stefan

wie rechtfertigst du

Stefan

den Einsatz dieses Werkzeugs und wie weit

Stefan

treibst du das?

Dominik

Ja, ich glaube, das ist tatsächlich

Dominik

gar nicht so einfach herauszufinden.

Dominik

Ja, und

Dominik

...

Johannes

Ich glaube aber, dass da noch ein anderes Problem dahinter ist.

Johannes

Ich bin sehr froh, Stefan, dass du

Johannes

da gesagt hast, dass du gegen

Johannes

Tests bist oder

Johannes

gegen große Testcoverage. Und du hast jetzt

Johannes

gerade eben so ein bisschen deinen Ansatz beschrieben,

Johannes

wie du Programme schreibst und

Johannes

du hast was gesagt, was meiner Meinung nach

Johannes

ganz wichtig ist. Du hast gesagt, du fängst

Johannes

an, ein Programm zu schreiben und weißt noch nicht, wie es am Ende

Johannes

ausschauen wird.

Johannes

Und das geht mir genauso.

Johannes

Und das ist einer der Gründe, warum

Johannes

ich

Johannes

Python mag,

Johannes

weil mir das die Freiheit gibt,

Johannes

da so explorativ rumzugehen, ohne

Johannes

mir groß Gedanken machen zu müssen,

Johannes

wie es denn jetzt sauber zusammenpasst.

Johannes

Und ich glaube, dass das ein Programmierstil ist.

Johannes

Das ist, ich nenne das, exploratives Programmieren.

Johannes

Ich muss so ein bisschen diesen Space

Johannes

erkunden, muss so ein bisschen sehen,

Johannes

was kann ich, was schaffe ich, was mache ich.

Johannes

Und das ist halt mein Stil.

Johannes

Ich gehe da rein und sage, jetzt machen wir erstmal irgendwas.

Johannes

Es gibt aber auch Leute, die da

Johannes

vielleicht mathematischer rangehen

Johannes

und die sagen, okay, ich habe hier einen Plan

Johannes

und eigentlich auf dem Papier habe ich es ja schon hingeschrieben.

Johannes

Und dann kann ich

Johannes

auch die Tests zuerst schreiben, weil ich weiß ja schon, was

Johannes

das machen soll. Ich weiß ja schon, wie es am Ende ausschaut.

Johannes

Oder ich kann gleich die richtigen Typen reinschreiben.

Johannes

Ja, da muss man sich ja das Akronym ändern

Jochen

und einfach Type-Driven-Development

Jochen

von einem neuen Stand starten.

Johannes

Ja, das sind, glaube ich,

Johannes

einfach zwei verschiedene Arten zu

Johannes

programmieren, die eben verschiedene Dinge

Johannes

eher bevorzugen.

Johannes

Es ist tatsächlich,

Stefan

glaube ich, auch ein bisschen von der Sprache abhängig, weil

Stefan

es ist ja auch ein bisschen von der Sprache abhängig, weil

Stefan

es ist ja auch ein bisschen von der Sprache abhängig, weil

Stefan

es ist ja auch ein bisschen von der Sprache abhängig, weil

Stefan

es ist ja auch ein bisschen von der Sprache abhängig, weil

Stefan

es ist ja auch ein bisschen von der Sprache abhängig, weil

Stefan

es ist ja auch ein bisschen von der Sprache abhängig, weil

Stefan

es ist ja auch ein bisschen von der Sprache abhängig, weil

Stefan

es ist ja auch ein bisschen von der Sprache abhängig, weil

Stefan

es ist ja auch ein bisschen von der Sprache abhängig, weil

Stefan

ich glaube, Python und JavaScript unterstützen

Stefan

ja diese Art des explorativen Programmierens

Stefan

sehr, sehr stark. Einfach eben in

Stefan

Gensity-Typen auch entfernen. Also du kannst

Stefan

wirklich einfach einmal herumprobieren und schauen, was

Stefan

rauskommt. Und schauen, wie

Stefan

weit du mit deinen Ideen

Stefan

kommst.

Stefan

Was ich spannend finde, also ich bin jetzt

Stefan

seit einigen Jahren auch sehr, sehr stark in Rust drin.

Stefan

Ich habe das jetzt schon erwähnt. Und sorry, das ist der klassische

Stefan

Rust-Nutzer. Nicht, dass ich ständig sage, dass

Stefan

er Rust verwendet, aber es ist halt

Stefan

wirklich so. Die Sprache macht einiges sehr, sehr richtig.

Stefan

Du hast in Rust eine sehr

Stefan

stark typisierte Programmiersprache

Stefan

mit einem fantastischen Typsystem.

Stefan

Das ist grandios, dass das

Stefan

so funktioniert, wie es funktioniert.

Stefan

Das heißt, du kannst dir gar nicht leisten, dass

Stefan

du einfach nur mal schaust,

Stefan

wo kommst

Stefan

du mit deinen Wertebereichen

Stefan

überhaupt am Ende hin. Aber trotzdem schafft

Stefan

es Rust, dass du explorativ

Stefan

arbeiten kannst, weil einfach die Mittel, die

Stefan

zur Verfügung gestellt werden, so zugänglich

Stefan

sein können, weil die Typen, die

Stefan

vor Hause schon drinnen sind, so

Stefan

entgegenkommen sind. Das heißt, du kommst mit ein paar

Stefan

Basistypen aus der Standardbibliothek

Stefan

und den üblichen Wertebereichen schon

Stefan

sehr, sehr weit, bevor du dir selbst deine eigenen

Stefan

Strukturen und

Stefan

Interfaces, nenne ich es jetzt einmal,

Stefan

heißen, anders überlegen musst.

Stefan

Und das ist sehr, sehr spannend. Es ist

Stefan

aber trotzdem ein anderer Wert des Programmierens.

Stefan

Das

Stefan

Endresultat schaut auch dann

Stefan

anders aus. Also ich mag das aber auch gerne.

Dominik

So Models oder so Dataclasses

Dominik

irgendwie zu bauen und dann zu gucken, hey, was sind

Dominik

das denn überhaupt für Objekte? Und dir halt dann direkt

Dominik

zur Annotation zu verwenden, das ist

Dominik

so strukturell sehr klar.

Stefan

Nein, es schließt sich auch nicht aus.

Stefan

Also es ist,

Stefan

ich denke mir,

Stefan

die

Stefan

Gefahr liegt wahrscheinlich, dass man sich auf eines

Stefan

komplett verschreibt.

Stefan

Auch das, was der Johannes

Stefan

wieder gesagt hat, ganz richtig ist,

Stefan

es ist am Ende des Tages, es ist

Stefan

ein Werkzeug, nicht? Und es muss irgendeinen Job

Stefan

erfüllen.

Stefan

Und wenn das gut funktioniert, dass du dir

Stefan

vorher Gedanken darüber machst, welche Daten, das du

Stefan

benötigst, dann ist das absolut legitim,

Stefan

meiner Meinung nach, nicht? Also ich finde

Stefan

gerade so

Stefan

angenehm. Wichtig ist, dass die

Stefan

Sprache, mit der du arbeitest, das unterstützt.

Jochen

Ja, ich glaube auch eben.

Jochen

Aber ich meine,

Jochen

das hat natürlich mal einen Preis, weil es halt zusätzliche

Jochen

Komplexität unter Umständen halt

Jochen

auch einführt und es dann halt vielleicht auch

Jochen

unzugänglicher macht. Also ich, worauf ich

Jochen

eigentlich hinaus will, ist,

Jochen

naja, je nach Use Case kann es

Jochen

halt unterschiedlich

Jochen

nützlich sein. Also wenn man halt zum Beispiel

Jochen

eben in einem Team

Jochen

einer großen Software schreibt, dann kann es halt sein,

Jochen

dass es sehr viel bringt, auch

Jochen

irgendwie möglichst viele Hürden

Jochen

zu errichten, bevor irgendwie

Jochen

Code... Du willst quasi gar nicht, dass die Entwickler

Jochen

irgendwas machen. Ja, das ist leider

Jochen

halt eine Strategie, das ist schwer

Jochen

zu unterscheiden von, irgendwie man

Jochen

versucht, Fehler zu vermeiden, bevor sie dann

Jochen

produktiv gehen, zu bloß nicht

Jochen

deployen, was dann halt auch viele Leute machen,

Jochen

was halt irgendwie auch blöde

Jochen

Konsequenzen hat unter Umständen dann, weil

Jochen

also viele Sachen, also man hat dann zum Beispiel nicht nur ein

Jochen

Staging-System, sondern noch so drei andere

Jochen

oder vier andere und führt immer mehr hinzu,

Jochen

sodass man bloß nicht nach Produktionen

Jochen

deployen muss. Ich habe zwei

Dominik

Abteilungen bei uns kennengelernt, die haben

Dominik

Employment-Release-Zyklus so alle sechs

Jochen

Monate. Ja, genau,

Jochen

in den sechs Monaten passiert halt auch nichts, aber

Jochen

ja, ist halt vielleicht auch irgendwie

Jochen

ein Konflikt mit anderen Zielen.

Johannes

Hast du etwa diesen Artikel über Move

Johannes

Fast-and-Break-Things gelesen, der kürzlich

Johannes

rausgekommen ist? Ja, genau.

Jochen

Ja, richtig. Und

Jochen

genau, also an der Stelle

Jochen

macht es ja vielleicht, wenn man

Jochen

in so einer Situation ist, sehr viel Sinn

Jochen

da, von den Leuten

Jochen

zu verlangen, dass sie sich erst Gedanken machen und dass halt man

Jochen

versucht, möglichst viele Fehler

Jochen

zu fangen, bevor sie halt in der Produktion

Jochen

aufschlagen, weil da ist es halt viel

Jochen

teurer, sie halt zu entfernen als

Jochen

aber es kann halt total anders

Jochen

sein, wenn jetzt jemand zum Beispiel, und das ist

Jochen

halt eine der Stärken bei Python,

Jochen

bei JavaScript auch

Jochen

ein bisschen anders,

Jochen

dass es halt vor allen Dingen auch von

Jochen

Leuten benutzt wird, die sich selber gar nicht als professionelle

Jochen

Programmierer sehen würden,

Jochen

sondern die eher sagen würden, naja, ich bin eigentlich eher so

Jochen

so Data Scientist oder

Jochen

Analyst oder sowas,

Jochen

oder halt irgendwie jemand, der

Jochen

irgendwie, keine Ahnung, Roboter irgendwie

Jochen

dazu bringt, irgendwie lustige Dinge zu machen oder sowas

Jochen

und ich will mich jetzt eigentlich... Oder Teilchenbeschleuniger.

Jochen

Oder Teilchenbeschleuniger, also solche

Jochen

Sachen, genau. Und ich will gar nicht

Jochen

jetzt irgendwie Typ,

Jochen

Typtheorie verstehen oder

Jochen

irgendwie, keine Ahnung, auch

Jochen

Unitests und da sind wir auch bei einem

Jochen

Ding, wo die Sachen so ein bisschen ähnlich sind.

Jochen

Also ich dachte auch lange Zeit irgendwie

Jochen

Unitests sind was ganz anderes

Jochen

und Typisierung

Jochen

ist ein

Jochen

anderen Ende von einem Spektrum und ich bin eher

Jochen

so Team Test, aber inzwischen denke ich so,

Jochen

naja, das ist schon relativ ähnlich auch. Ich meine,

Jochen

auch Unitesting ist halt so eine Sache, die man sich

Jochen

erst irgendwie erschließen muss und für

Jochen

manche Leute macht das einfach, wenn man

Jochen

halt irgendwie so in einem Jupyter Notebook

Jochen

Sachen macht,

Jochen

ja, manchmal macht es schon Sinn, das zu testen,

Jochen

aber für viele Leute ist es auch nicht, lohnt es sich,

Jochen

weiß ich nicht, ob es sich wirklich lohnt, da so

Jochen

tief einzusteigen und

Jochen

aber ich meine, klar, wenn man jetzt große Software

Jochen

im Team entwickelt, dann klar hat man

Jochen

Tests und eine CI-Pipeline

Jochen

und weiß ich nicht, diesen ganzen Kram halt, ne?

Johannes

Ja. Das Stichwort

Johannes

da ist doch Programming by Contract,

Johannes

oder? Und das ist halt eine Möglichkeit,

Johannes

so einen Contract zu schreiben, aber

Johannes

also ich bin da in so einem Zwiespalt, ja,

Johannes

einerseits bin ich total genervt von solchen Typsystemen,

Johannes

die dann sehr präzise sind und die dann,

Johannes

ich habe auch, ich bin auch mit Java

Johannes

aufgewachsen, Stefan, also ich zähle deinen Schmerz

Johannes

und dann

Johannes

wirkt man sich ab

Johannes

und macht ein Pair aus Int

Johannes

und String und dann weißt du aber nicht,

Johannes

wie du an den zweiten drankommst und

Johannes

ach, das ist alles ganz schön.

Johannes

Aber auf der anderen Seite

Johannes

gibt es nicht die Möglichkeit zu sagen,

Johannes

ganz triviale Sachen zu sagen, ja, zum Beispiel

Johannes

hier muss eine Zahl rauskommen, die immer größer ist als 0

Johannes

oder immer kleiner als 0, größer als 0

Johannes

geht ja tatsächlich noch, aber kleiner als 0

Johannes

ist 0, kannst du nicht sagen. Du kannst nicht sagen,

Johannes

hier muss was rauskommen, was zwischen 0 und 1 liegt.

Johannes

Und das ist irgendwie

Johannes

so eine weirde Sache,

Johannes

ich bin da in so einem Zwiespalt, ich hätte gerne

Johannes

keine Typsysteme, aber wenn ich Typsysteme

Johannes

hätte, hätte ich gerne so welche, die so exakt

Johannes

sind, dass ich sowas

Johannes

sagen kann und dass mir dann auch der Compiler sagen kann,

Johannes

ah, Moment, hier rufst du eine Funktion aus

Johannes

mit einer Zahl, die zwischen 0 und 1

Johannes

sein kann, aber die muss zwischen

Johannes

0 und minus 1 sein.

Johannes

Nee, das ist nicht Validierung, sondern das ist,

Johannes

nee, das sind sogenannte Value Types, das kannst

Johannes

du auch in ein Typsystem reingießen, wenn du das

Johannes

möchtest, das hat nur

Jochen

quasi keine Sprache.

Jochen

Ich glaube, ich habe eine mal gesehen.

Jochen

Eitris, ja genau.

Stefan

Also grundsätzlich im funktionalen Programmierbereich

Stefan

hast du das

Stefan

relativ häufig, aber

Stefan

ich würde mal

Stefan

annehmen, nicht in den

Stefan

populären oder weit

Stefan

verbreiteten Programmierungen. Nee, nicht in denen, die man benutzt

Dominik

irgendwo. Oder die man schon mal gehört hat.

Stefan

Aus einem ganz

Stefan

einfachen Grund, weil du halt unter den

Stefan

Wertebereichen von einer Zahl

Stefan

halt auch tatsächlich irgendwelche Bytes

Stefan

liegen, die von einer CPU ausgelesen

Stefan

werden. Also das,

Stefan

wenn dir

Stefan

das Typsystem das erlaubt, dass du dort

Stefan

irgendwas zwischen minus 1 und plus 1

Stefan

zum Beispiel definierst, oder mein Gott,

Stefan

eine ganze Zahl zwischen 25, was auch

Stefan

immer, dann schiebst du

Stefan

die Validierungen nur an eine andere Stelle.

Stefan

Ja gut,

Stefan

aber das machst du mit einem Typsystem generell, oder?

Johannes

Also ich meine, sobald der TypeScript-Compiler

Johannes

durch ist, ist er weg.

Johannes

Das ist,

Stefan

das ist sehr richtig, genau. Das ist sehr richtig.

Stefan

Ich glaube, in Python genauso, ne? Wenn ich mich nicht täusche.

Stefan

Ja, generell. In Python sind die

Stefan

Annotationen erstmal gar nichts. Genau, das ist

Jochen

in Python auch so leicht anders. Das wissen

Jochen

auch viele Leute. Ja, das ist ganz, das ist halt,

Jochen

wenn man zu den praktischen Dingen kommt, die halt

Jochen

damit problematisch sind, also ich bin ja häufiger auch

Jochen

irgendwie in unterschiedlichen

Jochen

Firmenkontexten da so unterwegs

Jochen

und das, was

Jochen

ich in letzter Zeit halt häufig sehe, ist halt

Jochen

sowas wie, Leute annotieren

Jochen

halt irgendwie ganz viel,

Jochen

sie haben keinen statischen Type-Checker,

Jochen

der da drüberlaufen würde und in Python ist halt auch keiner

Jochen

eingebaut, was vielleicht auch nicht so gut ist

Jochen

und man müsste da, und dann

Jochen

mache ich dann sowas wie, ich lasse mal

Jochen

MyPy drüberlaufen und die Leute verwenden

Jochen

alle TypeDict und sowas und denken halt,

Jochen

ja, das überprüft jetzt, ob meine ganzen Werte

Jochen

da so, also meine ganzen

Jochen

Werte in dem Dict halt so den

Jochen

richtigen Typ haben und so

Jochen

und Python selber macht

Jochen

da gar nichts. Das überprüft überhaupt nichts. Das

Jochen

ignoriert die Annotationen einfach.

Jochen

Ich lasse dann MyPy drüberlaufen und kriege dann so

Jochen

414.

Jochen

Fehler. Und dann denke ich mir so, okay,

Jochen

ja, also, du hast da schön deine Annahmen darüber,

Jochen

wie die ganzen Typen aussehen, dokumentiert, aber die sind halt

Jochen

leider alle falsch. Das stimmt überhaupt gar nicht.

Jochen

Und, ähm, ja, da ist dann,

Jochen

denkt man sich, warum hat man sich denn überhaupt die Mühe gemacht?

Jochen

Also, das ist halt irgendwie...

Stefan

Ja, wie ist denn der Zustand der

Stefan

Entwicklungsumgebungen in Python?

Jochen

Äh, kommt drauf an.

Dominik

Also, auch die hängen halt daran, ob du

Dominik

MyPy zum Beispiel als

Dominik

Static Type Shaper Extension

Dominik

richtig konfiguriert hast, ja, und

Dominik

ob dann auch MyPy die Stubs

Dominik

halt lesen kann, die halt

Dominik

da notwendig sind oder halt auch nicht.

Dominik

Die müssen halt alle dann... Aber viele IDEs behandeln das doch

Jochen

auch selber schon. Ja, ja, genau.

Jochen

Da gibt's ja auch dann, ähm, ich weiß gar nicht

Jochen

jetzt, äh, was bei VS Code

Jochen

dann normalerweise verwendet wird.

Jochen

MyPy ist Extension. Ja, aber

Jochen

ich meine, wenn jetzt zum Beispiel einfach nur das...

Jochen

Also, IntelliJ macht das selber. Ja, die machen das,

Jochen

die haben einen proprietären, dann gibt's irgendwie

Jochen

MyPy, klar, äh, und es gibt

Jochen

halt noch PyWrite und, ähm,

Jochen

der Language Server

Jochen

für Python, kann es sein, dass er selber in

Jochen

Type... von Microsoft, dass er in

Jochen

TypeScript geschrieben ist, ich glaube schon. Ich meine, schon, oder? Ja.

Stefan

Ja, es ist, ähm, es ist nämlich spannend,

Stefan

weil ich, ich, ich denke,

Stefan

TypeScript hat da einige

Stefan

richtige Entscheidungen getroffen auf dem Gebiet.

Stefan

Ähm, die, die ihr jetzt

Stefan

alle angesprochen habt, was, was kompliziert

Stefan

und was komplex in, in Python ist,

Stefan

ähm, nämlich,

Stefan

dass du, dass die Sprache dir zwar ein

Stefan

Typsystem anbietet,

Stefan

cool, aber eigentlich nichts damit macht,

Stefan

sondern du brauchst eh nur einen extra Typchecker und

Stefan

und anscheinend wie bei den Package Manager

Stefan

dann gibt es dort noch mehrere, die du, wo du

Stefan

dir dann noch aussuchen kannst, welcher gefällt dir jetzt

Stefan

und welcher passt zu dir

Stefan

und so weiter und ich finde das grandios, dass

Stefan

es Auswahl gibt, keine Frage, aber es erhöht

Stefan

natürlich auch die Komplexität. Ähm, und

Stefan

TypeScript hat, hat,

Stefan

TypeScript selbst ist ja eigentlich

Stefan

mehrere Dinge. Es ist zum einen mal

Stefan

ein Typsystem, cool, also wie werden

Stefan

Typen geschrieben, definiert, wie

Stefan

sind sie im Zusammenhang? Es ist auch ein

Stefan

Typchecker dabei, ähm, also,

Stefan

also der, der TypeScript Compiler

Stefan

TSC macht in erster Linie mal Typechecking,

Stefan

aber kompiliert

Stefan

dann auch tatsächlich JavaScript-Code, den

Stefan

du ausführen kannst. Also wir, es gibt so jetzt Proposals,

Stefan

dass du auch Typernotationen

Stefan

irgendwann einmal in JavaScript schreiben können

Stefan

solltest, ähnlich wie in Python, wir sind dort einfach von der

Stefan

Runtime ignoriert, ähm, aber da

Stefan

sind wir noch nicht, also da kommen wir erst hin.

Stefan

Das heißt, du brauchst auch den Compiler, das heißt, wir haben

Stefan

Typsystem, Typchecker, Compiler und noch auch ganz, ganz

Stefan

wichtig, eine Integration

Stefan

in Editoren und Entwicklungsumgebungen,

Stefan

ne? Ähm, und das war eigentlich,

Stefan

also, dieser, dieser gesamte

Stefan

Tooling-Aspekt rundherum, nicht nur

Stefan

das Typsystem anzubieten, sondern auch

Stefan

Werkzeuge anzubieten,

Stefan

dass du nachher zu validem JavaScript-Code kommst

Stefan

und du deine Fehler siehst

Stefan

und die Fehler auch sofort in deinem Editor und

Stefan

deiner IDE dargestellt werden,

Stefan

sind meiner Meinung nach genau

Stefan

die Punkte, die noch auch den, den

Stefan

unter Anführungszeichen Ziegelszug

Stefan

von, von TypeScript auch, ähm,

Stefan

ähm,

Stefan

zu verantworten gehabt haben, ne?

Stefan

Ähm, weil ohne dem hast du halt

Stefan

nur die Hälfte der Dinge, du brauchst halt irgendwie

Stefan

alles, damit du sauber, ähm,

Stefan

ähm, entwickeln kannst.

Stefan

Ähm, und wenn ich mir denke, dass ich Visual Studio Code

Stefan

aufmache, wo TypeScript schon, schon drinnen ist

Stefan

und ich mache irgendein JavaScript-File auf

Stefan

und es läuft im Hintergrund schon der

Stefan

TypeScript-Compiler und checkt meinen JavaScript-Code

Stefan

und versucht zu inferieren

Stefan

und zu verstehen, was ich schon geschrieben habe,

Stefan

ohne einzige Typ-Annotation

Stefan

und ich kriege aus dem raus schon

Stefan

Autocomplete und die

Stefan

ersten Warnings, dass vielleicht irgendwas nicht ganz

Stefan

schief, äh, nicht ganz, nicht ganz

Stefan

rund läuft und schief geht, das ist

Stefan

so viel wert, ohne dass ich eine Zeile

Stefan

TypeScript schreibe, wo ich mir denke, ja,

Stefan

das ist eigentlich eine richtig gute Idee

Stefan

gewesen. Ja.

Stefan

Naja, absolut. Da kann, da kann Python

Johannes

sich, glaube ich, auch noch eine Scheibe abschneiden davon,

Johannes

weil da gibt's noch so ein paar Löcher.

Stefan

Ja, oder was? Also wenn ich jetzt sage,

Stefan

ich installiere PyCharm oder, oder wie auch

Stefan

immer, welche Idee, und die kommt

Stefan

schon mit einem Typ-Interpreter

Stefan

oder einem Type-Checker mit,

Stefan

das wäre natürlich göttlich nett, dass du einfach sagst,

Stefan

hey, du brauchst nicht mehr die Typ-Annotation schreiben,

Stefan

aber die Idee hat

Stefan

irgendein Type-Checker schon bei Default

Stefan

drinnen. Wahrscheinlich schreiben sie ihn selbst, weil

Stefan

JetBrains schreibt das irgendwie selbst.

Stefan

Haben sie. Dann werde ich schon

Stefan

krank. Genau, der von JetBrains ist,

Johannes

der von JetBrains ist, ja, aber die,

Johannes

der ist supergut.

Johannes

Das ist einer der Gründe, warum man

Johannes

PyCharm verwendet, weil die halt da die

Johannes

beste Typ-Inferenz haben und die besten.

Johannes

Ich meine, man merkt schon, dass das

Johannes

Java ist, ja, aber.

Stefan

Aber das können sie, also da sind sie richtig, richtig

Stefan

gut. Ja, das ist super. Schon wieder Rust,

Stefan

für Rust haben sie auch einen eigenen geschrieben, also

Stefan

die ganze Welt verwendet Rust Analyzer.

Stefan

Außer du nimmst Rust

Stefan

Rover von JetBrains, dann ist

Stefan

da ein eigener drinnen und sie

Stefan

haben auch Recht damit. Also

Stefan

das ist halt

Stefan

alles richtig gut integriert in die Werkzeuge, die sie

Stefan

zur Verfügung stellen.

Jochen

Ja, auch ein zusätzlicher Effekt, den das

Jochen

hat, dass halt quasi bei Python halt

Jochen

der statische Type-Checker

Jochen

halt nicht so wirklich zur Sprache dazugehört,

Jochen

ist halt auch, dass bei TypeScript ist es halt

Jochen

so, dass was sich sozusagen

Jochen

in der TypeScript-Sprache tut,

Jochen

auch immer sofort verfügbar ist.

Jochen

Und halt dann, und das ist bei Python

Jochen

nicht so, weil die statischen

Jochen

Type-Checker vor allen Dingen von den großen

Jochen

Gebaut werden, halt nicht

Jochen

MyPy, Dropbox, ich weiß nicht, ob die immer

Jochen

noch da so hauptsächlich dran sind, aber dann gibt's noch

Jochen

einen von Google, es gibt noch Pyright.

Jochen

Die hängen sowieso immer

Jochen

so ein bisschen in den Versionen hinterher,

Jochen

weil sie ihre Code-Basis

Jochen

sowieso nicht an der aktuellsten Version halten können,

Jochen

weil sie das gar nicht schaffen, weil das einfach zu viel Arbeit ist.

Jochen

Das heißt, normalerweise

Jochen

bei MyPy hängst du halt immer so eine

Jochen

Version irgendwie von dem, was die Sprache

Jochen

eigentlich kann, zurück, was halt auch

Jochen

total doof ist einfach.

Jochen

Du musst ja auch noch darauf einigen,

Stefan

welches Subset des Typsystems du jetzt

Stefan

verwendest.

Stefan

Ja, genau.

Stefan

Da kann ja gar nichts schief gehen.

Stefan

Ja, aber TypeScript-Versionen gibt's ja jetzt auch.

Stefan

Ja, also TypeScript-Versionen-Management

Stefan

ist ja stark in der Kritik,

Stefan

ist ja keine Frage.

Stefan

Jedes Release ist ja bei KeyChange.

Stefan

Ja, und

Stefan

das ist aber einfach ein schwieriges Problem.

Johannes

Also ich glaube tatsächlich, dass TypeScript einfach

Johannes

dadurch, dass es eine jüngere Sprache ist,

Johannes

gewisse Fehler

Johannes

vermeiden konnte, die man halt

Johannes

vor 20 oder 25 oder 30

Johannes

Jahren machen musste mit diesen, mit den ganzen

Johannes

alten Sprachen.

Johannes

Aber manche Sachen sind halt immer noch nicht gelöst

Johannes

und Version Hell gehört halt dazu.

Johannes

Wobei ja

Stefan

sagen wir, TypeScript ist schon historisch gewachsen.

Stefan

Also du merkst schon

Stefan

die dunklen Flecken der Vergangenheit

Stefan

und versuchst sie zu ignorieren, das ist

Stefan

ja so, das passiert halt.

Stefan

So wie Sachen verwendet werden,

Stefan

hast du noch die Probleme.

Stefan

Ja, und das muss sich ja auch an JavaScript orientieren.

Johannes

Also es muss ja JavaScript-kompatibel

Johannes

sein und da kriegst du halt viel,

Johannes

sag ich mal.

Jochen

Ja, auch da kriegst du halt viel Historie.

Jochen

Wenn ich es sehr freundlich ausdrücken will.

Johannes

Ein kleines bisschen Programmiersprachen-Historie mitgeliefert.

Johannes

Ja.

Johannes

Ja.

Johannes

Ja, aber

Jochen

ich wollte gerade nochmal auf Java ein, wo wir das gerade hatten.

Jochen

Es ist leider schon ein bisschen drüber,

Jochen

aber davon wieder weg.

Jochen

Aber da hatte ich nämlich auch noch so eine

Jochen

schöne, da habe ich letztens was

Jochen

sehr, sehr Schönes

Jochen

gelesen,

Jochen

dass halt

Jochen

einer der Autoren,

Jochen

auch von der Sprachspezifikation

Jochen

von Java, hat halt

Jochen

irgendwann mal so geschrieben zu den

Jochen

Generics, also dass sie die Generics eingeführt

Jochen

haben. Also ja,

Jochen

das war irgendwie ein Fehler.

Jochen

Nein, das ist...

Jochen

Und dann

Jochen

hat er irgendwie noch, in dem Buch

Jochen

selber findet man auch irgendwo so eine sehr schöne

Jochen

Fußnote.

Jochen

Ja, wo

Jochen

halt quasi die

Jochen

Annotation von Inam,

Jochen

Inam ist auch ein Partner

Jochen

ein Problem, aber in Java halt auch.

Jochen

Und Inam ist

Jochen

halt irgendwie definiert

Jochen

als, ich suche gerade, ob ich das hier finde,

Jochen

ah ja, genau, ist eine

Jochen

generische Klasse definiert als

Jochen

Inam, Spitze Klammer T, Extents Inam,

Jochen

Inam, Spitze Klammer T, Klammer zu,

Jochen

Klammer zu. Also diese

Jochen

rekursive Definition ist halt so ein bisschen

Jochen

schwierig

Jochen

zu verstehen. Wir haben inzwischen aufgegeben,

Jochen

es zu versuchen, Leuten zu erklären.

Jochen

Es gibt irgendwie Spezialisten, die uns

Jochen

versichert haben, über

Jochen

Typtheorie, die uns versichert haben, dass das schon alles

Jochen

okay ist und kein Problem. Und wir sollen uns

Jochen

einfach nicht so viel Gedanken drüber machen,

Jochen

was wir sehr gerne annehmen.

Jochen

Und...

Jochen

Die Spannung ist ja bei den

Stefan

Java-Generics, dass

Stefan

die als einziges

Stefan

Element im Typsystem von Java

Stefan

keine

Stefan

Auswirkungen auf

Stefan

die Gestaltung der Laufzeitobjekte haben.

Stefan

Also das sind auch so...

Stefan

Nach dem Compile-Schritt wird das

Stefan

einfach entfernt und nie wieder

Stefan

angesehen. Und das ist halt das

Stefan

Beeindruckende daran. Also das war halt auch so,

Stefan

oh shit, das brauchen wir jetzt, wir müssen das

Stefan

jetzt machen im Release 1.5, glaube ich war das.

Stefan

Und das war die einfachste und

Stefan

unproblematischste Art, wie wir

Stefan

dazu kommen.

Stefan

Und alle Implikationen,

Stefan

die das hat, die werden bis heute mitgezogen.

Stefan

Du kannst quasi generische Klassen

Stefan

nie wirklich optimieren. Geht einfach

Stefan

nicht. Was halt spannend ist, weil die hast du

Stefan

halt überall, du hast überall Generics

Stefan

drin. Deswegen

Stefan

werden auch

Stefan

oft nur in der Standardbibliothek

Stefan

das generische Object

Stefan

verwendet, anstatt dass du einen generischen Typ-Parameter

Stefan

hast. Und was ich mit

Stefan

Innam sein kann, weiß ich sowieso nicht. Also ich habe das

Stefan

gesehen bei unseren Kollegen und das ist

Stefan

kein Innam. Das ist ein...

Stefan

Also ich finde, das ist

Dominik

eigentlich jetzt ein guter Zeitpunkt, um noch

Dominik

mal so ein bisschen zu erklären, worum es

Dominik

überhaupt geht und was da alles so drin ist. Wir sind jetzt auch schon

Dominik

auf so einem relativ hohen Fluglevel unterwegs.

Dominik

Aber wir haben auch

Dominik

viele Menschen, die uns zuhören,

Dominik

die vielleicht noch gar nicht wissen, was denn ein Generic

Dominik

überhaupt ist. Und vielleicht

Dominik

sollten wir das einmal kurz...

Dominik

Ja...

Jochen

Aber jetzt kriegen sie es halt mal gesagt.

Stefan

Ich habe gesehen, es gibt auch Generics

Stefan

in Python.

Stefan

Ja, genau.

Stefan

Ja, aber wovon geht da an?

Stefan

Ja, aber also das ist ja...

Stefan

Also diese Generics in den

Stefan

Typ-Annotationen, das ist ja

Johannes

wirklich nur sehr instruktiv.

Johannes

Es ist nur sehr so

Johannes

vage gesagt.

Johannes

Das ist keine... Da ist die Erasure ja noch

Johannes

viel größer.

Johannes

Johannes,

Dominik

was ist denn bitte ein Generic?

Dominik

Ein Generic

Johannes

ist eine Spezialisierung eines

Johannes

Typen anhand eines anderen Typs.

Johannes

Und das klassische Beispiel ist da die

Johannes

Java-Liste. In Python

Johannes

hast du ja eine Liste, die, sag ich mal,

Johannes

dynamisch typisiert ist. Das heißt, wenn du eine Liste hast,

Johannes

kannst du da eine Zahl reintun und einen String und

Johannes

eine komplexe Zahl

Johannes

und ein Objekt und noch eine Liste.

Johannes

Das ist immer sehr unterhaltsam, wenn man das

Johannes

in den... Wenn ich das in den

Johannes

Seminaren mache, wenn ich den Leuten Programmieren

Johannes

beibringe, die vielleicht schon mal eine Programmiersprache

Johannes

gesehen haben oder die schon was

Johannes

davon gehört haben, dann sage ich hier so, jetzt kannst du da...

Johannes

Du kannst noch eine Liste auch reintun oder Dictionary

Johannes

kannst du auch einfach in deine Liste reintun.

Johannes

Und in Java geht

Johannes

das nicht. In Java hat jede Liste

Johannes

einen Typen. Das heißt, du kannst...

Johannes

Wenn du einfach nur List sagst, dann

Johannes

meinst du Liste von Objekt. Das heißt, alles, was

Johannes

du da reintun kannst, ist Objekt. Aber

Johannes

du kannst diese Liste

Johannes

spezieller gestalten, indem

Johannes

du eben diesen Generic-Mechanismus

Johannes

verwendest und sagst, du hast jetzt nicht eine Liste

Johannes

von Objekt, sondern du hast eine Liste von

Johannes

String. Das heißt, der Compiler

Johannes

weiß an bestimmten Stellen, dass

Johannes

dieser Typ, den du da hingeschrieben hast,

Johannes

der vorher vielleicht nur ein Platzhalter war,

Johannes

in TypeScript verwendet man

Johannes

dann oft T oder K oder V. Das ist

Johannes

auch in Stefans Buch

Johannes

kommt es mehrmals vor,

Johannes

dass du dann eben zu einem bestimmten

Johannes

Zeitpunkt diesen generischen

Johannes

Typen ersetzt durch einen konkreten

Johannes

Typen und sagst, okay, ich habe jetzt hier

Johannes

nicht eine Liste von Objekt, sondern ich habe ganz

Johannes

klar eine Liste von String.

Johannes

Und dann kann der Compiler oder eben

Johannes

das Typsystem überprüfen,

Johannes

dass du da tatsächlich lauter

Johannes

Strings drin hast.

Johannes

Der Code, den du da ausführst,

Johannes

ist genau der gleiche.

Johannes

Aber du hast jetzt eben einen spezifischen

Johannes

Typen für eine Liste von Strings gemacht.

Johannes

Und das hat gewisse Vorteile.

Johannes

Zum Beispiel, wenn du da ein Objekt rausholst,

Johannes

kriegst du dann halt eben nicht nur ein

Johannes

generisches Objekt zurück, sondern du kriegst

Johannes

dann tatsächlich einen String zurück.

Johannes

Das ist der große Vorteil, den du in Java

Johannes

davon hast, dass du diese Accessor-Methoden hast,

Johannes

die dir die spezifischen Sachen

Johannes

rausgeben.

Johannes

War das korrekt erklärt, Stefan?

Johannes

Ist cool.

Johannes

Super, genau das.

Stefan

Also, gut, Experte.

Stefan

Bestätigt.

Stefan

Experte, wenn einfach nur lauf genug und schreibt den ganzen Mist auf.

Johannes

Ja, gut, aber das macht dich zum Experte.

Stefan

Aber nein, das beschreibt es ziemlich gut.

Stefan

Du kannst halt mit

Stefan

Typparametern dir die Entscheidung

Stefan

auf den tatsächlichen Typen

Stefan

für später aufheben.

Stefan

Das ist das, was dort passiert.

Stefan

Und eben, du sagst, dann wird das halt eine Array-List

Stefan

von String oder eine Array-List von

Stefan

Integer.

Stefan

Und du substituierst diesen Typparameter

Stefan

mit einem konkreten Typen

Stefan

und kriegst nachher auch

Stefan

solche konkreten Typen wieder.

Stefan

Also, in manchen Programmiersprachen

Stefan

kannst du dann auch noch so Dinge wie

Stefan

Constraints oder Bounds angeben,

Stefan

wo du eben sagst, hey, du hast dort

Stefan

jetzt einen beliebigen Typparameter, ja,

Stefan

aber er muss einem gewissen

Stefan

Subtypen entsprechen. Das heißt, er muss

Stefan

eine gewisse Funktionalität zur Verfügung haben

Stefan

oder muss,

Stefan

also,

Stefan

TypeScript ist ja

Stefan

strukturell typisiert,

Stefan

was bedeutet, dass du einfach sagst, hey, solange die

Stefan

Methoden dort sind und solange die

Stefan

Properties dort sind, passt schon,

Stefan

muss nicht den gleichen Namen haben, muss nicht in irgendeiner

Stefan

Hierarchie sein, sondern Hauptsache

Stefan

schaut irgendwie so aus, wie

Stefan

das eine, was ich da erwarten würde.

Stefan

Und dann haut das schon hin. Und dann kriegst du halt

Stefan

zum einen die Sicherheit,

Stefan

dass du nicht irgendwelche Typen reingibst, die nicht damit

Stefan

funktionieren würden.

Stefan

Und zum anderen

Stefan

kriegst du halt noch mehr

Stefan

Informationen über deinen Typ noch heraus, wenn du

Dominik

ihn dann vermeidest. Wie macht man das denn in Python?

Dominik

Protokolle? Doch, das ist in Python

Jochen

seit drei, achtem Gründer auch

Jochen

so, oder kann man das so machen? Man kann auch

Jochen

nominal typisiert das Ganze

Jochen

machen, aber da geht das jetzt auch, genau,

Jochen

mit Typing-Protokolls

Jochen

geht das auch.

Jochen

Ja, genau, und dann

Johannes

Habt ihr das schon mal irgendwo gesehen?

Johannes

Ja, ich verwende das.

Johannes

Also ich finde das eine großartige Idee, aber ich

Johannes

habe es noch nie irgendwo verwendet gesehen.

Jochen

Ja, ja, doch, also

Jochen

ich kenne es auch vor allen Dingen aus dem

Jochen

Fluent Python

Jochen

Buch von

Jochen

Luciano Ramalou.

Jochen

Und

Jochen

der hat sich auch mit diesem

Jochen

Typisierungsthema stark beschäftigt

Jochen

und hat dann diverse Fehler

Jochen

in der Typeschat

Jochen

Repository, wo halt die ganzen,

Jochen

wo auch die Standardbibliothek von Python

Jochen

genau annotiert

Jochen

ist, hat er da gefunden

Jochen

und viele davon konnte er

Jochen

fixen mit

Jochen

diesem Structural Typing Ansatz.

Jochen

Und also Fehler

Jochen

im Sinne von halt die

Jochen

Annotationen waren halt irgendwie, da waren halt

Jochen

False Positives oder halt False Negatives

Jochen

möglich. Auch sehr interessant,

Jochen

wenn man sich halt anguckt, welche

Jochen

Fehler sind häufiger.

Jochen

False Positives sind viel, viel

Jochen

häufiger bei Typ-Annotationen als False

Jochen

Negatives. Also in der

Jochen

Python-Standard-Bibliothek waren es irgendwie achtmal

Jochen

so häufig.

Jochen

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.

Jochen

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.

Jochen

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.

Jochen

Und wenn sie ein bisschen zu viel draußen halten, ist es besser, als was durchzulassen, was halt dann irgendwie knallt.

Jochen

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.

Jochen

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.

Jochen

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.

Jochen

Das Ganze macht. Und nominal geht das halt nicht so richtig.

Stefan

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.

Stefan

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.

Stefan

Methodennamen, Rückgabe-Werte, Property-Typen etc.

Stefan

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.

Stefan

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.

Stefan

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.

Jochen

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.

Johannes

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.

Stefan

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.

Stefan

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.

Stefan

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.

Jochen

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,

Jochen

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,

Jochen

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.

Jochen

Aber noch cooler wäre es natürlich, wenn du auch die Werte angeben könntest.

Jochen

Entschuldigung, Stefan.

Jochen

Hast du?

Stefan

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.

Stefan

Das sind sehr große Mengen zum Teil, String, Number oder alle Objects.

Stefan

Zum Teil sind sie halt auf deine Objekttypen heruntergebrochen, wo du sagst, diese Kombination.

Stefan

Die Kombination an Properties, die gewisse Typen haben, erlaubst du dort oder nicht.

Stefan

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.

Stefan

Das heißt, du kannst einen Wert haben, wo du sagst, alles, was diese Variable annehmen darf, ist der Wert 1.

Stefan

Und das klingt am Anfang doof, weil was machst du mit einer Variable, die nur 1 sein kann?

Stefan

Du kannst es schenken.

Stefan

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.

Stefan

1 oder 2 oder 3 oder 4 oder 5 oder 6.

Stefan

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.

Stefan

Und das ist spannend. Das kannst du auch mit Strings machen.

Stefan

Und was halt dann wirklich elegant ist, ist, dass du zum Beispiel Strings mit gewissen Pattern definieren kannst.

Stefan

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.

Stefan

Das heißt, es muss mit ON anfangen und nachher muss der erste Buchstabe unbedingt ein Großbuchstabe sein.

Stefan

Solche Strings akzeptierst du, andere akzeptierst du nicht.

Stefan

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.

Stefan

Dass du jetzt sagst, hey, das ist jetzt viel zu viel Aufwand, das zu definieren.

Stefan

Mein Lieblingsbeispiel ist immer noch HTTP-Methoden.

Stefan

Get, Post, Delete, was auch immer.

Stefan

Oder HTTP-Error-Codes, da gibt es 70 um den Dreh.

Stefan

Ich weiß jetzt nicht, ob es 201 gibt, ob es 217 noch gibt, weiß ich nicht.

Stefan

Das kann mir dieser Union-Typ sehr, sehr schön sagen.

Stefan

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.

Johannes

Ich muss mich einmal korrigieren. Ich habe eben nachgelesen, Value-Types ist nicht das richtige Wort.

Johannes

Das bezieht sich auch auf etwas anderes. Das wird als Abgrenzung zum Reference-Type verwendet.

Johannes

Also ob man einen Wert oder eine Referenz hat. Aber das Konzept, das hast du gerade sehr schön erklärt. Vielen Dank, Steffen.

Stefan

Das ist auch in Kapitel 4 beschrieben von meinem Buch und da bist du ja noch nicht.

Johannes

Das haben wir vorhin schon festgestellt, ich habe noch nicht weit genug gelesen.

Johannes

Aber ich habe es jetzt wieder rausgeguckt.

Johannes

Ich habe es wieder rausgeholt und jetzt lege ich es mir unter das Kopfkissen und werde das per Diffusion aufnehmen.

Stefan

Gut, das ist so wie die Matura geschafft mit dem Mathematikbuch unter dem Kopfkissen. Funktioniert.

Stefan

Sehr gut.

Dominik

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.

Dominik

Wir hatten jetzt ein New-Type, was irgendwie ganz cool ist. Wir hatten die Generics.

Jochen

Ja, so Generics. Achso, genau.

Jochen

Für meinen Typ gibt es gar keine Generics.

Jochen

Da dachte ich mir so, oh mein Gott, wenn hoffentlich fragt das keiner, deswegen frage ich das jetzt mal.

Jochen

Kann mir einer vielleicht erklären, was der Unterschied zwischen Co-Variant, Kontra-Variant und In-Variant und so ist?

Jochen

Ja, genau.

Jochen

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?

Jochen

Und was macht dann Bound und so?

Jochen

Ja.

Stefan

Ich kann es aus einer Typ-Theorie sagen, was Co- und Kontra-Variant ist.

Stefan

Ich weiß aber nicht, ob das so auf Python auch zutrifft.

Stefan

Aber ich versuche es jetzt mal so zu erklären.

Stefan

Co-Variant.

Stefan

Co-Variant ist, wenn du...

Stefan

Schnell die Petitfragen.

Stefan

Nein, es ist irrsinnig schwierig zu erklären.

Stefan

Lass mich kurz mein zweites Buch aufmachen, weil da wäre Zeichnung.

Stefan

Also bevor ich jetzt allgemeine Beschreibungen erkläre, sage ich es lieber mal so.

Stefan

In einer Co-Varianten-Beziehung hast du zum Beispiel einen Typ, der ist String oder Number.

Stefan

Was bedeutet, dass wenn du einen Wert hast, der Number ist, dann kannst du den auf jeden Fall auf diesen einen Typ

Stefan

zuweisen, der String oder Number sein kann.

Stefan

Das heißt, je enger dieser Wertebereich wird, hat kein Effekt drauf, kannst du weiterhin darauf zuweisen.

Stefan

Kontra-Variant ist genau umgekehrt.

Stefan

Du kannst zum Beispiel jetzt nicht eine Funktion, die als ersten Parameter String oder Number

Stefan

oder einen Funktionstypen, der als ersten Parameter String oder Number erwartet, kannst

Stefan

jetzt nicht eine echte Funktion zuweisen, die nur String erwartet, weil ja der Fall, dass auch eine Number

Stefan

als Parameter sein kann, nicht dadurch abgedeckt wird.

Stefan

Das heißt, du hast der Typ zwar auch ein Subtyp, der Parametertyp ist ein Subtyp vom anderen,

Stefan

aber nachdem der in einer Funktion steht, sind die nicht zueinander kompatibel, sondern nur umgekehrt.

Stefan

Das heißt, du kannst eine Funktion, einen Funktionstypen definieren, der als ersten Parameter

Stefan

eine Number angibt, was bedeutet, dass du auch Funktionen zuweisen kannst, die String oder Number

Stefan

erwarten, weil eben dieser eine Fall abgedeckt ist.

Stefan

Und das ist der Unterschied zwischen Co-Variant und Kontra-Variant.

Stefan

Brauchst du eigentlich nie, macht du dir irgendwelche komischen Fehlermeldungen, meinst du,

Stefan

irgendwelche Sachen zuweisen, willst du die dann nicht so funktionieren.

Stefan

Ist aber, glaube ich, in der Typtheorie die korrekte Beschreibung.

Stefan

Ist nicht kompliziert, ich möchte euch da für die Shownotes eine Grafik zur Verfügung stellen,

Stefan

die das wunderschön erklärt.

Stefan

Und da suche ich mir den Link jetzt wirklich raus aus meinem Buch, weil das habe ich genau

Stefan

aus dem Grund habe ich es da reingetan.

Stefan

Weil das sind die Sachen, die merke ich mir selber nie genau.

Stefan

Das ist was man immer nachlesen muss.

Dominik

Also in welche Richtung kann man was irgendwie doch voneinander erben, wenn ich das richtig verstehe?

Dominik

Und das allgemeiner annotieren?

Johannes

Also generisieren. Also ich habe es jetzt hier auch gerade, wenn jemand anders spricht, kann ich ja googeln.

Johannes

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.

Johannes

Es wird hier so erklärt, du hast zwei Klassen, Basisklasse und eine abgeleitete Klasse.

Johannes

Die derived.

Johannes

Genau. B und D. Also Basisklasse und abgeleitete Klasse.

Johannes

Und du hast irgendeine generischen Typenliste mit.

Johannes

Irgendeinem Typen drin.

Johannes

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?

Johannes

Also eine abgeleitete Klasse.

Johannes

Oder ist es andersrum?

Dominik

Das wäre dann Co-Variant oder Kontra-Variant.

Johannes

Genau. Und das eine ist Co-Variant und das andere ist Kontra-Variant.

Johannes

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.

Johannes

Und das ist natürlich schön, dass man da zwei Worte genommen hat, die exakt gleich klingen.

Dominik

Also Co-Variant ist, wenn man quasi annotiert mit der Implementierung und Kontra-Variant ist, wenn man mit der Basis annotiert.

Dominik

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.

Johannes

Ja, irgendwie so. Für genauere Sachen muss man PEP484 lesen. Das haben wir ja sicherlich alle schon gemacht.

Johannes

Da muss man gar nicht genauer drauf eingehen.

Jochen

Ich packe die Grafik in die Show Notes und dann schauen wir mal.

Jochen

Genau.

Jochen

Schauen wir mal, ob das hilft.

Jochen

Ja, aber genau. Ich dachte auch so, man kann das ja angeben und dann dachte ich so, ich habe das noch nie verwendet.

Jochen

Ist das irgendwie, habe ich was, passe ich was oder?

Jochen

Und was macht dann Bound?

Dominik

Also weil das macht man ja irgendwie auch bei den Kontra-Variants oder ist das schon das?

Dominik

Ich weiß nicht.

Dominik

Steht zumindest in der Types, Picing, Typing.

Johannes

Tatsächlich ist in dem PEP484 eine sehr schöne Erklärung drin.

Johannes

Mit Employees und Managers.

Johannes

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.

Johannes

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.

Johannes

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.

Johannes

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.

Johannes

Wenn du aber eine Liste von Managern reingegeben hast, dann geht das nicht.

Johannes

Und das ist jetzt eben genau so eine Frage.

Johannes

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.

Dominik

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.

Dominik

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.

Dominik

Mit präzisem Fachwissen. Und zwar den Type-Alias und die Type-Var, die da noch irgendwie dazu können.

Dominik

Also was ist denn der Unterschied? Und man kann ja auch noch das schöne Keyword Type dazu schreiben und sowas.

Jochen

Na, ich meine, bei Type-Alias, das kannst du auch einfach so hinschreiben. Das ist nur eine explizitere Darstellung.

Jochen

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.

Jochen

Und dann ist halt unklar, was gemeint ist, wenn man den nicht Type-Alias davor schreibt.

Jochen

Also beispielsweise, wenn ich jetzt...

Dominik

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.

Jochen

Ja, aber du könntest ja auch einfach hinschreiben, myUnion gleich und dann irgendwie der Typ, Pipe-Symbol, der andere.

Dominik

Das ist dann ein Type-Alias schon. Das heißt, das selber kann ich annotieren mit... Nein, ist es nicht?

Jochen

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.

Jochen

Ähm, macht... Also Type-Alias macht das dann halt explizit, dass das halt sozusagen...

Jochen

Der Alias, das ist okay.

Jochen

Ja, ähm...

Dominik

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.

Dominik

Ja, das sind halt die Generics, oder, die wir vorhin hatten.

Dominik

Ja, genau, genau.

Johannes

Stefan, du hast angesetzt. Erklär uns, was Type war.

Stefan

Also, ja, ja, also ich hab jetzt ganz kurz diesen PEP-4-4 aufgemacht und der ist, der ist wunderschön.

Stefan

Also, also, äh...

Stefan

Der ist super.

Stefan

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.

Stefan

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,

Stefan

das ist das Zweite dort, ähm, der zweite Parameter, ähm, einschränken.

Stefan

Also, ein Bound sagt dir, ähm, also, oder der generelle Typ-Parameter sagt dir, alle möglichen Werte, aber später nur ein konkreter.

Stefan

Ähm, und der Bound sagt dir, alle möglichen Werte, die auch diese Eigenschaften erfüllen, später ein konkreter.

Stefan

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,

Stefan

ä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.

Stefan

Oder Protokoll.

Stefan

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,

Stefan

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.

Stefan

Ähm, spannend wäre so, ob ich dort einen String reingeben kann, weil man kann ja die Länge von einem String definieren.

Stefan

Ja, kannst du.

Stefan

Ähm, genau.

Stefan

Alles, alles, was Len von irgendwas hat, ist Seist.

Stefan

Also, also, String muss auch eine Länge rauskriegen, ne?

Stefan

Ja.

Stefan

Ja.

Johannes

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.

Johannes

Mhm.

Johannes

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.

Johannes

Mhm, mhm.

Johannes

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.

Johannes

Mhm.

Johannes

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.

Stefan

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.

Stefan

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.

Stefan

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.

Stefan

Finde ich cool, dass das das Typ-System so macht, normalerweise würde TypeScript dir da vielleicht einen Fehler werfen.

Stefan

TypeScript würde da sagen, hey, ähm.

Stefan

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.

Stefan

Das ist ziemlich geil.

Stefan

Also, richtig cool.

Stefan

Ja, das ist ziemlich schön.

Stefan

Also, nämlich auch so, dass ich das jetzt verwenden möchte, muss ich ganz ehrlich sagen.

Stefan

Ich glaube, ich habe das so weit.

Stefan

Sehr gut.

Johannes

Viele Programmsprachen-Features kommen ja durch Knight umgesetzt.

Johannes

Das ist bei Python und auch nicht anders.

Johannes

Viele Sachen sind einfach aus Knight durch andere Sprachen entstanden.

Stefan

Also, den größten Knight habe ich ja durch die Input-Signatur.

Stefan

Das macht einfach so viel einfacher.

Stefan

In JavaScript ist es umgekehrt.

Stefan

Du importierst zuerst die Einzelelemente aus dem Paket und das ist reine Ästhetik.

Stefan

So ist es viel klarer.

Stefan

Du spezifisierst zuerst das Paket und dann importierst du die Sachen draus.

Stefan

Jeder Editor freut sich, wenn er das so kriegen kann.

Stefan

Mhm.

Stefan

Ja.

Stefan

Ja.

Dominik

Was mich noch interessieren würde hier an der Stelle ist diese Overloads, die da mit drin stehen.

Dominik

Das ist ja auch so eine Sache, die man nur bei den Type Annotations findet oder auch woanders,

Dominik

wo halt derselbe Methodenname mehrfach hintereinander definiert wird.

Dominik

Was macht denn das genau?

Stefan

Schreibst du in Python dort dann beide Methoden aus?

Stefan

Also, implementierst du da beide Methoden?

Stefan

Ah, in Python musst du dich da anstrengen dafür.

Stefan

Oder sind das nur die Signaturen?

Johannes

In Python musst du dich da anstrengen dafür.

Johannes

Das hat ja nicht mal viel mit.

Johannes

Ja, es hat vielleicht schon was mit Types zu tun, aber, also so richtiges Overloading gibt es ja gar nicht in Python.

Johannes

Du fügst eine weitere Signatur hinzu zur Methode.

Johannes

Ja, genau.

Johannes

Was macht denn das?

Johannes

Warum macht man denn das?

Stefan

Aber du hast doch nicht zwei Funktionen, du hast zwei Signaturen.

Johannes

Du hast eine Funktion, die, also es ist so, der ganz grundlegende Prozess ist, dass eine Funktion in Python eine Variable ist,

Johannes

die halt ein Funktionsobjekt enthält.

Johannes

Und diese Variable hat einen Namen und diesen Namen, der ist eindeutig, den kannst du nur einmal geben.

Johannes

Und zu diesem Namen kannst du auch nur diese eine Funktion geben.

Johannes

Was du jetzt aber machst, um Überladung zu machen, und das, ich erkläre es gleich noch für die Zuhörer, ja,

Johannes

ist, dass du sagst, du definierst eine Basismethode und der fügst du dann eine weitere Signatur hinzu.

Johannes

Und wenn diese, da ist dann eben so ein, durch Dekoratoren hast du so einen Mechanismus, der diese Signaturen entsprechend überprüft.

Johannes

So, was ist Überladung überhaupt und was erreicht man damit?

Johannes

Ü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.

Johannes

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.

Johannes

Was du jetzt in Java machst, ist, du schreibst eine zweite Funktion, die auch add heißt, aber die eine andere Signatur hat.

Johannes

Und die wird durch das Kompilat eher zu einer anderen Funktion.

Johannes

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.

Johannes

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.

Johannes

Die sind dann im JavaScript-Kompilat heißen die dann unterschiedlich, weil die eben da unterschiedlich sind.

Johannes

Das ist genau das.

Johannes

Das ist genau der Unterschied.

Johannes

Heißt nicht unterschiedlich.

Stefan

Nein, ein Overload in TypeScript ist im Grund nur eine andere Funktionssignatur auf Basis, über der tatsächlichen.

Stefan

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.

Stefan

Und dann kannst du so viele Overload schreiben, wie du willst und du hast dann einfach unterschiedliche Aufrufe.

Stefan

Durch die du durchgehen kannst.

Stefan

Aber im Endeffekt wird nur eine Methode aufgerufen oder eine Funktion aufgerufen.

Stefan

Deswegen habe ich genauso nachgefragt, weil ich bin mir nicht sicher, wie das jetzt in Python funktioniert, weil es ist spannend.

Stefan

Es ist so Führungslieder.

Stefan

Okay.

Stefan

Genau.

Johannes

In Python ist es ein bisschen anders.

Johannes

In Python musst du das eben über Dekoratoren machen, weil du diesen Namen nicht mehrfach haben darfst.

Johannes

Und was da im Wesentlichen passiert ist, du sagst, wenn die Methode aufgerufen wird mit zwei.

Johannes

Mit zwei Variablen oder mit Argumenten, die dieser Signatur entsprechen, dann rufe bitte diese Subsignatur auf.

Johannes

Also du fügst da quasi eine weitere Funktion hinzu, die nur in bestimmten Fällen aufgerufen wird.

Johannes

Aber das ist was, was zur Laufzeit passiert.

Johannes

Also zur Laufzeit wird dann entschieden, welche Submethode aufgerufen wird.

Johannes

Das ist im Wesentlichen ein Match Case, der da vorsteht.

Jochen

Nein, aber ich weiß nicht, ob das im Typing-Zusammenhang nicht was anderes ist.

Jochen

Es gibt diese Overload-Geschichten vielleicht in Klassen, aber ich meine hier auch bei Funktionen.

Jochen

Wenn ich jetzt einfach das sozusagen für diese Typ-Annotation verwenden will, dann ist es, soweit ich sehen kann, auch so.

Jochen

Es gibt die Funktion einmal, aber ich kann halt viele sozusagen mit Overload dekorierten Funktionen haben, die keine Implementation haben.

Jochen

Aber wo ich sozusagen nur quasi die unterschiedlichen möglichen Arten, wie das aufgerufen werden kann,

Jochen

anottiere, weil ich das nicht in eine Annotation schreiben kann, weil geht halt nicht.

Jochen

Und ja.

Jochen

Ach so, okay.

Jochen

Da gibt es zwei, also es gibt da, dann habe ich, also es gibt zwei verschiedene Dinge.

Jochen

Es gibt mehrere Overload-Dinge, denke ich.

Jochen

Genau, also das, das, das ist blöd, ja.

Jochen

Es ist blöd, dass es die, dass diese Sachen in unterschiedlichen Sprachen unterschiedliche Dinge bedeuten.

Johannes

Und es ist, also wenn ich der Kaiser wäre, dann wäre das anders.

Johannes

Ja.

Johannes

Dieser, also das ist tatsächlich was, was ich vermisst habe, ja, an Python.

Johannes

Als ich zu Python gekommen bin, aus Java.

Johannes

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.

Johannes

Und die machen sehr unterschiedliche Dinge, aber im Endeffekt das gleiche Semantische, die fügen die aneinander.

Johannes

Und die heißen gleich, weil die das gleiche machen.

Johannes

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.

Johannes

Single Dispatch.

Johannes

Ja, das hat, ja.

Stefan

Also weißt du, warum das in Java überhaupt möglich ist, dass du den gleichen Namen mehrmals vergeben kannst?

Johannes

Ja, weil die beim Kompilieren die Namen, weil die Namen weg sind beim Kompilieren.

Stefan

Nein, nein, weil die, weil die Funktionssignatur und Typen haben.

Stefan

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.

Stefan

Vertraue und glaube, es hilft, es heilt die göttliche Kraft!

Johannes

Genau, es sind unterschiedliche Funktionen.

Johannes

Also die Funktion addIntInt ist eine andere Funktion

Johannes

als die Funktion addFloatFloat.

Stefan

Und darum ist natürlich in JavaScript und Python

Stefan

halt komplett anders, weil im Endeffekt hast du halt nur

Stefan

eine Funktion mit ein paar Parametern.

Stefan

Und die Typen sind ja, wie wir mitbekommen haben,

Stefan

eigentlich wurscht.

Stefan

Die sind dann weg.

Jochen

Ja, zur Laufzeit auf jeden Fall.

Johannes

Aber diesen Mechanismus, den kriegst du hin,

Johannes

der heißt Single Dispatch.

Johannes

From Functools import Single Dispatch.

Johannes

PEP 443.

Johannes

Das, was ihr beschrieben habt, das heißt Overload,

Johannes

das ist ja was ganz anderes.

Johannes

Python Lang Util.

Johannes

Okay.

Jochen

Ich habe es jetzt hier aus From Typing.

Jochen

Also so wie ich das gesehen habe,

Jochen

es gibt auch ein sehr schönes Beispiel dafür.

Jochen

Das ist auch aus dem Fluent Python Buch.

Jochen

Habe ich das da.

Jochen

Also das ist halt so ein Beispiel für Methoden,

Jochen

die halt eigentlich in, also die hat auch so ein Problem,

Jochen

dass man mit Type Annotation

Jochen

halt so hat, beschreiben, nämlich,

Jochen

dass man, dass halt die Type Annotation nicht so,

Jochen

also die ist ja auch eine Sprache,

Jochen

ist halt eine andere Art, das hinzuschreiben.

Jochen

Und die ist halt nicht so expressiv wie Python selber.

Jochen

Das heißt, wenn ich jetzt Funktionen habe,

Jochen

wie zum Beispiel Min und Max,

Jochen

jetzt weiß ich gar nicht,

Jochen

ob es das in der JavaScript-Welt auch so gibt,

Jochen

aber die kann ich halt sehr schön in Python hinschreiben.

Jochen

So in irgendwie so 20 Zeilen oder sowas.

Jochen

Und ist sehr schön zu lesen, ist nicht kompliziert.

Jochen

Die Type Annotation dafür ist aber sehr, sehr schwer,

Jochen

weil das halt so super generisch ist.

Jochen

Und dann kann man noch ein Callback übergeben,

Jochen

das halt irgendwie zum Sortieren verwendet wird und sowas.

Jochen

Und ja, die korrekten Type Annotationen für Min und Max

Jochen

sind halt sehr viel länger als die Implementation.

Jochen

Und das ist halt, liegt halt daran,

Jochen

dass man das in dieser neuen Annotationssprache

Jochen

halt nicht so gut hinschreiben kann.

Jochen

Und dafür, also da hast du dann halt so irgendwie,

Jochen

ich weiß nicht, zig Overloads, weil,

Jochen

du kannst das sowieso immer nur quasi für einen Teil der,

Jochen

wie man das aufrufen kann, halt annotieren.

Jochen

Und dann musst du das halt,

Jochen

musst halt zehn Dinger übereinander häufen,

Jochen

um das halt irgendwie abgebildet zu kriegen.

Jochen

Und ja, und auch in diesen Dingern sind dann halt,

Jochen

waren halt lange Fehler drin.

Jochen

Und die sind halt auch echt schwer zu finden.

Jochen

Also ja.

Jochen

Und die machen ja auch überhaupt gar nichts,

Jochen

diese Fehler, jetzt mal ganz ehrlich.

Jochen

Ja gut, na gut.

Jochen

Also irgendjemand hat dann halt,

Jochen

es kann ja sein, du rufst das halt auf,

Jochen

lässt das auf eine bestimmte Art

Jochen

und dann läuft dein Type-Checker drüber

Jochen

und der sagt, der spuckt dir dann halt irgendeine Fehlermeldung aus,

Jochen

die vollkommen unverständlich ist.

Jochen

Und das verdirbt dir halt den Vormittag oder so,

Jochen

weil du verstehst gar nicht, wo das Problem ist.

Jochen

Und dann war es halt nicht mal wirklich ein Problem,

Jochen

sondern es ist einfach nur etwas,

Jochen

was halt in den Annotationen kaputt war.

Jochen

Und du hast es korrekt aufgerufen,

Jochen

das ist ja schon ärgerlich.

Jochen

Also ich meine, ja, also, ja, gut.

Jochen

Zugegeben, ja.

Jochen

Aber.

Jochen

Aber was war jetzt die Lösung, Jochen?

Johannes

Weil ich habe dich jetzt unterbrochen,

Johannes

aber gibt es da jetzt eine Lösung dafür?

Johannes

Kann ich jetzt da Overload sagen?

Jochen

Genau, und du kannst jetzt sozusagen,

Jochen

wenn du eine Funktion annotieren möchtest,

Jochen

aber das halt die Annotation nicht einfach so hinschreiben kannst,

Jochen

dann kannst du die möglichen Arten,

Jochen

wie das halt, also wenn es halt mehrere,

Jochen

wenn du mehrere Annotationen hinschreiben musst

Jochen

für die Funktion, kannst du das per Overload hinschreiben.

Jochen

Hast dann halt der Methoden-Body

Jochen

oder Funktions-Body ist dann so,

Jochen

sondern ist einfach Ellipsis, also Punkt, Punkt, Punkt.

Jochen

Und genau, dann kannst du halt alle Arten,

Jochen

wie man das Ding halt getypt aufrufen kann,

Jochen

halt hinschreiben.

Johannes

So richtig schön sieht das aber auch nicht aus.

Johannes

Nee, das sieht nicht schön aus.

Stefan

Ich würde es zum Beispiel in TypeScript

Stefan

auch nicht immer verwenden.

Stefan

Meistens ist das ein Codespell,

Stefan

wenn du Methoden oder Funktionen hast,

Stefan

die mehr können soll.

Stefan

Was sie beschreibt, ja.

Stefan

Ja, so ein bisschen so eine Krücke, ne?

Stefan

Warum machen wir das dann nicht?

Dominik

Vielleicht, wenn man so ein Public-API-Interface hat,

Dominik

was unbedingt benutzt bleiben muss,

Dominik

aus irgendwelchen Gründen.

Dominik

Vielleicht für Legacy oder sowas.

Dominik

Ja, also in TypeScript gibt es es,

Stefan

weil du halt in TypeScript

Stefan

Parameter weglassen kannst

Stefan

oder

Stefan

Parameter in unterschiedlichen Positionen

Stefan

auch was anderes heißen.

Stefan

Und da hat halt TypeScript irgendeine Methode braucht,

Stefan

um das darzustellen.

Stefan

Und deswegen haben wir es.

Dominik

Ja, gut, wenn man Sternchen, Komma, Quark schreibt oder sowas, ja.

Stefan

Also gerade dieses Add-Beispiel von Johannes,

Stefan

das würde ich eigentlich jetzt in TypeScript

Stefan

mit Generics umsetzen, oder?

Stefan

Ja, gut.

Johannes

Wenn du jetzt die Methode Add für Integer

Johannes

und eine Methode Add für Stringen hast,

Johannes

musst du ja schon zwei unterschiedliche Implementierungen haben auch.

Johannes

Also an irgendeiner Stelle musst du ja deine Implementierung verzweigen.

Johannes

Ja, wenn du Plus verwendest, okay.

Johannes

Aber dann musst du das Plus irgendwo hin verzweigen,

Johannes

weil das macht ja sehr unterschiedliche Dinge.

Johannes

Ja.

Johannes

Dann kann ich das dann netto überschreiben.

Johannes

Ja, ja.

Johannes

Ja.

Dominik

Was mir noch fehlt,

Dominik

wir haben schon relativ viel gesagt,

Dominik

ich glaube, es ist eben schon einmal gefallen,

Dominik

sowas wie rekursive Types oder sowas.

Dominik

Wenn ich zum Beispiel einen JSON-Type definiere.

Dominik

Oh, sag doch nicht sowas.

Dominik

Oh Gott.

Dominik

Kapitel 7.

Johannes

Du bist ja noch weit entfernt von Kapitel 7.

Stefan

Ja, also rekursive Types ist schon nötig.

Stefan

Wenn du jetzt zum Beispiel irgendwie eine Liste definieren willst,

Stefan

eine einfach verkettete Liste,

Stefan

dann hast du dort nur einen Knoten

Stefan

und du verweist auf den nächsten Knoten.

Stefan

Aber das ist eigentlich nur ein Typsystem.

Stefan

Du musst halt irgendwie die Möglichkeit haben,

Stefan

dass du Typen definieren kannst,

Stefan

die,

Stefan

die sich selbst referenzieren können,

Stefan

wenn nötig.

Dominik

Also wie JSON-Objekte oder sowas zum Beispiel tatsächlich.

Dominik

Zum Beispiel, ja, genau.

Stefan

Also in JSON kannst du ja auch sehen,

Stefan

dass du,

Stefan

naja,

Stefan

schwierig.

Dominik

Ja, eine Liste von Objekten habe,

Dominik

in denen andere Listen stecken,

Dominik

die wieder irgendwie Teugs haben oder so.

Dominik

Ja, genau.

Stefan

Oder in Array von Arrays.

Stefan

Ja.

Stefan

Wenn du schon dabei bist, ne.

Stefan

Aber ich habe eben einmal mit,

Stefan

mit jemandem vom TypeScript-Team gesprochen,

Stefan

bezüglich rekursiven Typen.

Stefan

Ähm,

Stefan

das ist meistens ein Implementierungsdatei,

Stefan

wie tief der Compiler dort denn gehen kann.

Stefan

Also was, was sind die,

Stefan

ähm,

Stefan

wie,

Stefan

wie ist der Compiler entwickelt,

Stefan

äh,

Stefan

dass er bald genug sagen kann,

Stefan

hey, da stoppe ich jetzt und passe nicht mehr weiter.

Stefan

Also wie, wie geht der Compiler mit der Rekursion?

Stefan

Ja, es gibt irgendwie so ein,

Stefan

Typ-Systeme können das eigentlich.

Dominik

Ja, da auch in der IDE irgendwie,

Dominik

ich weiß nicht,

Dominik

bei JSON-Type oder sowas,

Dominik

wie, bis wie viel Level tief darf der denn gucken,

Dominik

ob das noch stimmt.

Dominik

Genau, genau.

Stefan

Und da werden es auch immer besser.

Stefan

Das ist der Mathematik-Egal.

Stefan

Der TypeScript-Compiler ist schon recht,

Stefan

das ist der Mathematik-Egal,

Stefan

die guckt, ähm.

Stefan

Ja, genau.

Jochen

Ja, das kommt dann wieder darauf an,

Jochen

welche Art von Mathematik, ne,

Jochen

wenn man den konstruktiven Zweig anhängt.

Jochen

Das gibt es gar nicht.

Jochen

JSON-Dastro-Typik.

Johannes

Wenn du schon in der Grundvorlesung,

Johannes

also ich habe ja eine mathematische Ausbildung genossen

Johannes

an der Universität,

Johannes

da werden dann die natürlichen Zahlen nochmal definiert

Johannes

und die werden rekursiert.

Johannes

Ja, ja.

Johannes

Ja, ja.

Johannes

Ja, ja.

Johannes

Da gibt es eigentlich nur eine natürliche Zahl,

Johannes

das ist die 0 oder die 1,

Johannes

je nachdem, wo du anfangen willst.

Johannes

Und dann sagt man einfach,

Johannes

jede Zahl hat einen Nachfolger

Johannes

und zack, hast du alle natürlichen Zahlen beisammen.

Johannes

Also es geht schon weit rein mit der Rekursion

Johannes

und die geht auch weit genug in der Mathematik.

Johannes

Ja.

Johannes

Ja, ja, ja.

Jochen

Ja, ich weiß nicht, haben wir noch,

Jochen

ah, oh, was mir noch einfällt, genau.

Jochen

Das schließt so ein bisschen an das Pedantik-Thema von eben an.

Jochen

Ich meine, das ist ja jetzt etwas,

Jochen

was man, also die Typen werden ja zur Laufzeit ignoriert in Python,

Jochen

aber nicht immer und man müsste es auch nicht,

Jochen

weil im Grunde kann man rausfinden,

Jochen

wie die Annotationen sind.

Jochen

Und es gibt halt auch Software, die das macht,

Jochen

wie zum Beispiel Pedantik.

Jochen

Ja, oder MyPy.

Jochen

Oder FastAPI.

Jochen

Oder FastAPI.

Jochen

Ja, genau.

Jochen

Gibt es sowas eigentlich in TypeScript auch?

Jochen

Weil ich meine, gut, das wird ja kompiliert zu JavaScript,

Jochen

aber es gibt ja jetzt auch,

Jochen

glaube ich, Interpreter, die direkt TypeScript interpretieren,

Jochen

so Deno oder sowas, macht das, glaube ich,

Jochen

ich weiß nicht so genau,

Jochen

könnte das ja im Grunde dann tun.

Stefan

Das ist ja ein weitverbreiteter,

Stefan

ich glaube, dass Deno direkt TypeScript interpretiert.

Stefan

Ach so.

Stefan

Deno hat nur einen TypeScript-Compiler inkludiert,

Stefan

also kompiliert TypeScript, bevor er das JavaScript ausführt.

Stefan

Also tatsächlich,

Stefan

ich sage mal, im JavaScript-Bereich reden wir eher

Stefan

von unterschiedlichen Typsystemen, die existieren.

Stefan

Wie Flow-Type ist zum Beispiel eins,

Stefan

das sehr, sehr optisch sehr, sehr ähnlich ist zu dem,

Stefan

was TypeScript zur Verfügung stellt,

Stefan

aber halt in den Nansen unterschiedlich ist.

Stefan

Oder eben TypeScript,

Stefan

und das sind auch schon die populärsten.

Stefan

Der Clojure-Compiler hat einmal ähnlich funktioniert,

Stefan

also wie Typ definiert werden.

Stefan

CoffeeScript gab es früher.

Stefan

Ja, CoffeeScript ist aber sogar eigene Programmiersprache.

Stefan

Also wie Typ definiert werden.

Stefan

Ja, aber kompiliert, also ich meine, ja.

Johannes

Gleiche Historie.

Stefan

Ähnlich, ähnlich.

Stefan

Da gibt es auch einen wichtigen Punkt,

Stefan

weil wie Typen definiert werden in JavaScript,

Stefan

das ist ja eigentlich nicht dem TypeScript-Team zu verdanken,

Stefan

sondern dem ECMAScript-4-Standard,

Stefan

der schon viel, viel älter ist, der nie umgesetzt wurde,

Stefan

an den sich aber alle Typsysteme jetzt irgendwie dranhalten

Stefan

bei der Definition des eigenen Typsystems.

Stefan

Ich würde eher sogar sagen, dass ActionScript,

Stefan

also die Flash-Programmiersprache noch eher ähnlicher

Stefan

oder verwandter mit TypeScript und Flow-Type ist.

Stefan

Aber das ist es dann auch.

Stefan

Also du hast entweder unterschiedliche Typsysteme,

Stefan

dann entscheidest du dich in den meisten Fällen

Stefan

heutzutage eh für TypeScript

Stefan

und dann bietet dir TypeScript eigentlich alles,

Stefan

was du dort dann dafür brauchst.

Stefan

Also du laufst da gar nicht in Gefahr,

Stefan

dass du irgendwie ein anderes Werkzeug nimmst.

Stefan

Und TypeScript versteht halt auch komplett JavaScript.

Stefan

Das heißt, du kannst halt dort noch mit JavaScript-Code anfangen

Stefan

und dich nur einmal auf die Typ-Inferenz

Stefan

vom TypeScript-Type-Checker verlassen.

Stefan

Dass er sagt,

Stefan

ich weiß jetzt, welche Typen du verwendest,

Stefan

rein in der Verwendung deines Codes.

Stefan

Dass du jetzt so eine retroaktive Typ-Annotation machst,

Stefan

macht man eher nicht.

Stefan

Es gibt ein paar Werkzeuge,

Stefan

ich könnte aber jetzt nicht den Namen dazu sagen,

Stefan

macht man aber aus dem Grund nicht,

Stefan

weil der TypeScript-Type-Checker eh gut genug ist,

Stefan

dass er schon sehr, sehr viel herausfindet,

Stefan

bevor du überhaupt irgendeine Annotation machen musst.

Stefan

Was ein gutes Migrations-Sol ist,

Stefan

ist JS-Doc,

Stefan

das ist halt eine Typ-Annotation im Kommentar,

Stefan

wo du einfach sagst,

Stefan

hey, du hast diese Funktion,

Stefan

die hat drei Parameter,

Stefan

du definierst den Typen im Kommentar

Stefan

und nicht im Code.

Stefan

Und das machen viele Bibliotheken,

Stefan

das machen sehr viele alte JavaScript-Bibliotheken,

Stefan

wie zum Beispiel Lodash oder Underscore schon.

Stefan

Und TypeScript kann mit dem umgehen.

Stefan

Also TypeScript kann auch Typ-Informationen

Stefan

aus diesen Kommentaren lesen

Stefan

und hat halt so weit mehr Komplizität,

Stefan

Komplizität mit dem gesamten Ökosystem,

Stefan

als wenn sie darauf bestehen würden,

Stefan

dass sie nur die Typen verwenden,

Stefan

die du annotierst.

Johannes

Okay, aber so ein richtiges Äquivalent zu dem,

Johannes

was der Jochen gefragt oder gesagt hat,

Johannes

gibt es nicht wirklich.

Johannes

Zur Laufzeit hast du nicht wirklich mehr die Typ-Informationen.

Stefan

Also zur Laufzeit,

Stefan

es gibt Bibliotheken,

Stefan

die fügen Typ-Informationen zur Laufzeit hinzu

Stefan

und leiten dadurch TypeScript-Typen,

Stefan

aber das ist es dann schon.

Stefan

Also es gibt auch ein paar so Reflection-Geschichten.

Stefan

Achso, okay, dass du so rumgehst.

Stefan

Das ist aber alles Mumpitz.

Stefan

Also das möchte ich nicht einmal erwähnen,

Stefan

weil es einfach Schwachsinn ist.

Stefan

Eine Sache, die aber gut ist, zum Beispiel,

Stefan

das ist SOD.

Stefan

Wenn du jetzt sagst, du brauchst jetzt

Stefan

Typ-Informationen zur Laufzeit auch,

Stefan

dann kannst du über die SOD-Bibliothek

Stefan

dir deinen Typen in JavaScript definieren.

Stefan

Das ist aber nicht TypeScript,

Stefan

das ist JavaScript.

Stefan

Und kannst dann, wenn du diesen Typen

Stefan

weiter im TypeScript-Code

Stefan

verwenden willst, sagen,

Stefan

hey, leite mir jetzt aus diesem JavaScript-Konstrukt,

Stefan

das ich gebaut habe,

Stefan

das einen Typen darstellen soll,

Stefan

leite mir von diesem JavaScript-Konstrukt

Stefan

doch einen TypeScript-Typen ab,

Stefan

den ich weiterverwende.

Stefan

Und du bekommst dann zum einen einen Typen,

Stefan

klassischer TypeScript-Typ,

Stefan

den du in deinen Methodensignaturen

Stefan

verwenden kannst,

Stefan

den du annotieren kannst,

Stefan

wo du Type-Checking hast,

Stefan

das funktioniert, das ist grandios gut.

Stefan

Parallel dazu hast du aber immer noch

Stefan

dieses JavaScript-Konstrukt mit der Validierung

Stefan

erfahren kannst. Das heißt, du kannst

Stefan

sagen, hey, du kriegst jetzt ein Chasen von einem Backend,

Stefan

steckst es in den Validator rein

Stefan

und kriegst entweder Ergebnisse, die es nachher

Stefan

dem Typen entspricht, super, oder

Stefan

Fehlermeldungen, mit der du umgehen kannst.

Stefan

Und das ist eine grandiose

Stefan

Bibliothek.

Stefan

Erstens ist sie

Stefan

so nah an TypeScript, dass du wirklich sämtliche

Stefan

Dinge, die du in TypeScript schreiben kannst,

Stefan

auch damit umsetzen kannst.

Stefan

Und zweitens ist sie schnell,

Stefan

sie macht robustere Code, ich bin total glücklich

Stefan

mit der, die kann ich sehr, sehr gut empfehlen.

Stefan

Also unbedingt. Aber prinzipiell

Stefan

gilt als Methoden. Okay, cool. Also ein ähnliches

Stefan

Verfahren. Sehr ähnlich.

Stefan

In SOD ist es aber so, dass du

Stefan

halt die Typen dann

Stefan

anfängst zu schreiben in dieser

Stefan

JavaScript-Welt

Stefan

mit den dort

Stefan

vorhandenen Methoden und Funktionen.

Stefan

Und das ist halt umgekehrt zu dem, was du

Stefan

normalerweise in TypeScript auch hast, dass du sagst,

Stefan

du schreibst deine Typen und die sind nach dem

Stefan

Kompilator einfach weg. Also TypeScript ist so eine

Stefan

Erased-to-JavaScript-Sprache,

Stefan

was auch bedeutet, wenn du es nicht zur Laufzeit haben willst,

Stefan

musst du in JavaScript anfangen und musst halt dem anderen

Stefan

Weg gehen.

Johannes

Ja, okay, aber da steht ja nicht, würde ja nicht

Johannes

prinzipiell was dagegen sprechen, oder?

Johannes

Dass du von TypeScript-Typen zu

Johannes

JavaScript-Typen gehst. Das ist nur jetzt halt

Johannes

das Tooling, das existiert nicht.

Johannes

Ja, okay, aber das ist doch cool. Also du hast auf jeden Fall

Johannes

das Gleiche. Unbedingt zu empfehlen.

Stefan

Ja, unbedingt zu empfehlen.

Stefan

Also das ist richtig, richtig cool. Finde ich super spannend.

Stefan

Könnte auch für mich nützlich sein.

Stefan

Also gerade wenn du mit

Stefan

Backends arbeiten musst, denen du nicht trauen kannst,

Stefan

herrlich. Ja, oder

Stefan

mit Inputs von Benutzern

Stefan

und ich meine, da musst du eh immer Validierung

Stefan

machen, aber das

Johannes

kann einem ja in dem Sinne

Johannes

die Arbeit ein bisschen abnehmen.

Jochen

Naja, also man definiert halt, wie man gerne

Jochen

hätte, dass die eigene Datenstruktur

Jochen

aussieht und benutzt dann diese Information

Jochen

halt auch zur Validierung dagegen.

Jochen

Das ist natürlich, also ja,

Jochen

das ist genau eigentlich der Use Case von

Jochen

Pydentic auch.

Stefan

Ja, ja. Muss man das Pydentic noch genau

Stefan

anschauen. Also das hört zum

Stefan

Zeitmehr, ob es heute gehört,

Stefan

wie wir begonnen haben.

Stefan

Und jetzt wieder. Erklär mal,

Johannes

Jochen, erzähl mal den Unterschied zwischen FastAPI

Johannes

und Pydentic. Ach, ja,

Jochen

FastAPI ist sozusagen ein

Jochen

Repetiface, was

Jochen

Pydentic, ja, genau.

Dominik

Automatisierung bereitstellen. Pydentic

Jochen

ist eine Bibliothek, die benutzt wird von

Jochen

FastAPI und

Jochen

die halt sozusagen

Jochen

ermöglicht, wenn man halt

Jochen

mit Typannotationen sozusagen oder

Jochen

der Syntax, es gibt noch mehr, weil man kann halt auch noch

Jochen

mehr machen als nur die Sachen, die mit

Jochen

Annotationen möglich sind. Man kann halt auch Validations

Jochen

Validierungsfunktionen

Jochen

haben und Upper Limits

Jochen

und Lower Limits und weiß ich nicht

Jochen

und ganz viel kompliziertes Zeugs halt auch mit dazu

Jochen

schreiben. Das geht mit den

Jochen

Typannotationen natürlich nicht, aber wenn man einfach nur

Jochen

die Typannotationen hinschreibt, dann passiert

Jochen

das halt auch, dass dann sozusagen

Jochen

man einen JSON nehmen kann und

Jochen

man hat halt eine Objektstruktur definiert

Jochen

mit den Typen und dann sagt man halt, hier ist

Jochen

das JSON,

Jochen

passt das mal und validiert das mal.

Dominik

Und wenn es nicht, dann kriegst du 422 zurück, weil

Dominik

da fehlt irgendwas. Wenn es nicht

Jochen

okay ist, kriegt man halt schöne Fehlermeldungen auch

Jochen

zurück, wo dann genau gesagt wird, so an

Jochen

der Stelle hast du gesagt, das

Jochen

soll ein Number sein, aber da ist eigentlich

Jochen

da ist ein String oder das ist

Jochen

halt irgendwie, das passt sonst wie nicht, das soll eine Liste

Jochen

sein, aber das ist halt nicht, ja

Jochen

und das ist natürlich nett. Okay, also es ist

Jochen

also es ist quasi

Johannes

das, woraus FastAPI

Johannes

gebaut wird. FastAPI ist

Johannes

Identik via

Johannes

HTTP. Ja,

Jochen

plus es sind noch so ein paar Sachen

Jochen

zusätzlich dabei. Starlet ist halt

Jochen

irgendwie sozusagen das alles, was HTTP

Jochen

angeht oder so macht, da drunter

Jochen

die Bibliothek von Tom Christie.

Jochen

Also FastAPI ist schon so ein bisschen,

Jochen

ist halt so irgendwie

Jochen

drei sehr coole oder drei, vier sehr

Jochen

coole Open-Source-Bibliotheken in einem French-Code

Jochen

irgendwie quasi. Noch so Routing,

Dominik

das hat man halt irgendwie von Flask früher

Dominik

kannte, als Dekorator oben. Ja, Flask war auch

Jochen

sehr, ja genau, das ist natürlich auch sehr

Jochen

alt. Also

Johannes

Stefan, wenn du FastAPI schon kennst, dann

Johannes

weißt du auch, wie Pedantic funktioniert. Nur halt

Johannes

innerhalb. Okay.

Stefan

Genau. Also wie gesagt, ich habe den Namen

Stefan

in Architektur-Diagramm geschrieben, also das ist

Stefan

meine Erfahrung damit, aber

Stefan

reicht anscheinend.

Stefan

Ist schon mehr damit gemacht als viele andere.

Stefan

Genau.

Stefan

Ja.

Jochen

Genau, also ja, das ist auf jeden Fall auch so

Jochen

noch ein ganz interessanter Ding, dass man, weil

Jochen

ich meine, das ist ja tatsächlich so, wie viele Leute das benutzen.

Jochen

Viele Leute benutzen dann TypeDict und denken,

Jochen

das würde passieren, dass es validiert wird, aber es passiert halt nicht.

Jochen

Ja.

Jochen

Genau. Ja, ansonsten,

Jochen

ich weiß es nicht, haben wir noch irgendwas Großes

Jochen

vergessen oder so, aber ich glaube,

Jochen

ansonsten, ich habe hier fast nichts

Jochen

mehr, was ich noch irgendwie unbedingt

Jochen

gerne wissen wollte. Ja.

Johannes

Nach anderthalb Stunden

Johannes

alles über

Johannes

Typsysteme und Typen gesagt.

Johannes

Das ging ja relativ schnell jetzt.

Johannes

Ja. Für meinen Typen

Dominik

habt ihr immer noch keine Erklärung gefunden, aber sonst.

Dominik

Ja.

Johannes

So Typen wie dich, Dominik,

Johannes

ist schwer zu beschreiben.

Johannes

Ja.

Johannes

No space enough.

Johannes

Ja.

Dominik

Wirklich, ich finde es schön. Stefan, hast du noch was, was du

Dominik

unbedingt loswerden wolltest?

Stefan

Ich glaube, ich habe jetzt noch ein anschauliches Beispiel

Stefan

gefunden zu Co-Varianz und Kontra-Varianz.

Stefan

Oh ja. Nachdem ich mir die Grafik so lange angeschaut habe.

Stefan

Ich hoffe, ich kann es erklären.

Stefan

Co-Varianz ist

Stefan

in Wirklichkeit, was wir als

Stefan

Subtyping verstehen. Angenommen,

Stefan

du hast ein Lebewesen, dann hast du ein Subtyp davon,

Stefan

das ist ein Pflanzenfresser, dann hast du ein Subtyp

Stefan

davon, das ist eine Kuh. Das heißt, du wirst immer

Stefan

konkreter und konkreter und konkreter.

Stefan

Was bedeutet, wenn du irgendwo ein Lebewesen

Stefan

erwartest, kannst du dort einen Pflanzenfresser reinschmeißen,

Stefan

kannst du aber auch Kühe reinschmeißen oder Schafe

Stefan

reinschmeißen oder

Stefan

Veganer.

Stefan

Von mir aus, nicht?

Stefan

Und das ist Co-Varianz.

Stefan

Das heißt, du kannst

Stefan

etwas sehr Breites akzeptieren

Stefan

und kannst was sehr Konkretes reinstopfen,

Stefan

wenn der Subtyp...

Dominik

Das heißt, ich erwarte ein Lebewesen als Type Annotation quasi.

Dominik

Genau, genau, genau.

Stefan

Jetzt hast du aber zum Beispiel

Stefan

eine andere Co-Varianz, nämlich du hast

Stefan

jetzt eine Pflanze und davon abgeleitet,

Stefan

Gras und davon abgeleitet vielleicht

Stefan

Heuer oder so. Und jetzt

Stefan

willst du

Stefan

eine Funktion zur Verfügung stellen,

Stefan

die akzeptiert Grasesser,

Stefan

dann kannst du dort

Stefan

bei den Grasessern Kühe, aber

Stefan

auch Pflanzenfresser reinschmeißen.

Stefan

Wenn du jetzt aber sagst, du akzeptierst

Stefan

jetzt

Stefan

du akzeptierst jetzt

Stefan

Pflanzen, also

Stefan

alle die Pflanzen

Stefan

oder Funktionen, die

Stefan

Pflanzen haben, dann kannst du

Stefan

von Entitäten, die

Stefan

alle Pflanzen essen können, alle Pflanzen,

Stefan

dann kannst du dort keine Kühe

Stefan

reingeben, weil Kühe können nur Gras essen.

Stefan

Und das ist Kontrovarianz.

Stefan

Das heißt, du hast zwar auch einen Subtypen, du hast einen

Stefan

sehr breiten Typen, ich akzeptiere ja

Stefan

Pflanzenfresser, allerdings kannst

Stefan

du keine Kühe reingeben, weil Kühe nur Gras essen dürfen.

Stefan

Okay, und Invarianz

Dominik

ist dann ganz festgesetzt, dass halt nur den

Stefan

einen speziellen Typ... Genau, Invarianz geht

Stefan

in beide Richtungen.

Stefan

Also ich hoffe, dass das nochmal

Stefan

veranschaulicht. Ich glaube, wir gucken,

Dominik

ich lebe dein Bild nochmal an. Ich hoffe, das Bild ist so

Dominik

anschaulich für die

Dominik

Leute, die ausgestiegen sind, ja.

Dominik

Ja, super.

Johannes

Da werden wir sicherlich ganz viele E-Mails kriegen und das

Johannes

in den nächsten vier Folgen alles nochmal

Johannes

genau erklären. Ja, ist ja auch okay,

Jochen

wenn da eine Erklärung

Jochen

dabei ist, die... Hallo bei

Dominik

peistenpodcast.de. Genau. Wir haben

Dominik

aber noch gar nicht ganz fertig, weil wir möchten

Dominik

noch unseren Pick der Woche, glaube ich,

Dominik

auswählen. Oh ja.

Dominik

Ich fang mal an, ich nimm... Stefan,

Dominik

weißt du denn, was ein Pick ist?

Dominik

Ja.

Stefan

Also müssen wir jetzt irgendeinen Link raussuchen,

Stefan

den er total grandios findet. Ja, genau.

Stefan

Irgendwas Schönes zeigen.

Dominik

Ja, meistens nennen wir Python-Module, aber

Dominik

ich nimm tatsächlich, ja,

Dominik

auch nicht immer. Ich nimm tatsächlich diesmal

Dominik

eins von Simon Willison,

Dominik

und zwar das LLM. Ich glaube, das haben wir bei einer der

Dominik

Machine Learning-Folgen... Ach, das Kommando-Zahlen-Tool.

Dominik

...zwar schon irgendwo gehabt, aber

Dominik

es ist tatsächlich, bei mir

Dominik

ist vermehrt in Benutzung, im MonkeyPatch

Dominik

schon immer das Default, aber sonst ist es sehr,

Dominik

sehr schön, weil du halt ganz viele

Dominik

Templates und Chains von Templates direkt

Dominik

benutzt.

Dominik

...benutzen kannst in deiner Kommando-Zeile,

Dominik

um halt mit den verschiedenen Modellen zu sprechen

Dominik

direkt, die du da haben

Dominik

willst. Und es ist

Dominik

toll, wenn man harte Instruktionen gibt,

Dominik

dann so die Standard-Persönlichkeit

Dominik

des antwortenden

Dominik

LLMs irgendwie

Dominik

so ein bisschen gerade zu rücken auf das, was man selber

Dominik

gerne als Antwort hätte.

Dominik

Such irgendwie die Leute

Dominik

genug gut aus, mit denen du sprichst,

Dominik

das wollte ich damit sagen, und

Dominik

deswegen... Und dann lädst du

Dominik

uns ein, Dominik.

Dominik

Weiter hätte viel Spaß bei den nächsten

Dominik

Picks, wollte ich noch sagen, ja.

Dominik

Ja.

Dominik

Ja, was hast du denn gepickt, Jochen?

Jochen

Was wollte ich? Ah, genau, ich

Jochen

dachte mir so, naja, vielleicht auch ein Buch

Jochen

mal, und zwar eins, das ich

Jochen

nicht gelesen habe.

Jochen

Aber wo man das alles nachlesen kann,

Jochen

kann man auch die Antworten,

Jochen

wenn man drauf gekommen ist, wie das sein muss,

Jochen

an uns schicken, und zwar

Jochen

The Little Typer ist ein

Jochen

Buch, das, ich hab's versucht zu lesen,

Jochen

das ist irgendwie, ich hab dann zwischendurch aufgegeben.

Jochen

Das muss ich sagen, wie Experiment

Jochen

mit Types entbeißen.

Jochen

Ja, aber da

Jochen

steht, da steht das, glaub ich, alles ganz genau drin,

Jochen

wenn man das wissen will. Und, ah gut,

Jochen

vielleicht nochmal was Praktisches, weil

Jochen

ja,

Jochen

das ist ja doch nicht irgendwie

Jochen

was für alle wahrscheinlich.

Jochen

Doku ist ganz nett,

Jochen

auch nicht Python, sondern Go.

Jochen

Geschichte,

Jochen

Heroku hatte ja in letzter Zeit so ein bisschen

Jochen

Probleme, und

Jochen

ähm, ist nicht mehr so richtig,

Jochen

äh, irgendwie der Platz, wo man vielleicht so mal so,

Jochen

wenn man, also früher hat man das ja irgendwie, wenn man irgendwas

Jochen

mal eben deployen wollte, hat man

Jochen

das oft dann bei Heroku oder so

Jochen

getan, weil das halt sehr einfach war,

Jochen

aber das, äh, das geht

Jochen

irgendwie nicht mehr. Und, ähm,

Jochen

das kann man auch in Selbstmord... Wo würdest du das jetzt machen, Jochen?

Jochen

Äh, also meine, meine,

Jochen

meine Lösung dafür ist ja, dass ich das halt einfach,

Jochen

ich hab da so meine Standard, äh,

Jochen

Ansible, äh, Dinger...

Jochen

Ja, okay, gut. Also du, ja.

Johannes

Du bist vom, dir ist Heroku zu

Johannes

kompliziert geworden, und deshalb hast du jetzt,

Johannes

äh, deine eigene Hosting-Lösung gebaut, aber das...

Johannes

Ja, leider, ja. Ist natürlich keine Option,

Jochen

die jetzt viele dazu haben. Genau, also,

Jochen

das kann ich auch nicht unbedingt empfehlen, das ist,

Jochen

äh, das unerwartet, äh,

Jochen

kompliziert, aber bei mir geht's jetzt daher,

Jochen

hab ich das Problem nicht mehr, ähm,

Jochen

und ich mach ja auch keinen Docker oder so, sondern, äh,

Jochen

ich deploye dann direkt irgendwie,

Jochen

ähm... Knallhart, bare metal.

Jochen

Ja, genau.

Jochen

Und, ähm, äh,

Jochen

bei, bei Doku hat man dann halt irgendwie

Jochen

sowas, wo man dann so ähnlich wie mit

Jochen

Heroku einfach, man hat halt so ein Pog-File,

Jochen

und dann kann man das einfach direkt,

Jochen

und da auch, also wenn man Docker-Container

Jochen

bauen kann, kann man direkt Docker-Container dahin deployen,

Jochen

und die laufen dann unter Subdomain

Jochen

direkt mit HTTPS und so. Arbeitet das sogar

Jochen

mit Heroku, also Doku?

Jochen

Äh, nee, nee, das ist also, aber du,

Jochen

du musst halt das Doku auf einem

Jochen

von, von, von, irgendwo auf nem,

Jochen

weiß ich nicht, auf einer virtuellen Maschine

Jochen

irgendeinem Dings halt deployed haben,

Jochen

oder auf der anderen Seite. Self-hosted Heroku. Genau,

Jochen

self-hosted Heroku quasi, ja.

Jochen

Und, ähm, genau,

Jochen

das ist, glaube ich, manchmal ganz hilfreich, sowas zu haben.

Jochen

Ah, ja.

Johannes

Okay, dann, ähm, dann schließe

Johannes

mich da direkt mal an, weil in dem Fall

Johannes

habe ich drei Picks. Ah, okay.

Johannes

Der erste ist, äh,

Johannes

Vercel. Oh, cool.

Johannes

Das ist, äh, das ist wie Heroku, nur cooler.

Johannes

Ähm,

Johannes

der zweite wäre Fly.io.

Johannes

Das ist quasi, äh,

Johannes

Docker-Sachen auf Hosted-Infrastruktur

Johannes

überall hin, ähm,

Johannes

machen, und die machen krasses technisches

Johannes

Zeugs damit. Also du, du schickst dir den

Johannes

Docker-Container, aber die zerlegen den, und

Johannes

äh,

Johannes

und, ähm, bauen sich da

Johannes

eigene Sachen draus. Das, äh, ist auch

Johannes

technologisch sehr interessant. Äh,

Johannes

das war jetzt aber der opportunistische

Johannes

Pick, äh, nur um da die,

Johannes

die Alternativen zu

Johannes

Heroku und self-hosted

Johannes

einmal gesagt zu haben.

Dominik

Jetzt sind wir ganz tief in den Pop-Rätchen, ja.

Johannes

Genau, mein, mein eigentlicher Pick

Johannes

ist was ganz anderes, äh, und zwar,

Johannes

äh, das ZDF

Johannes

hat ja eine Mediathek, und, äh,

Johannes

auf dieser Mediathek kann man Sachen ansehen, und wenn man

Johannes

ein paar Sachen angesehen hat, dann versucht das ZDF

Johannes

da Recommendations, äh,

Johannes

draus zu machen. Wow, das ist das

Johannes

erste Mal seit Ewigkeiten,

Dominik

dass ich von Fernsehen etwas höre.

Dominik

Du meinst das ZDF, meinst du das tatsächliche

Dominik

Fernsehen, was, ja, ähm,

Dominik

das, äh, das, äh,

Johannes

das zweite deutsche Fernsehen, meine ich, ähm,

Johannes

und, äh,

Johannes

die, also nur die Mediathek.

Johannes

Und, ähm,

Johannes

weil das ZDF ja in öffentlich-rechtlicher

Johannes

Hand ist, haben die sich gesagt, eigentlich müssen

Johannes

wir das ja den Leuten zurückgeben, und das haben sie tatsächlich

Johannes

gemacht. Die haben ihr Recommendation-System,

Johannes

ähm, auf GitHub

Johannes

gepackt, und man kann das jetzt ansehen.

Johannes

Und dann GitHub ZDF minus

Johannes

Open Source, äh,

Johannes

gibt's auch jetzt schon ein Repository drunter,

Johannes

das heißt Recommendations PA Base,

Johannes

ähm, und da sind,

Johannes

da ist das Recommendation-System

Johannes

vom ZDF drin, und fand ich einfach spannend,

Johannes

ähm, das mal anzusehen,

Johannes

weil da ja doch, ähm,

Johannes

auch einiges an Arbeit drinsteckt,

Johannes

und weil's da auch viele Firmen gibt, die sowas gerne hätten.

Johannes

Genau, das war's von mir.

Johannes

Stefan, hast du noch was für uns dabei?

Stefan

Ja, ich hab noch was rausgefunden, das ist schon

Stefan

ein älterer Artikel, ähm, vom

Stefan

Bob Nystrom aus dem Jahre 2015,

Stefan

ähm, heißt

Stefan

What Color Is Your Function?

Stefan

Und Bob Nystrom ist, ähm, einer der, der

Stefan

Sprachdesigner, ähm,

Stefan

der jetzt aktuell an Dart arbeitet,

Stefan

ähm, und das ist sehr spannend,

Stefan

weil er versucht zu erklären,

Stefan

anhand von, von Farben,

Stefan

ähm,

Stefan

wie, wie sich

Stefan

normale Funktionen und asynchrone Funktionen

Stefan

in, im Sprachdesign

Stefan

unterscheiden. Also rein

Stefan

aus der Perspektive von, welche Herausforderungen

Stefan

kriegst du als Sprachdesigner, wenn du

Stefan

so ein Async-Await-Konstrukt

Stefan

gestalten musst.

Stefan

Ähm, und wie gesagt, der ist schon ewig alt, aber er ist

Stefan

vor kurzem wieder bei uns in, in, äh,

Stefan

in der Firma aufgeprobt, kann ich sehr empfehlen.

Stefan

Ähm, versuch das so zu erklären,

Stefan

dass du das, die, die, die

Stefan

Ergebnisse, ähm,

Stefan

oder die Erkenntnisse in, in Python

Stefan

genauso anwenden kannst.

Stefan

Und hab ich, finde ich immer wieder sehr

Stefan

interessant. Gehe sehr oft

Stefan

wieder drauf zu.

Stefan

Für die Programmiersprachen Interessierten.

Jochen

Ja, ne, sehr cool.

Jochen

Also ich den, äh, quasi diese Analogie oder

Jochen

diese Metapher hab ich auch schon häufig gehört. Ich wusste

Jochen

aber nicht, wo sie herkommt und, äh, ja, das muss ich

Jochen

auch hier nochmal lesen. Ne, da gibt's tatsächlich noch was

Jochen

Älteres. What color are your bits?

Johannes

Äh, ist von 2004.

Johannes

Da geht's um die Herkunft

Johannes

von, äh, von

Johannes

Bits. Also ob deine Bits, äh,

Johannes

äh, urheberrechtlich geschützt sind oder nicht.

Johannes

Okay. Was du damit

Johannes

machen kannst, um die Farbe, damit sie die Farbe

Johannes

ändern. Aber das ist, äh, ja.

Johannes

Also ich, äh, musste da auch zuerst dran denken. Also es

Johannes

scheint eine gute Metapher zu sein. Wir können

Johannes

das ja beides verlinken. Ja.

Johannes

Sehr gern. Ja.

Johannes

Ja, vielen Dank. Cool. Ich würde sagen,

Dominik

herzlichen Dank, dass ihr heute alle wieder da wart.

Dominik

Herzlichen Dank, Stefan. Herzlichen Dank, Johannes.

Stefan

Ja, danke für die Einladung. Freut mich sehr.

Dominik

Sehr gern. Und dann, ja, ähm,

Dominik

bleibt uns gewogen, schaltet uns wieder ein,

Dominik

hört uns, wo immer ihr gerade seid, morgens, mittags, nachts,

Dominik

abends, tagsüber zum Schlafen,

Dominik

zum Einschlafen. Ähm,

Dominik

einen wunderschönen Tag.

Dominik

Bis bald. Tschüss.

Dominik

Ciao. Tschüss.