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 ja nicht so viel gesammelt.

Jochen

Heißt ein 3.12.1.

Jochen

Genau, das ist natürlich irgendwie, es stand irgendwie dabei, so 400 Bugfixes und so, also sollte man wahrscheinlich mal installieren und meine Frage dazu wäre halt, bist du jetzt schon umgestiegen auf 3.12, weil du wolltest ja immer nur die erste meiner Version abwarten, aber dann auch, ja?

Dominik

Ja, also noch nicht mit allen Sachen, aber

Dominik

mit vielen Sachen.

Dominik

Also 3.12, das ist bei 1 draufgekommen und

Dominik

jetzt in meinem Systeminterpreter

Dominik

zum Beispiel ist das auf 3.12.

Jochen

Hervorragend. Tja, aber ich glaube

Jochen

da war nichts,

Jochen

also außer Bugs ist da nichts irgendwie

Dominik

passiert. Mein Hauptproblem im Moment

Dominik

ist halt PyTorch oder sowas, wo es auch im

Dominik

Dezember einen Release gab, dass es jetzt endlich mit 3.11

Dominik

funktioniert. Ah, ja, ja.

Jochen

Ja, ansonsten

Jochen

genau neue Releases. Es gab

Jochen

neue Ruby on Rails

Jochen

Release. Ich gucke da ab und zu mal so

Jochen

rüber, weil ich halt interessant finde, wie viel

Jochen

tolles

Jochen

Zeug da passiert. Und das ist jetzt

Jochen

deutlich schneller geworden.

Jochen

Hat irgendwie einen eingebauten

Jochen

Time-Compiler und

Jochen

verwendet jetzt einen ähnlichen

Jochen

Ansatz für den Parser, wie

Jochen

Python halt auch. Python ist ja jetzt mit

Jochen

3.9 auf dem Pack-Parser umgestiegen.

Jochen

Und das

Jochen

ist, Ruby verwendet da jetzt was

Jochen

ganz ähnliches. Ist auch so ein

Jochen

rekursives Dings da, Parsen

Jochen

ich weiß nicht, ich habe es wieder vergessen, wie das

Jochen

genau heißt, so ähnlich. Und sie sind

Jochen

auch umgestiegen von Bison, also dem Pasa-Generator

Jochen

auf den anderen. Ich habe, finde ich, schon ganz oft

Dominik

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

Jochen

sagen. Ja, und auch bei dieser

Jochen

ganzen Just-in-Time-Compile-Geschichte,

Jochen

da ist, glaube ich, einer

Jochen

der Hauptsponsoren auch Shopify.

Jochen

Ja, genau.

Jochen

Also es gibt ja viele große

Jochen

Unternehmen, die hauptsächlich

Jochen

auf Ruby und Rails-Moduliten basieren

Jochen

und da kommt halt auch

Jochen

eine Menge Geld rein.

Jochen

und ja, Python ist ja jetzt auch

Jochen

dran mit diesem Just-in-Time-Compiler

Jochen

Thema, da in 3.13 kommt das ja auch.

Johannes

Das wäre meine News gewesen, Jochen. Achso, sorry.

Johannes

Dann schieb's mal los.

Johannes

Ja,

Johannes

Ende Dezember

Johannes

ist wohl ein Patch in den 3.13

Johannes

Branch reingekommen, wo ein JIT-Compiler

Johannes

drin ist für Python. Also es ist jetzt

Johannes

richtig im Plan drin, dass Python

Johannes

in 3.13 einen JIT-Compiler hat, einen Copy-and-Patch

Johannes

JIT-Compiler, was

Johannes

auch immer das bedeuten mag.

Dominik

Da gab es auch angeblich eine wundervolle Diskussion

Dominik

auf Reddit zu...

Jochen

Ja, also

Jochen

es gibt einmal die, ich kann empfehlen,

Jochen

es gibt Core-PY, das ist

Jochen

ein Podcast, wo zwei der Core-Entwickler

Jochen

irgendwie drüber reden. Da gibt es eine

Jochen

Episode zum Just-In-Time-Compiler.

Jochen

Und dann... Wer sind dabei?

Dominik

Shannon und Sean? Oder wie ist das?

Jochen

Nee, das

Jochen

sind Pablo Galindo

Jochen

Salgado, der Release-Manager

Jochen

auch für die, für 3.13.

Jochen

Und, äh, Lukas Schlanger.

Jochen

Ah ja. Genau.

Jochen

Und, ähm, genau, die haben da einmal drüber geredet

Jochen

und, äh, daher weiß ich auch,

Jochen

dass das, ähm, das basiert

Jochen

hauptsächlich, also warum man das jetzt nochmal

Jochen

in Angriff nimmt, auf

Jochen

Geschichten, die in Lua passiert sind.

Jochen

Da gab's jetzt auch irgendwelche,

Jochen

ich hab jetzt wieder die Details vergessen, aber so

Jochen

Papers, äh, die sehr, sehr interessant

Jochen

aussahen und die halt vermuten lassen,

Jochen

dass man's relativ leicht, äh, irgendwie auch für Python

Jochen

verwenden kann und, ähm, ja, das ist

Jochen

halt ein InPython in, in, in,

Jochen

Ruby, da werden überall diese

Jochen

Dinger jetzt gerade eingebaut.

Jochen

Und hier der, der wegen dem PyPy

Jochen

auch hier war schon,

Jochen

der meinte

Jochen

auch so, oh, er muss jetzt mal sein

Jochen

Commit-Bit

Jochen

wieder

Jochen

hochfahren, quasi aus

Dominik

erneuern lassen. Ja, es gab ja immer, dass halt die neuen

Dominik

Versionen deutlich einfacher zu implementieren sind

Dominik

bei PyPy, wenn das drin ist,

Dominik

was da in C-Extensions irgendwie dazukommen

Dominik

sollte, wollte, wenn ich das

Dominik

richtig verstanden hatte damals.

Jochen

Ja, also jedenfalls, der macht da jetzt auch mit.

Jochen

Und das wird auf jeden Fall spannend.

Jochen

Ein schnelles Python.

Jochen

Ja, genau.

Jochen

Ja, ansonsten hätte ich jetzt noch das,

Jochen

ich habe ja jetzt mich auch hier an dieser Stelle

Jochen

schon irgendwie ein paar Mal beschwert

Jochen

über irgendwie sehr holprige Updates von Python.

Jochen

Über mich?

Jochen

Über dich.

Jochen

Entschuldigung.

Jochen

Ja, gut.

Jochen

Über Pydentic 2,

Jochen

über den Umstieg von Pydentic 1 auf 2.

Jochen

Und jetzt haben das andere Leute auch gemacht,

Jochen

Simon Willison hat da in letzter Zeit relativ viel zu gepostet,

Jochen

dass er das irgendwie ungünstig fand.

Jochen

Und da habe ich dann auch so Sachen gesehen wie,

Jochen

es gab da ein Issue zu, wo dann einer von Netflix oder so

Jochen

in relativ freundlichem Ton zunächst schrieb,

Jochen

das macht bei uns sehr viel Arbeit und das war jetzt alles nicht so günstig.

Jochen

Und ich habe dann geguckt, der hat dann auch irgendwann beschrieben,

Jochen

welche Issues, die da reingelaufen sind.

Jochen

Und das war halt zum Beispiel auch einer von den Dingern,

Jochen

in die ich da reingerannt bin.

Jochen

ja, genau, der meinte dann

Jochen

so, tja, also sauberer wäre es gewesen, wenn man

Jochen

das Paket irgendwie umbenannt hätte oder so

Jochen

und das wollten sie aber nicht machen

Jochen

und dann haben sie gesagt, nee, das geht auch

Jochen

so oder geht so, aber es ging alles nicht und es war

Jochen

relativ furchtbar, also

Jochen

gerade wenn man eine Library ist, hat man damit halt

Jochen

ein großes Problem, weil man nicht kontrollieren kann,

Jochen

was in der Applikation, die

Jochen

einen benutzt, halt irgendwie für eine

Jochen

Pidentic-Version ist und zum Beispiel

Jochen

FastAPI hat damit auch ein Riesenproblem gehabt

Jochen

und wie die das dann letztendlich gemacht

Jochen

haben, ist, sie haben halt so einen Flag eingeführt,

Jochen

Pydentic V2, und machen

Jochen

dann jetzt gerade sowas wie, if Pydentic

Jochen

V2, 500

Jochen

Zeilen eingerückt, irgendwie

Jochen

Kompatibilitätsleer, und dann

Jochen

else, und dann sonst, und das

Jochen

haben sie an mehreren Stellen, das ist wirklich absolut schrecklich.

Jochen

Naja, aber so sieht's halt

Jochen

aus, also das war, dieses Update war

Jochen

nicht wirklich

Jochen

reibungslos, sondern da haben

Jochen

viele Leute irgendwie eine Menge

Jochen

Schweiß gelassen, naja.

Jochen

Also nicht durch.

Dominik

Okay, also gut, wenn man es nicht zu sehr drin hat.

Dominik

Ich habe tatsächlich auch

Dominik

zwischendurch noch auf eins dependen müssen,

Dominik

weil da so bei zwei Sachen nicht so ging,

Dominik

was jetzt irgendwie geht, aber ja.

Dominik

Ein bisschen nervig.

Dominik

Johannes, hast du noch was?

Johannes

Nee, also in der TypeScript-Welt

Johannes

gibt es sowas nicht.

Johannes

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

Dominik

Apropos,

Dominik

ich habe gehört, dass ein neues Buch erschienen

Dominik

in der TypeScript-Welt.

Dominik

Echt, was? 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, das war die softeste Überleitung.

Stefan

Ja, das war der softeste Übergang,

Stefan

den der Dominik macht.

Stefan

Ich habe das jetzt total spannend gefunden,

Stefan

weil es wird ja immer so

Stefan

gemunkert,

Stefan

dass im Web-Bereich

Stefan

gibt es ja quasi alle drei Minuten

Stefan

irgendeinen neuen Fachbegriff

Stefan

oder irgendeinen neuen Bibliothek-Namen

Stefan

oder irgendein neues JavaScript-Framework,

Stefan

das irgendeinen abstrusen

Stefan

Namen hat, mit dem

Stefan

sie alle nachher irgendwie auseinandersetzen müssen.

Stefan

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

Stefan

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

Stefan

Den ersten Namen, den ich erkannt habe, das war FastAPI,

Stefan

weil tatsächlich, das ist spannend, ich bin jetzt seit vier, fünf Monaten

Stefan

bei uns in der Firma mit einer Gruppe Python-Developern unterwegs,

Stefan

Data Scientist, ganz klassisch, du hast einen Data Scientist

Stefan

und das Tool der Wahl ist Python, die Bibliotheken sind da,

Stefan

Das Übliche mit Langchain, Pipa Pro für diese ganze LLM-Sache.

Stefan

Und das war so mein erstes Intro in dieser Python-Welt.

Stefan

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

Stefan

Da gibt es ja dann Conda, Anaconda, Pep oder sind das ganz andere?

Stefan

Keine Ahnung. Also wie gesagt, das ist ja schon wieder vorbei.

Stefan

Aber ich weiß, dass ich FastAPI

Stefan

nach langen, langen Gesprächen mit unseren

Stefan

Python-Devs in unser Architektur-

Stefan

Diagramm eingetragen habe für

Stefan

irgendeinen Server, den wir gemacht haben.

Stefan

Das war eben das Erste, wo ich mir gedacht habe,

Stefan

da kenne ich mich jetzt aus, bei FastAPI

Stefan

da kann ich mitreden.

Stefan

Funktioniert

Stefan

Multithreaded, aber nicht Async.

Stefan

Ist das richtig?

Jochen

Also kann man wahrscheinlich so betreiben,

Jochen

wenn man wirklich will, aber nee, es ist tatsächlich

Jochen

Async. Also unter FastAPI

Jochen

liegt normalerweise

Jochen

so würde ich jetzt mal sagen, wenn man

Jochen

das so betreibt, wie es gedacht ist,

Jochen

halt Stalett

Jochen

beziehungsweise UV-Corn

Jochen

und das ist halt sozusagen die

Jochen

Lib-UV, also das ist halt eine Adaption

Jochen

von Nen-UV, was halt auch unter der

Jochen

Event-Loop bei Node.js

Jochen

liegt halt für Python.

Jochen

Ja, und also ist

Jochen

halt quasi genauso schnell dann auch

Jochen

und ist Async, ja.

Stefan

Cool. Das war die

Stefan

zweite, war dann, dass ich

Stefan

versucht habe, über

Stefan

PyO3 eine Brücke

Stefan

zwischen Async Rust und

Stefan

Async Python einmal zu schreiben. Das war spannend.

Stefan

Das war richtig cool.

Stefan

Was mich da beeindruckt hat,

Stefan

und mit dem habe ich nicht gerechnet, ist, dass

Stefan

das vollen Frankischen Interface von Python

Stefan

ja fantastisch ist.

Stefan

Also du hast dort dein kompiliertes

Stefan

SO-Modul dazu und du kannst

Stefan

auf die Objektliste zugreifen

Stefan

und kannst die Identifier herauslesen.

Stefan

Also das Kompilieren

Stefan

vom Rust-Code war auf jeden Fall anspruchsvoller,

Stefan

als wir nachher die Symbole in Python

Stefan

zu loben und zu verwenden, das war richtig,

Stefan

richtig beeindruckend. Also

Stefan

coole Sache, möchte ich mir auf jeden Fall mehr anschauen.

Stefan

Aber das ist es. Also das sind

Stefan

meine Python-Kenntnisse.

Dominik

Ja, aber ich finde auch, das Benutzen von

Dominik

Python ist halt das, was so Spaß macht.

Dominik

Also High-Level-Interface,

Dominik

ich glaube, ist sehr gut geeignet.

Dominik

Py3, auch ein cooles Beispiel. Da gibt es die meisten

Dominik

Sachen, die es irgendwie kann. Ich glaube, was es nicht kann, ist

Dominik

irgendwie Iteratoren

Dominik

ausspucken, richtig, oder so, oder Generatoren.

Dominik

Ja, das wird wahrscheinlich schwierig sein.

Dominik

Das kann ich mir gut vorstellen.

Dominik

Keine Ahnung.

Stefan

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

Stefan

und sehr schwierig, in andere Sprachen zu integrieren, nehme ich mal an.

Dominik

Ja, aber ich hatte ja als News ja auch quasi noch ein bisschen Werbung gemacht für dein Buch.

Dominik

Vielleicht willst du dazu noch irgendwie kurz was sagen?

Dominik

Ja, dankeschön. Danke für diese Überleitung.

Stefan

Ich habe tatsächlich in den letzten Jahren TypeScript-Bücher geschrieben.

Stefan

Das erste Buch, das ich geschrieben habe, war in 2020 TypeScript in 50 Lessons,

Stefan

das beim Smashing Magazine Verlag rausgekommen ist,

Stefan

das als angenehmer, unaufgeregter Einstieg in TypeScript als Typsystem auf JavaScript gedacht ist.

Stefan

Das Zielpublikum waren Entwicklerinnen und Entwickler, die JavaScript schon kennen,

Stefan

sich dort auch schon wohlfühlen und jetzt merken, jetzt müssen sie TypeScript verwenden,

Stefan

Wir brauchen die Info, warum man das erstens überhaupt haben will und zweitens, wie das jetzt so richtig funktioniert und warum es da so viel Syntax gibt und warum das so kompliziert ausschaut und versucht, das grundlegende System, Typsystem runterzubrechen auf einfach zu verdauende Lektionen.

Stefan

Genau, das war das Ziel von dem Buch, das habe ich dann zufälligerweise in 50 Lektionen geschafft, das war ein Riesenspaß, das war quasi mein Corona-Projekt, mein erstes Lockdown-Projekt, wobei es stimmt nicht, ich habe zwischen dem ersten und dem zweiten Lockdown tatsächlich das meiste geschrieben.

Dominik

Das ist auch tatsächlich ein Schicksal, das sieht auch super aus, also von außen, wenn du in den Schrank stellst.

Jochen

Wir wissen das, weil wir dieses Buch auch alle haben, zwar als Paltenentwickler, was natürlich auch schon was heißt.

Stefan

Das macht mich irrsinnig happy.

Stefan

Ihr kennt sich das nicht vorstellen.

Stefan

Das sind diese unglaublich schönen Momente,

Stefan

wenn man sieht,

Stefan

dass das Buch tatsächlich an Leute kommt

Stefan

und Leute das verwenden.

Stefan

Also die Lesepäntchen gesehen herrlich spitze.

Stefan

Und die Optik ist wirklich ganz, ganz besonders,

Stefan

weil das war eigentlich auch ein Grund,

Stefan

warum ich mit Smashing Magazine zusammenarbeiten wollte.

Stefan

Die haben einfach irrsinnig viel Liebe zum Detail

Stefan

und versuchen wirklich sehr individuelle Bücher zu machen,

Stefan

haben eine wunderschöne Typografie,

Stefan

die sauber zu lesen ist

Stefan

und verzetteln sich dann in kleinen Finessen so stark.

Stefan

Und ich habe zum Beispiel,

Stefan

das Cover wurde gestaltet von Rob Draper,

Stefan

den habe ich tatsächlich in Düsseldorf kennengelernt,

Stefan

auf der Björn Tellerrand,

Stefan

der als Künstler die Intro-Grafiken

Stefan

zu den Golden Globes gemacht hat,

Stefan

für Nike und BMX-Fahrräder

Stefan

beziehungsweise Schuhe designt hat.

Stefan

Und der mich gefragt hat,

Stefan

ich habe ihm eine E-Mail geschrieben,

Stefan

hey, der Robert ist cool,

Stefan

möchtest du mein Buch designen?

Stefan

Ja, passt. Und ich habe gedacht, hey, wow, cool.

Stefan

Ich hoffe, er kostet jetzt nicht eine Million oder so.

Stefan

Und er hat tatsächlich dann unser Buch, also das Buch gestaltet,

Stefan

also versucht er mit diesem Kapitel in Lays ein bisschen das Ganze zugänglich zu machen,

Stefan

freundlich zu machen. Das war uns ganz, ganz wichtig.

Stefan

Und die Person, die nachher, also die Ari, die nachher das Ganze gesetzt hat

Stefan

und versucht hat, ein Produkt daraus zu machen, hat dann auch recherchiert

Stefan

und hat zum Beispiel das Lesebändchen, das rote Lesebändchen,

Stefan

in der Farbe bestellt von den roten Unterlinien in Visual Studio Code.

Stefan

Das heißt, das ist der gleiche Farbton.

Stefan

Und so tief ins Detail geht es dort.

Stefan

Und das ist halt einfach absolut herrlich für mich,

Stefan

der praktisch nur den Text beigetragen hat,

Stefan

dass du siehst, wie andere Leute sich so investieren in dieses Projekt

Stefan

und versuchen, gemeinsam da irgendwas Cooles draus zu machen.

Stefan

Also da kriege ich heute noch Gänsehaut.

Stefan

Und es ist ja für mich so, ich weiß, es ist mein Buch, aber es ist nicht nur mein Buch.

Stefan

Also da sind so viele Leute daran beteiligt gewesen.

Stefan

Es war ein irrsinnig cooler Effort von so vielen Menschen.

Stefan

Und das macht mich einfach jedes Mal wieder glücklich,

Stefan

wenn ich dann sehe, dass das Leute auch so sehen, sie das in die Bücherregale stellen.

Stefan

Oder das Beste, was du machen kannst, hast du einen Zoom-Call,

Stefan

stell es in den Hintergrund und schick mir ein Foto von dem Zoom-Call.

Stefan

Das ist das Allerbeste. Das macht mir die größte, größte Freude.

Stefan

Es hat eine Freude für mich gemacht, wie er ein Interview für sein Start-up gemacht hat.

Stefan

Auf einmal sehe ich, da ist mein Buch im Hintergrund.

Stefan

Herrlich, also macht riesen Spaß.

Stefan

Das war das erste TypeScript-Buch.

Stefan

Ich habe dann noch ein zweites TypeScript-Buch geschrieben.

Stefan

Das ist erst im September rausgekommen, also ist noch ganz, ganz frisch.

Stefan

Das ist das TypeScript-Cookbook, das jetzt mit O'Reilly veröffentlicht worden ist.

Stefan

Das war praktisch eine Auftragsarbeit.

Stefan

Also O'Reilly hat so diese Acquisition Editors, die suchen halt noch potenziellen Autoren,

Stefan

schlagen denen Buchprojekte vor oder schlagen vor, hey, möchtest du zu dem Thema was schreiben?

Stefan

Und sie haben gesagt, sie wollen ein TypeScript-Buch veröffentlichen in diesem Stil wie TypeScript in 50 Lessons,

Stefan

ob ich mir vorstellen kann, noch ein solches zu schreiben.

Stefan

Und am Anfang haben wir gedacht, nein, das geht nicht, ich habe jetzt schon ein Buch geschrieben,

Stefan

ich habe halt einfach eine gewisse Ansicht, eine gewisse Stimme, eine gewisse Idee zu dem Ganzen.

Stefan

Habe aber gedacht, naja, meine Saisonreile probierst du doch mal, dass du kurz ein Inhaltsverzeichnis unterschreibst, wie du dir ein zweites Buch vorstellen kannst. Und gerade habe ich 100 weitere Einträge gehabt innerhalb von drei Stunden. Also ich bin mir am Nachmittag hingesetzt und habe gedacht, ups, wow, da ist ein Buch da.

Stefan

Ich bin mit denen in einen Vertrag gegangen und habe dann versucht, den Nachfolger vom TypeScript in 50 Lessons Buch zu schreiben.

Stefan

Wenn du in TypeScript in 50 Lessons lernst, wie das Typsystem funktioniert, lernst du im TypeScript QuickBook alle Dinge, die schief gehen können.

Stefan

Dinge, die, wenn du wirklich Programme damit schreibst, wo du merkst, da passt gerade was nicht,

Stefan

da spielt das Typsystem nicht so mit, wie ich mir das denke,

Stefan

beziehungsweise brauche ich halt irgendeine Technik oder irgendein Prinzip oder irgendein Pattern,

Stefan

das ich anwenden kann, um einem gewissen Problem.

Dominik

Im Moment, ich dachte jetzt, so Typen hast du damit nichts mehr schief gehen kann.

Dominik

Und mit Typen, mit sicheren statischen Typen sind die Sprachen immer ganz besonders gut.

Stefan

Genau, da beschreibt man nur mehr Programme, die nur mehr funktionieren und man hat keine Bugs mehr und es ist super-happy.

Stefan

Ja, genau.

Dominik

Ja, also ich bin eine super Überleitung tatsächlich auf das Thema, was wir heute machen wollen, oder?

Dominik

Ja.

Dominik

Also ganz herzlichen Dank, dass du heute da bist, Stefan, das freut uns sehr.

Dominik

In Python haben wir ja von Typen auch schon

Dominik

das eine, andere Mal am Rande gehört.

Jochen

Ja, wir haben diese Episode immer lange vor uns hergeschoben,

Jochen

weil wir uns nie ausreichend vorbereitet

Jochen

gefühlt haben dafür, weil das halt so ein großes Thema ist.

Jochen

Es gibt auch eine ganz große Anti-Fan-Gemeinde

Jochen

in Python für Types irgendwie.

Jochen

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

Stefan

Wie seid ihr

Stefan

da so drauf? Also

Stefan

habt ihr jetzt Typen schon in eurem Python-Code drinnen

Stefan

oder ist das eher noch so das Buch mit

Stefan

sieben Siegeln, das ihr nicht öffnen wollt?

Dominik

Annotationen nutze ich persönlich sehr gerne

Dominik

insbesondere dann, wenn ich mit anderen Menschen

Dominik

arbeite, um einfach so zu dokumentieren,

Dominik

was macht das denn überhaupt.

Dominik

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

Dominik

Das ist aber gefährlich damit.

Jochen

Ja, also ich

Jochen

verwende sie auch schon und ich habe halt

Jochen

ein Projekt mal so komplett

Jochen

irgendwie annotiert, einfach nur auch,

Jochen

weil ich wissen wollte, wie schwierig ist es

Jochen

denn nun, wie weh tut es denn

Jochen

irgendwie.

Jochen

Und ja, das ging schon,

Jochen

aber es war auch, also ich habe

Jochen

da jetzt nicht so wahnsinnig viel

Jochen

irgendwie

Jochen

Nutzen rausziehen können, aber

Jochen

ich hatte auch vorher neben dem Ding halt auch schon

Jochen

100% Test-Coverage, insofern

Jochen

war da einfach wahrscheinlich nicht mehr so viel

Jochen

zu, ja auch

Jochen

das habe ich ja gemacht, um es mal

Jochen

gemacht zu haben.

Dominik

Ich habe tatsächlich in den Projekten bei mir jetzt Enforced

Dominik

MyPi Precommit Hook.

Dominik

Das ist auch schon, damit gehe ich ziemlich vielen

Dominik

Leuten auf die Nerven, aber

Johannes

Gut, dann kannst du überall Objekt hinschreiben, oder?

Johannes

Das zählt doch auch. Ja, okay, also

Dominik

da sind die meisten noch nicht draufgekommen.

Johannes

Oh, da habe ich jetzt ein Geheimnis

Johannes

verraten, hups.

Stefan

Annie, oder? Annie, Annie.

Stefan

So, zack.

Stefan

Also ich bin beeindruckt von der 100%

Stefan

Test-Courage. Also ich bin

Stefan

leider Gottes der faulste

Stefan

Tester.

Stefan

Diesseits der Donau.

Stefan

Ich sage immer,

Stefan

also ich habe diesen Spruch

Stefan

gehabt, wie ich noch in einer Agentur gearbeitet habe,

Stefan

dass ich sage, ja, getestet wird beim Kunden,

Stefan

nicht, wenn es in Production ist, es soll reichen.

Stefan

Aber ich, keine Ahnung, liegt es an der Software,

Stefan

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

Stefan

Ich bin sehr, sehr selten jemand,

Stefan

der wirklich ausgiebige Testsuit schreibt.

Stefan

Also das ist, glaube ich,

Stefan

als ich auch Schärfe habe, das ist, glaube ich,

Stefan

meine größte Schwäche.

Stefan

Ja, 100% Courage ist auch schon sehr...

Stefan

Ja, ich finde es beeindruckend, wirklich.

Johannes

Ja, das haben wir in dem Projekt, in dem ich bin,

Johannes

Ach, 100%, also 100% Branch

Johannes

Coverage sogar. Und

Johannes

TypeScript. Also es ist ja oft

Johannes

so, dass man das so ein bisschen als

Johannes

gegensätzliche Pole ansieht,

Johannes

sag ich mal. Die einen machen Typen und die anderen machen

Johannes

Testing. Und das ist schön, Stefan,

Johannes

dass du das jetzt bestätigt hast, aber

Stefan

Ich bin quasi

Stefan

das Typen-Paradebeispiel.

Stefan

Ich meine, das Ding ist,

Stefan

JavaScript und Python

Stefan

haben ja die gleiche Eigenschaft,

Stefan

dass beides in der Praxis

Stefan

dynamisch typisiert

Stefan

Sprachen sind. Sprich, natürlich gibt es

Stefan

Typen, sonst könntest du mit den ganzen Werten nichts

Stefan

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

Stefan

ist. Du kannst dann

Stefan

ein Number oder ein Integer einer

Stefan

Variable zuweisen und im nächsten Schritt

Stefan

dann String und keiner regt sich auf und keiner beschwert sich.

Stefan

Das funktioniert halt einfach.

Stefan

Oder du kannst verschiedene Typen mischen. Du kannst

Stefan

ein String mit einer Zahl kombinieren.

Stefan

Das geht nicht.

Stefan

Okay, cool. Dann seid ihr schon mal einen Riesenschritt weiter

Stefan

als in JavaScript.

Johannes

Das ist ja das große Problem an JavaScript, oder?

Johannes

Dass du solche implizite Konversionen

Johannes

drin hast. Ja, also

Jochen

das heißt ja immer weak getyped

Jochen

versus strong getyped, aber

Jochen

ich weiß nicht, ob das irgendein Sinn ergibt.

Johannes

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

Stefan

Also die schöneren

Stefan

Bezeichnungen sind meiner Meinung nach statisch und

Stefan

dynamisch, wo du einfach weißt, okay,

Stefan

definierst du den Typen im Vorhinein

Stefan

oder wird er definiert durch die Verwendung?

Stefan

Weak und strong,

Stefan

also schwach und stark,

Stefan

sind sehr

Stefan

schwache Bezeichnungen, meiner Meinung

Stefan

nach. C zum Beispiel hat

Stefan

ein statisches

Stefan

Typsystem, aber ein sehr, sehr schwaches. Ob du jetzt

Stefan

einen Character hast oder ein Integer oder irgendwas anderes,

Stefan

es ist einfach komplett wurscht.

Johannes

Du kannst alles damit machen. Und kannst auch hin und her wechseln

Johannes

und kannst auch Bitfiddling mit allem möglichen

Johannes

Scheiß machen. Genau, genau, genau.

Stefan

Wundervolle Bühne. Und vor dem

Stefan

ist das Statische eigentlich das Wichtige,

Stefan

weil es eine ein bisschen andere Herangehensweise

Stefan

ans Programmieren

Stefan

voraussetzt.

Stefan

Du machst dir einfach mehr Gedanken über

Stefan

die

Stefan

mögliche Wertemenge

Stefan

einer Variable, bevor du

Stefan

an wer zuweist. Das schließt jetzt nicht aus,

Stefan

dass du sagen kannst, hey, du bekommst

Stefan

einen Typen durch Typ-Inferenz, das mache

Stefan

ich sehr, sehr gerne, weil ich sage, hey, diese Variable

Stefan

x ist 3 und dann weißt du,

Stefan

dass das ein Number oder Integer oder was auch immer ist.

Stefan

Das geht natürlich auch, das machen auch moderne

Stefan

Programmiersprachen sehr, sehr, sehr gerne.

Stefan

Grundlegend, dass du halt

Stefan

mit wenig Annotationen machen kannst.

Stefan

Nichtsdestotrotz

Stefan

definierst du Verträge zwischen

Stefan

Bausteinen deines Codes, zwischen den Functions,

Stefan

zwischen Methoden in deinen Klassen etc.,

Stefan

in denen du sagst, du erwartest aber jetzt diesen Wertebereich und nichts anderes

Stefan

und du lässt auch nichts anderes zu.

Stefan

Und TypeScript ist meiner Meinung nach da sehr, sehr spannend,

Stefan

weil TypeScript versucht, eine sehr dynamische, dynamisch typisierte Programmiersprache

Stefan

und generell sehr dynamische Programmiersprache wie JavaScript

Stefan

in einer gewissen Art und Weise 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 da eigentlich vor sich geht.

Stefan

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

Stefan

wieder zurückgehst und dir fragst, was war denn diese Variable X nochmal?

Stefan

Also was habe ich mir da eigentlich gedacht?

Stefan

Und dann hast du irgend so eine fette Wurst am Code und musst herauslesen,

Stefan

was du eigentlich damit machst.

Stefan

Und das ist etwas, was mich immer komplett verwirrt hat.

Stefan

Ich habe da nie ein funktionales Programmierparadigmen ausprobiert,

Stefan

viel mit asynchronen Promises gearbeitet in Not.

Stefan

Irgendwelche dynamischen Objekte gehabt, wo ich ständig neue Keys hinzugefügt habe

Stefan

und wieder entfernt habe.

Stefan

Und das war kurz und effektiv und schnell und schön.

Stefan

Und drei Monate später habe ich nicht mehr gewusst, was ich dort mache.

Stefan

Wenn ich das Programm heute lese, ich kenne mich nicht aus.

Stefan

Und ich würde es auch heute nicht mehr so machen.

Stefan

Einfach weil, gut österreichisch, sorry, Graut und Ruben einfach zusammenschmeißt und hofft, dass am Ende alles funktioniert.

Stefan

Und das ist gut für kleine Skripte, das ist gut, wenn du irgendwie geschwind was runterheckst.

Stefan

Aber wenn ihr wirklich mit einem Team versucht, reale Software zu machen, dann ist das, glaube ich, die niedrigste Schwelle, die du hast,

Stefan

um zu dokumentieren, was jetzt von deiner Software und von den Nutzern deiner Software überhaupt erwartet wird.

Stefan

Und ich glaube, deswegen sind Typen so wichtig. Und deswegen, glaube ich, sind Typen auch in Python sehr, sehr interessant, weil du ja da die gleichen Voraussetzungen hast. Also du musst ja wissen, was erwartet jetzt deine Funktion dort. Und je mehr Bibliotheken, die du hast, wie gesagt, ich wäre schon gesagt, ich bin jetzt in diesem Luncheon und LLM-Wahnsinn irgendwie gefangen, da hast du sehr, sehr komplexe Objekte, die du da hin und her schickst.

Stefan

Woher sollst du wissen, oder woher soll ich wissen, der kein Python schreibt, sondern nur lest, was da jetzt eigentlich erwartet wird und was ich da rauskriege?

Dominik

Das finde ich auch, also das tatsächlich so als Dokumentationstyp

Dominik

für Python ist das, was ich auch am häufigsten

Dominik

gerne mag, also in kleinen Closures,

Dominik

in kleinen Methoden oder Funktionen irgendwie

Dominik

die Argumente so zu annotieren,

Dominik

dass beim Riesen klar wird, was denn

Dominik

der Mensch da haben möchte, der

Dominik

diese API bereitstellt,

Dominik

dass ich das irgendwie zusammengebaut kriege oder so, oder

Dominik

verstehe, 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.

Johannes

Also ich finde, dass das Argument, was der Dominik bringt, das stimmt, wenn man nur simple Funktionen hat. Also wenn man wissen will, ob da jetzt ein Integer oder ein String rein muss. 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 irgendwelche benannten Typen, die irgendwelche interne Struktur haben, die völlig opak ist und dann hast du 17 verschiedene Varianten davon und am Ende weißt du genauso wenig, was da rein muss und was nicht. Und das hat alles so seine Grenzen.

Jochen

Ja, ich habe letzte Woche mit einem Freund telefoniert, da haben wir uns auch kurz über Type Annotations unterhalten und der meinte so, ja, schön und gut und ich sehe die Vorteile und so, ich finde es einfach irgendwie hässlich, weil irgendwie, okay, die IDE, ja, okay, das ist eigentlich alles gesagt.

Jochen

die Ästhetik ist immer das Argument.

Jochen

Ja.

Jochen

IDE kann damit was anfangen oder so, wenn man das jetzt

Jochen

anguckt, der meinte so, ja, dann hat man bei den ganzen

Jochen

modernen Libraries heutzutage, dann hast du da

Jochen

irgendwie Funktionen und da hast

Jochen

du pro Zeile

Jochen

einen Parameter, weil da kommt immer

Jochen

der Name des Parameters, dann

Jochen

kommt halt die Typannotation,

Jochen

die einem nicht viel sagt und dann kommt nochmal ein Kommentar,

Jochen

der erklärt, was die Typannotation einem eigentlich

Jochen

sagen will und das dann so

Jochen

untereinander. Dann meinte er so, das erinnert mich total an

Jochen

C-Code aus den 80ern, ich weiß nicht,

Jochen

Ich mag das nicht.

Jochen

Das ist nicht Python.

Jochen

Ja, aber

Jochen

dieses Argument höre ich auch häufig, wenn man

Jochen

jetzt so bei den Alten,

Jochen

zum Beispiel übernächste Woche wieder

Jochen

oder als nächstes, ich weiß nicht.

Jochen

Auch hier aufs Python-User.

Jochen

Und das nächste, nächste Mittwoch.

Jochen

Das nächste Woche, ja.

Jochen

Genau, gehen. Da gibt es dann die

Jochen

alteingesessenen,

Jochen

die sagen auch immer so,

Jochen

immer nur Aks, Quaks, Sternchen, Sternchen.

Jochen

Nein, das nicht, aber

Jochen

Jaja, aber das ist schon so ein Punkt,

Jochen

mit dem viele Probleme haben, ja.

Stefan

Ich kenne genug Python, dass ich den Witz

Stefan

mit Aks-Quaks verstanden habe.

Johannes

Da gehörst du schon

Johannes

zu den Oberlehrern.

Johannes

Ja, also gut, also

Stefan

ich

Stefan

bin immer sehr kritisch,

Stefan

wenn es darum geht, dass man

Stefan

die Ästhetik bewertet, weil

Stefan

ich schreibe sehr viel in Rust. Rust ist

Stefan

eine sehr unästhetische Sprache. Du hast

Stefan

quasi, hey, wie viel Syntax

Stefan

kann eine Programmiersprache vertragen? Und Rust sagt,

Stefan

Ja, also her damit.

Stefan

Aber dafür ist mir halt

Stefan

zu jedem Zeitpunkt absolut

Stefan

hundertprozentig klar, was passiert.

Stefan

Und das ist halt auch ein Vorteil,

Stefan

den man nicht leugnen kann. Gerade wenn man in Teams

Stefan

arbeitet. Und da nehme ich halt die paar

Stefan

Annotationen, die ich da habe, einfach hin.

Stefan

irgendwas hat jetzt da geblinkt, ich bin kurz rausgekommen.

Stefan

Und verstehe zumindest,

Stefan

was passiert. Und ich muss ganz ehrlich sagen,

Stefan

was ich rein jetzt sehe von dem, was

Stefan

wie Python

Stefan

Typings umsetzt,

Stefan

ist das eh sehr

Stefan

minimalistisch. Also da kann man sich noch

Stefan

weit, weit mehr verausgaben. Also ich finde das gar nicht

Stefan

einmal so hässlich.

Johannes

Ja, ich finde

Johannes

das Problem ist halt, dass

Johannes

diese Typsysteme

Johannes

oft zu weit getrieben werden.

Johannes

Und das treibt dann Blüten.

Dominik

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

Johannes

Genau, für alles und jedes. Und das muss dann alles ein benannter

Johannes

Typ sein und das geht dann,

Johannes

Also ich habe hier ein Beispiel aus der Apple-Dokumentation.

Johannes

Da gibt es einen Typen, der heißt

Johannes

CN Label Contact Relation Younger Cousin,

Johannes

Mother, Siblings, Daughter or Father, Sisters, Daughter.

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, das erste ist ein Object, das heißt Makro.

Johannes

Das zweite ist ein Object, das heißt Arc 1.

Johannes

Das dritte ist ein Object, das heißt Arc 2.

Johannes

Und so geht es weiter bis Arc 30.

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

Und es gibt halt da diese Fetischisten, die sagen,

Johannes

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

also auf dem anderen Bergerl gegenüber, wohnt einer der Erfinder vom Spring-Framework.

Stefan

Also wir kennen uns, unsere Kinder gehen gemeinsam in die Schule und solche Sachen.

Stefan

Und da gibt es eine Klasse, das ist die Has this type pattern tried to sneak in some generic or parameterized type pattern matching stuff anywhere visitor.

Stefan

Und das ist fantastisch.

Stefan

Also bei uns in der Firma haben die Java-Developer diese Weißkin-Monitore,

Stefan

aber nicht, dass sie irgendwie dort mehrere Fenster nebeneinander hinkriegen,

Stefan

sondern ich sage immer, das ist, damit sie die Klassennamen ohne Zeilenhundbruch durchstehen können.

Stefan

Und das ist natürlich, das ist Mumpitz, das ist ganz klar.

Stefan

Ich denke, man muss die ganzen Sachen immer ein bisschen pragmatischer sehen

Stefan

und halt auch einen richtigen Nutzen oder wissen, welchen Nutzen man daraus zieht.

Stefan

Das gilt für alles in der Softwareentwicklung meiner Meinung nach.

Stefan

Das ist der Anzug.

Stefan

Genau. Was ich am liebsten habe zum Beispiel,

Stefan

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 mein Software am Ende ausschaut.

Stefan

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

Stefan

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

Types gibt. Also gerade auch in meinem Buch gibt es

Stefan

ein paar Beispiele drinnen.

Stefan

Da kann man sich schon 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

Stefan

dafür 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

wie Currying, versuchen, auf drei sehr, sehr komplexe Orten umzusetzen und zu sagen,

Stefan

aber überleg dir, ob diese Typen jetzt das gerechtfertigen, was du da als Funktion schreibst,

Stefan

oder ob du nicht lieber eine Funktion nimmst, die viel, viel weniger kann,

Stefan

aber genauso einfach zu verwenden ist und die einfach zu typisieren ist,

Stefan

mit der du besser die Typinformationen rauskriegst.

Stefan

Und das stelle ich dann auch so zur Diskussion.

Stefan

Also man muss halt immer abwägen können, wie rechtfertigst du den Einsatz dieses Werkzeugs

Stefan

und wie weit treibst du das?

Dominik

Ja, ich glaube, das ist tatsächlich gar nicht so einfach rauszufinden.

Dominik

Ja, und

Dominik

ich glaube aber, dass da noch ein anderes Problem

Johannes

dahinter ist und ich bin sehr froh,

Johannes

Stefan, dass du da gesagt hast, dass du

Johannes

gegen Tests bist

Johannes

oder gegen große Testcoverage

Johannes

und du hast jetzt gerade eben so ein bisschen deinen Ansatz

Johannes

beschrieben, wie du Programme schreibst

Johannes

und du hast was gesagt,

Johannes

was meiner Meinung nach ganz wichtig ist.

Johannes

Du hast gesagt, du fängst an, ein Programm zu schreiben und weißt

Johannes

noch nicht, wie es am Ende ausschauen wird.

Johannes

Und das

Johannes

geht mir genauso. Und das ist einer

Johannes

der Gründe, warum ich

Johannes

Python

Johannes

mag, weil mir das die Freiheit

Johannes

gibt, da so explorativ rumzugehen,

Johannes

ohne mir groß Gedanken machen

Johannes

zu müssen, wie es denn jetzt sauber zusammenpasst.

Johannes

Und ich glaube, dass das ein Programmierstil

Johannes

ist. Ich nenne das

Johannes

exploratives Programmieren. Ich muss so ein bisschen

Johannes

diesen Space erkunden, muss so ein bisschen sehen,

Johannes

was kann ich, was schaffe ich, was mache

Johannes

ich. Und das ist halt

Johannes

mein Stil. Ich gehe da rein und sage, jetzt machen wir

Johannes

erstmal irgendwas. Es gibt aber auch Leute,

Johannes

die da vielleicht mathematischer

Johannes

rangehen und die sagen, okay, ich habe hier

Johannes

einen Plan und eigentlich auf dem Papier habe ich es ja

Johannes

schon hingeschrieben,

Johannes

dann kann ich auch die Tests zuerst schreiben, weil ich weiß

Johannes

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

Johannes

Oder ich kann gleich die richtigen Typen

Johannes

reinschreiben. Ja, da muss man sich ja das Akronym

Jochen

ändern und einfach Type-Driven-Development

Jochen

von einem neuen

Jochen

Stand starten.

Johannes

Und da

Johannes

ja, das

Johannes

sind, glaube ich, einfach zwei verschiedene

Johannes

Arten zu programmieren, die eben

Johannes

verschiedene Dinge eher bevorzugen.

Johannes

Es

Johannes

ist tatsächlich, glaube ich, auch ein bisschen von der Sprache

Stefan

abhängig, weil, also ich glaube,

Stefan

Python und JavaScript unterstützen ja diese Art

Stefan

des explorativen Programmierens sehr, sehr stark.

Stefan

Einfach eben in dem sie die Typen auch

Stefan

entfernen. Also du kannst sie wirklich einfach mal

Stefan

herumprobieren und schauen, was rauskommt.

Stefan

Und schauen, wie weit

Stefan

du mit deinen Ideen kommst.

Stefan

Was ich spannend finde,

Stefan

also ich bin jetzt seit einigen Jahren auch sehr,

Stefan

sehr stark im Lasten drin, ich habe das jetzt schon erwähnt, und sorry,

Stefan

Das ist der klassische Rust-Nutzer.

Stefan

Nicht, dass ich ständig sage, dass er Rust verwendet,

Stefan

aber es ist halt wirklich so.

Stefan

Die Sprache macht einiges sehr, sehr richtig.

Stefan

Du hast in Rust eine sehr stark typisierte Programmiersprache

Stefan

mit einem fantastischen Typsystem.

Stefan

Das ist grandios, dass das so funktioniert, wie es funktioniert.

Stefan

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

Stefan

dass du einfach nur mal schaust,

Stefan

wo kommst du mit deinen Wertebereichen überhaupt am Ende hin.

Stefan

Aber trotzdem schafft es Rust, dass du explorativ arbeiten kannst,

Stefan

weil einfach die Mittel, die zur Verfügung gestellt werden, so zugänglich sein können,

Stefan

weil die Typen, die von Haus aus schon drinnen sind, so entgegenkommen sind.

Stefan

Das heißt, du kommst mit ein paar Basistypen aus der Standardbibliothek

Stefan

und den üblichen Wertebereichen schon sehr, sehr weit,

Stefan

bevor du dir selbst deine eigenen Strukturen und Interfaces, nenne ich es jetzt einmal,

Stefan

heißen anders, überlegen musst.

Stefan

Und das ist sehr, sehr spannend.

Stefan

Es ist aber trotzdem ein anderer Wert des Programmierens.

Stefan

Also das Endresultat schaut auch dann anders aus.

Dominik

Also ich mag das aber auch gerne, so Models oder so Dataclasses irgendwie zu bauen

Dominik

und dann zu gucken, hey, was sind das denn überhaupt für Objekte

Dominik

und dir halt dann direkt zur Annotation zu verwenden.

Dominik

Das ist so strukturell sehr klar.

Stefan

Nein, es schließt sich auch nicht aus.

Stefan

Also ich denke mir, die Gefahr liegt wahrscheinlich,

Stefan

dass man sich auf eines komplett verschreibt.

Stefan

Auch das, was der Johannes wieder gesagt hat, ganz richtig ist,

Stefan

es ist am Ende des Tages ein Werkzeug und es muss irgendeinen Job erfüllen.

Stefan

Und wenn das gut funktioniert, dass du dir vorher Gedanken darüber machst,

Stefan

welche Daten du benötigst, dann ist das absolut legitim meiner Meinung nach.

Stefan

Also ich finde die gerade so angenehm.

Stefan

Wichtig ist, dass die Sprache mit der du arbeitest, das unterstützt.

Jochen

Ja, ich glaube auch eben.

Jochen

Aber ich meine, das hat natürlich einen Preis,

Jochen

weil es halt zusätzliche Komplexität unter Umständen halt auch einführt

Jochen

und es dann halt vielleicht auch unzugänglicher macht.

Jochen

Also worauf ich eigentlich hinaus will ist,

Jochen

naja, je nach Use Case kann es halt unterschiedlich nützlich sein.

Jochen

Also wenn man halt zum Beispiel eben in einem Team

Jochen

an einer großen Software schreibt,

Jochen

dann kann es halt sein, dass es sehr viel bringt,

Jochen

auch irgendwie möglichst viele Hürden zu errichten,

Jochen

bevor irgendwie Code...

Jochen

Du willst quasi gar nicht, dass die Entwickler irgendwas machen.

Jochen

Ja, das ist leider halt eine Strategie, das ist schwer zu unterscheiden von irgendwie, man versucht Fehler zu vermeiden, bevor sie dann produktiv gehen, zu bloß nicht deployen, was dann halt auch viele Leute machen, was halt irgendwie auch blöde Konsequenzen hat unter Umständen dann, weil also viele Sachen, also man hat dann zum Beispiel nicht nur ein Staging-System, sondern noch so drei andere oder vier andere und führt immer mehr hinzu, sodass man bloß nicht nach Produktionen deployen muss.

Dominik

Ich habe zwei Abteilungen bei uns kennengelernt, die haben einen Employment-Release-Zyklus so alle sechs Monate.

Jochen

Ja, genau. In den sechs Monaten passiert halt auch nichts, aber es ist halt vielleicht auch irgendwie ein Konflikt mit anderen Zielen.

Johannes

Hast du etwa diesen Artikel über Move Fast and Break Things gelesen, der kürzlich rausgekommen ist?

Johannes

Ja, genau.

Jochen

Ja, richtig.

Jochen

Genau, also an der Stelle macht es ja

Jochen

vielleicht, wenn man in so einer Situation ist,

Jochen

sehr viel Sinn, da

Jochen

von den Leuten zu verlangen, dass sie sich erst Gedanken

Jochen

machen und dass halt man versucht, möglichst viele

Jochen

Fehler zu fangen, bevor

Jochen

sie halt in der Produktion aufschlagen,

Jochen

weil da ist es halt viel teurer, sie halt zu

Jochen

entfernen. Aber

Jochen

es kann halt total anders sein, wenn jetzt jemand

Jochen

zum Beispiel, und das ist halt eine der Stärken

Jochen

bei Python, bei JavaScript

Jochen

auch ein bisschen anders,

Jochen

dass

Jochen

es halt vor allen Dingen auch von Leuten benutzt wird, die

Jochen

sich selber gar nicht als professionelle

Jochen

Programmierer sehen würden, sondern die eher sagen würden,

Jochen

naja, ich bin eigentlich eher so

Jochen

Data Scientist oder ein Analyst

Jochen

oder sowas oder halt

Jochen

irgendwie jemand, der irgendwie, keine Ahnung,

Jochen

Roboter irgendwie dazu bringt, irgendwie

Jochen

lustige Dinge zu machen oder sowas.

Jochen

Oder Teilchenbeschleuniger.

Jochen

Oder Teilchenbeschleuniger, also solche Sachen, genau.

Jochen

Und ich will gar nicht jetzt irgendwie

Jochen

Typtheorie

Jochen

verstehen oder irgendwie

Jochen

keine Ahnung, auch Unitests

Jochen

und da sind wir auch bei einem Ding, wo die

Jochen

Sachen so ein bisschen ähnlich sind. Also ich dachte auch

Jochen

lange Zeit irgendwie

Jochen

Unitests sind was ganz anderes

Jochen

und Typisierung

Jochen

ist ein

Jochen

anderes Ende von einem Spektrum und ich bin eher so

Jochen

Teamtest, aber inzwischen denke ich so, naja,

Jochen

das ist schon relativ ähnlich auch. Ich meine auch Unitesting

Jochen

ist halt so eine Sache, die man sich erst

Jochen

irgendwie erschließen muss und für manche Leute

Jochen

macht das einfach, wenn man halt irgendwie

Jochen

so in einem Jupyter-Notebook Sachen macht.

Jochen

Ja,

Jochen

manchmal macht es schon Sinn, das zu testen, aber für viele

Jochen

Leute ist es auch nicht, lohnt es sich, weiß ich nicht,

Jochen

ob es sich wirklich lohnt, da so tief einzusteigen.

Jochen

Und, aber, ich meine,

Jochen

klar, wenn man jetzt große Software in einem Team

Jochen

entwickelt, dann, klar, hat man Tests und

Jochen

eine CI-Pipeline und weiß ich nicht,

Jochen

diesen ganzen Kram halt, ne?

Johannes

Ja, das Stichwort da ist

Johannes

doch Programming by Contract, oder? Und das

Johannes

ist halt eine Möglichkeit, so einen Contract

Johannes

zu schreiben. Aber, also

Johannes

ich bin da in so einem Zwiespalt, ja, einerseits

Johannes

bin ich total genervt von solchen Typsystemen, die dann

Johannes

sehr präzise sind und die dann

Johannes

ich habe auch, ich bin auch mit Java aufgewachsen

Johannes

Stefan, also ich zähle deinen Schmerz

Johannes

und dann

Johannes

wirkt man sich ab und macht

Johannes

ein Pair aus Int und

Johannes

String und dann weißt du aber nicht, wie du an den

Johannes

zweiten dran kommst und ach, das ist

Johannes

alles ganz schön. Aber auf

Johannes

der anderen Seite gibt es

Johannes

nicht die Möglichkeit zu sagen, ganz

Johannes

triviale Sachen zu sagen. Zum Beispiel hier

Johannes

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

Johannes

oder immer kleiner als 0. Größer als 0 geht

Johannes

ja tatsächlich noch, aber kleiner als 0

Johannes

kannst du nicht sagen. Du kannst nicht sagen, hier

Johannes

muss was rauskommen, was zwischen 0 und 1 liegt.

Johannes

Und das ist irgendwie so

Johannes

eine weirde Sache.

Johannes

Ich bin da so im Zwiespalt. Ich hätte gerne

Johannes

keine Typsysteme, aber wenn ich Typsysteme hätte,

Johannes

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

Johannes

dass ich sowas sagen kann.

Johannes

Und dass mir dann auch der Compiler sagen kann,

Johannes

Moment, hier rufst du eine Funktion aus mit einer Zahl,

Johannes

die zwischen 0 und 1 sein kann,

Johannes

aber die muss zwischen 0 und

Johannes

minus 1 sein.

Johannes

Nee, das ist nicht Validierung, sondern das ist

Johannes

Nee, das sind sogenannte Value-Types.

Johannes

Das kannst du auch in ein Typ-System reingießen,

Johannes

wenn du das möchtest.

Jochen

Das ist quasi keine Sprache.

Jochen

Ich glaube, ich habe eine mal gesehen.

Jochen

Eifel.

Jochen

Eifel, ja genau.

Stefan

Also grundsätzlich im funktionalen Programmierbereich

Stefan

hast du das relativ häufig.

Stefan

Ja, es gibt da so ein paar Erweiterungen.

Stefan

Aber ich würde mal annehmen,

Stefan

nicht in den populären oder weitverbreiteten Programmierungen.

Stefan

Nee, nicht in denen, die man benutzt irgendwo.

Dominik

Oder die man schon mal gehört hat.

Stefan

Aus einem ganz einfachen Grund, weil du halt unter den Wertebereichen von einer Zahl

Stefan

tatsächlich irgendwelche Bytes liegen, die von einer CPU ausgelesen werden.

Stefan

Ja, klar.

Stefan

Wenn dir das Typsystem das erlaubt, dass du dort irgendwas zwischen Minus 1 und Plus 1

Stefan

zum Beispiel definierst, oder mein Gott, eine ganze Zahl zwischen 25, was auch immer,

Stefan

dann schiebst du die Validierungen nur an eine andere Stelle.

Stefan

Ja gut, aber das machst du mit dem Typsystem generell, oder?

Johannes

Also ich meine, sobald der PipeScript-Compiler

Johannes

durch ist, ist er weg.

Stefan

Das ist sehr richtig, genau.

Stefan

Ich glaube, in Python genauso, wenn ich mich nicht täusche.

Stefan

Ja, generell.

Stefan

In Python sind die Annotationen erstmal gar nichts.

Jochen

Genau, das ist in Python auch so leicht anders.

Jochen

Das wissen auch viele Leute.

Jochen

Das ist halt, wenn man zu den praktischen Dingen kommt,

Jochen

die halt damit problematisch sind, also ich bin ja häufiger

Jochen

auch irgendwie in unterschiedlichen

Jochen

Firmenkontexten da so unterwegs

Jochen

und das,

Jochen

was ich in letzter Zeit halt häufig sehe,

Jochen

ist halt sowas wie Leute

Jochen

annotieren halt irgendwie ganz viel,

Jochen

aber

Jochen

sie haben keinen statischen

Jochen

Type-Checker, der da drüber laufen würde. Und in Python

Jochen

ist halt auch keiner eingebaut, was vielleicht auch nicht so gut

Jochen

ist. Und man müsste da

Jochen

und dann mache ich dann sowas wie

Jochen

ich lasse mal MyPy drüber laufen und die Leute

Jochen

verwenden alle TypeDict und sowas und denken

Jochen

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

Jochen

Werte da so

Jochen

meine ganzen Werte in dem Dict halt so

Jochen

den richtigen Typ haben

Jochen

und so. Und Python selber

Jochen

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

Jochen

es ignoriert die Annotationen einfach.

Jochen

Ich lasse dann MyPy drüberlaufen und kriege dann so

Jochen

400 Fehler. Und dann denke ich mir so, okay,

Jochen

ja, also du hast da schön deine Annahmen

Jochen

darüber, wie die ganzen Typen aussehen, dokumentiert, aber die

Jochen

sind halt leider alle falsch. Das stimmt überhaupt

Jochen

gar nicht. Und ja, da ist

Jochen

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

Jochen

Also es ist halt irgendwie...

Stefan

Ja, wie ist denn der Zustand

Stefan

der Entwicklungsumgebungen in Python?

Jochen

Kommt drauf an.

Dominik

Also auch die hängen halt daran, ob du

Dominik

MyPy zum Beispiel

Dominik

als Static Type Shaper Extension

Dominik

richtig konfiguriert hast.

Dominik

Und ob dann auch MyPi

Dominik

die Stubs halt lesen kann,

Dominik

die halt notwendig sind oder halt auch nicht.

Dominik

Die müssen halt alle dann...

Dominik

Aber viele IDEs behandeln das doch auch selber schon.

Jochen

Ja, ja, genau.

Jochen

Da gibt es ja auch dann, ich weiß gar nicht jetzt,

Jochen

was bei VS Code

Jochen

dann normalerweise verwendet wird.

Jochen

MyPi ist eine Extension.

Jochen

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

Jochen

Also IntelliJ macht das selber.

Jochen

Ja, die haben einen proprietären, dann gibt es irgendwie MyPi, klar.

Jochen

Und es gibt halt noch PyRide

Jochen

und der Language-Server

Jochen

für Python, kann es sein,

Jochen

dass er selber von Microsoft

Jochen

in TypeScript geschrieben ist?

Stefan

Ja, es ist

Stefan

nämlich spannend, weil ich

Stefan

denke, TypeScript

Stefan

hat da einige richtige Entscheidungen getroffen

Stefan

auf dem Gebiet.

Stefan

Die ihr jetzt alle angesprochen habt,

Stefan

was kompliziert und was komplex

Stefan

in Python ist,

Stefan

nämlich, dass die Sprache

Stefan

dir zwar ein Typsystem

Stefan

anbietet, cool,

Stefan

aber eigentlich nichts damit machst, sondern du brauchst

Stefan

eh nur einen extra Typ-Checker und

Stefan

anscheinend wie bei den Package-Managern gibt es

Stefan

dort auch mehrere, wo du dir dann noch aussuchen

Stefan

kannst, welcher gefällt dir jetzt und

Stefan

welcher passt zu dir und so weiter

Stefan

und ich finde das grandios, dass es Auswahl gibt,

Stefan

keine Frage, aber es erhöht natürlich auch die

Stefan

Komplexität. Und TypeScript

Stefan

hat, TypeScript

Stefan

selbst ist ja eigentlich

Stefan

mehrere Dinge. Es ist zum einen einmal ein Typ-System,

Stefan

cool, also wie werden Typen geschrieben,

Stefan

definiert, wie sind sie im Zusammenhang.

Stefan

Es ist auch ein Typ-Checker dabei,

Stefan

also der TypeScript-Compiler

Stefan

TSC macht in erster Linie mal

Stefan

Type-Checking, aber

Stefan

kompiliert dann auch tatsächlich JavaScript-Code,

Stefan

den du ausführen kannst. Also es gibt so jetzt

Stefan

Proposals, dass du auch Typ-Annotationen

Stefan

irgendwann einmal in JavaScript schreiben können

Stefan

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

Stefan

von der Runtime ignoriert,

Stefan

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

Stefan

Das heißt, du brauchst auch den Compiler.

Stefan

Das heißt, wir haben Typ-System, Typ-Checker, Compiler und noch auch

Stefan

ganz, ganz wichtig, eine Integration

Stefan

in Editoren und Entwicklungsumgebungen.

Stefan

Und das war eigentlich, also dieser gesamte Tooling-Aspekt rundherum,

Stefan

nicht nur das Typ-System anzubieten, sondern auch Werkzeuge anzubieten,

Stefan

dass du nachher zu validem JavaScript-Code kommst und du deine Fehler siehst

Stefan

und die Fehler auch sofort in deinem Editor und deiner IDE dargestellt werden,

Stefan

sind meiner Meinung nach genau die Punkte, die nachher auch den,

Stefan

unter Anführungszeichen, Ziegelszug von TypeScript auch zu verantworten gehabt haben.

Stefan

Weil ohne dem hast du halt nur die Hälfte der Dinge. Du brauchst halt irgendwie alles, damit du sauber entwickeln kannst. Und wenn ich mir denke, dass ich Visual Studio Code aufmache, wo TypeScript schon drinnen ist und ich mache irgendein JavaScript-File auf und es läuft im Hintergrund schon der TypeScript-Compiler und checkt meinen JavaScript-Code und versucht zu inferieren und zu verstehen, was ich schon geschrieben habe ohne einzige Typ-Annotation und ich kriege aus dem raus schon Autocomplete und die ersten Warnings,

Stefan

dass vielleicht irgendwas nicht ganz rund läuft und schief geht.

Stefan

Das ist so viel wert,

Stefan

ohne dass ich eine Zeile TypeScript schreibe,

Stefan

wo ich mir denke,

Stefan

ja, das ist eigentlich eine richtig gute Idee gewesen.

Stefan

Ja, absolut.

Stefan

Da kann Python sich, glaube ich,

Johannes

auch noch eine Scheibe abschneiden davon,

Johannes

weil da gibt es noch so ein paar Löcher.

Stefan

Also wenn ich jetzt sage,

Stefan

ich installiere PyCharm oder wie auch immer,

Stefan

welche Idee,

Stefan

und die kommt schon mit einem Typinterpreter

Stefan

oder einem TypeChecker mit,

Stefan

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

Stefan

sagst, hey, du brauchst nicht mehr die Typernotation

Stefan

schreiben, aber die IDE

Stefan

hat irgendeinen Type-Checker schon

Stefan

per T-Fold drinnen. Wahrscheinlich schreiben sie ihn selbst,

Stefan

weil JetBrains schreibt das irgendwie selbst.

Stefan

Haben sie.

Johannes

Der von JetBrains ist

Johannes

der ist super gut.

Johannes

Das ist einer der Gründe, warum

Johannes

man PyCharm verwendet, weil die halt

Johannes

die beste Typ-Inferenz haben.

Johannes

Man merkt schon,

Johannes

dass das so der Java ist.

Stefan

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

Stefan

Schon wieder Rust, für Rust haben sie auch einen eigenen geschrieben.

Stefan

Also die ganze Welt verwendet Rust Analyzer.

Stefan

Außer du nimmst Rust Rover von JetBrains, dann ist da ein eigener drinnen und sie haben auch Recht damit.

Stefan

Also das ist halt alles richtig gut integriert in die Werkzeuge, die sie zur Verfügung stellen.

Jochen

Ja, auch ein zusätzlicher Effekt, den das hat, dass halt quasi bei Python halt der statische Type Checker halt nicht so wirklich zur Sprache dazugehört.

Jochen

Ist halt auch, dass bei TypeScript ist es halt so, dass was sich sozusagen in der TypeScript-Sprache tut, auch immer sofort verfügbar ist. Und das ist bei Python nicht so, weil die statischen TypeChecker vor allen Dingen von den großen Wendeln gebaut werden, halt nicht MyPy, Dropbox, ich weiß nicht, ob die immer noch da so hauptsächlich dran sind, aber dann gibt es noch einen von Google, es gibt noch PyWrite.

Jochen

Die hängen sowieso immer so ein bisschen

Jochen

in den Versionen hinterher, weil

Jochen

sie ihre Code-Basis sowieso nicht

Jochen

an der aktuellsten Version halten können, weil sie das

Jochen

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

Jochen

Das heißt, normalerweise

Jochen

bei MyPi hängst du halt immer so eine

Jochen

Version irgendwie von dem, was die Sprache eigentlich

Jochen

kann, zurück, was halt auch total

Jochen

doof ist einfach.

Jochen

Du musst ja auch noch darauf einigen, welches

Stefan

Subset des Typsystems du jetzt verwendest.

Stefan

Ja.

Stefan

Genau.

Stefan

Da kann ja gar nichts schief gehen.

Stefan

Ja, aber TypeScript-Versionen gibt es ja jetzt auch und ich habe auch schon Freude damit gehabt.

Stefan

Ja, also das TypeScript-Version-Management ist sehr stark in der Kritik, sehr keine Frage.

Stefan

Also das, jedes Release ist ein Breaking Change.

Stefan

Ja, und das ist aber einfach ein schwieriges Problem.

Johannes

Also ich glaube tatsächlich, dass TypeScript einfach dadurch, dass es eine jüngere Sprache ist,

Johannes

gewisse Fehler vermeiden konnte, die man halt vor 20 oder 25 oder 30 Jahren machen musste mit den ganzen alten Sprachen.

Johannes

aber manche Sachen sind halt

Johannes

immer noch nicht gelöst und Version Hell

Johannes

gehört halt dazu

Johannes

Wobei auch sagen wir, das TypeScript ist schon

Stefan

historisch gewachsen, also du merkst

Stefan

schon die dunklen Flecken

Stefan

der Vergangenheit und versuchst sie zu ignorieren

Stefan

das ist halt so, das passiert halt

Stefan

so wie Sachen verwendet werden

Stefan

hast du nachher die Probleme

Stefan

Ja und das muss sich ja auch

Stefan

an JavaScript orientieren, also es muss ja

Johannes

JavaScript kompatibel sein und da kriegst du halt

Johannes

viel, sag ich mal

Jochen

Ja, auch da kriegst du halt Historie, wenn ich es sehr freundlich ausdrücken will.

Johannes

Ein kleines bisschen Programmiersprachen-Historie mitgeliefert.

Johannes

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

Jochen

Schon alles gesagt.

Jochen

Das ist leider schon ein bisschen drüber, aber davon wieder weg.

Jochen

Aber da hatte ich nämlich auch noch so eine schöne, da habe ich letztens was sehr, sehr Schönes gelesen, dass halt einer der Autoren, auch von der Sprachspezifikation von Java, hat halt irgendwann mal so geschrieben zu den Generics, also dass sie die Generics eingeführt haben.

Jochen

Also ja, das war irgendwie ein Fehler. Und dann hat er irgendwie noch, in dem Buch selber findet man auch irgendwo so eine sehr schöne Fußnote, wo halt quasi die Annotation von Inam, Inam ist auch ein Partner ein Problem, aber in Java halt auch.

Jochen

Und Inam ist halt irgendwie definiert als, ich suche gerade, ob ich das hier finde, ah ja genau, ist eine generische Klasse definiert als Inam, Spitze, Klammer, T, Extens, Inam, Spitze, Klammer, T, Klammer, Zu, Klammer, Zu.

Jochen

Also diese rekursive Definition ist halt so ein bisschen schwierig zu verstehen.

Jochen

Wir haben inzwischen aufgegeben, es zu versuchen, Leuten zu erklären.

Jochen

Es gibt irgendwie Spezialisten,

Jochen

die uns versichert haben,

Jochen

über Typtheorie, die uns versichert haben,

Jochen

dass das schon alles okay ist und kein Problem

Jochen

und wir sollen uns einfach nicht so viel

Jochen

Gedanken drüber machen, was wir

Jochen

sehr gerne annehmen.

Jochen

Das Spannende ist ja bei den Java-Generics,

Stefan

dass die

Stefan

als einziges Element

Stefan

im Typsystem von Java

Stefan

keine Auswirkungen

Stefan

auf die Gestaltung der Laufzeit

Stefan

Objekte haben. Also das sind auch

Stefan

so, nach dem

Stefan

Compile-Schritt wird das einfach entfernt und

Stefan

nie wieder angesehen.

Stefan

Und das ist halt das Beeindruckende daran.

Stefan

Also das war halt auch so, oh shit, das brauchen

Stefan

wir jetzt, wir müssen das jetzt machen, im Release 1.5

Stefan

glaube ich war das, und das war

Stefan

die einfachste und unproblematischste

Stefan

Art, wie wir dazu kommen.

Stefan

Und

Stefan

alle Implikationen, die das hat, die werden bis heute

Stefan

mitgezogen. Du kannst quasi generische

Stefan

Klassen nie wirklich optimieren.

Stefan

Geht einfach nicht. Was halt spannend

Stefan

ist, weil die hast du halt überall, du hast überall

Stefan

Generics drin.

Stefan

Deswegen werden auch

Stefan

oft nur in der

Stefan

Standardbibliothek das generische

Stefan

Object verwendet, anstatt dass du einen generischen

Stefan

Typ-Parameter hast.

Stefan

Was ich mit Inam sein kann, weiß ich sowieso nicht.

Stefan

Also ich habe das gesehen bei unseren Kollegen

Stefan

und das ist kein Inam.

Stefan

Das ist kein Inam.

Stefan

Ich finde das eigentlich jetzt ein guter

Dominik

Zeitpunkt, um nochmal so ein bisschen zu erklären,

Dominik

worum es überhaupt geht und was da alles so drin ist.

Dominik

Wir sind jetzt auch schon auf so einem relativ hohen

Dominik

Frug-Level unterwegs, aber wir haben auch

Dominik

viele

Dominik

Menschen, die uns zuhören, die vielleicht noch gar nicht

Dominik

wissen, was denn ein Generic überhaupt ist

Dominik

und vielleicht sollten wir das einmal kurz

Dominik

ja

Jochen

wissen wollen, aber jetzt

Jochen

kriegen sie es halt mal gesagt.

Stefan

Im GFG-Nich gibt

Stefan

es auch Generics in Python.

Stefan

Ja, genau.

Stefan

Wovon

Stefan

geht an?

Stefan

Also das ist ja,

Stefan

diese Generics in den Typ-Annotationen,

Johannes

das ist ja wirklich nur sehr instruktiv,

Johannes

nur sehr so vage gesagt.

Johannes

Da ist die Erasure ja noch viel größer.

Dominik

Johannes, was ist denn bitte ein Generic?

Johannes

Ein Generic ist eine Spezialisierung eines Typen

Johannes

anhand eines anderen Typen.

Johannes

Und das klassische Beispiel ist da die Java-Liste.

Johannes

In Python hast du ja eine Liste,

Johannes

die, sag ich mal, dynamisch typisiert ist.

Johannes

Das heißt, wenn du eine Liste hast,

Johannes

kannst du da eine Zahl reintun und einen String und

Johannes

eine komplexe

Johannes

Zahl 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 und dann zeige ich hier so, jetzt kannst du da,

Johannes

du kannst noch eine Liste auch reintun oder ein 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 Object. Das heißt, alles, was

Johannes

du da reinschauen kannst, ist Object. 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 Object, 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

Und dass du dann eben zu einem bestimmten Zeitpunkt diesen generischen Typen ersetzt durch einen konkreten Typen und sagst, okay, ich habe jetzt hier nicht eine Liste von Objects, sondern ich habe ganz klar eine Liste von String. Und dann kann der Compiler oder eben das Typsystem überprüfen, dass du da tatsächlich lauter Strings drin hast.

Johannes

Der Code, den du da ausführst, ist genau der gleiche, aber du hast jetzt eben einen spezifischen Typen für eine Liste von Strings gemacht. Und das hat gewisse Vorteile, zum Beispiel, wenn du da ein Objekt rausholst, kriegst du dann halt eben nicht nur ein generisches Object zurück, sondern du kriegst dann tatsächlich einen String zurück. Das ist der große Vorteil, den Java davon hat, dass du diese Accessor-Methoden hast, die dir die spezifischen Sachen rausgeben. War das korrekt erklärt, Stefan?

Johannes

Es ist cool.

Johannes

Als Experte.

Stefan

Gott, Experte.

Stefan

Ich bin nie ein Experte, ich bin einfach nur

Stefan

aufgehoben und schreibe den ganzen Mist auf.

Johannes

Ja gut, aber das macht dich zum Experte.

Stefan

Aber nein, das beschreibt es ziemlich gut.

Stefan

Du kannst mit

Stefan

Typparametern dir die Entscheidung

Stefan

auf den tatsächlichen

Stefan

Typen für später aufheben.

Stefan

Das ist das, was dort passiert.

Stefan

Und ebenso sagst du, dann wird das eine Arraylist

Stefan

von String oder eine Arraylist von

Stefan

Integer und du

Stefan

substituierst diesen Typparameter mit

Stefan

einem konkreten Typen und kriegst

Stefan

nachher auch solche

Stefan

konkreten Typen wieder retour.

Stefan

In manchem Programmiersprachen kannst du dann auch noch

Stefan

so Dinge wie Constraints

Stefan

oder Bounds angeben, wo du eben

Stefan

sagst, hey, du hast dort jetzt einen beliebigen

Stefan

Typparameter, ja, aber er muss

Stefan

einem gewissen Subtypen

Stefan

entsprechen. Das heißt, er muss eine gewisse

Stefan

Funktionalität zur Verfügung haben oder

Stefan

muss, also

Stefan

TypeScript ist ja

Stefan

strukturell typisiert,

Stefan

was bedeutet, dass du einfach

Stefan

sagst, hey, solange die Methoden dort sind und

Stefan

solange die Properties dort sind,

Stefan

passt schon, muss nicht den gleichen Namen

Stefan

haben, muss nicht in irgendeiner Hierarchie sein, sondern

Stefan

Hauptsache, schaut irgendwie so aus

Stefan

wie das eine, was ich da erwarten

Stefan

würde und dann haut das schon hin.

Stefan

Und dann kriegst du halt zum einen

Stefan

die Sicherheit, dass du nicht irgendwelche

Stefan

Typen reingibst, die nicht damit funktionieren

Stefan

würden.

Stefan

Und zum anderen

Stefan

kriegst du halt noch mehr Informationen über deinen

Stefan

Typ noch heraus, wenn du ihn dann vermeidest.

Dominik

Wie macht man das denn? Ein Python-Protokoll?

Jochen

Doch, in Python ist das seit 3.8. im Grunde auch so oder kann man das so machen.

Jochen

Man kann auch nominal typisiert das Ganze machen, aber da geht das jetzt auch.

Jochen

Genau, mit Typing-Protokolls geht das auch.

Jochen

Ja, genau.

Johannes

Habt ihr das schon mal irgendwo gesehen?

Johannes

Ja, ich verwende das.

Johannes

Also ich finde das eine großartige Idee, aber ich habe es noch nie irgendwo verwendet gesehen.

Jochen

Ja, ja, doch. Also ich kenne es auch vor allen Dingen aus dem Fluent Python Buch von Luciano Ramallo.

Jochen

Und der hat sich auch mit diesem Typisierungsthema stark beschäftigt und hat dann diverse Fehler in der TypeShed Repository, wo halt die ganzen, wo auch die Standardbibliothek von Python annotiert ist, hat er da gefunden.

Jochen

Und viele davon konnte er fixen mit diesem Structural Typing-Ansatz.

Jochen

Also Fehler im Sinne von halt die Annotationen waren halt irgendwie,

Jochen

da waren halt False Positives oder halt False Negatives möglich.

Jochen

Auch sehr interessant, wenn man sich halt anguckt,

Jochen

welche Fehler sind häufiger.

Jochen

False Positives sind viel, viel häufiger bei Typ-Annotationen

Jochen

als False Negatives.

Jochen

Also in der Python-Standard-Bibliothek waren es irgendwie achtmal 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

Jochen

okay gewesen wäre und

Jochen

also offenbar

Jochen

ist es halt irgendwie so

Jochen

mehr opportun, irgendwie auf der Seite von

Jochen

strikter zu sein, zu irren

Jochen

als umgekehrt.

Jochen

Was ja auch so ein bisschen

Jochen

vielleicht damit zusammenhängt, welche Leute

Jochen

das, für welche Leute das halt vor allen Dingen gut ist,

Jochen

nämlich die, die halt versuchen wollen, möglichst viel

Jochen

da draußen zu halten und wenn sie ein bisschen zu viel draußen

Jochen

halten, ist es besser, als was durchzulassen,

Jochen

was halt dann irgendwie knallt zur Laufzeit.

Jochen

Das wäre dann Full Snagged.

Jochen

Ja, genau.

Jochen

Und ja, der hat das lange erklärt in dem Buch

Jochen

und da habe ich das halt quasi her.

Jochen

Und ja, ich finde das eigentlich sehr nett,

Jochen

weil damit kann man im Grunde genau das Gleiche machen

Jochen

wie ein Typescript mit diesen Intersection- und Union-Types.

Jochen

Was ja auch irgendwie so, das ist halt so sehr cool eigentlich,

Jochen

dass das geht.

Jochen

Und das geht halt, wenn man jetzt so mit Abstract Base Classes das Ganze macht und nominal, geht das halt nicht so richtig.

Stefan

Das Problem ist, wenn du nominal arbeitest, du brauchst da auf dem Schlag eine Hierarchie auf.

Stefan

Auch wenn die implizit ist durch die Basistypen, die du definierst.

Stefan

Und das kannst du 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, eine Programmiersprache wie JavaScript

Stefan

wäre gar nicht anders zu typisieren gewesen

Stefan

oder es wäre gar nicht möglich gewesen, die anders zu typisieren als mit einem strukturellen

Stefan

Typsystem, weil sonst praktisch kein Code mehr funktioniert hätte, den du irgendwie

Stefan

geschrieben hast. Und das war eben auch so ein Designprinzip von TypeScript, dass sie sagen,

Stefan

hey, wir wollen bestehenden JavaScript-Code unterstützen und mögliche Fehler

Stefan

herausfinden und nicht einfach nur

Stefan

aufgrund von einem

Stefan

APTR-geschaffenen

Stefan

Hierarchie-Konstrukt sagen, das passt

Stefan

oder passt nicht.

Stefan

Und ich glaube, es kann

Stefan

man gut vorstellen, dass das Python auch stark

Stefan

hilft. Ja, definitiv.

Stefan

Ja, das ist jetzt also seitdem

Stefan

also, ich meine, ist das auch in, glaube ich,

Stefan

in Go ist das

Stefan

ja auch so, mit den Interfaces in Go verhalten sich

Stefan

im Grunde auch so.

Stefan

Genau, du implementierst implizit

Stefan

Interfaces, wenn die Methodensignatur

Stefan

gleich ist, genau. Dann bist du

Stefan

kompatibel zum Interface.

Stefan

Ja, und

Stefan

also, ne, ich verwende das tatsächlich.

Jochen

Ich glaube auch, das ist halt, das ist eigentlich sozusagen das,

Jochen

wo es dann anfängt, Spaß zu machen.

Jochen

Weil, ehrlich gesagt, mit den Hierarchien,

Jochen

Klassenhierarchien und so, das ist nicht so

Jochen

meine Vorstellung von Spaß.

Jochen

Ja, also, ich glaube, das ist schon ein paar Mal

Jochen

gemeckert, ja.

Jochen

Ja, du hast ganz

Jochen

recht, Johannes. Das ist das, was, oder ich glaube,

Jochen

es war Johannes, oder was? Ja, genau, das ist das,

Jochen

was natürlich passiert. Du hast Klassen und dann hast

Jochen

der Hierarchien davon und dann benutzt du die und fertig.

Jochen

Das ist dem Konstrukt zu schulden.

Jochen

Und unter Kante ist

Jochen

Konstrukt auch nichts dafür. Das ist halt einfach so.

Johannes

Nee, und das liegt halt auch nahe.

Johannes

Du hast schon diese Hierarchie

Johannes

und dann benutzt du sie halt auch weiter. Du hast schon die Struktur.

Johannes

Also nehmen wir sie.

Johannes

Aber das

Johannes

ist dann eben das Problem, worauf du dann triffst.

Johannes

Du kommst an eine Stelle,

Johannes

wo du weißt, hier muss ich jetzt eigentlich

Johannes

nur addieren, aber der Typ, den du verlangen musst,

Johannes

ist halt irgendein ganz wilder

Johannes

oder ein ganz abgefahrener oder

Johannes

irgendeiner, der wo ganz anders in der Hierarchie drin ist.

Johannes

Und das, genau.

Johannes

Was mir sehr gut gefällt

Johannes

am Python-Typ-System, was ich gesehen

Stefan

habe, nur durchs drüberfliegen, ist

Stefan

dieses New-Type-Konstrukt, wo du

Stefan

sagen kannst, hey, es gibt schon einen bestehenden Typen

Stefan

und der ist vielleicht sehr, sehr

Stefan

freigebig, der ist vielleicht ein Integer-Dustring oder was auch immer,

Stefan

aber da kannst du ihm noch dieses eine Label

Stefan

verschaffen, damit du jetzt nicht irgendwelche unterschiedlichen

Stefan

Integer-Werte durcheinander kriegst oder

Stefan

irgendwelche Objektwerte, die ähnlich sind,

Stefan

durcheinander kriegst. Weil

Stefan

strukturelle Typ-Systeme funktionieren halt immer bis zu

Stefan

im Grad, was du sagen musst, hey, aber

Stefan

dieses eine Ding will ich da jetzt nicht herinnen haben,

Stefan

weil ich erwarte doch etwas anderes und kann

Stefan

das durch das Typsystem nicht so ausdrücken.

Stefan

Mach das Newtype, dann wird es explizit

Stefan

und dann kannst du genau sagen, hey, an dieser Stelle

Stefan

erwartest du etwas,

Stefan

was so ausschaut, aber es muss doch etwas anderes

Stefan

sein. Und das finde ich eigentlich ganz

Stefan

brauchbar.

Jochen

Genau, das benutze ich

Jochen

genau für diesen Use Case, dass man halt

Jochen

oft

Jochen

quasi sowas, zum Beispiel

Jochen

Integer möchte man einschränken,

Jochen

in der Range, aber das kann man im Typsystem nicht so richtig ausdrücken

Jochen

und ich finde, dann reicht oft schon,

Jochen

um den gleichen Effekt zu haben,

Jochen

im Newtype einzuführen, also wo ich das dann halt zum Beispiel

Jochen

aktuell brauche, ist halt, ich habe halt

Jochen

ein Jahr und ich weiß, dieses Jahr ist halt nur

Jochen

von 2025 bis 2040

Jochen

oder irgendwie sowas und

Jochen

mir reicht

Jochen

im Grunde, wenn, ich

Jochen

mache das gar nicht über das Typsystem,

Jochen

dass diese Range dann sozusagen abgesichert

Jochen

wird, aber allein dadurch,

Jochen

dass ich sage, ich definiere den Newtype

Jochen

hier, der halt eigentlich

Jochen

ein Int ist, kann mir der Type-Checker

Jochen

sagen, wenn ich

Jochen

irgendwie mal ein anderes Int da reingesteckt habe, was ich

Jochen

nicht mal als Ja irgendwo anders deklariert habe

Jochen

und krieg dann sozusagen

Jochen

den Effekt, dass wenn da irgendjemand irgendwas reinsteckt,

Jochen

was kein Ja ist, dann gibt's halt auch

Jochen

ein, sagt der Type-Checker halt schon,

Jochen

okay, nee, das sieht nicht gut aus.

Jochen

Und so kann man sich halt das

Jochen

sozusagen so ein bisschen

Jochen

herbeiemulieren, dass man

Jochen

irgendwie damit auch überprüft, ob das

Jochen

inhaltlich Sinn macht.

Jochen

Aber noch cooler wäre es natürlich, wenn du auch

Jochen

die Werte angeben könntest.

Jochen

Entschuldigung, Stefan.

Jochen

Weißt du?

Stefan

Also gerade mit dem,

Stefan

also in TypeScript kannst du

Stefan

das ein bisschen, du kannst teilweise

Stefan

Werte oder

Stefan

geringere Wertbereiche definieren.

Stefan

Also in TypeScript ist es das Spannende,

Stefan

wie in jedem Typsystem, du hast

Stefan

Wertemengen und

Stefan

du definierst ja nur, ob dieser eine Wert,

Stefan

den du hast, jetzt in diese Menge passt

Stefan

oder nicht. Das sind sehr

Stefan

große Mengen zum Teil, String, Number

Stefan

oder alle Objects.

Stefan

Zum Teil sind sie halt auf deine

Stefan

Objekttypen heruntergebrochen,

Stefan

wo du sagst, diese Kombination an

Stefan

Properties, die gewisse Typen haben,

Stefan

erlaubst du dort oder nicht.

Stefan

Du kannst aber auch sagen, hey,

Stefan

dieser einzige

Stefan

oder einzelne konkrete Wert,

Stefan

die Zahl 1

Stefan

des String-Stefan, was auch immer,

Stefan

kann auch als Typ gelten.

Stefan

Das heißt, du kannst einen Wert haben, wo du

Stefan

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 Literal-Types oder Value-Types, wie es du benannt hast, Johannes,

Stefan

kombinieren mit anderen Value-Types.

Stefan

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

Stefan

und weißt noch aus, wenn ein Wert da reinkommt,

Stefan

dann hat er garantiert eine dieser sechs Zahlen.

Stefan

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

Stefan

Und was halt dann wirklich elegant ist, ist,

Stefan

dass du zum Beispiel Strings mit gewissen Pattern definieren kannst.

Stefan

Du kannst sagen, hey, du erlaubst alle Strings, die mit on anfangen,

Stefan

weil du gerade dein Eventsystem implementierst

Stefan

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

Solches Tricks akzeptierst du, andere akzeptierst du nicht.

Stefan

Da kannst du wirklich sehr elegant Wertebereiche definieren, mit denen du korrekte Werte angibst,

Stefan

mit denen du auch über deine Werte diverse Aussagen treffen kannst, die dir nachher helfen,

Stefan

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

hat. Und dann bin ich mir

Stefan

sicher, dass ich den richtigen

Stefan

HTTP-Statuscode in meiner

Stefan

Response schicke und

Stefan

brauche nicht großartig überlegen,

Stefan

ob ich noch im richtigen Wertebereich bin oder nicht.

Johannes

Ich muss mich

Johannes

einmal korrigieren. Ich habe eben nachgelesen,

Johannes

Value-Types ist nicht das richtige Wort.

Johannes

Das bezieht sich auch auf etwas anderes.

Johannes

Das wird als

Johannes

Abgrenzung zum Reference-Type verwendet.

Johannes

Also ob man einen Wert oder

Johannes

eine Referenz hat. Aber das Konzept

Johannes

ist

Johannes

hast du gerade sehr schön erklärt. Vielen Dank, Steffen.

Stefan

Das ist auch in Kapitel

Stefan

4 beschrieben von meinem Buch

Stefan

und da bist du ja noch nicht.

Johannes

Das haben wir vorhin schon festgestellt, ich habe noch nicht

Johannes

weit genug gelesen. Aber ich

Johannes

habe es jetzt wieder rausgeholt und jetzt

Johannes

lege ich es mir unter das Kopfkissen

Johannes

und werde das per Diffusion

Stefan

aufnehmen. So wird die

Stefan

Matura geschafft mit dem

Stefan

Mathematikbuch unter dem Kopfkissen.

Stefan

Funktioniert.

Dominik

Ich finde, wir müssen noch ein bisschen darüber reden,

Dominik

wie man das so in Python

Dominik

dann machen kann noch und wie man das

Dominik

Typing-Modul vielleicht noch so ein bisschen benutzt.

Dominik

Wir hatten jetzt ein Newtype, was

Dominik

irgendwie ganz cool ist. Wir hatten die Generics.

Jochen

Ja, also Generics, achso, genau.

Jochen

Wo wir dann schon mal, da habe ich nämlich jetzt heute

Jochen

eins gehabt, da dachte ich mir so,

Jochen

oh mein Gott, wenn, hoffentlich fragt das keiner, deswegen frage ich

Jochen

das jetzt mal, kann mir

Jochen

einer vielleicht erklären, was der Unterschied zwischen

Jochen

Co-Variant, Contra-Variant und In-Variant und so

Jochen

ist, weil das kann man nämlich auch mit angeben

Jochen

und ich dachte mir so, okay, ich kann es ja angeben, aber

Jochen

oh Gott, was bedeutet das eigentlich?

Jochen

Und was macht dann Bound und so?

Jochen

Ja.

Stefan

Ich kann es aus einer Typtheorie sagen, was Co- und

Stefan

Contra-Variant ist. Ich weiß aber nicht, ob das so

Stefan

auf Python auch zutrifft.

Stefan

Aber ich versuche

Stefan

es jetzt mal so zu erklären.

Stefan

Co-Variant ist, wenn du

Stefan

Schnell die

Stefan

Petitfragen.

Stefan

Nein, es ist irrsinnig schwierig zu erklären.

Stefan

Lass mich kurz mein zweites Buch aufmachen, weil da wird

Stefan

Zeichnung.

Stefan

Also bevor ich jetzt allgemeine

Stefan

Beschreibungen erkläre, sage ich es lieber mal so.

Stefan

In einer Co-Varianten-Beziehung

Stefan

hast du zum Beispiel einen Typ, der

Stefan

ist String oder Number,

Stefan

was bedeutet, dass wenn du einen Wert

Stefan

hast, der Number ist, dann kannst du

Stefan

dir auf jeden Fall auf diesen einen Typen

Stefan

zuweisen, der String oder Number sein kann.

Stefan

Das heißt, je enger dieser Wertebereich

Stefan

wird,

Stefan

hat kein Effekt drauf,

Stefan

kannst du weiterhin darauf zuweisen.

Stefan

Die Contra-Variante ist genau umgekehrt.

Stefan

Du kannst zum Beispiel jetzt nicht

Stefan

eine Funktion, die als ersten Parameter

Stefan

String oder Number, oder

Stefan

einen Funktionstypen, der

Stefan

als ersten Parameter String oder Number erwartet,

Stefan

kannst du jetzt nicht

Stefan

eine echte Funktion zuweisen, die

Stefan

nur String erwartet, weil ja

Stefan

der Fall, dass auch ein Number als Parameter

Stefan

sein kann, nicht dadurch abgedeckt wird.

Stefan

Das heißt, du hast der Typ zwar auch ein Subtyp,

Stefan

der Parametertyp ist ein Subtyp

Stefan

vom anderen,

Stefan

aber nachdem der in einer Funktion steht,

Stefan

sind die nicht zueinander kompatibel, sondern

Stefan

nur umgekehrt. Das heißt, du kannst eine Funktion,

Stefan

einen Funktionstypen definieren, der als ersten

Stefan

Parameter eine Number angibt, was bedeutet,

Stefan

dass du auch Funktionen zuweisen kannst,

Stefan

die String oder Number

Stefan

erwarten, weil eben dieser eine Fall

Stefan

abgedeckt ist. Und das ist der Unterschied zwischen

Stefan

Kovarianz und Kontravarianz. Brauchst du eigentlich nie,

Stefan

macht halt irgendwelche komischen Fehlermeldungen, wenn du

Stefan

irgendwelche Sachen zuweisen willst, die dann nicht so funktionieren.

Stefan

Ist

Stefan

aber, glaube ich, in der Typtheorie

Stefan

die korrekte Beschreibung.

Stefan

Ist nicht kompliziert, ich möchte euch da für die

Stefan

Shownotes eine Grafik zur Verfügung stellen,

Stefan

die das wunderschön erklärt.

Stefan

Und da suche ich mir den Link jetzt wirklich

Stefan

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. Also in welche

Dominik

Richtung kann man was irgendwie doch voneinander

Dominik

erben, wenn ich das richtig verstehe?

Dominik

Generisieren.

Johannes

Generisieren. Also ich habe es

Johannes

jetzt hier auch gerade, wenn jemand

Johannes

anders spricht, kann ich ja googeln.

Johannes

Also so wie ich

Johannes

das jetzt hier verstehe, ist es, das

Johannes

bezieht sich direkt auf Python hier

Johannes

und die Qualitätsquelle Stack Overflow

Johannes

kann man ja auch verlinken.

Johannes

Es wird hier so erklärt,

Johannes

du hast zwei Klassen,

Johannes

Basisklasse und eine abgeleitete Klasse.

Johannes

Die derived.

Johannes

Genau.

Johannes

B und D,

Johannes

also Basisklasse und abgeleitete Klasse.

Johannes

Und du hast irgendeine generische Typenliste

Johannes

mit irgendeinem Typen drin.

Johannes

Und jetzt ist die Frage,

Johannes

wenn du eine Liste hast,

Johannes

die den Typen B hat,

Johannes

also den Basistypen,

Johannes

kannst du die dann da verwenden,

Johannes

wo du eine Liste vom Typen D erwartest, also eine abgeleitete Klasse.

Johannes

Oder ist es andersrum?

Dominik

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

Johannes

Genau, das eine ist Co-Variant und das andere ist Kontra-Variant,

Johannes

weil du eben sagst, okay, wenn du den als Generic verwendest,

Johannes

dann geht die Beziehung in die eine Richtung

Johannes

oder die Beziehung geht in die andere Richtung.

Johannes

Und das ist natürlich schön, dass man da zwei Worte genommen hat,

Johannes

die exakt gleich klingen.

Dominik

Also Co-Variant ist, wenn man quasi annotiert mit der Implementierung

Dominik

und Contra-Variant ist, wenn man mit der

Dominik

Basis

Dominik

notiert, ja. Und

Dominik

Invariant wäre dann, wenn man nicht

Dominik

beides verwenden darf, weil

Dominik

der sagt ja halt, nö, das ist nicht genau

Dominik

das, was ich erwarte.

Johannes

Ja, irgendwie so. Für genauere Sachen

Johannes

muss man PEP484 lesen, das haben wir

Johannes

ja sicherlich alle schon gemacht.

Johannes

Muss man gar nicht genauer drauf eingehen.

Jochen

Ich packe die Grafik

Jochen

in die Show Notes und dann schauen wir mal.

Jochen

Genau.

Jochen

Ja, aber genau, ich dachte

Jochen

auch so, also man kann das ja angeben

Jochen

und dann dachte ich so, ich hab das noch nie verwendet, ist das

Jochen

irgendwie, hab ich was, pass ich

Jochen

was oder? Und was macht dann Bound?

Dominik

Also weil das

Dominik

macht man ja irgendwie auch bei den Contra-Variants

Dominik

oder ist das schon das?

Dominik

I don't know.

Dominik

Steht zumindest in der Types, Pricing, Typing.

Johannes

Tatsächlich ist in dem

Johannes

PEP484 eine sehr schöne Erklärung drin.

Johannes

Mit

Johannes

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.

Johannes

Alle Angestellten feuern, nur Manager feuern.

Johannes

Genau. Aber dass du zum Beispiel jemanden hinzufügst zu dieser Liste. 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. Wenn du aber eine Liste von Managern reingegeben hast, dann geht das nicht.

Johannes

Und das ist jetzt eben genau so eine Frage, 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.

Dominik

Und der Bound ist dann quasi tatsächlich die,

Dominik

wenn dann erst die Manager gefallen,

Dominik

weil das die spezialisiertere Variante ist.

Dominik

Ja, wir haben noch mehr von dem Typing-Modul,

Dominik

damit wir uns noch mehr schöne Sachen dazu erzählen können

Dominik

und mehr ergänzen können mit präzisem Fachwissen.

Dominik

Und zwar den Type-Adias und die Type-Ware,

Dominik

die da noch irgendwie dazu können.

Dominik

Also was ist denn der Unterschied?

Dominik

Und man kann ja auch noch das schöne Keyword Type

Dominik

dazu schreiben und sowas.

Jochen

Ich meine, bei Type-Alias, das

Jochen

kannst du auch einfach so hinschreiben, es ist nur eine explizitere

Jochen

Darstellung und manchmal ist es halt

Jochen

problematisch, wenn du zum Beispiel einfach einen String verwendest,

Jochen

den du ja auch quasi benutzen kannst,

Jochen

statt, und manchmal muss man das ja auch

Jochen

um zyklische Imports zu vermeiden und so,

Jochen

dann ist halt unklar, was gemeint ist,

Jochen

wenn man den nicht Type-Alias davor schreibt.

Jochen

Also beispielsweise, wenn ich jetzt irgendwie eine Union habe,

Dominik

das kann jetzt mehrere Sachen sein, dann kann ich dann

Dominik

Type-Alias dafür verwenden, dass das damit

Dominik

gemeint ist, dass es einen Namen gibt. Ja, aber du könntest ja auch einfach

Jochen

hinschreiben, myUnion gleich

Jochen

und dann irgendwie

Jochen

der Typ, Pipe-Symbol,

Jochen

der andere.

Dominik

Das ist dann ein Type-Alias schon.

Dominik

Das selber kann ich annotieren mit, nein, ist es nicht?

Jochen

Ja, also du könntest damit dann wieder

Jochen

annotieren, aber wenn du

Jochen

jetzt zum Beispiel da Strings verwenden

Jochen

wollen würdest für die Typ-Typen,

Jochen

dann geht's

Jochen

halt nicht mehr so richtig.

Jochen

Also Type-Alias macht das dann halt

Jochen

explizit, dass das halt sozusagen...

Jochen

Und die Type-Ware,

Dominik

das hatten wir eben, TVK, TKV,

Dominik

warum TKV jetzt da

Dominik

im besonderen Sinne, weil ich diese kurzen Dinge

Dominik

nicht, also einer der Gründe, warum ich Go nicht leiden kann,

Dominik

sind diese

Dominik

Ein-Charakter-Variablen-Namen, aber

Dominik

ja. Ja, das sind halt die Generics, oder, die wir

Johannes

vorhin hatten. Ja, genau. Stefan, du hast angesetzt.

Johannes

Erklär uns, was Type war.

Stefan

Ja, also ich habe jetzt ganz kurz diesen PEP-Vier-Ocht-Vier

Stefan

aufgemacht und der ist wunderschön.

Stefan

Der ist super, oder?

Stefan

Also eine Type-Variable, also ich sage immer

Stefan

Type-Parameter dazu, aber das ist im Grunde

Stefan

genau das Gleiche. Das ist eben diese

Stefan

ein Typ, der später durch

Stefan

einen konkreten Typ ersetzt wird. Das heißt, du kannst

Stefan

Also jetzt sagen wir, du hast diese Typvariable

Stefan

in diesem Beispiel von pep484, das ist st,

Stefan

seist type wird das heißen dort,

Stefan

weil da geht es um seist,

Stefan

wo du sagst, hey, du machst jetzt eine Funktion,

Stefan

die erlaubt x beliebige Typen,

Stefan

allerdings kannst du sie durch irgendeinen Bound,

Stefan

das ist das zweite dort,

Stefan

der zweite Parameter, einschränken.

Stefan

Also ein Bound sagt hier,

Stefan

oder der generelle Typ-Rameter sagt dir,

Stefan

alle möglichen Werte, aber später nur ein konkreter.

Stefan

Und der Bound sagt dir, alle möglichen Werte,

Stefan

die auch diese Eigenschaften erfüllen, später ein konkreter.

Stefan

Und das ist dort in diesem Beispiel recht gut,

Stefan

weil da wird Seist als Bound definiert,

Stefan

was bedeutet, dass du eine Länge definieren können musst

Stefan

oder eine Länge lesen können musst.

Stefan

In Python hast du ja nur diese Hilfsfunktion,

Stefan

du hast ja selten Methoden auf Klassen,

Stefan

soweit ich das weiß.

Stefan

Deswegen brauchst du halt überall diese Bounds.

Stefan

Andererseits könntest du ja sagen,

Stefan

du hast irgendeine Subklasse oder so.

Stefan

Aber Bound ist auch etwas,

Stefan

das kennen wir in anderen Programmiersprachen auch.

Stefan

In TypeScript wird das als Constraint bezeichnet.

Stefan

Aber im Grund geht es darum,

Stefan

dass du einfach vordefinierst,

Stefan

du hast ein paar Eigenschaften,

Stefan

die du sicherstellen willst.

Stefan

In dem Fall, was dort beim PEP484 ist,

Stefan

mit diesem Upper-Bound, sagst du einfach,

Stefan

du willst die Möglichkeit haben, eine Länge zu berechnen,

Stefan

du willst einfach wissen, hey, da gibt es eine Size,

Stefan

das hat eine gewisse Längegröße,

Stefan

was auch immer.

Stefan

Spannend wäre es, ob ich dort einen String reingeben kann,

Stefan

weil man kann ja die Länge von einem String definieren.

Stefan

Ja, kannst du.

Stefan

Alles, was Length von irgendwas hat,

Stefan

ist Size.

Stefan

Also ich kenne keinen Python, aber ich habe diesen Code jetzt gelesen

Stefan

und weiß sofort, was ich da zu erwarten habe,

Stefan

weil ein String muss auch

Stefan

eine Länge rauskriegen.

Stefan

Schon cool.

Johannes

Ja. Und das ist auch sehr interessant hier, weil also diese Type Variable, die gerade in diesem Beispiel, ich habe es zufällig auch gerade offen, benutzt wird, die wird in dieser Funktion, da wird eine Funktion definiert, die heißt longer und die nimmt zwei Variablen, x und y, die sind beide vom Typ st und der Rückgabewert ist ebenfalls st.

Johannes

Und das ist eine sehr interessante Sache, weil das eben bedeutet, du kannst hier zwei Sachen reingeben, die von der gleichen Sorte sind und kriegst wieder eins raus, was wieder von der gleichen Sorte ist. 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, das ist der Bound, ich muss davon die Länge abrufen können.

Johannes

Und das hat diese Funktion schon sehr genau spezifiziert, die Spezifikation dieser Funktion, also longer x, y ist ja erstmal sehr lose und jetzt durch diese Typvariablen 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-Parameter oder diese Type-Var ersetzt durch eine List, das ist glaube ich die eckigen Klammern, im zweiten Aufruf, da hast du geschwungene Klammern, wird es durch ein Set ersetzt, also der Typ wird durch ein Set ersetzt, aber im dritten, da ist im ersten Aufruf eckige Klammern, im zweiten Parameter sind geschwungene Klammern,

Stefan

da wird der Parent-Type davon eine Collection verwendet,

Stefan

wo du sagst, hey, okay, ist nicht List, ist nicht Set,

Stefan

also es könnte beides sein,

Stefan

du nimmst einfach was, was beide beschreibt.

Stefan

Finde ich cool, dass das das Typsystem so macht.

Stefan

Normalerweise würde TypeScript dir da vielleicht einen Fehler werfen.

Stefan

TypeScript würde da sagen,

Stefan

hey, wenn du das einmal durch einen Typ ersetzt,

Stefan

dann musst du auch im zweiten Parameter

Stefan

den gleichen Typ verwenden

Stefan

und so findest du aber in der Hierarchie

Stefan

tatsächlich einen Parent-Type, den du nutzen kannst.

Stefan

Das ist ziemlich geil.

Stefan

Also, richtig gut.

Stefan

Ja, das ist ziemlich schön.

Stefan

Also, nämlich auch so, dass ich das jetzt

Stefan

verwenden möchte, muss ich ganz ehrlich sagen.

Stefan

Ich glaube, ihr habt es so weit.

Stefan

Sehr gut.

Johannes

Viele Programmiersprachen-Features

Johannes

kommen ja durch Knight

Johannes

umgesetzt. Das ist bei Python

Johannes

und auch nicht anders.

Johannes

Viele Sachen sind einfach aus Knight durch andere

Johannes

Sprachen entstanden.

Stefan

Also, den größten Knight

Stefan

habe ich ja durch die Import-Signatur.

Stefan

das macht einfach so viel einfacher.

Stefan

In JavaScript ist es umgekehrt,

Stefan

du importierst zuerst die Einzelelemente

Stefan

aus dem Paket

Stefan

und das ist reine Ästhetik, so ist

Stefan

viel klarer, du spezifisierst

Stefan

zuerst das Paket und dann importierst du die Sachen

Stefan

draus, jeder Editor freut sich, wenn er das

Stefan

so kriegen kann.

Dominik

Ja, was

Dominik

mich noch interessieren würde hier an der Stelle,

Dominik

ist diese Overloads, die da mit drinstehen,

Dominik

das ist ja auch so eine Sache,

Dominik

die man nur bei den Type Annotations

Dominik

findet oder auch woanders, wo halt derselbe

Dominik

Methodenname mehrfach hintereinander

Dominik

definiert wird. Was macht denn das genau?

Stefan

Schreibst du

Stefan

in Python dort dann beide

Stefan

Methoden aus? Also implementierst du da

Stefan

beide Methoden oder

Stefan

sind es nur die Signaturen?

Johannes

In Python musst du

Johannes

dich da anstrengen dafür. Das hat ja nicht mal viel

Johannes

mit, ja es hat vielleicht schon

Johannes

was mit Types zu tun, aber

Johannes

also so richtiges

Johannes

Overloading gibt es ja gar nicht in Python.

Johannes

Du fügst eine weitere Signatur

Johannes

hinzu zur Methode. Ja genau, was macht denn

Stefan

Aber du hast doch nicht zwei Funktionen,

Stefan

du hast zwei Signaturen.

Johannes

Du hast eine Funktion, die,

Johannes

also es ist so,

Johannes

der ganz

Johannes

grundlegende Prozess ist, dass eine Funktion

Johannes

in Python eine Variable ist,

Johannes

die halt ein

Johannes

Funktionssubjekt enthält.

Johannes

Und diese Variable hat einen Namen und diesen Namen,

Johannes

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,

Johannes

um Überladung zu machen,

Johannes

und ich erkläre es gleich noch für die Zuhörer,

Johannes

ist, dass

Johannes

du sagst, du definierst

Johannes

eine Basismethode und der fügst du

Johannes

dann eine weitere Signatur hinzu.

Johannes

Und wenn diese, da ist dann eben so ein

Johannes

durch Dekoratoren

Johannes

hast du so einen Mechanismus, der diese Signaturen

Johannes

entsprechend überprüft. So, was ist

Johannes

Überladung überhaupt und was erreicht man damit?

Johannes

Überladung ist, wenn

Johannes

du eine Funktion, also ganz

Johannes

klassisch aus dem Java-Umfeld, wenn du eine Funktion

Johannes

hast, die heißt add

Johannes

und die definierst du für float und float und dann

Johannes

kommt hinterher wieder ein float raus.

Johannes

Dann funktioniert die ganz einwandfrei für Floats, aber du kannst damit nicht Ints adden, kannst keine Integer addieren, weil der Compiler dir sagt, ich habe 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 und die wird durch das Kompilat eher zu einer anderen Funktion.

Johannes

Das heißt, zum Zeitpunkt des

Johannes

Kompilierens kann der Compiler sagen, ah, du meintest

Johannes

diese Funktion mit der Signatur

Johannes

oder du meintest diese Funktion mit der

Johannes

Signatur. Und das geht

Johannes

auch in TypeScript, wenn ich mich recht erinnere,

Johannes

dass du überladene

Johannes

Methoden hast, die dann eben durch

Johannes

den Compiler zum Zeitpunkt des Compilens

Johannes

die richtige

Johannes

Zuweisung bekommen. Die sind dann im

Johannes

JavaScript-Kompilat, heißen die dann unterschiedlich,

Johannes

weil die eben da unterschiedlich sind.

Johannes

Das ist genau der Unterschied.

Stefan

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

Stefan

Du musst mindestens zwei angeben. Eine, die dem Typsystem mitgeteilt wird als Nutzungssignatur

Stefan

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.

Stefan

Und du hast dort einfach unterschiedliche Aufrufe, durch die du durchgehen kannst.

Stefan

aber im Endeffekt wird nur eine Methode aufgerufen

Stefan

oder eine Funktion aufgerufen.

Stefan

Deswegen habe ich genauso nachgefragt,

Stefan

weil ich bin mir nicht sicher,

Stefan

wie das jetzt in Python funktioniert,

Stefan

weil es ist spannend.

Stefan

Es hat Führungslieder.

Stefan

Okay.

Stefan

Genau.

Johannes

In Python ist es ein bisschen anders.

Johannes

In Python musst du das eben über Dekoratoren machen,

Johannes

weil du diesen Namen nicht mehrfach haben darfst.

Johannes

Und was da im Wesentlichen passiert ist,

Johannes

du sagst, wenn die Methode aufgerufen wird

Johannes

zwei Variablen oder mit

Johannes

Argumenten, die

Johannes

dieser Signatur entsprechen, dann rufe bitte

Johannes

diese Subsignatur

Johannes

auf. Also du fügst da quasi

Johannes

eine weitere Funktion hinzu, die nur in bestimmten

Johannes

Fällen aufgerufen wird. Aber das ist

Johannes

was, was zur Laufzeit passiert. Also zur Laufzeit

Johannes

wird

Johannes

dann entschieden, welche

Johannes

Submethode

Johannes

aufgerufen wird. Das ist im Wesentlichen

Johannes

ein Match Case,

Johannes

der da vorsteht.

Jochen

Ich weiß nicht, ob das im Typing-Zusammenhang

Jochen

nicht was anderes ist. Also ich meine, es gibt diese

Jochen

Overload-Geschichten vielleicht

Jochen

in Klassen, aber ich meine hier

Jochen

auch bei Funktionen,

Jochen

wenn ich jetzt einfach das sozusagen für diese

Jochen

Typ-Annotation verwenden will, dann ist es

Jochen

soweit ich sehen kann auch so. Es gibt die Funktion einmal,

Jochen

aber

Jochen

ich kann halt viele sozusagen

Jochen

mit Overload dekorierten

Jochen

Funktionen haben, die keine Implementationen haben,

Jochen

aber wo ich sozusagen nur

Jochen

quasi die unterschiedlichen

Jochen

möglichen Arten

Jochen

wie ich das, wie das aufrufen

Jochen

werden kann, halt annotiere, weil ich das nicht in

Jochen

eine Annotation schreiben kann, weil geht halt

Jochen

nicht. Und

Jochen

ja. Ach so, okay.

Jochen

Da gibt es zwei, also es gibt

Jochen

mehrere Overload

Jochen

Dinge, denke ich.

Jochen

Genau, also das

Jochen

ist blöd, ja. Es ist blöd, dass

Jochen

diese Sachen in unterschiedlichen Sprachen

Jochen

unterschiedliche Dinge bedeuten.

Johannes

Also wenn ich der Kaiser wäre,

Johannes

dann wäre das anders.

Johannes

Also das ist tatsächlich was, was ich vermisst habe an Python, als ich zu Python gekommen bin aus Java. 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, Listen.

Johannes

Und die machen sehr unterschiedliche Dinge, aber im Endeffekt

Johannes

das gleiche Semantische. Die fügen die

Johannes

aneinander. Und die heißen

Johannes

gleich, weil die das gleiche machen.

Johannes

Und sowas gibt es in Python nicht, weil in Python

Johannes

musste jedes Mal

Johannes

einen neuen Namen haben dafür

Johannes

oder einen neuen Scope oder so.

Johannes

Und dafür gibt es Single Dispatch.

Johannes

Ja, das hat

Stefan

damit zu tun, dass

Stefan

es möglich ist, dass du

Stefan

den gleichen Namen mehrmals vergeben kannst.

Johannes

Ja, weil die beim Kompilieren

Johannes

die Namen weg sind beim Kompilieren.

Stefan

Nein, nein, weil die

Stefan

Funktionssignaturen Typen haben.

Stefan

Nein, weil die Funktionssignaturen Typen haben.

Stefan

Weil Java die Typen

Stefan

erfordert

Stefan

und dadurch ist

Stefan

einfach genug Unterschied da, um das

Stefan

zu identifizieren können.

Stefan

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,

Johannes

das heißt Overload,

Johannes

das ist ja was ganz anderes. Python lang

Johannes

util.

Johannes

Okay.

Jochen

Ich hab's jetzt hier aus, von Typing.

Jochen

Also, so wie ich

Jochen

das gesehen hab, es gibt auch so ein sehr schönes

Jochen

Beispiel dafür, das ist auch aus dem

Jochen

Fluent Python Buch, hab ich das

Jochen

da, also das ist halt

Jochen

so ein Beispiel für Methoden, die halt

Jochen

eigentlich in, also, die hat auch so ein

Jochen

Problem, dass man mit Type

Jochen

Annotationen halt so hat,

Jochen

beschreiben nämlich, dass man

Jochen

die Typannotationen nicht so

Jochen

also die ist ja auch eine Sprache, ist halt eine andere

Jochen

Art, das hinzuschreiben

Jochen

und die ist halt nicht so expressiv wie Python selber.

Jochen

Das heißt, wenn ich jetzt Funktionen habe, wie zum Beispiel

Jochen

min und max, jetzt weiß ich gar nicht, ob es das

Jochen

in der JavaScript-Welt auch so

Jochen

gibt, aber die

Jochen

kann ich halt sehr schön in Python hinschreiben

Jochen

so in irgendwie so

Jochen

20 Zeilen oder sowas

Jochen

und ist sehr schön zu lesen,

Jochen

ist nicht kompliziert.

Jochen

Und die Typ-Annotation dafür ist aber sehr, sehr schwer, weil das halt so super generisch ist.

Jochen

Und dann kann man noch ein Callback übergeben, das halt irgendwie zum Sortieren verwendet wird und sowas.

Jochen

Und ja, die korrekten Type-Annotationen für Min und Max sind halt sehr viel länger als die Implementation.

Jochen

Und das liegt halt daran, dass man das in dieser neuen Annotationssprache halt nicht so gut hinschreiten kann.

Jochen

Und dafür, also da hast du dann halt so irgendwie, ich weiß nicht, zig Overloads, weil du kannst das sowieso immer nur quasi für einen Teil der, wie man das aufrufen kann, halt annotieren.

Jochen

Und dann musst du das halt, musst du halt zehn Dinger übereinander häufen, um das halt irgendwie abgebildet zu kriegen.

Jochen

Und ja, und auch in diesen Dingern sind dann halt, waren halt lange Fehler drin und die sind halt auch echt schwer zu finden.

Jochen

Also ja.

Jochen

Und die machen ja auch überhaupt gar nichts, diese Fehler, jetzt mal ganz ehrlich.

Jochen

Ja gut, na gut, also irgendjemand hat dann halt, es kann ja sein, du rufst das halt auf, lässt es auf eine bestimmte Art und dann läuft dein Typechecker drüber und der sagt, der spuckt dir dann halt irgendeine Fehlermeldung aus, die vollkommen unverständlich ist und das verdirbt dir halt den Vormittag oder so, weil du verstehst gar nicht, wo das Problem ist.

Jochen

Und dann war es halt nicht mal wirklich ein Problem,

Jochen

sondern es war einfach nur etwas, was halt

Jochen

in den Annotationen kaputt war.

Jochen

Und du hast es korrekt aufgerufen.

Jochen

Das ist ja schon ärgerlich.

Jochen

Also ich meine, ja, also

Jochen

ja, gut.

Jochen

Zugegeben, ja.

Jochen

Aber

Jochen

Aber was war jetzt die Lösung, Jochen?

Johannes

Ich habe dich jetzt unterbrochen, aber

Johannes

gibt es da jetzt eine Lösung dafür? Kann ich jetzt da Overload sagen?

Jochen

Genau. Und du kannst jetzt sozusagen,

Jochen

wenn du eine Funktion

Jochen

annotieren möchtest, aber das halt die

Jochen

Annotationen nicht einfach so hinschreiben kannst, dann kannst

Jochen

du die möglichen Arten,

Jochen

wie das halt, also

Jochen

wenn du mehrere

Jochen

Annotationen hinschreiben musst

Jochen

für die Funktion, kannst du das per Overload

Jochen

hinschreiben. Hast dann halt der

Jochen

Methoden-Body oder Funktions-Body

Jochen

ist einfach Ellipsis, also

Jochen

Punkt, Punkt, Punkt und

Jochen

genau, dann kannst du halt alle

Jochen

Arten, wie man das Ding halt getypt

Jochen

aufrufen kann, halt hinschreiben.

Johannes

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

Johannes

Ne, das sieht nicht schön aus.

Stefan

Ich würde es zum Beispiel in TypeScript

Stefan

auch nicht immer verwenden.

Stefan

Meistens ist es ein Codespell, wenn du

Stefan

Methoden oder Funktionen

Stefan

hast, die mehr können

Stefan

soll, als für das, was

Stefan

sie beschreibt. Ja, so ein bisschen

Stefan

so eine Krücke, warum machen wir das dann nicht?

Dominik

Vielleicht, wenn man so ein Public-API-Interface

Dominik

hat, was unbedingt benutzt bleiben muss,

Dominik

aus irgendwelchen Gründen.

Dominik

Vielleicht für Legacy oder sowas.

Dominik

In JavaScript gibt es es, weil

Stefan

also in TypeScript gibt es das, weil du halt

Stefan

in JavaScript Parameter

Stefan

weglassen kannst

Stefan

oder

Stefan

Parameter

Stefan

in unterschiedlichen Positionen auch was anderes heißen

Stefan

und da hat TypeScript

Stefan

irgendeine Methode gebraucht, um das darzustellen

Stefan

und deswegen

Dominik

haben wir es. Ja, gut, wenn man

Dominik

Sternchen, Quark schreibt oder sowas.

Stefan

Also gerade dieses Ads-Beispiel von Johannes,

Stefan

das würde ich eigentlich jetzt

Stefan

in TypeScript mit

Stefan

mit Generics umsetzen

Stefan

hat.

Johannes

Ja gut, wenn du jetzt

Johannes

die Methode

Johannes

Add für Integer und die Methode Add für Stringen

Johannes

hast, musst du ja schon zwei unterschiedliche

Johannes

Implementierungen haben auch.

Johannes

Also an irgendeiner Stelle musst du ja deine

Johannes

Implementierung verzweigen.

Johannes

Nicht in

Johannes

JavaScript. Ja, wenn du Plus verwendest,

Johannes

okay, aber dann musst du das Plus irgendwo hin

Johannes

verzweigen, weil das macht ja sehr unterschiedliche Dinge.

Johannes

Ja.

Johannes

Dann könnte ich das dann dann Etto überschreiben.

Johannes

Ja, ja.

Johannes

Ja.

Dominik

Was mir noch

Dominik

fehlt, wir haben schon relativ viel

Dominik

gesagt, was ist sowas wie, ich glaube es ist eben

Dominik

schon einmal gefallen, sowas wie rekursive Types oder sowas.

Dominik

Wenn ich zum Beispiel einen Jason-Type definiere.

Dominik

Hier, sag doch nicht sowas.

Dominik

Kapitel 7.

Johannes

Bin ich ja noch weit entfernt von Kapitel 7.

Stefan

Ja, also rekursive Types

Stefan

rekursive Types ist schon

Stefan

nötig. Wenn du jetzt zum Beispiel

Stefan

eine Liste definieren willst, eine einfach

Stefan

verkettete Liste, dann hast du dort

Stefan

einen Knoten und du verweist auf den nächsten

Stefan

Knoten.

Stefan

Aber das ist eigentlich

Stefan

nur ein Typsystem-Fu, also du musst

Stefan

irgendwie die Möglichkeit

Stefan

haben, dass du Typen definieren kannst,

Stefan

die sich selbst

Stefan

referenzieren können, wenn nötig.

Dominik

Also wie JSON-Objekte

Dominik

oder sowas zum Beispiel tatsächlich?

Stefan

Zum Beispiel, ja, genau. Also in JSON

Stefan

kann es ja auch sein, dass du

Stefan

naja, schwierig.

Dominik

Ja, eine Liste von Objekten habe,

Dominik

in denen andere Listen stecken, die wieder irgendwie

Dominik

Teugs haben oder so. Ja, genau.

Stefan

Oder ein Array von Arrays,

Stefan

wenn du schon dabei bist.

Stefan

Aber ich habe eben mal mit

Stefan

jemandem vom TypeScript-Team gesprochen,

Stefan

bezüglich rekursiven Typen.

Stefan

Das ist meistens

Stefan

Implementierungsdatei, wie tief der Compiler

Stefan

dort denn gehen kann. Also was sind die,

Stefan

wie

Stefan

ist der Compiler entwickelt?

Stefan

dass er bald genug sagen kann, hey, da stoppe ich jetzt

Stefan

und passe nicht mehr weiter. Also wie geht der Compiler

Stefan

mit der Regression?

Stefan

Typsysteme können das eigentlich.

Dominik

Also auch in der IDE, ich weiß nicht, bei JSON-Type

Dominik

oder sowas, bis wie viel Level-Tief

Dominik

darf der denn gucken, ob das noch

Dominik

stimmt?

Stefan

Und da werden es auch immer besser.

Stefan

Das ist der Mathematik-Egal.

Stefan

Das ist der Mathematik-Egal, die guckt

Stefan

Ja.

Stefan

Genau.

Jochen

Ja, da kommt dann wieder darauf an, welche Art von Mathematik, wenn man den konstruktiven Zweig anhängt. Das gibt es gar nicht.

Johannes

Wenn du schon in der Grundvorlesung, also ich habe ja eine mathematische Ausbildung genossen an der Universität, da werden dann die natürlichen Zahlen nochmal definiert und die werden rekursiv definiert.

Johannes

Da gibt es eigentlich nur eine natürliche Zahl.

Johannes

Das ist die 0 oder die 1, je nachdem, wo du anfangen willst.

Johannes

Und dann sagt man einfach, 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, ich weiß nicht, haben wir noch?

Jochen

Ah, was mir noch einfällt, genau.

Jochen

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

Jochen

Ich meine, das ist ja jetzt etwas, was man, also

Jochen

die Typen werden ja

Jochen

zur Laufzeit ignoriert

Jochen

in Python, aber

Jochen

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

Jochen

im Grunde kann man rausfinden,

Jochen

wie die Annotationen sind

Jochen

und es gibt halt auch Software, die das macht,

Jochen

wie zum Beispiel Pydentic.

Jochen

Ja, oder MyPy.

Jochen

Oder FastAPI. Oder FastAPI.

Jochen

Ja, genau.

Jochen

Gibt es sowas eigentlich in TypeScript auch?

Jochen

Weil, ich meine, gut,

Jochen

Das wird ja kompiliert zu JavaScript, aber es gibt ja jetzt auch, glaube ich, Interpreter, die direkt TypeScript interpretieren.

Jochen

So Deno oder sowas macht das, glaube ich. Ich weiß nicht so genau.

Jochen

Könnte das ja im Grunde genommen tun.

Stefan

Das ist ja ein weitverbreiteter Irrglaube, dass Deno direkt TypeScript interpretiert.

Stefan

Deno hat nur einen TypeScript-Compiler inkludiert und kompiliert TypeScript, bevor er das JavaScript ausführt.

Stefan

Also tatsächlich, ich sage mal, im JavaScript-Bereich reden wir eher von unterschiedlichen Typsystemen, die existieren.

Stefan

wie Flow-Type ist zum Beispiel

Stefan

eins, das sehr, sehr optisch sehr, sehr ähnlich

Stefan

ist zu dem, was TypeScript

Stefan

zur Verfügung stellt, aber halt

Stefan

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

Coffee-Script gab es früher.

Stefan

Ja, Coffee-Script ist aber sogar

Stefan

eine eigene Programmiersprache.

Stefan

Ja, aber komplett, also ich meine.

Johannes

Gleiche Historie.

Stefan

Ähnlich, ähnlich. Da gibt es auch einen wichtigen Punkt, weil wie Typen definiert werden in JavaScript, das ist ja eigentlich nicht dem TypeScript-Team zu verdanken, sondern dem ECMAScript-4-Standard, der schon viel, viel älter ist, der nie umgesetzt wurde, an den sich aber alle Typsysteme jetzt irgendwie dranhalten bei der Definition des eigenen Typsystems.

Stefan

Ich würde eher sogar sagen, dass Action-Skript, also die Flash-Programmiersprache noch eher ähnlicher oder verwandter mit TypeScript und Flow-Type ist. Aber das ist es dann auch. Also du hast entweder unterschiedliche Typsysteme, dann entscheidest du dich in den meisten Fällen heutzutage eh für TypeScript und dann bietet dir TypeScript eigentlich alles, was du dafür brauchst.

Stefan

Also du laufst da gar nicht in Gefahr, dass du irgendwie ein anderes Werkzeug nimmst. Und TypeScript versteht halt auch komplett JavaScript. Das heißt, du kannst halt dort noch mit JavaScript-Code anfangen und dich nur einmal auf die Typ-Inferenz vom TypeScript-Type-Checker verlassen.

Stefan

Dass du sagst, ich weiß jetzt, welche Typen du verwendest, rein in der Verwendung deines Codes. Dass du jetzt so eine retroaktive Typ-Annotation machst, macht man eher nicht. Es gibt ein paar Werkzeuge, ich könnte aber jetzt nicht den Namen dazu sagen, macht man aber aus dem Grund nicht, weil der TypeScript-Type-Checker eh gut genug ist, dass er schon sehr, sehr viel herausfindet, bevor du überhaupt irgendeine Annotation machen musst.

Stefan

Was ein gutes Migrations-Solis ist, ist JS-Doc, das ist eine Typ-Annotation im Kommentar,

Stefan

wo du einfach sagst, hey, du hast diese Funktion, die hat drei Parameter,

Stefan

du definierst den Typen im Kommentar und nicht im Code und das machen viele Bibliotheken,

Stefan

das machen sehr viele alte JavaScript-Bibliotheken, wie zum Beispiel Lodash oder Underscore schon

Stefan

und TypeScript kann mit dem umgehen, also TypeScript kann auch Typ-Informationen aus diesen Kommentaren lesen

Stefan

und hat halt so weit mehr Kompatibilität mit dem gesamten Ökosystem,

Stefan

als wenn sie darauf bestehen würden, dass sie nur die Typen verwenden, die du annotierst.

Johannes

Okay, aber so ein richtiges Äquivalent zu dem, was der Jochen gefragt oder gesagt hat,

Johannes

gibt es nicht wirklich.

Johannes

Zur Laufzeit hast du nicht wirklich mehr die Typinformation.

Stefan

Also zur Laufzeit, es gibt Bibliotheken, die fügen Typinformation zur Laufzeit hinzu und leiten dadurch TypeScript-Typen ab, aber das ist es dann schon. Also es gibt auch ein paar so Reflection-Geschichten, das ist aber alles Mumpitz, also das möchte ich nicht einmal erwähnen, weil es einfach Schwachsinn ist.

Stefan

Eine Sache, die aber gut ist zum Beispiel, das ist SOD.

Stefan

Wenn du jetzt sagst, du brauchst jetzt Typinformationen zu Laufzeit auch,

Stefan

dann kannst du über die SOD-Bibliothek dir deinen Typen in JavaScript definieren.

Stefan

Das ist aber nicht TypeScript, das ist JavaScript.

Stefan

Und kannst dann, wenn du diesen Typen weiter im TypeScript-Code verwenden willst,

Stefan

sagen, hey, leite mir jetzt aus diesem JavaScript-Konstrukt, das ich gebaut habe,

Stefan

das einen Typen darstellen soll, leite mir von diesem JavaScript-Konstrukt

Stefan

doch einen TypeScript-Typen ab, den ich weiterverwende.

Stefan

Und du bekommst dann zum einen einen klassischen TypeScript-Typ, den du in deinen Methodensignaturen verwenden kannst, den du annotieren kannst, wo du typechecken kannst, das funktioniert, das ist grandios gut.

Stefan

Parallel dazu hast du aber immer noch dieses JavaScript-Konstrukt, mit dem du erst eine Validierung empfangen kannst. Das heißt, du kannst sagen, hey, du kriegst jetzt ein Chasen von einem Backend, steckst es in den Validator rein und kriegst entweder Ergebnisse, die es nachher dem Typen entspricht, super, oder Fehlermeldungen, mit denen du umgehen kannst.

Stefan

und das ist eine

Stefan

grandiose Bibliothek.

Stefan

Erstens

Stefan

ist sie so nah an TypeScript, dass du

Stefan

wirklich sämtliche Dinge, die du in TypeScript schreiben kannst,

Stefan

auch damit umsetzen kannst

Stefan

und zweitens ist sie schnell,

Stefan

sie macht robusteren Code,

Stefan

ich bin total glücklich mit der, die kann ich sehr, sehr gut empfehlen.

Stefan

Also unbedingt.

Stefan

Aber prinzipiell gilt es.

Stefan

Okay, cool. Also ein ähnliches

Stefan

Verfahren. Sehr ähnlich.

Stefan

In Salt ist es aber so, dass du

Stefan

die Typen dann anfängst

Stefan

zu schreiben in dieser JavaScript-Welt

Stefan

mit den dort vorhandenen Methoden und Funktionen.

Stefan

Und das ist halt umgekehrt zu dem,

Stefan

wie es du normalerweise in TypeScript auch ist,

Stefan

dass du sagst, du schreibst deine Typen

Stefan

und die sind nach dem Kompilator einfach weg.

Stefan

Also TypeScript ist so eine 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 weggehen.

Johannes

Ja, okay, aber da würde ja nicht prinzipiell was dagegen sprechen, oder?

Johannes

dass du von TypeScript-Typen zu

Johannes

JavaScript-Typen gehst. Das ist nur

Johannes

das Tooling, das existiert nicht.

Johannes

Aber das ist doch cool. Du hast auf jeden Fall

Johannes

das gleiche. Unbedingt zu empfehlen.

Stefan

Ja, unbedingt zu empfehlen.

Stefan

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

Ich meine, da musst du eh immer Validierung

Stefan

machen, aber das

Johannes

kann einem ja

Johannes

in dem Sinne die Arbeit ein bisschen abnehmen.

Jochen

Naja, quasi man definiert

Jochen

halt, wie man gerne hätte, dass die eigene

Jochen

Datenstruktur aussieht und benutzt

Jochen

dann diese Information halt auch zur Validierung

Jochen

dagegen. Das ist natürlich

Jochen

also, ja, das ist genau eigentlich

Jochen

der US-Case von Pydentic auch.

Stefan

Ja, ja,

Stefan

muss man das Pydentic noch genauer anschauen.

Stefan

Also das hört sich zum

Stefan

Zeitmehr, ich habe es heute gehört, wie wir

Stefan

begonnen haben.

Stefan

Und jetzt wieder. Erklär mal, Jochen,

Johannes

zwischen FastAPI und Pydentic.

Jochen

Ach, ja, FastAPI ist sozusagen ein ...

Jochen

Ein Repeter-Face, fast.

Jochen

Ja, genau.

Dominik

Automatisierung bereitstellen.

Dominik

Ja, und Pydentic.

Jochen

Pydentic ist eine Bibliothek, die benutzt wird von FastAPI

Jochen

und die halt sozusagen ermöglicht,

Jochen

wenn man halt mit Typ-Annotationen sozusagen,

Jochen

oder der Syntax, es gibt noch mehr,

Jochen

weil man kann halt auch noch mehr machen

Jochen

als nur die Sachen, die mit Annotationen möglich sind.

Jochen

Man kann halt auch Validierungsfunktionen haben

Jochen

und Upper Limits und

Jochen

Lower Limits und weiß ich nicht, und ganz viel kompliziertes

Jochen

Zeugs halt auch mit dazu schreiben. Das geht

Jochen

mit den Typ-Annotationen natürlich nicht,

Jochen

aber wenn man einfach nur die Typ-Annotationen hinschreibt,

Jochen

dann passiert das halt auch, dass dann

Jochen

sozusagen man

Jochen

einen JSON nehmen kann und man hat halt

Jochen

eine Objektstruktur definiert mit den Typen

Jochen

und dann sagt man halt, hier ist das JSON,

Jochen

parse das mal

Jochen

und validiere das mal.

Dominik

Und wenn es nicht, dann kriegst du 422 zurück, weil da fehlt irgendwas.

Dominik

Wenn es nicht okay ist,

Jochen

kriegt man halt schöne Fehlermeldungen auch zurück, wo dann

Jochen

genau gesagt hat, so an der Stelle

Jochen

hast du gesagt, das soll ein

Jochen

Number sein, aber da ist eigentlich, da ist ein

Jochen

String oder das ist halt irgendwie,

Jochen

das passt sonst wie nicht, das soll eine Liste sein, aber das

Jochen

ist halt nicht, ja, und

Jochen

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

Jochen

also es ist quasi

Johannes

das, woraus FastAPI

Johannes

gebaut wird. FastAPI ist

Johannes

identisch 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 Fast API ist schon so ein bisschen,

Jochen

ist halt so irgendwie

Jochen

drei sehr coole oder drei, vier

Jochen

sehr coole Open-Source-Bibliotheken in einem French-Code

Jochen

irgendwie quasi. Noch so Routing,

Dominik

das hat man halt irgendwie von Flask

Dominik

früher kannte, als Dekorator.

Dominik

Ja, Flask war auch sehr alt.

Jochen

Ja, genau, das ist natürlich auch sehr alt.

Johannes

Also Stefan, wenn du Fast API schon kennst,

Johannes

dann weißt du auch, wie Pedantic funktioniert.

Johannes

Nur halt innerhalb.

Stefan

Genau.

Stefan

Also wie gesagt, ich habe den Namen in ein Architektur-Diagramm

Stefan

geschrieben. Also das ist meine Erfahrung damit.

Stefan

Reicht anscheinend.

Stefan

Es ist schon mehr damit gemacht als viele.

Stefan

Genau.

Stefan

Ja.

Jochen

Genau. Also ja, das ist

Jochen

auf jeden Fall auch so noch ein ganz interessanter

Jochen

Ding. Weil ich meine, das ist ja tatsächlich

Jochen

so, wie viele Leute das benutzen. Viele Leute benutzen

Jochen

einen TypeDict und denken, das würde passieren, dass es

Jochen

validiert wird. Aber es passiert halt nicht.

Jochen

Ja. Genau.

Jochen

Ja, ansonsten, ich weiß es nicht. Haben wir noch

Jochen

irgendwas Großes vergessen oder so, aber ich glaube

Jochen

ansonsten

Jochen

ich habe hier fast nichts mehr, was ich noch irgendwie

Jochen

unbedingt gerne wissen wollte.

Johannes

Ja, nach anderthalb

Johannes

Stunden alles über

Johannes

Typsysteme und Typen

Johannes

gesagt. Das ging ja relativ

Johannes

schnell jetzt.

Dominik

Für meinen Typen hat der immer noch keine Erklärung gefunden,

Dominik

aber sonst.

Johannes

So Typen wie

Johannes

dich, Dominik, ist schwer zu beschreiben.

Johannes

Das ist so.

Johannes

No space enough.

Dominik

Ja, wirklich, ich finde es schön.

Dominik

Stefan, hast du noch etwas, was du unbedingt loswerden wolltest?

Stefan

Ich glaube, ich habe jetzt noch ein anschauliches Beispiel gefunden

Stefan

zu Co-Varianz und Kontra-Varianz.

Stefan

Nachdem ich mir die Grafik so lange angeschaut habe.

Stefan

Ich hoffe, ich kann es erklären.

Stefan

Co-Varianz ist in Wirklichkeit etwas, was wir als Subtyping verstehen.

Stefan

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

Stefan

das ist ein Pflanzenfresser, dann hast du ein Subtyp davon, das ist eine Kuh.

Stefan

Das heißt, du wirst immer konkreter und konkreter und konkreter.

Stefan

Was bedeutet, wenn du irgendwo ein Lebewesen erwartest,

Stefan

kannst du dort einen Pflanzenfässer reinschmeißen,

Stefan

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

Stefan

oder Veganer, von mir aus.

Stefan

Und das ist Covariance.

Stefan

Das heißt, du kannst etwas sehr Breites akzeptieren

Stefan

und kannst etwas sehr Konkretes reinstopfen,

Stefan

wenn der Subtyp da ist.

Dominik

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

Dominik

Genau, genau, genau.

Stefan

Jetzt hast du aber zum Beispiel eine andere Covariance,

Stefan

Nämlich du hast jetzt Pflanze und davon abgeleitet Gras und davon abgeleitet vielleicht Heu oder so.

Stefan

Und jetzt willst du eine Funktion zur Verfügung stellen, die akzeptiert Grasesser,

Stefan

dann kannst du dort bei den Grasessern Kühe, aber auch Pflanzenfresser reinschmeißen.

Stefan

Wenn du jetzt aber sagst, du akzeptierst jetzt Pflanzen,

Stefan

also alle die Pflanzen oder Funktionen von Entitäten,

Stefan

die alle Pflanzen essen können, alle Pflanzen,

Stefan

dann kannst du dort keine Kühe reingeben,

Stefan

weil Kühe können nur Gras essen.

Stefan

Und das ist Kontravariant.

Stefan

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

Stefan

du hast einen sehr breiten Typen.

Stefan

Ich akzeptiere ja Pflanzenfresser.

Stefan

Allerdings kannst du keine Kühe reingeben,

Stefan

weil Kühe nur Gras essen dürfen.

Dominik

Okay, und Inverianz ist dann ganz festgesetzt,

Stefan

dass halt nur den einen speziellen Typ.

Stefan

Genau, Inverianz geht in beide Richtungen.

Stefan

Ja, genau. Also ich hoffe,

Stefan

dass das nochmal veranschaulicht.

Dominik

Ich glaube, wir gucken uns lieber dein Bild nochmal an.

Dominik

Ich hoffe, das Bild ist so anschaulich

Dominik

für die Leute, die rausgestiegen sind.

Dominik

Ja, aber

Johannes

wir werden sicherlich ganz viele E-Mails

Johannes

kriegen und das in den nächsten vier Folgen alles nochmal

Johannes

genau erklären.

Jochen

Ja, okay, wenn da eine Erklärung dabei ist.

Dominik

Hallo bei peistenpodcast.de.

Dominik

Wir haben aber noch gar nicht ganz fertig,

Dominik

weil wir möchten ja noch unseren Pick der Woche, glaube ich, auswählen.

Dominik

Ich fange mal an.

Dominik

Stefan, weißt du denn, was ein Pick ist?

Stefan

Ja, also müssen wir jetzt irgendeinen Link raussuchen,

Stefan

den er total grandios findet.

Stefan

Ja, genau.

Stefan

Irgendwas Schönes zeigen.

Dominik

Ja, meistens nennen wir Python-Module, aber das ...

Dominik

Ich nehme tatsächlich, ja, auch nicht immer.

Dominik

Ich nehme tatsächlich diesmal eins von

Dominik

Simon Willison und zwar das LLM. Ich glaube, das haben wir

Dominik

bei einer der Machine Learning Folgen

Dominik

in Shownotes irgendwo

Dominik

gehabt, aber es ist tatsächlich

Dominik

bei mir ist vermehrt in Benutzung

Dominik

im Monkey Patch schon immer das Default, aber sonst

Dominik

ist es sehr, sehr schön, weil du halt

Dominik

ganz viele Templates und Chains von

Dominik

Templates direkt benutzen kannst in deiner

Dominik

Kommandozeile, um halt mit den verschiedenen

Dominik

Modellen zu sprechen direkt, die

Dominik

du da haben willst.

Dominik

Und es ist toll, wenn man

Dominik

harte Instruktionen gibt, dann so die

Dominik

Standard-Persönlichkeit des

Dominik

antwortenden LLMs irgendwie

Dominik

so ein bisschen gerade zu rücken

Dominik

auf das, was man selber gerne als Antwort hätte.

Dominik

Such irgendwie die Leute gut aus,

Dominik

mit denen du sprichst, das wollte ich damit sagen.

Dominik

Und dann leitest du uns ein, Dominik.

Dominik

Weiterhin viel Spaß

Dominik

bei den nächsten Pics, wollte ich noch sagen.

Dominik

Ja.

Dominik

Ja, was hast du denn gepickt, Jochen?

Jochen

Was wollte ich? Ah, genau. Ich dachte mir

Jochen

so, naja, vielleicht auch ein Buch mal.

Jochen

Und zwar eins, das ich nicht gelesen

Jochen

habe. Aber wo man

Jochen

das alles nachlesen kann, kann man auch

Jochen

die Antworten, wenn man

Jochen

drauf gekommen ist, wie das sein muss, an uns schicken.

Jochen

Und zwar The Little

Jochen

Typer ist ein Buch, das

Jochen

ich habe es versucht zu lesen. Es ist irgendwie, ich habe

Jochen

dann zwischendurch aufgegeben.

Jochen

Das muss ich sagen, wie Experiment mit Types

Jochen

entbeißen.

Jochen

Aber da steht

Jochen

da steht das, glaube ich, alles ganz genau drin, wenn man das

Jochen

wissen will. Und ah gut, vielleicht

Jochen

nochmal was Praktisches, weil

Jochen

ja,

Jochen

das ist ja doch nicht irgendwie

Jochen

was für alle wahrscheinlich.

Jochen

Doku ist ganz nett, auch

Jochen

nicht Python, sondern Go.

Jochen

Geschichte,

Jochen

Heroku hatte ja in letzter Zeit so ein bisschen Probleme

Jochen

und

Jochen

ist nicht mehr so richtig

Jochen

irgendwie der Platz, wo man vielleicht so mal so,

Jochen

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

Jochen

mal eben deployen wollte,

Jochen

hat man das oft dann bei Heroku oder so

Jochen

getan, weil das halt sehr einfach war,

Jochen

aber das geht

Jochen

irgendwie nicht mehr.

Jochen

Wo würdest du das jetzt machen, Jochen?

Jochen

Also meine

Jochen

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

Jochen

ich habe da so meine Standard

Jochen

Ansible-Dinger.

Jochen

Ja, okay, gut. Also du

Johannes

bist vom, dir ist Heroku

Johannes

zu kompliziert geworden und deshalb hast du

Johannes

jetzt deine eigene Hosting-Lösung gebaut.

Johannes

Ja, leider, ja.

Johannes

Ist natürlich keine Option, die jetzt viele

Jochen

dazu hören. Genau, also das kann ich auch

Jochen

nicht unbedingt empfehlen, das ist

Jochen

unerwartet kompliziert,

Jochen

aber bei mir geht's jetzt daher, hab ich das Problem

Jochen

nicht mehr. Und ich mach ja auch

Jochen

kein Docker oder so, sondern ich deploy da

Jochen

dann direkt irgendwie.

Jochen

Knallhart, bare metal.

Jochen

Ja, genau. Und

Jochen

bei

Jochen

Doku hat man dann halt irgendwie sowas,

Jochen

wo man dann so ähnlich wie mit Heroku einfach

Jochen

man hat halt so ein POC-File und dann

Jochen

kann man das einfach direkt und da auch

Jochen

also wenn man einen Docker-Container bauen kann, kann man

Jochen

Docker-Container dahin deployen und die laufen

Jochen

dann unter Subdomänen direkt mit

Jochen

HTTPS und so. Arbeitet das sogar mit Heroku?

Jochen

Also Doku?

Jochen

Nee, nee, das ist also, aber du musst

Jochen

halt das Doku auf einem

Jochen

von irgendwo auf einem

Jochen

weiß ich nicht, auf einer virtuellen Maschine

Jochen

irgendeinem Dings halt deployed haben.

Jochen

Self-hosted Heroku. Genau, self-hosted

Jochen

Heroku quasi.

Jochen

Und genau, das ist glaube ich

Jochen

manchmal ganz hilfreich, sowas zu haben.

Jochen

Ah. Ja.

Johannes

Okay, dann schließe ich mich da

Johannes

direkt mal an, weil in dem Fall habe ich drei

Johannes

Picks.

Johannes

Der erste ist Vercel.

Johannes

Das ist

Johannes

wie Heroku, nur cooler.

Johannes

Der zweite

Johannes

wäre Fly.io. Das ist

Johannes

quasi

Johannes

Docker-Sachen auf Hosted-Infrastruktur

Johannes

überall hin

Johannes

machen und die machen krasses technisches Zeugs damit.

Johannes

Also du schickst dir den Docker-Container,

Johannes

aber die zerlegen den und

Johannes

bauen sich da eigene

Johannes

Sachen draus. Das ist auch technologisch

Johannes

sehr interessant.

Johannes

Das war jetzt aber der opportunistische Pick,

Johannes

nur um da die

Johannes

Alternativen zu Heroku

Johannes

und Self-Hosted

Johannes

einmal gesagt zu haben.

Dominik

Jetzt sind wir ganz tief in den Pop-Bretchen.

Johannes

Genau, mein eigentlicher Pick ist was ganz

Johannes

anderes und zwar

Johannes

das ZDF hat ja

Johannes

eine Mediathek und auf dieser Mediathek

Johannes

kann man Sachen ansehen und wenn man ein paar Sachen

Johannes

angesehen hat, dann versucht das ZDF da

Johannes

Recommendations draus

Johannes

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? Ja.

Dominik

So analog.

Johannes

Das zweite deutsche Fernsehen, meine ich.

Johannes

Und die,

Johannes

also nur die Mediathek.

Johannes

Und weil das

Johannes

ZDF ja in öffentlich-rechtlicher Hand

Johannes

ist, haben die sich gesagt, eigentlich müssen wir das ja

Johannes

den Leuten zurückgeben. Und das haben sie tatsächlich gemacht.

Johannes

Die haben ihr Recommendation-System

Johannes

auf GitHub gepackt.

Johannes

Und man kann das jetzt ansehen.

Johannes

GitHub ZDF minus Open Source

Johannes

gibt es auch jetzt schon

Johannes

ein Repository drunter, das heißt

Johannes

Recommendations PA Base.

Johannes

Und da sind,

Johannes

da ist das Recommendations System

Johannes

vom ZDF drin. Und fand ich einfach spannend,

Johannes

das mal anzusehen.

Johannes

Weil da ja doch auch einiges

Johannes

an Arbeit drinsteckt. Und weil es da auch

Johannes

viele Firmen gibt, die sowas gerne hätten.

Johannes

Genau, das war's von mir. Stefan, hast du noch was für uns dabei?

Stefan

Ich habe noch etwas herausgefunden. Das ist schon ein älterer Artikel von Bob Nystrom aus dem Jahre 2015. Heißt What Color is Your Function? Und Bob Nystrom ist einer der Sprachdesigner, der jetzt aktuell an Dart arbeitet.

Stefan

Und das ist sehr spannend, weil er versucht zu erklären, anhand von Farben, wie sich normale Funktionen und asynchrone Funktionen im Sprachdesign unterscheiden. Also rein aus der Perspektive von, welche Herausforderungen kriegst du als Sprachdesigner, wenn du so ein Asian-Greed-Konstrukt gestalten musst.

Stefan

Und wie gesagt, der ist schon ewig alt, aber er ist

Stefan

vor kurzem wieder bei uns in der

Stefan

Firma aufgepuppt. Kann ich sehr empfehlen.

Stefan

Versuch das so zu erklären,

Stefan

dass du das, die

Stefan

Ergebnisse

Stefan

oder die Erkenntnisse in Python

Stefan

genauso anwenden kannst.

Stefan

Und finde ich immer wieder sehr

Stefan

interessant. Gehe sehr oft

Stefan

wieder drauf zu.

Stefan

Für die Programmiersprachen Interessierten.

Jochen

Ja, sehr cool.

Jochen

Also quasi diese Analogie

Jochen

oder diese Metapher habe ich auch schon häufig gehört.

Jochen

Ich wusste aber nicht, wo sie herkommt.

Jochen

Und ja, das muss ich auch irgendwo mal lesen.

Jochen

Nee, da gibt es tatsächlich noch was Älteres.

Jochen

What Color Are Your Bits?

Johannes

Das ist von 2004.

Johannes

Da geht es um die Herkunft von Bits.

Johannes

Also ob deine Bits urheberrechtlich geschützt sind oder nicht.

Johannes

Okay.

Johannes

Was du damit machen kannst, um die Farbe,

Johannes

damit sie die Farbe ändern.

Johannes

Aber das ist, ja.

Johannes

Also ich musste da auch zuerst dran denken.

Johannes

Also es scheint eine gute Metapher zu sein.

Johannes

Wir können das ja beides verlinken.

Johannes

Ja, sehr gerne.

Johannes

Ja. Ja, vielen Dank.

Dominik

Ich würde sagen, herzlichen Dank, dass ihr heute

Dominik

alle wieder da wart. Herzlichen Dank, Stefan.

Stefan

Herzlichen Dank, Johannes. Ja, danke für die Einladung.

Dominik

Freut mich sehr. Ja, sehr gern.

Dominik

Dann, ja, bleibt uns gewogen.

Dominik

Schaltet uns wieder ein. Hört uns, wo immer ihr gerade seid.

Dominik

Morgens, mittags, nachts, abends.

Dominik

Zum Schlafen, zum Einschlafen.

Dominik

Einen wunderschönen Tag.

Dominik

Bis bald.

Dominik

Tschüss. Ciao. Tschüss.