Transcript: Live von der DjangoCon Europe 2025 in Dublin - Tag 2
Full episode transcript. Timestamps refer to the audio playback.
Hallo liebe Hörerinnen und Hörer, willkommen beim Python-Podcast, Episode 64, heute nochmal von der DjangoCon, eine Sonderausgabe.
Ja, zweite Live-Episode.
Ja, freut mich wieder da zu sein. Hey Jochen.
Ja, hallo Dominik.
Hallo Johannes.
Hallo zusammen.
Und hey Ronny, heute alles ganz.
Hallo Ronny.
Hi, schön hier zu sein.
Ja, schön, dass du da bist.
Ja.
Ja, wir wollten noch ein bisschen wieder von der DjangoCon erzählen, auf der wir gerade sind in Dublin.
Ja.
Das hatten wir gestern schon getan, die Folge ist tatsächlich auch pünktlich online gegangen, danke.
Ja, fast pünktlich.
So nach dem Pub-Besuch ist das immer so ein bisschen schwieriger, also das Hotelzimmer wiederzufinden und dann auch noch eine Episode online zu stellen.
Insofern, das ging nur so irgendwie unterschiedlich.
Nee, ich habe noch mein Sweater vermisst und dann habe ich mein Sweater gefunden, das war wahnsinnig gut.
Dann hatte ich aber meine Hotelzimmer-Eintrittskarte nicht.
Am ersten Tag einmal alles mitgebracht.
Ja, und wenn man das Zimmer wechselt, ist auch schlecht.
Ja, genau.
Alles anders.
Ja, aber es hat irgendwie alles geklappt.
Ja.
Es hat immer noch da.
Wir haben ja gestern bis zum ungefähr Mittagshalt ja erzählt, was so war.
Was war denn gestern noch Interessantes?
Oh, das ist ja mein Notizen-Zurück-Zitzenblättern, es tut mir leid, du warst schon bei heute.
Ich glaube, das Erste, was wir tatsächlich gesehen haben, oder zumindest teilweise gesehen haben, war HTMX.
Ja, da kamen wir gerade nach dem Podcast noch so rein.
Ja.
Ja.
Und ja, war solide, aber auch nichts Überraschendes oder so.
Ich weiß nicht genau, ob jemand von euch da irgendwas Neues gesehen hat oder Interessantes.
Ja, nachdem wir die erste Hälfte verpasst haben.
Ja, stimmt, da kann man auch nicht so wirklich was zu sagen.
Und ich war kurz im Gym- und Spa-Bereich.
Also ich habe es gesehen und ich würde mich da anschließen.
Also ich fand es solide, wenn man sich nicht damit beschäftigt hat, auf jeden Fall super hilfreich.
Wenn man sich nicht damit beschäftigt hat, glaube ich, nicht allzu viele neue Dinge.
Kurzes Sidenote, bevor du runtergehst.
Den Talk mittags von Sebastian, hattet ihr den besprochen?
Weil der ist ja auch aus der Region bei uns, aus Köln.
Achso, den hatten wir nicht besprochen.
Nee, den hatten wir nicht besprochen.
Genau, da freue ich mich über ein bisschen, dass es geklappt hat.
Weil er hatte mich noch gefragt, weil ich ja schon mal letztes Mal bei der JungleCon mich beworben hatte
und genommen wurde, wie es denn aussieht und ob er meint, dass die Idee fliegt.
Und genau, fand das eine coole Sache.
Ich fand den Vortrag tatsächlich noch cooler.
Also für mich, ich habe mehr mitgenommen, als ich jetzt persönlich erwartet hätte noch.
Vielleicht erst mal kurz, worum ging es denn überhaupt?
Sorry, sorry, natürlich.
Genau, also der hieß The Fine Print in Jungle Release Notes.
Und es ging um neue Features in den neuen Versionen.
Also im Endeffekt, der Aufhänger ist, liest die Release Notes,
abgesehen von dem einen mega krassen, geilen Feature,
weil man halt da sehr viele Dinge immer kommt, die einem das Leben leichter machen,
wo man Code sparen kann, irgendwelche fiesen Hex-Walkarounds ausbauen kann.
Und hat sich dann durch die 5.x-Versionen durchgehangelt.
Da waren tatsächlich Sachen dabei, die ich noch nicht gesehen hatte.
Ja, der Carlton.
Du hattest ja vorhin auch so erwähnt, dass er auf keinen Fall wieder zu 4.2 zurückgehen würde,
wenn sich das vermeiden lässt.
Genau.
Und genau, freut mich sehr, weil der ist jetzt auch ein Regular beim Jungle Cologne.
Was hat der denn alles Schönes erzählt?
Vielleicht kannst du so ein paar...
Da fragst du mich Sachen.
Es ist immer so schwer, sich in Details zu erinnern, wenn man sich am Tag...
Wenn man nicht so Notizen hat, wie der Johannes hier vor sich.
Ja, ich war aber nicht in dem Talk, deshalb habe ich keine Notizen zu dem Vortrag.
Da war ja was.
Es ging um diverse...
Verbesserungen im Admin.
Es ging um Custom-Error-Messages, die man jetzt bei Constraints hinterlegen kann,
die auch übersetzbar sind.
Ja, cool.
Und es waren im Endeffekt alles relativ kleine Dinge,
aber immer auf Use-Cases bezogen, wie sie es halt vorher gelöst haben und nachher.
Also es war ein ganz...
Also selbst wenn man jetzt sagt, oh, diesen Case hatte ich noch nie,
ich muss noch nie eine Custom-Unique-Constraint definieren,
dann war halt immer so, ah, aber das sieht tatsächlich nützlich aus,
weil diesen Fall kann ich mir nicht vorstellen, weil man ihn halt präsentiert bekommt.
Also, wie gesagt, das...
war deutlich, auch für mich, deutlich nützlicher, als ich es mir eigentlich vorgestellt hatte,
weil ich dachte eigentlich, ich weiß schon alles,
aber tatsächlich habe ich scheinbar das Front-Print auch nicht so genau gelesen.
Ja, dann hat er das gut gelöst.
Das ist ja aber auch wirklich so eine Sache, dass in vielen Frameworks
hat man ja diesen Death-by-a-Thousand-Paper-Cuts.
Ja, das sind einfach viele, viele kleine Sachen, die gut oder nicht so gut sind.
Und ich glaube, dass das tatsächlich eine der Stärken von Django ist,
dass die halt auch an diesen Kleinigkeiten arbeiten und dann auch sagen,
wir haben an diesen Kleinigkeiten gearbeitet und dass die sich dann so langsam mit der Zeit...
auflösen. Ich kann ja auch noch mal
in diesem Kontext erwähnen, dass ich jetzt in 5.2
meine erste Django-Contribution drin habe.
Oh, herzlichen Glückwunsch.
Was bringst du uns denn?
Ich habe für, im Zuge von
meinem Pony Express Package, habe ich nach der
Django-Convigo einen Vortrag darüber gehalten.
Das ist ein Package, was E-Mailing
ein bisschen vereinfacht, also wirklich die
programmatische Erstellung
und Testen von E-Mails, was ich
relativ verbose finde, wenn man
das mit den gegebenen Django-Tools macht.
Und fürs Testing,
eine E-Mail hat ja nicht nur
Text, sondern die hat ja verschiedene
Text, also
Inhalte. Also die kann theoretisch Medieninhalte
haben. Es gibt den HTML-Inhalt
und den Plaintext-Inhalt. Die sind, glaube ich, die relevantesten
für die meisten modernen E-Mail-Clients.
Und man musste im Endeffekt
wirklich manuell sich durch ein multidimensionales
Dictionary in den E-Mail-Alternatives
durchgraben, wenn man das testen möchte.
Dafür haben wir in dem Package für die Testsuit
einen Wrapper geschrieben. Also die Testsuit nicht
für das Package, sondern für die
E-Mail-Klassen, die man produziert mit dem Package.
Und hab dann vorgeschlagen,
ob das nicht ein relativer No-Brainer wäre,
wenn man sowas auch irgendwie dem E-Mail-Alternatives
geben könnte, dass es quasi alle
also diese
wie nennt man das?
Dieses Text
slash JavaScript, Script
slash irgendwas, diese, ich komm grad nicht drauf.
Nein-Types?
Content-Types, genau.
Ja, achso, Content-Types.
Dass man quasi alles, was mit Text-Slash anfängt
und was man hinzugefügt, was in 99% der
Fälle wahrscheinlich immer nur plain und
HTML sein wird, trotzdem, dass man das
dann aus dem Objekt zurückbekommt und dann halt im Test
sehr einfach darauf ersorgen kann, ohne halt
sich durch irgendwelche nicht dokumentierten
APIs durchzugraben. Und
genau, das ging auch tatsächlich relativ gut durch.
Ich hab dann nochmal was anderes probiert
nach meinem Erfolgserlebnis
und hab dann genau gemerkt, was Carlton
heute in seinem Vortrag, ich greife vor, aber
was er sagt, kann ich nachher
nochmal meine persönliche Erfahrung dazu
spiegeln.
Ja, da werden wir auf jeden Fall gleich nochmal eingehen. Das ist doch das Thema von gestern,
was wir dann auch schon gesagt haben.
Und dann, glaube ich, nochmal ein bisschen aufmachen, wo es um
geht, wie man denn partizipieren kann
an Django. Aber vielleicht machen wir
chronologisch weiter mit den Talks. Das ist vielleicht
mal echt so eine gute Idee. Ja, der nächste war
Solving a Python Mystery. Ah ja.
Oder wart ihr bei jemandem bei dem Quality-Workshop?
Den da war ich auch nicht drin.
Nee, leider nicht.
Wollte ich zwar auch irgendwie, aber irgendwie hat's nicht
geklappt. Ja, es hat tatsächlich nicht gepasst.
Genau, Solving a Python Mystery, der war groß. Aber der war gut.
Der war sehr gut, insofern.
Nicht so, dass ich den jetzt anwenden könnte,
aber einfach mal mit SJS
überall.
Da reingucken und schauen,
was da für Dateien offen sind und so.
Ja, genau, da ging's
hauptsächlich um so Dinge,
die man halt, also was ist, wenn man ein Produktionssystem
hat, wo man nicht so gut drauf gucken kann?
Man hat bloß halt vielleicht
Log-Files oder man kann nur extern drauf gucken, man kommt
nicht in die Prozesse rein. Ja, oder hat man eine
eingeschränkte Shell drauf, sowas? Ja.
Aber man kann halt, ja, also zum Beispiel, man hat
einen Docker-Container, wie kommt man an das Environment?
Halt über das Proc-File-System
kommt man da halt dann ran.
Und dann hat man die ganzen Credential-Systeme
die man so braucht, um halt in die anderen Sachen
reingucken zu können. Und
dann kann man viel mit SJS
machen. Und ja, das mache ich auch
sehr gern.
Und, naja, es gibt halt
noch so ein paar andere Sachen, die man halt auch sich
angucken muss. So, wie viel I.O.-Operationen pro Sekunde
gibt's denn eigentlich auf der Maschine?
Was macht die denn? Was schreibt die? Was lief die denn
so? Und er hatte, ich glaube, das erste
Beispiel, was er hatte, war irgendwie ein Kafka,
was irgendwie 25
Messages pro Sekunde gemacht hat oder so.
Und alle waren so halbwegs zufrieden. Das ist übrigens auch etwas,
was ich immer wieder sehe bei Kunden oder so, dass sie halt
mit Dingen zufrieden sind, wo man sich einfach
Moment, das kann nicht sein. Das ist einfach
so weit, dass es mehrere Größenordnungen
von dem entfernt, was man erwarten würde.
Das kann einfach nicht sein. Aber
oft wissen Leute halt nicht,
dass das eigentlich irgendwie anders aussehen
sollte und denken dann, ja, so ist das halt.
Und dann machen sie halt ein Kafka-Cluster,
statt halt mal zu gucken, warum das nicht so richtig funktioniert.
Dann, genau,
war da halt so eine Geschichte,
TCP, No-Delay kann man irgendwie
setzen, wenn man... Macht Python ja auch an
Stellen weit. Genau, macht Python...
Macht es irgendwie nicht. Und dann
sieht man so ein typisches 40-Millisekunden-Delay
irgendwie. Und wenn man das
irgendwo sieht, dann weiß man schon so, oha.
Genau. Und
ja, solche Sachen halt. Und
was war das? Was hat er noch alles
erzählt? Ich weiß nicht.
Es war schon
sehr weit runter in den Kernel. Das war eigentlich
das Interessante, dass der halt nicht
Python debuggt hat, sondern er hat eigentlich
Linux und File Handles
und Kernel Traces debuggt.
Weil dann meinte er so, ja, also von außen solche
Sachen debuggen, das ist eigentlich super einfach.
Und dann hat er ein Diagramm irgendwie auf einer
Seite gezeigt und das ist halt ultra kompliziert,
was er alles an Teilen irgendwie
vom Kernel bis zu...
Und dann gibt es auch noch irgendwie
eBPF-Trace oder so. Es gibt ja dieses tolle neue Interface
da, so Berkeley
Packet Filter
Interface im Kernel. Da kannst du halt auch
tatsächlich die Syscrolls selber
tracen. Du kannst eigenen Code in den
Kernel injecten.
Ja, das hört sich simpel an.
Der dann im
Kernel, vom Kernel formal bewiesen
wird, dass er nichts Böses tut und dann ausgeführt werden kann.
Ja, dann.
Ja, und
jemand, den wir auch schon im Podcast hatten, Martin, hat dafür
einen Python-to-irgendwie diese
Intermediate-Language-Compiler mal geschrieben.
Dann kann man das auch in Python machen. Also
das Ding ist total gut. Er meinte auch, das verwendet
er auch häufig irgendwie, wenn er
nochmal tiefer gehen muss.
Ja, ansonsten
weiß ich, ich kann mich nicht mehr so wirklich erinnern an
allerlei Details, aber es war halt so, ja,
also man muss immer mal gucken und
oft
kann man halt mit so Standard
Linux-Tools irgendwie dann doch rauskriegen,
was da irgendwie schiefläuft an Produktionssystemen.
Also, ja. Aber der, man merkte,
der hatte richtig viel Erfahrung und schon eine Menge
gesehen. Ja. Mein Hauptgedanke
war, ich bin dankbar für die Abstraktionsebene,
die wir inzwischen in unserem Berufsfeld haben,
dass das Dinge sind, mit denen ich einfach nicht
beschäftigen muss. Ja.
Mein Gedanke war, dass ich
dankbar bin, dass es so Leute gibt wie ihn, der das
macht. Ja. Meinte er auch
auch erst halt so, wenn er irgendwo einen 500er-Fehler
sieht oder sowas, dann, er kann nicht mehr schlafen.
Er muss das irgendwie rauskriegen. Das geht auch ohne
Unix-Debugging.
Ja.
Ja. Genau, ja. War sehr schön.
Danach war der Celery
Vortrag, also der
Parallelisierungsvortrag mit Celery.
Den fand ich jetzt nicht so,
der ist nicht so tief reingegangen,
wie ich gedacht hätte, dass man kann. Und für mich war es
mehr so eine
Bestätigung, dass die Sachen, die ich rausgefunden
habe, nicht ganz abwegig sind. Ja.
Ja. Und die waren?
Ja, dass du Tasks in möglichst
kleine Teile aufteilst, dass du ein
Modell hast mit einem Status drauf, dass du den Status
atomar änderst.
Also in der Transaktion machst du
ein Select for Update auf dieses Modell, änderst
den Status, speicherst den, dann,
das hat er nicht gezeigt, dann mache ich es normalerweise so,
dass ich an dem Punkt die Transaktion beende,
weil dann habe ich ja mein Modell in der Hand
mit dem korrekten Status, dass ich kein anderer mehr
nehmen kann. Und dann kannst du diesen Task
abarbeiten und dann hast du nochmal so einen Block, der dann den
Status auf die nächste Stufe stellt.
Und dieses
Muster, das ist so was,
ich weiß nicht, vielleicht bin ich da
als Einziger draufgekommen oder auch nicht, ja,
und dieser Vortrag war so ein bisschen die Bestätigung,
ich bin nicht als Einziger draufgekommen.
Das ist immer sehr gut, weil das eben bedeutet,
dass man nicht was ganz Verrücktes macht.
Also du hast ein Statusmodell, das hält dann immer da, wo
bist du denn gerade und das wird dann immer Transaktionsgrund
angefasst und du füllst das dann auf
Dinge, die auf dieses Statusmodell
Ja, und wenn du
in so ein Task reingehst, dann
erwartest du, dass das Objekt, was
du bearbeitest, in einem bestimmten Status ist
und änderst es in
einen anderen Status, damit kein anderer Task
das anfassen kann. Das heißt, direkt am Anfang?
Ja, das ist das allererste, was du machst,
bevor du irgendwas anderes machst.
Änderst du das auf ein Processing oder sowas?
Ja, genau, also es kommt darauf an, je nachdem, was
du halt für Status hast.
Es kann ja sein, dass du durch mehrere
Stufen durch musst. Genau, also ich meine,
du änderst das nicht direkt in den nächsten, sondern in den
Intermittenten. Sondern du änderst das in einen,
der sagt, dass es gerade
bearbeitet wird, auf eine bestimmte Art und Weise,
und dass kein anderer dieses gerade bearbeiten
darf. Und dann machst du
deine Verarbeitung da drauf
und wenn die fehlschlägt, dann
machst du es rückgängig und gehst zurück auf den vorherigen
Status, weil dann kannst du nämlich einen Retry machen.
Wenn die funktioniert, dann stellst du
auf den nächsten Status, sodass der nächste Prozessschritt
gehen kann. In der
einfachsten Stufe ist es, du hast einen, der ist
Pending, dann hast du Processing und dann hast du Done.
Aber du kannst
natürlich diesen Aufbau, kannst du
natürlich x Stufen haben. Du kannst ja 5
verschiedene Verarbeitungsschritte oder 100
verschiedene.
Oder dann auch verzweigt haben.
Und das
Wichtige ist aber, dass du tatsächlich dieses Statusfeld
hast. Eins, was Warte auf Verarbeitung
heißt und eins, das heißt, wird verarbeitet.
Und dann kannst du sicher gehen,
dass du den nicht doppelt verarbeitest. Wenn du nämlich
das Erste machst, das Erste, was du machst,
du holst dir den aus der Datenbank
mit einer Datenbanktransaktion.
In einem Select for Update.
Das Select for Update sorgt
genau dafür, dass wenn du den
rausholst aus der Datenbank mit dem
Status und der ID, das ist sozusagen
der kritische Filter. Du suchst nach der ID
und nach dem Status und dann
kriegst du von der Datenbank eben genau
einen oder keinen. Wenn du keinen
kriegst, sagst du, gut, dann hat es wohl schon jemand anders
gemacht oder der ist schon fertig oder was auch immer.
Und wenn du einen kriegst, machst du weiter.
Und so
schützt du dich quasi davor,
dass du diese Race Conditions in die Datenbank
rein trägst. Dass du sagst,
okay, der verarbeitet jetzt was
und derweil verarbeitet jemand anders auch noch irgendwas.
Und er hat das gestern
Idem Potency genannt, also Idem Potenz.
Meiner Meinung nach nicht 100% korrekt
genannt. Darfst du es ja nicht
ein paar Mal ausführen.
Weil Idem Potenz eigentlich bedeutet, wenn du es mehrmals
ausführst, hast du das gleiche Ergebnis.
So ein bisschen
der Outcome
ist das gleiche.
Korrekte Idem Potenz.
Der korrekte Begriff wäre hier
irgendwie Locking oder sowas.
Du hast einen Locker drauf und das machst
hast du so eingerichtet, dass es wirklich nur eine kommt.
Wie gesagt, dieser Talk war für mich
hauptsächlich Bestätigung dessen,
dass das, was ich mir ausgedacht habe, nicht
ganz verrückt ist.
Das ist ja ungeheuer viel wichtig, ungeheuer viel
wert, dass du nicht so
ja, man baut sich ja oft so Sachen und
dann kommt man auf irgendwelche Lösungen und
irgendwann findet man raus, das ist absoluter Quatsch.
Oh, ich weiß nicht, was da ist.
Das ist dir noch nie passiert.
Bei mir passiert das ständig.
Und jetzt mal das andere Erlebnis zu haben,
es ist nicht ganz Quatsch, was du dir ausgedacht hast.
Na, schön.
Ja,
genau, genau. Aber ja,
Celery immer so ein bisschen, aber der macht ja dann auch so Dinge
mit Workflows und keine Ahnung, das ist kompliziert.
Und ich denke so, ha, lieber nicht, sowas macht man das nicht.
Wie ist denn jetzt der Stand mit den Django-Tasks?
Die sollten doch jetzt langsam mal...
Ja, ist aber noch nicht. Die kommen auch irgendwann.
Kommt jetzt dann vielleicht demnächst.
Aber ich glaube, es geht ja vor allem nur ums Interface
erstmal. Es gibt ja dieses Package,
wo das jetzt erstmal quasi so eine Art
ich glaube, die Datenbank-Tasks
als Primärding implementiert
werden und in Django Core
soll tatsächlich nur der Dummy-Taskrunner,
den man dann für Tests nutzen kann und das Interface.
Und diese Idee mit diesem Interface, das finde ich
super spannend. Es gibt ja jetzt auch starke Überlegungen,
die ganze Authentifizierung bei
Django, was ja auch oft kritisiert wird, dass im
User-Model ein sehr Western-Centric
Vor-Nahme-Nach-Nahme-Konzept, das passt oft
nicht in vielen Use-Cases oder auch anderen
Kulturen. Dann viele...
Also es wird ja username-standardmäßig genutzt,
du kannst das irgendwie opt-outen, es gibt so Packages,
E-Mail-Adresse ist nicht unik,
also ganz viele Dinge und das halt nicht die richtige
Lösung wäre, zu sagen, wir ändern das
jetzt oder wir bauen jetzt was Neues dazu, sondern
dass man das einfach auch Plug-and-Play macht,
wie halt auch die Datenbank-Anbindung Plug-and-Play ist,
wie die Caches Plug-and-Play sind, wie
mehr oder weniger eigentlich alles Plug-and-Play ist und da ein
Authentifizierungssystem zu haben, wäre natürlich
super und ich glaube, auf diesem gleichen Konzept
basiert auch dieses Tasks. Das ist im Endeffekt
das Django Core, im Endeffekt mit jedem kompatiblen
Task-Runner oder Task...
Ist es Task-Runner? Ich weiß es nicht genau.
Background-Task,
Backend.
Task-Backend, dann kommunizieren
kann, wenn man dann sagt, ich möchte ja eins mit
Celery, dann baust du dir eins und wenn du sagst,
mir reicht die Datenbank, dann baust du dir dafür eins
oder nimmst das, was da ist und
das... Ja, ich warte da aber auch schon
sehnsüchtig drauf. Wir können auch
noch kurz vorgreifen auf einen der Lightning-Talks,
weil da war nochmal der...
äh...
der Mann da, der auch über die Python-Mystery gesprochen hat
und hat mit so ein kleines bisschen Zorn gesagt
hier, Celery, das ist alles Mist
und das ist viel zu viel Aufwand
und deshalb habe ich mir mein eigenes geschrieben.
Und das Interessante daran war,
dass er das gleiche Interface benutzt hat
wie das von Celery. Also das ist nicht
das Django-Tasks-Interface, sondern
das von Celery. Das heißt, es ist
ein Drop-in-Replacement und man kann einfach seine Lösung
verwenden, wenn man keinen Bock mehr hat auf Celery.
Und wenn es nicht so funktioniert, wie man es möchte,
geht man zurück. Fand ich auch
eine interessante Idee.
Was ich daran sehr interessant fand, ist,
dass wenn man viele nutzen,
also Celery kann ja nicht mit der Datenbank als Broker
sprechen, aus Gründen, die niemand so genau
weiß. Ja, aber es gibt so ein
Interface dafür. Ja, aber
das wird immer, das ist rot umrandet
und da habe ich mich... Das heißt, die
meisten Leute nutzen halt dann Redis oder Revit im
Queue, irgendein Derivator von Redis ist das bekannteste,
viele Leute nutzen Redis und dann
gibt es halt diesen Disclaimer auf der Webseite, dass wenn man
halt Scheduled Tasks, also wenn man quasi
Tasks in die Zukunft
plant, dass es
damit Redis-Issues gibt. Das ist da seit...
Also wir, uns ist das glaube ich 2018
auf die Nase gefallen.
Und unser... Also wir
haben ja immer gesagt, okay, dann nutzen wir Revit im Queue, das war kein Problem,
aber im Endeffekt haben wir auch dann einfach
angefangen, wir planen einfach keine Tasks mehr
in die Zukunft, weil du kannst ja einfach quasi
die schedulen lassen. So. Aber du kannst
ja auch einen Scheduler verwenden, du kannst andere Sachen...
Wir haben das wirklich mehr oder weniger gut
ausgebaut bekommen, kein Problem mehr, Kuh vom Eis.
Und dann meinte dann, in dem
Lightning Talk gestern, meinte er so, ja, ja,
ihr denkt, ihr nutzt die nicht,
aber in dem Moment, wo ein Retry
kommt, nutzt ihr die plötzlich schon.
Und das war mir nicht bewusst und das ist dann so ein
Oh, dann sollte ich vielleicht wirklich kein
Redis zusammen mit Celery verwenden.
Ja,
Ivar Shkalvans ist der Name.
Ja, ja, also das...
Ich verstehe auch nicht so genau, warum
mit dem Schedule, das funktioniert immer nicht so, wie man das
richtig will. Und das Package heißt übrigens
Django-Task-Queue,
also wie der Buchstabe,
falls irgendwer mal Spaß daran hat.
Ja, es gibt leider so ein bisschen viele
Django-Task-Sachen, die alle so ganz ähnlich
ein Name mengen.
Ja, kann ich verlinken, auf jeden Fall.
Genau.
Genau, dann kam so ein bisschen, ging es so ein bisschen
ins Abendprogramm rein, da war es schon 17 Uhr und
dann kam der
Words-Vortrag, Logs, Shells, Caches
and other strange words.
Von einem Dortmunder,
das fand ich auch interessant.
Ja, wusste ich auch nicht, ist auch relativ nah bei uns dran,
aber noch nie gehört.
Nee, ist ungeheuer weit weg, finde ich.
Ja, gut.
Ja, Hörertreffen in Stuttgart.
Die machen sie jetzt dafür ab.
Genau, der Vortrag...
Wir haben übrigens ganz kurz zum Hörertreffen
schon uns entschieden für...
Ja, kam ja immer noch rum.
Da ging es dann schon so ein bisschen ins Abendprogramm rein,
hat er auch selber gesagt, war ein sehr unterhaltsamer Vortrag.
Ja, fand ich.
War sehr schön gemacht, war sehr nett,
hat einfach so ein bisschen über die
Etymologie gesprochen und über die lustigen
Herkünfte von...
den Wörtern, die wir benutzen,
die aber eigentlich nautischen Ursprungs im 17. Jahrhundert sind.
Was mich tatsächlich schockiert hat,
ist, dass die Story mit dem Bug,
also der Motte in dem IBM-Computer,
dass das nicht stimmt, also dass das nicht die Ursache
davon ist.
Das habe ich schon oft rumerzählt.
Ja, das ist auch ein schönes Bild.
Ja, aber...
Das musst du mir nochmal erzählen, ich habe den Tag nämlich verpasst.
Warum stimmt das nicht?
Also es gibt diesen Eintrag von dieser
Computermitarbeiterin,
die die Motte aus dem Gerät,
gefischt hat und dann in ihrem
handgeschriebenen Logs,
also wirklich das, was heute halt
auf dem System irgendwie im Hintergrund läuft,
in einem Buch, und da hat sie sich die Motte eingeklebt
und hat das dann so geschrieben
als, wir haben gerade den ersten Bug
gefunden. Tatsächlich war das aber
ironisch gemeint, weil das Wort Bug auf
ich glaube Edison war es, zurückgeht,
der geschrieben hat, sein Ideenfindungsprozess
ist so, wenn er eine neue Idee hat,
dann kommt das so in einem Schwall
heraus und danach kommen
wie kleine, wie kleine
ist ungeziefer diese ganzen Probleme
in der Realität, mit denen sie sich dann
auseinandersetzen muss, bevor er dann irgendeine Lösung
hat, die er wirklich verkaufen kann
oder nicht. Achso, die kleinen Käfer und
dann hat sie gesagt, okay, jetzt haben wir wirklich einen
echten Käfer. Genau. Ja, die Mutter.
Das fand ich aber auch sehr interessant, dieses Zitat, weil
das ist ja auch ein Gefühl, was man so kennt,
dass man einmal so einen Inspirationsschub hat und
dann stellt sich da die Realität in den Weg.
Und du weißt aber
eigentlich erst, wenn du diese ganze
schmutzige Arbeit gemacht hast,
ob es ein Erfolg oder ein Misserfolg ist.
Ja, das ist echt eine Idee selber, kannst du
das nicht ansehen. Außer du kennst jemanden, der
den Weg schon gegangen ist und kannst ihn fragen.
Ja, aber das ist keine neue Idee. So erfindest du die Glühbirne
nicht.
Gut,
und danach gab es natürlich noch Lightning Talks. Lightning Talks
sind immer super, finde ich großartig. Da ist
immer eine schöne Auswahl
und das war auch gestern so.
Apropos Lightning Talks, ich glaube,
es gibt heute interessante Lightning Talks. Machst du ein bisschen
Spoiler? Ich weiß nur von einem Lightning Talk, den es heute
gibt, weil ich habe mich angemeldet,
unvorsichtigerweise zu einem Lightning Talk.
Und ich werde in 5 Minuten
darüber sprechen, wie man in 5 Minuten einschlafen
kann. Und wie man das
hinkriegt, in 5 Minuten einzuschlafen.
Ja, also wenn ihr jetzt noch dran seid, dann habt ihr
es noch nicht geschafft.
Ich habe heute Abend dann 5 Minuten Zeit. Mal schauen,
bei wie vielen es klappt.
Und Ronny, du wolltest auch was über
deinen Lightning Talk erzählen.
Genau, ich hatte eigentlich vor, mich gestern schon
auch für einen Lightning Talk anzumelden.
Ich habe leider gestern ein bisschen
geschwächelt, gesundheitsbedingt.
Habe es dann nicht gemacht. Jetzt habe ich gerade gehört,
dass alle Slots schon voll sind.
Von daher werde
ich nicht über das Thema reden, aber ich kann es ja hier
ganz kurz präsentieren.
Morgen ist ja auch schon voll, habe ich gehört.
Auch schon voll, heile nein.
Es geht darum, dass ich habe vor
einiger Zeit, ich habe da auch einen Blogpost drüber geschrieben,
hatte ich den Fall, dass
wir so eine Art Django
DevOps-Geschichte in so einem großen Monolithen
brauchten. Es hatte zu tun,
ganz konkret, um Django Migrations aufzuräumen
für einen relativ spezifischen Case mit
für ein Projekt mit sehr, sehr langen
Deployment-Zyklen und so.
Und ja,
das aus Gründen nicht funktioniert hat und so
wegen, das Circular Dependencies auflösen
dauert zu lange, etc., etc.
Auf jeden Fall habe ich dann mich
relativ stark dafür eingesetzt und habe da
beim Kunden auch so ein paar Hierarchie-Ebenen,
Hierarchie-Träbchen rauf und runter gemacht,
um die davon zu überzeugen, dass wir das Ding dafür einfach
Open Source machen könnten und sie es trotzdem
voll zahlen.
Was am Anfang für ein paar gehobene
Augenbrauen geführt hat, weil
warum Open Source? Hä, wir zahlen doch.
Warum Sachen verschenken? Genau.
Und ich habe dann aber nachher tatsächlich
einen ganzen Haufen Argumente gefunden, warum das
einfach für alle Beteiligten besser ist.
Beispielsweise... Weil man dann endlich eure Fehler
finden kann, die dann auch öffentlich verfügbar
und einsehbar sind.
Vor allem auch, weil wir ansonsten das halt irgendwie
in den Monolithen reingewurschelt hätten und sobald irgendwann mal
ein Problem kommt, sowas fasst ja nie wieder einer freiwillig
an. Wenn das jetzt Open Source
ist, dann würde ich mich zumindest, solange ich es aktiv
maintaine, mich drum kümmern.
Und ich hatte bei zwei
Themen, wo ich selber... Open Source war also
ein Maintaining-Versprechen. Interessant, ja?
Solange ich mich drum kümmere, zumindest.
Da wird mich wahrscheinlich...
Da war die Kinderfahndung noch nicht so weit fortgeschritten.
Wird mich wahrscheinlich irgendjemand auf meine
Python-Podcast-Folge von vor zwei, drei
Jahren festnageln, wo ich
gesagt habe, das muss man immer weiter maintainen.
Ja.
Nein, genau.
Man kann ja auch schlecht maintainen. Ich maintaine Sachen
aber teilweise sehr, sehr, sehr schlecht.
Nein, aber vor allem, dass das Schöne an der Geschichte
ist, nachdem ich das gemacht habe,
Artikel darüber geschrieben habe und es halt wirklich
auch im Endeffekt eine wirkliche Win-Win-Situation
war ja auch wirklich die Entkoppelung auch dann da, wo man gar nicht
in die Verlegenheit kam, irgendwas projektspezifisch zu
machen, hatte ich
dann irgendwann plötzlich einen
Issue von
einer
scheinbar sehr, sehr kompetenten
Entwicklerin, die geschrieben hat,
dass sie folgende zwei Probleme
identifiziert hat.
Und das eine hatte ich sogar literally as to do im
Code, weil ich wusste, dass ich das eigentlich noch fixen muss, aber
ich brauchte es halt für einen Case gerade nicht, darum habe ich es dann
offen gelassen. Dann hat sie mich gefragt,
ob sie das lösen darf und hat
dann zwei absolut
perfekte Merge-Requests, wo ich wirklich absolut
oder fast nichts daran aussetzen konnte,
delivered, die einfach funktioniert haben,
alles durchgetestet und das
sind halt Sachen, die hätten die ansonsten halt
niemals da reinbekommen.
Und genau, ansonsten
ich nutze das natürlich auch für meine Projekte und das
ist eine sehr schöne Success-Story und
ich glaube, wenn das mehr Leute im Kopf haben,
dass das geht, dann könnte man sehr, sehr
viel mehr in Open Source einfach leveragen,
über Kundengeld,
wenn man es halt einfach im Kopf hat.
Und das wolltest du quasi als Success-Story verkaufen
und ein bisschen Werbung zu machen. Was war das genau?
Worum ging es da? Also ich habe, du hast gesagt,
Deployment-Zeugs bei Django. Also genau,
das Package heißt Django Migration Zero.
Es gibt leider, ich habe auch eine Sache, wenn man
Packages erstellt, checkt vorher mal, was es für Packages
gibt, die ähnlich heißen. Ups.
Es gibt nämlich Mig Zero
und Migration Zero Django und ich glaube,
Migration Zero ohne Django.
Ja, meinst du, ich habe
einen Artikel geschrieben, ich habe in Blog-Posts das verlinkt und noch
einen Artikel drüber geschrieben. Das heißt, Google
packt mich jetzt auf Platz 1, glaube ich.
Yay.
Aber genau, also es geht einfach darum,
dass wenn man, wir bei uns nutzen
aus historischen Gründen, wie du vorhin auch meintest,
man hat mal so eine Lösung im Kopf und dann nutzt man die immer
weiter. Wir haben, um quasi Object-Ownership
zu haben, haben wir quasi in so einer, in unserer
Toolbox-Package, wo so kleine Dinge,
die sich nicht als eigenes Package lohnen,
haben wir quasi so dieses
Created-By, Last-Modified-By
und das ziert Titel auf den User,
was dazu halber führt, dass wir sehr, sehr viele Circular-D-
Dependencies haben, wenn wir ein Custom-User-Model
haben, was wir aus historischen Gründen,
weil früher war das alles sehr mühsam mit Django, mit
Aus, wie immer mit, auch Model-Switchen und
haben wir meistens uns für ein Custom-Model
entschieden, was wir heute nicht mehr tun,
aber es war halt ein älteres Projekt und das
heißt, du hast sehr, sehr, sehr, sehr viele
Circular-Dependencies und wenn du Squashen möchtest,
musst du die, also das dauert, weiß ich nicht,
Tage, glaube ich, hätte das gedauert zu lösen,
für den Effekt, dass ich weiß, welche
Migrations mal da waren, aber das ist halt kein
Packages-Deployed-System, also was auf
ein Produktivsystem angekommen ist, da ist,
Ende, so, ich muss nicht
wissen, was danach passiert ist, was davor passiert ist,
das heißt, es ist einfach determiniert und
ich kann mir halt einfach auch, was
Migration-Zero im Endeffekt ist, ist, du gehst
halt einfach hin und löscht alles, so, und startest halt
neu, weil das, das, das, haben wir alle schon ausgemacht,
Create Migrations lustigerweise
nicht das Problem hat, was Squashing hat
mit, das kriegt es einfach hin, ich weiß nicht
wie, aber es kriegt es hin
und genau, von daher ist
das halt für, wenn man einfach eine Applikation
hat und regelmäßig aufräumen möchte,
der Trick ist halt, dass ich im Endeffekt, du hast die Datenmacht schon einmal
so gezogen, dass der Stand stimmt und dann schmeißt du alle Migrations
weg, machst neue Migrations hin. Genau, und der, du musst
halt, du kannst halt in ganz, ganz fiese Edge-Cases
kommen, die nicht so altsehr wahrscheinlich sind,
aber wenn du halt ein Produktionssystem hast mit Uptime und
sowas, möchte man halt einfach nicht sich solche,
solche Dinge einbauen, das heißt, du musst halt auch gucken,
dass die Django Migration Table im Endeffekt den,
der Apply-Cache,
ja, von Django, muss man halt
auch aufräumen und damit man halt, weil niemand gerne
auf der Produktionsdatenbank herumfudelt, habe ich quasi
ein Skript geschrieben, dass das für einen macht
und du kannst es von Django Admin quasi an- und ausstellen,
also sagst, okay, ich weiß, es kommt ein Deployment,
das nächste Deployment, das ist, mach den Haken an,
dann macht dir das quasi für einen selber, das heißt,
du musst nicht mehr auf der Datenbank herumfudeln, du musst
im Endeffekt einfach nur noch das tun, was du gerne machst,
irgendwas im Code ändern, committest das
und der Rest passiert dann automatisch
und, ähm, genau.
Das ist sehr, ich finde das für den Use-Case
sehr konvenient. Ja, cool.
Coole Sache. Nice.
Aber habe ich das richtig rausgehört? Ihr nehmt kein
Custom-User-Model mehr?
Ähm, wir versuchen eher, über diesen
User-Profile-Ansatz zu gehen, also,
das Problem ist, dass, ich glaube, Django lädt
sehr, sehr, sehr, sehr, sehr, sehr stark dazu ein,
dass man, ähm, so gewisse
zentrale Models mit immer mehr belädt
und dass man halt nicht wirklich versucht,
Domänen zu schneiden. Ähm,
ich meine, Foreign-Keys, so
enorm praktisch die sind, ist halt auch,
du bist halt einfach in irgendeiner Funktion
plötzlich drei Domänen
irgendwo weiter und hast dann plötzlich irgendwelche
Daten dir gefischt, weil es geht halt
und, ähm, von daher versuchen
wir jetzt in den neuen Projekten eher über
Profile zu gehen. Also Profile ist für euch dann
ein eigenes Modell, eine eigene Tabelle, überzeugst du?
Genau, also wir sagen quasi alle, also der User, der Django-User
ist nur für die Authentifizierung da, also
wir nutzen im besten Fall auch nicht den Namen oder
E-Mail-Adresse, logischerweise schon, aber
nicht den Namen und dann gibt es zum Beispiel
dann irgendwie ein Account-Profil, wo dann der Name
drinsteht, dann vielleicht die Adresse,
ähm, dann, das ist vielleicht
gerade kein Beispiel mehr, zum Beispiel, wenn du jetzt sagst, ich habe
irgendwelche Konfigurationen, die ich machen kann in meiner
Applikation, gibt es vielleicht ein User-Konfigurations-
Profil und versucht das aufzuteilen
und dann die verschiedenen kleinen Models
in ihren Domänen zu haben, was halt auch so zu
führt, dass du, wenn du zum Beispiel den User immer weiter
aufbläst, so teilweise hast du dann ja 50, 60
Felder in einer hinreichend großen Applikation, ist ja
keine Seltenheit, die Daten werden auch immer
gefetcht und die wenigsten Leute in Django
machen ja auch, dass sie wirklich dann per Select sich nur die
Felder holen, die sie brauchen, sondern eher so, ja, gib mir mal
alles, das erzeugt auch wohl
vor allem, also gegeben der Last, aber auch
immer einen relativ großen Overhead, plus ist
natürlich auch für den nächsten Junior, der ins Projekt
kommt, der muss halt 50 Felder verstehen und nicht
nur drei. Das mit
Daten habe ich noch nicht drüber nachgedacht, aber ich habe jetzt
tatsächlich User-Profile an ein
Profil, Jason Field, gehängt.
Ja, also ich finde, Jason Field sind
ein sehr zweischneidiges Schwert, das ist immer so ein bisschen,
die führen so ein bisschen die
Relational-Datemark-Adaptsodum, weil manche Dinge
sind die super. Ja, für solche Sachen im Profil
möchte ich das nicht filtern, also das ist nicht so Filter-Rebuild
und deswegen ist es egal. Aber ich versuche, also ich sage
mal so, ich versuche die, ich nutze
die, aber ich versuche da dreimal drüber nachzudenken, ob ich
es wirklich nutzen möchte und wenn ich zum Beispiel
so die Profilkonfiguration habe, weiß ich nicht, die
Farbe und die Sprache und keine Ahnung was,
das kann ich ja relational
speichern, dann versuche ich es auch zu tun.
Äh, ich bin tatsächlich gerade in
die andere Richtung unterwegs, zum Thema
User-Model. Ich bin jetzt eher wieder
dazu übergegangen, Custom User-Models zu machen,
aber nicht, um da Felder hinzuzufügen,
sondern eben genau, um Felder wegzuschneiden, weil ich
keinen Firstname brauche, ich brauche keinen Lastname, ich brauche
keinen... Ich habe auch alles gestrichen,
nur E-Mail gemacht. Ja, genau, einfach nur
E-Mail und Passwort und das ist eigentlich
für die meisten Sachen reicht das ja schon.
Aber dann spricht der tatsächlich meinem eigentlich
gar nicht. Ja, genau, das ist ja eigentlich das Gleiche.
Ja, vielleicht sogar noch
ein logischer weiterer Schritt. Ja, aber
halt mit Aufwand verbunden. Ja.
Und das ist dann in meinem Projekt-Template drin
und dann habe ich es einmal gemacht und dann ist es fertig.
Ja.
Ja, das ist auch sowas, dass man baut sich
ja dann irgendwie so eine Sammlung an
so eine Schatzkiste an Lösungen auf und die
benutzt man dann schon immer wieder und wenn die je verloren geht,
dann bin ich wieder ein Jumbo-Anfänger.
Dann kann ich einmal... Tja.
Darum haben wir damals mal angefangen, die ganzen Sachen
in ein Package zu packen. Das ist zwar
nicht der Weg, wie Packages sein, die sollen ja eigentlich
Single-Purpose und dass du einem eine
Sache hast, aber es gibt so viele Kleinigkeiten
auch für ein Admin, wo man sagt so, ja, ich will
das jetzt nicht jedes Mal neu googeln, wie ich
jetzt dieses eine Read-Only-Dingsbums
da irgendwie machen kann oder sowas oder diesen
einen Sonderfall mit weiß ich nicht was.
Das ist schon praktisch, wenn man das
da reingießen kann und mit einem... Ja, man hat sich
so ein kleines kariertes Maiglöckchen da gemacht, hat noch ein bisschen
gehegt und gepflegt und ordentlich aufgezogen
und dann noch die Ecken und Kanten ein bisschen
richtig gestutzt, dass das da genauso aussieht. Genau.
Also wir zum Beispiel, also ich finde das zum Beispiel
super, dieses Toolbox-Package, das wir haben.
Also das nutzen wir in den Projekten. Da sind natürlich
auch viele Sachen drin, die Leute einfach nicht brauchen, aber ich meine,
im Endeffekt, es ist halt...
Ja, also ich räume da auch
regelmäßig auf, also einfach, wenn ich dann sage,
okay, jetzt ist der Zeitpunkt gekommen, wo das nicht mehr relevant ist
oder habe einfach Sachen aktiv rausgezogen,
also mit das Body Express Package,
von dem ich vorhin am Anfang gesprochen habe,
das war auch mal Teil davon. Habe ja gesagt, ja,
das ist sowas von Single Purpose, also das macht keinen Sinn,
das da mit reinzufudeln. Das kann man gut rausziehen. Genau.
Cool.
Dann sind wir mit gestern
durch. Dann kommen wir nach heute.
Heute, der Tag hat angefangen. Er hat sehr früh
angefangen. Einer, ihr habt so früh überlassen.
Auch nicht. Nach unserer Zeit neun Uhr
nach Lokaler...
Mein Jetlag ist schon vorbei.
Ich fand es jedenfalls
interessant, es war ja, also ich meine...
Es war der Talk für die Django Software
Foundation, die Versammlung und der offizielle
20. Geburtstag.
Ja, war ja gar kein Talk, sondern es war das
Django Software Foundation Board Meeting.
Ja. Das jährliche Board Meeting,
das erste jährliche Board Meeting,
also weiß noch nicht, ob man davon jährlich
sprechen kann. Gleichzeitig die Geburtstagsfeier, 20 Jahre
Django, es gab auch Kuchen. Genau, es gab Kuchen, ja.
Das war sehr schön. Aber es war halt
heute früh um acht und mir ist durchaus aufgefallen, dass
dann so um acht Uhr zehn noch ein paar Leute gekommen sind
und um acht Uhr 15 oder um acht Uhr 20.
Oder um acht Uhr 30, wie ich.
Es scheint tatsächlich nicht ganz einfach
zu sein, so früh aufzustehen.
Ich meine, für...
Mit Kindern ist das eigentlich so, ja.
Ich kam halt aus der Stadt und die Busse fahren so mittel
von... Ja, okay, gut, das
ist natürlich...
Wir sind ja alle hier im Hotel,
da ist es natürlich einfacher. Ja.
Ich habe jemanden gesehen,
der mit Badelatschen
die ganze Zeit... Da dachte ich mir so, oh,
warum bin ich da nicht drauf gekommen? Ich bin mit den Schuhen an.
Ja, ich habe mich auch nicht gedacht, ich wollte eigentlich
gerade eben nochmal... Das ist jetzt Jim.
und Steam, aber dann muss ich mit Bademantel
an der Konferenz vorbei und kurz winken.
Mit Bademantel zur Konferenz gehen.
Das habe ich mir auch überlegt.
Solange der Bademantel zu ist, ist doch alles okay.
Das ist auch eine Frage.
Ich passe da immerhin rein, ich habe ja nämlich meinen eigenen Bademantel.
Das haben wahrscheinlich auch nicht so viele.
Okay, also das Jungle of Software
von der Board Meeting, das war...
Ich bin da hingegangen, weil
ich das mal sehen wollte.
Ich weiß, dass ich da nichts beitragen kann.
Ich weiß, dass ich diese Verantwortung nicht tragen kann, weil ich nicht genügend Zeit habe.
Und was hast du gesehen?
Es war interessant, die Diskussionskultur war interessant.
Die Menschen, die sich daran beteiligen,
ich meine, viele von den Namen kennt man,
wenn man so ein bisschen in der Szene ist.
Aber es war trotzdem einfach mal
interessant zu sehen, wie die so...
Wie viel Zeit man mit so Dingen verbringen kann.
Auch wie viele Meta-Dinge einfach
passieren müssen und wenn sie nicht passieren,
wie viele negative Konsequenzen das hat.
Und wie viele Kommentare es gibt zu allem.
Ja, da muss man nochmal reden.
Jeder darf auch was dazu sagen und dann wird dem auch zugehört.
Also sehr corporate.
Und dann gab es Kuchen.
Das war sehr schön.
Das hat sich gelohnt, früher aufzustehen und hinzugehen.
Ja.
Gut, dann gab es den Einführungsvortrag
des heutigen Tages, so für die breite Masse,
sage ich mal, im Mainstream.
Oh, im Mainstream?
Im Mainhall.
Gab es den? Hab ich den verpasst?
Nein, da war es auch der Most Bizarre Software Bugs in History.
Ach so, ja, das ist...
War eine schöne Aufstellung.
Hat der Jochen
den Lightning Talk vom Johannes vorher schon gehört?
Ja, vielleicht.
Ich habe ihm das vorher kurz gezeigt.
Das war eine Pause.
Nee, das war nur der Vulkanier-Mindgrab.
Genau, das war auch eine sehr schöne,
war sehr unterhaltsam, dieser Vortrag.
War erstaunlich lang.
Er hat viele Sachen gesagt.
Und viele von den Geschichten
kennt man ja schon so ein bisschen mehr.
Man hat es ja schon mal gehört.
Ein Lion Air Flight 110.
Ich habe gar nicht mehr gesagt, was das ist.
Ich habe gar nicht mehr gesagt, was das ist.
Ich habe gar nicht mehr die Geschichten alle notiert.
Ich habe nur notiert, wie die Geschichten heißen.
Das mit der Mars-Mission, mit dem metrischen System.
Ja, vielleicht gehen wir noch mal kurz darauf ein.
Ein Bagger ist natürlich
in den Flugzeug abgestürzt, nicht so gut, weil...
Nee, es sind zwei sogar. Es sind zwei abgestürzt.
Boing.
So ein System eingebaut hat, dass die Nase immer korrigieren sollte.
Und dann ist der Sensor ausgefallen.
Sie hatten nur einen eingebaut.
Und die Piloten wussten nichts davon.
Bei dem zweiten Flug, der war sogar noch ein bisschen tragischer.
Weil da wussten die Piloten davon.
Haben es nicht abgesteckt gekriegt.
Haben es nicht abgesteckt gekriegt.
Und vor allem, dieses System ist gekoppelt
an den Steuerknüppel.
Das heißt, die haben versucht, an den Steuerknüppel zu ziehen.
Und das System hat dagegen gedrückt.
Und irgendwann konnten die nicht mehr.
Und das finde ich noch viel tragischer.
Wenn du halt gegen die Maschine kämpfen musst.
Und die Maschine in dem Moment will dich umbringen.
Fies gesagt.
Und dann gewinnst du auch noch.
Das ist hart.
Und dann klappt...
Nachdem diese beiden Flugzeuge abgestürzt waren,
ist ja auch die gesamte Flotte
einfach...
einfach stillgelegt worden.
Für den Moment, bis da einmal eine neue Zertifikation durch war.
Ja, die, die ja...
Also es war eine wirklich schöne Aufstellung
von Dach und so ein bisschen Hinweis.
Auf der Mars-Mission ist vielleicht auch noch interessant.
Ah ja, Mars-Mission, ja.
Klassischer Fall.
Klein Backup zwischen Umrechnung, zwischen metrischen...
Wer ist nochmal das andere System?
Genau, das eine...
Das eine hat halt...
Genau, das eine hat halt den Zoll gerechnet
und das andere hat den Millimeter gerechnet.
Empire Strikes Back.
Genau.
Was ich total ironisch finde wirklich,
wenn man mal in den USA war,
da wird ja dieses Independence Day
und diese Unabhängigkeit von England
wirklich ganz, ganz, ganz, ganz hoch gehalten
und keine Gelegenheit,
nicht jedes Schiff und jeden Soldaten
nochmal hervorzuheben,
wie besonders das war,
gegen England gewonnen zu haben,
aber da mit Händen und Füßen
am imperialen System
bei den Einheiten festzuhalten.
Am Ende gewinnt der König doch.
Ja, das war auch eine tragische Sache,
dieser Mars Reconnaissance Orbiter war das, glaube ich,
wo einfach die Positionierung nicht gestimmt hat.
Das heißt, er wollte um den Mars kreisen,
aber er hat ihn getroffen.
Klabum.
Andererseits,
das habe ich auch zum Jochen schon in dem Vortrag gesagt,
ist auch so ein gewisser Power-Move von der Erde,
dass wir da hier Jahre und Millionen reinstecken
und dann einfach zack.
Verglüht im Orbit.
Ja, und dann die anderen Geschichten.
Da gibt es ja viele so Geschichten.
Ich meine, die meisten Leute werden
keine Software für Flugzeuge schreiben
oder auch den Mars nicht mit irgendwas beschießen,
aber...
Was tatsächlich viel im Alltag irgendwie ja betrifft
und das ist tatsächlich
auch immer eine sehr hübsche Fehler,
dass Leute Excel-Sheets halt für alles mögliche verwenden
und dann da halt diese ganzen normalen
Standard-Software-Engineering-Practices,
die man halt so hat,
die einen vor dem Gröbsten irgendwie bewahren,
die gibt es da halt nicht.
Man kann auch Excel dann das nachbauen.
Bitte?
Ja, hast du schon mal gesehen,
dass jemand Excel-Sheets in quasi...
Habt ihr keine Unit-Tests auf euren Excel-Sheets?
Ja, oder Unit-Tests oder irgendwie
ein Repository eincheckt
und das gibt es alles irgendwie nicht so richtig?
Ja, ich habe...
Nee, das geht alles über E-Mail.
Du hast die Leitung ja schon zwei Jahre nachgebaut.
Das war eine ganz tolle Erfahrung.
Ja.
Ach so, du hast es mal nach...
Oh Gott.
Genau.
Das kann ja dann auch...
Also, sie hat ja da auch so ein paar Sachen erwähnt,
die einfach richtig schlimme Folgen haben.
Ja, JP Morgan hat halt eine von den Berechnungen,
haben sie...
Hups.
Falsch.
Addiert statt zu mitteln
und dann haben sie ihre Risikobewertung
einfach um Faktor 2 falsch gehabt
und Milliarden an Dollar verloren.
So.
Tadam.
Ja.
Ja, gut.
Als Softwareentwickler sagt man,
selber schuld.
Hättet ihr mal von uns gehört.
Als Banker ist es so.
Passiert mir jedes zweite Wochenende.
Ja, sechs Milliarden unter Freunden kommen.
Ja.
Ja, genau.
Also, es war wirklich eine schöne Zusammenstellung,
war sehr unterhaltsam,
war ein guter Anfang.
Sie hat auch einen sehr guten Vortragsstil.
Ja, war wirklich sehr angenehm.
Ja, was gab es denn da noch?
Danach...
Oh ja, das war cool.
Danach war so ein bisschen,
für mich ein bisschen bisher das Highlight des Tages.
das Highlight der Woche bisher.
Haki Benita. Genau.
How to get foreign keys horribly wrong.
Ja, das müsst ihr mir jetzt erzählen, weil ich bin nämlich in der Zeit
rübergegangen zu dem
anderen Workshop und
ja, hab dann aber
nicht wirklich zugehört, sondern gearbeitet.
Ja gut, dann. Aber deswegen kann ich
das Workshop kreieren. Aber den Topf von Haki Benita
hätte ich gerne noch mehr verstanden, wie man den foreign keys
richtig macht. Indizes setzen
oder was hat er gesagt? Ja, aber
also die Sache an Haki Benita
ist, der ist ein
DBA, ein Database Admin,
der seit 20 Jahren im Geschäft ist, der kennt alle Tricks.
Und
er hat einen sehr
unterhaltsamen Vortragsstil. Sehr energetisch.
Ja, und auch das Publikum
mit einbezogen und Fragen und dann
auf Leute gezeigt und so. Also das ist großartig.
Aber er hat so ganz harmlos
angefangen. Er hat gesagt, ja,
was fällt euch da auf?
Und dann kam natürlich so, ja, da muss man
Index machen. Und er hat gesagt, ja, aber?
Und dann hat er das gemacht
und
hat so ein bisschen da die Sachen erzählt. Und dann hat er gesagt, was fällt
euch denn jetzt auf? Und dann ist er noch eine Ebene runter
gegangen. Und dann kamen schon weniger
Kommentare. Und dann hat er gesagt, was fällt euch denn jetzt auf?
Also, er ist einfach
ganz harmlos angefangen und dann so
tief runtergegangen.
Ja, okay.
Aber als er dann aufgehört hat,
hat das Publikum an seiner Stelle weitergemacht
und hat ihm gesagt, weil er das wusste noch nicht.
Und sein Fazit war dann so,
okay, das mit den Migrationen sollte man einfach lassen.
Das ist keine gute Idee. Das ist irgendwie
nicht machen. Ja, also es ist wirklich,
es ist halt problematisch. Je genau man hinguckt, desto
mehr Probleme
sieht man da auch.
Die natürlich aber auch nie, nur nicht in
allen Cases wirklich realistisch.
Bevor er jetzt wieder so eintaucht,
wir müssen erstmal kurz nochmal erkennen,
dass das ein interessanter Talk war, haben wir jetzt verstanden,
aber worum ging es denn jetzt eigentlich?
Also es, willst du?
Nee, sprich du, René. Also es geht, im Endeffekt
ging es darum, es war im Endeffekt ein Standardmodel,
also Django-Model, jetzt mehr oder weniger
was man halt so kennt.
Und die,
die,
die, und dann ging es halt
darum, so quasi, was kann
man daran verbessern? Hat sich halt
Expeditor Foreign Case bezogen. Oder was ist gefährlich auch?
Genau, oder was könnte gefährlich sein?
Natürlich immer mit dem Hintergedanken,
wenn man da jetzt eine Tabelle mit 50
Einträgen hat oder auch 500.000,
ist das wahrscheinlich alles relativ egal.
Oder kein Hochverfügbarkeitssystem, aber halt
was für Systeme kann, was kann
man halt theoretisch kaputt machen, ohne es zu wissen?
Und dann hat er sich halt quasi dann
darüber rausgehangelt, wie sieht es aus,
mit, wenn ich diesen Index
setze, was ist mit automatisch gesetzten
Indizes, kann ich die wegnehmen?
Ja, genau, und
wie weit kann man da gehen?
Was kann man alles kaputt machen?
Was kann einem alles implizit auf die Füße
fallen? Genau, und dann auch viel über Migrations,
Migration-Anordnungen, was man damit
noch anders machen kann, also indem man die einfach
auseinanderzieht, atomare Transaktion,
also Datenbank-Atomare-Transaktion,
Reihenfolge, und da halt immer weiter runter.
Und das halt in einem sehr, sehr
energetischen, interaktiven
Weg, um auch dieses Thema, das man auch perfekt
ultra-trocken irgendwie runterbeten
könnte. Also das ist tatsächlich einer
von den Talks, die ich mir auf die Liste geschrieben habe,
für die muss ich später nochmal nachschauen.
Also was konkrete Dinge drin waren,
wie zum Beispiel ist sowas wie, du hast halt ein
Foreign Key auf dein User-Modell
als Created Ad oder sowas
an irgendeinem Modell dran, und
wenn du jetzt sagst, okay, das wird jetzt schon
relativ groß,
das wird eh nicht benutzt, und dann nimmst du
den Index weg, und dann löscht
irgendein automatischer Job ab und zu mal
User, und legt dann deine Datenbank
lahm, weil, naja, es gibt keinen Index mehr
auf dem Ding, und
dann macht das halt ein Table-Scan bei jedem User, der gelöscht
werden soll, und wenn das viele sind, dann, naja,
es ist halt... Ja, auch wenn es einmal auftritt,
wenn du irgendwo eine Tabelle mit Millionen
rein hast. Wenn du bei Instagram mit 500 Millionen
Nutzer anscheinend bist. Ja, genau, die müssen
da schon aufpassen. Das hat er am Ende
auch gesagt, ja, viele von den Sachen sind halt jetzt
rausgesucht als Probleme für einen
Vortrag, sonst kannst du nichts zeigen.
So für den
Hausgebrauch, für die...
Wenn du 10.000
TPS hast, Transaktionen pro Sekunde,
ist das sicherlich ein anderes Thema, als wenn du
drei Transaktionen pro Sekunde hast.
Also ich glaube,
einer von den Learnings war, dass er quasi
die Nutzer
aware gemacht hat, dass Django
sehr viele Dinge einem
für einen mitdenkt,
und dass es halt Cases gibt,
wo man das nicht tun,
also wo man Django nicht das...
Also er hat am Anfang die Queries, glaube ich,
mit angemacht, die bei den Queries, dass man sieht,
was... Ja, oder dass man auf jeden Fall immer
die Queries sich bei einer Migration zum Beispiel,
er hatte dann irgendwie eine schöne Stopp-Slide,
die dann
ab und zu mal kamen, sondern erst einmal mal das
SQL angucken, bevor man die Migration wirklich ausführt,
weil... Den wichtigsten
Schritt hat er da für mich eigentlich in den Fragen am Ende
gesagt. Und hat er nämlich gesagt,
bei Ihnen machen sie es so, dass sie
eine GitHub-Action haben, die das
SQL, wenn du eine Migration machst, schreibt
die dir das SQL als Kommentar
in deine Review. Das fand ich auch krass.
Und das heißt, du bist gezwungen,
dieses SQL...
Das SQL anzugucken. Du kannst gar nicht...
Du kannst nicht zustimmen, ohne das SQL gesagt zu haben.
Und das fand ich einen super Trick.
Weil das so ein...
Das ist psychologisch korrekt.
Das ist kein, wir halten dich ab, das zu tun, sondern
ein, hier, guck doch mal.
Ja, absolut. Großartig.
Und was auch noch echt cool war, der hat gesagt,
dass sie exzessiv
die Django-Checks verwenden, also
die System-Check-Framework. Aber mit eigenen, geschriebenen
Regeln. Genau. Also erstmal hängt es
bei denen in der Pipeline. Das geht relativ einfach. Das haben wir
jetzt auch angefangen einzubauen. Also das führt auch
dazu, dass man da einmal wirklich auch mal guckt, was
Django so meldet. Manche Dinge machen jetzt auch
zum Beispiel in der Pipeline einfach keinen Sinn.
Manche Einstellungen. Aber trotzdem, dass man die da
einmal so konfiguriert, dass der Pipeline grün ist,
was schon mal super ist. Und eigene Checks
wirklich zu verwenden, weil das ist... Die laufen
natürlich in jedem Mal, wenn der
Development-Server startet. Das heißt, wenn man da
sehr viele hat oder sehr langsame hat, kann man natürlich die
Developer-Experience massiv beeinflussen.
Negativ. Muss man ein bisschen aufpassen.
Weil viele Dinge könnte man auch irgendwie in der Linting-Stage
machen, vermutlich. Trotzdem hast
du halt Zugriff auf das komplette initialisierte Django-
Projekt. Und da kann man, glaube ich, sehr, sehr viele
coole Dinge Richtung Code-Qualität
machen, weil du halt den Leuten sagst, so
hey, guck mal hier.
Lieber Mitentwickler, folgendes ist
gerade komisch. Das ist sehr
mächtig und das ist auch eine Sache, wo ich mich auch
nochmal mehr damit beschäftigen möchte.
Weil ich glaube, dass das wirklich sehr...
Dass man da nochmal sehr viel rausholen kann.
Wie letztes Jahr bei Vigo,
bei dem Talk. Deine Architektur
oder Code-Qualität ist so gut wie dein Tooling, das du hast.
Ohne Tooling
degradet alles sofort.
Also waren
auf jeden Fall viele coole Sachen drin.
Haki Benita ist immer gut.
Kann ja die Links
wieder unten reintun. Dann der nächste
Talk. Karl Gibson.
War gar kein technischer Talk diesmal.
Nee, hat er auch am Anfang
so scherzhaft gesagt. Nächstes Mal
wieder technischer Talk war viel zu anstrengend.
Ja,
How we make decisions in Django.
Ja,
mir fällt es schwer, da jetzt was
zu sagen.
Ja, ich habe
in der Zeit was gegessen, Kaffee getrunken.
Ja, ich würde auch zu. Es ist halt ein schwieriges Thema
und ich habe absolut keine Meinung dazu.
Ich würde auch sagen, so ja,
ja. Ich finde es gut, dass das jemand macht.
Ja.
Muss man... Also im Endeffekt,
es ging ihm ja, glaube ich,
ging ihm ja darum,
dass er...
Ich werde darauf angesprochen, ich zwar auf dem
Endeffekt sage. Ja, wir haben schon ein Fehlspiel draus gemacht.
Das werden wir heute Abend
beim Review der Folge nochmal spielen.
Da ging es ihm darum, dass
halt der Prozess, wie
über gewisse Dinge abgestimmt wird, also
meist im Forum soll er diskutiert werden,
dass das sehr, sehr mühsam ist. Da kann ich doch einen schönen Bogen spannen
zu meinem Eingangsthema.
Ich habe vor
einem Jahr
sind in den Django Storages,
ungefähr vor einem Jahr, glaube ich, sind die
Django Storages, ist die
Settings API leicht verändert worden.
Da gibt es irgendwie statt mehreren Einzelvariablen
gibt es eine Variable. Da gab es auch
eine Warnung,
und normalerweise kümmere ich mich da immer
sofort drum, aber wir hatten dann einen ganz, ganz merkwürdigen
Bug mit dem
Thumbnail-Package, irgendwas ganz wildes,
wo nichts mehr funktioniert hat.
Ich habe dann einfach gesagt, ich mache das dann später.
Und dann irgendwann war die Warnung
halt weg. Und ich so, ah, okay.
Ja, perfekt.
Hat es halt auch
nicht, ausnahmsweise halt einmal nicht
wie das halt immer so ist. Das ist dieses Schweißer-Käse-Modell.
Das ist halt genau einmal...
Das kommt ja nachher auch noch.
Das kam vorher schon.
Genau in dem einmal, wo man sich halt nicht sofort drum kümmert,
wo irgendwas Komisches passiert, wo man es halt dann doch irgendwie
ein bisschen aufschiebt,
in Kombination mit
Django Storages, was wir für S3,
also für Datentransfer nach S3 verwenden,
war eine Plattform,
an der ich gearbeitet habe.
Und genau in dem
Zeitfenster, wo wir dann quasi
das Django upgedatet haben,
wo dann quasi diese Storage war, also dass
die Deprecation quasi aktiv wurde,
wurden dann halt
von den Nutzern
100,
hunderte von Dokumenten hochgeladen,
was mehr Dokumente wahrscheinlich waren, als insgesamt
bis jetzt hochgeladen wurden, weil das halt so ein neues Feature war,
das dann live ging. Und leider
hat Django Storages das nicht gemerkt.
Django dachte, das Feld ist nicht mehr da und die Sachen sind alle
in Nirvana gelandet.
Das war ärgerlich.
Eine schöne Übertreibung, die du hier wählst.
Ärgerlich.
Ja.
War natürlich auch etwas schwierig, dann den Leuten
zu erklären, sorry, bitte alles nochmal.
Teilweise waren die Sachen natürlich einfach da.
Die sind da ja da.
Ja klar, braucht man ja.
So, weg. Ja, war sehr blöd.
Dann habe ich das halt im Django Forum halt mal angesprochen,
hab gesagt, hey Leute, es ist sowas irgendwie dumm gelaufen, kann man nicht
irgendwas tun. Und dann hat sich da so eine Diskussion
ergeben, dass man ja vielleicht, weil
Django ist ja super dokumentiert, so bis Version
1.0 zurück, ob man nicht einfach
sagen soll, hey, wir machen irgendein Systemcheck
mal wieder, ein Systemcheck, wo wir einfach sagen, hey, guck mal,
du verwendest hier eine Variable,
die soll das eigentlich nicht mehr geben.
Denk mal drüber nach, ob du die wirklich noch,
ob da alles richtig ist bei dir.
Man kann ja Systemchecks aktiv disablen und so,
wenn jetzt jemand der Meinung ist, er braucht jetzt die Login,
URL für irgendwas anderes oder ein ganz
Party-Package, will unbedingt die Login, dann
nimmt man es halt aus und lebt damit, dass die disabled ist.
Gut, dann ist mehr oder weniger alles
agreed worden, ich habe einen Pull-Request gemacht,
hab mir
sehr zum Ärger von manchen Leuten
eine initiale Liste von
GPT generieren lassen, weil ich dachte,
damit ich erstmal was habe zum Testen, ob es
überhaupt funktioniert, hab die dann nachher nochmal
manuell abgeglichen, trotzdem waren direkt ein paar Leute
böse, hab dann gesagt, hey, chill,
wir sind noch nicht fertig.
So, haben das dann gemacht, ich hab nochmal quasi
alle Change-Logs gemacht, wir haben die nochmal verlinkt,
ich hab nochmal Optimierungsideen,
hey, wenn du ein Set verwendest statt
eine Liste, das ist nochmal einen Ticken schneller, weil das
läuft ja die ganze Zeit. Richtig
coole Lösung. Und dann kam
halt von einer Person, naja,
wir machen doch keine
deprecated Sachen im
Framework. Und dann habe ich gesagt, ja, aber die Leute haben doch gesagt,
ich bin nicht der Einzige, dem das passiert.
Es hilft halt extrem.
Es macht den Update-Prozess ein bisschen
einfacher. Es gibt aktuell noch nichts, was
das tut, weil sonst wäre es mir ja nicht passiert. Und ich bin
ja aware, Dango Upgrade, das ganze Tooling,
das es da gibt, klingt doch gut.
Nee, machen wir nicht. Und
irgendwie war dann halt so diese eine Gegenstimme
gegen halt 10 Leute,
15 Leute, die im PR mitgearbeitet
haben, also auch wirklich motiviert mitgearbeitet
haben oder halt auch im Forum sich
geäußert haben. Und irgendwie hat
halt diese eine Person das halt dazu
gebracht, dass es halt dann nicht passiert ist.
Und, ähm...
Wie der Diskussion von gestern. Wer darf denn merchen und wer sagt dann
nein? Oder auch das, was
Carlton gesagt hat, dass Konsens gesucht wird.
Genau, das ist ja genau das. Und ich glaube,
dass er hat, also selbst Carlton war ja auch in dem
Thread da dabei. Und da hat
er dann auch das durchklingen lassen, was
glaube ich, teilweise hinter der Motivation
dieses Vortrags stand, weil ihn das glaube ich
auch manchmal einfach frustriert,
dass es halt dann quasi, ne, alle
Leute sagen, okay, das können wir machen,
wie dieser schöne Spruch, ähm,
komm ich jetzt drauf,
safe enough, good enough for now, safe enough to
try, so. Im allerschlimmsten Fall
muss man halt so ein Security, baut man den Check
halt wieder aus, wenn man merkt, dass es jetzt nach drei,
nach einem Major Release furchtbar ist und alle es
doof finden, dann ist es halt, hast du ja nicht mehr,
so, keine Ahnung. Und ich glaube,
dass das so ein bisschen auch der, einer der
Fairtrade-Mitglieder ist.
Der Täter von, der Gedanken war, weil ich glaube, der erlebt
sowas halt sehr, sehr oft. Ja. Und das hat
eine Person, die Handbremse quasi, ne, einmal so
quasi schönen Stock ins Getriebe,
wo mehr oder weniger sich eine coole Dynamik entwickelt
hat, wo man dann auch wirklich sagen kann, ey, guck mal, das ist
ein, das hilft vor allem Newbies halt, ne?
Und. Ja, man gibt halt vor allem dem
Veto sehr viel Macht. Ja, man gibt dem
jeder kann sagen nein und dann stimmt's. Und
egal wie viele Leute vorher. Ein bisschen gespaltene
Meinung zu. Ja, es ist auch
schwierig, aber, aber wenn sowas
unterwegs ist, das ist natürlich super frustrierend,
ja, wenn da schon viel Zeit und viel Arbeit reingestellt
hat und die Zustimmung gekriegt hat und dann sagt
einer, ach nee, du. Also ich bin ganz auf
der Meinung, so better ask for forgiveness than
for permission. Ja, ist aber
hier ja nicht so. Das ist aber genau bei so einem
Framework aber vielleicht genau falsch
rum ist, weil könnte ja sein, dass ein
Flugzeug mit so einem Dango läuft
und da muss man, ja, also. Es ist
auch so, es ist auch so, dass man manche Sachen einfach
nicht wieder zurücknehmen kann, weil du kannst manche,
also es gibt da den Deprecation-Prozess, aber. Ja, aber auch, absolut.
Das wieder rauszukriegen, einfach so mit dem Patch, ich weiß nicht. Das sammelt sich an.
Ähm, und das ist so ein,
deswegen verstehe ich sehr gut die Leute, die da so die
Knüppel zwischen, wenn der es richtig machen will, man kann es halt
auch missbrauchen und es kann halt ätzend werden. Ja, und das
muss vor allem grün im Prozess sein. Genau,
und dann erst die Leute losrennen lassen, zwei Jahre Arbeit,
ist halt, ach nee, übrigens doch nicht, ist halt
ziemlich blöd. Also ich meine, im Endeffekt
haben wir halt genau das gemacht, um auf den Tortag wieder
zu kommen, was, äh, was Carlton
halt auch vorgeschlagen hat, er sagt, das Ecosystem
von Dango ist halt im Endeffekt
einer der Haupt-USBs.
Ich hab's schon wieder gesagt.
Ich freu dich drauf hingewiesen.
Ähm, und, äh,
die, ähm, das neue,
die Dinge erstmal in Packages leben sollen und
wenn man wirklich das Gefühl hat, dass das
unbedingt in Core rein muss und ansonsten
ein gut gewartetes Package halt keinen Nachteil
zum eigentlichen Django hat, vor allem
gibt es diesen schönen Spruch aus Python,
irgendwie, Features go to the main
library to die, also sprich, sobald irgendwas
in der Main Library ist, wird einfach nichts mehr daran
entwickelt, weil die Zyklen einfach viel zu langsam
sind, um, von daher gibt es jetzt
Django Removals, ganz kurz, noch ein kurz, also
wer sich dafür interessiert, das ist
sehr, sehr klein und tut nur was
auf dem Development Server, kann man theoretisch, wenn man das möchte,
auch erst Development Dependence
installieren, dann läuft es ja nicht in der Pipeline und dann
kann man quasi, wenn, vor allem für alte Projekte,
äh, Fun Fact, in jedem
einzelnen alten Projekt, also alt, sag ich mal
2018 und davor,
hab ich mindestens eine Variable gefunden, die nicht
mehr da drin sein sollen, hat in allen anderen Fällen keine
Auswirkung gehabt, die hat einfach nichts getan,
aber trotzdem interessant, das mindestens einmal drüber
laufen zu lassen und zu merken, äh, was
man vielleicht vergessen hat. Hat mich auch schon desaufter
gebissen, also irgendwie einfach ein altes Template genommen
und dann mit neuem Pack angefangen, alte, äh,
ja, bum, hup, huch,
wenn man es dann merkt, ist gut. Jetzt hast du die Lösung.
Ja.
Das Problem, was ich hab mit dem,
mit der Library-Lösung, ist Visibility.
Ja. Weil niemand erfährt davon,
dass es das gibt. Ja. Hast keine Chance,
wenn du nicht Carlton Gibson heißt oder sonst was,
äh, irgendwo Benutzer
für deine Library anzukriegen. Ja. Wenn es irgendwie
so ein Nischen-Use-Case ist, also ich hab so ein,
so ein Feature, was ich gerne in Django drin hätte,
wo ich jetzt auch schon mit mehreren Leuten drüber gesprochen hab,
äh, wo ich mich jetzt mal... Einzig Grund, warum du hier bist.
Richtig. Wo ich jetzt mich, weil
so langsam rantasten werde und es ist auch
wirklich was ganz Kleines. Welches ist denn in Django?
Ja, das erzähl ich nachher mal. Da muss ich erst noch
mehr politischen
guten Wirklichkeiten, bevor ich das verraten kann.
Aber, okay. Es wäre eine sehr
einfache Änderung und es wäre auch was, was man einfach
in der Bibliothek machen würde, aber wenn ich es in der Bibliothek
machen würde, wäre es unsichtbar. Niemand
würde das finden. Ja. Weil
es eine Funktionalität von Django, die
in Django Core drin ist, erweitert.
Genauso wie bei den Unremovals, ja.
Da ist doch ein Warnungsmechanismus
drin. Warum muss ich jetzt nochmal was
machen, damit ich andere Warnungen bekomme?
Und ich glaube, dass das
einfach... Also das ist das, was mich frustriert.
Dass es Dinge gibt,
die man mit wenig Aufwand machen könnte,
die halt Django erweitern und die Antwort ist
tu es in der Library. Ja, okay, aber
dann ist es halt für mich. Dann ist es für mich.
Ja, könnte ich auch machen.
Entschuldigung.
Darüber sprechen wir dann morgen.
Das nächste Mal habe ich gehört, forken wir die Django-Con und machen die
einfach bei uns in Germany. Gibt es ein großes Gerücht?
Ja.
Wir werden sehen.
Wir werden sehen.
Ich meine, wir Softwareentwickler sind
ja, wir mögen es, technische Probleme
zu lösen und jetzt hier geht es sehr viel
um Menschen. Bei Karten ging es darum, bei der Django-Software-Foundation
ging es um Menschen und das ist doch blöd.
Ja, das ist immer dasselbe Problem.
Ich bin noch nicht Softwareentwickler geworden, um mit Menschen zu tun zu haben
und jetzt muss ich mit Menschen sprechen. Schrecklich.
Ich könnte da so eine
Coaching-AI fragen.
Aber mit AI sprechen ist ja noch
schlimmer. Warum?
War jemand bei dem Workshop? Nee.
Nein. Okay, schade.
Dann müssen wir den jetzt auslassen.
Der Building-Unique-Voting-System.
Achso, nur eine Minute.
Klingt aber interessant.
Ja, hatte ich mich auch.
Aber der Workshop war halt sehr lang
und der hat dann zwei andere Talks überlegt.
Ich habe auch überlegt, wo ich gehe.
Würde ich nicht skippen.
Das war nicht für mich so interessant.
Da bin ich erst drüber gegangen und dann habe ich gedacht, ach komm.
Genau, dann gab es doch den
How to Enjoy Debugging in Production.
Oh ja, stimmt.
Von Karen Tracy.
Ja, genau.
Der war am Anfang sehr unterhaltsam,
weil sie eine Kiste gekriegt hat,
weil sie ein bisschen kleiner ist und nicht
über dieses Pult gekommen ist.
Das Audio-Setup ist dieses Mal ein bisschen
schwierig, habe ich das Gefühl.
Da ist nur ein Mikrofon da vorne.
Ja, das Mastering war...
Sie haben es dann ja quasi so weit aufgedreht,
bis es halt kurz vorm Rückkoppeln war.
Das war immer noch viel zu leise.
Das war in einer anderen Konstanz.
Aber das war eigentlich interessant,
was sie erzählt hat.
Es war super interessant.
Was hat sie eigentlich gesagt?
Es war aber auch wieder sowas,
so ein...
Ja, mache ich so.
Ja, mache ich so.
Kenne ich.
Genau.
Sie sagt halt quasi,
dass man für Produktionssysteme
ein Logging und ein Monitoring extra braucht,
was auch LRs kann.
Und dass man es halt dazu bauen muss.
Und dass man halt...
Also im Endeffekt,
ich habe bei dem Talk ein bisschen was anderes erwartet.
Das hat, glaube ich,
auch irgendwer aus dem Publikum nachher gefragt.
Weil ich dachte eigentlich eher,
es ging jetzt darum,
wie man halt wirklich tatsächlich
in Produktion irgendwas debuggt.
Und ich glaube,
ein Großteil ging halt davon,
wie man eigentlich vermeidet,
dass es so weit kommt.
Was ja auch genau,
der richtige Weg ist.
Ja, gut.
Aber ich glaube,
sie meinte,
also Debugging hat sie tatsächlich
hinter Logging und Monitoring verstanden.
Also, dass tatsächlich automatisiert
nach Fehlermeldungen gesucht wird.
Weil ich glaube,
die Menge, die sie hatte,
war ziemlich viel.
Also sowas wie, keine Ahnung,
Tausende von Messages,
die immer so aufpoppen,
dass man die halt ordentlich filtern
und nach Prioritäten sortieren kann
und sowas.
Und dann halt die richtigen weiterleitet.
Also, dass dann bei jemandem
so ein Licht angeht,
dass er dann wirklich direkt drauf gucken kann.
Und so.
Und dafür muss man das natürlich
alles ordentlich eingestellt haben.
Ja, klar.
Und sein eigenes Haus das betreiben.
Fand ich eigentlich ziemlich gut.
Weil sie hat halt gesagt,
kannst du nicht.
Du musst darauf vorbereitet sein,
Fehler in Produktion zu haben.
Und egal, was du machst,
wenn du mehr Testing machst,
hast du weniger.
Aber du hast sie trotzdem.
Was ich auch sehr interessant fand,
also wie gesagt,
ich glaube,
vieles von dem,
was sie gesagt ist,
so ja, okay,
man sollte Sentry haben.
So, das ist eine gute Sache.
Muss ich kurz was einwerfen.
Ich habe jetzt kürzlich gelernt,
es gibt Glitchtip.
Glitchtip?
Das benutzt,
das hat die gleiche AP wie Sentry.
Das heißt,
man benutzt Sentry Client,
aber es ist einfacher zu hosten,
weil es einfach ist.
Einfach so wie Sentry vor fünf Jahren ist.
Okay.
Für die kleinen Benutzer
ist das einfacher als Sentry.
Und wenn man dann groß wird,
kann man auch auf Sentry umsteigen.
Ja, cool.
Entschuldigung, jetzt.
Nein, also was ich ganz interessant fand,
ist so diese Side Notes aus der Praxis,
zum Beispiel so diese,
jeder kennt das ja wahrscheinlich,
wenn man als Entwickler fragt,
was ist, wenn nichts passiert?
Das kann nicht passieren.
Was ist, wenn hier quasi,
zum Beispiel man spricht DAPI an
und zieht sich irgendwelche Daten,
dann irgendwelche Nutzer
haben dann eine Firma.
Ja, okay, aber das ist eine Liste.
Was ist, wenn jetzt zwei kommen?
Ja, das passiert nicht.
Ja, was, wenn doch?
Nein, das passiert nicht.
Und genau diese Cases sind halt meistens die,
die einem dann nachher das Genick brechen,
weil dann doch irgendwo
die zweite Firma kommt.
Und da schon quasi über diese Strategien nachzudenken,
bevor sie passieren.
Und nicht zu sagen,
also ich meine,
es gibt natürlich Cases,
wo es sich immer lohnt,
die Handbremse zu ziehen,
aber selbst wenn,
das bewusst zu tun
und nicht in irgendeinem random,
tiefen Python-Fehler dann zu explodieren.
Oder einfach zu sagen,
also zum Beispiel,
es gibt ja auch so einfach,
so dumme Strategien,
dass man zum Beispiel sagt,
oh, ich nehme zum Beispiel einfach
die erste Firma
und mache einfach weiter.
So, ja.
Je nachdem,
das muss man halt dann mit dem Kunden
oder wer auch immer das dann
für die man es baut.
Ja, man muss rausfinden,
ob es richtig ist.
Genau.
Genau, oder dass man es irgendwo vermerkt
oder sowas, ja.
Aber ich glaube,
da kann man sich echt
sehr, sehr viel Ärger sparen
und vor allem auch den Stress,
weil ich meine,
im Endeffekt der einzige Unterschied
zwischen Produktions-Debugging
und lokalem Debugging,
es macht ja jetzt nicht mehr
oder weniger Spaß an sich,
sondern du weißt halt,
dass du gerade aktiv
hat jemand das,
das Problem
und im Zweifelsfall machst du gerade
Daten kaputt,
die du aufräumen musst.
So, das sind ja die Sachen,
die es ätzend machen.
Ja, und du hast auch nicht
so viel Sichtbarkeit rein.
Wenn du es lokal hast,
kannst du ja fünfmal hintereinander
den Fehler machen.
Gut, ich meine,
oft kann man es ja auch reproduzieren,
zum Glück,
wenn irgendwie eine Möglichkeit ist.
Ja, gut, dann hast du natürlich.
Also, wir haben in mehreren
großen Systemen das so eingebaut,
dass wir so einen Job haben,
der anonymisierte Dumps postet.
Da gibt es ja auch
ein cooles Package,
auch aus Stuttgart.
Django Scrubber heißt das.
Da kann man über so eine Metaklasse,
das heißt, du hast dann quasi
produktionsnahe Daten
gegen zu Random-Daten,
mit denen es keinen Spaß macht
zu arbeiten
und die auch meistens irgendwie
nicht ins UI passen und so.
Also, Django Scrubber
könnt ihr euch mal anschauen,
auf jeden Fall.
Das ist auch so,
was du für sie meintest, ne?
Also, so Staging erzeugen,
das von der Daten-Volume
genauso groß ist wie...
Genau, sie hat das nicht gesagt,
aber im Endeffekt,
das ist, glaube ich,
das, was sie gemeint hat.
Und wir haben halt dann immer
so einen S3,
also in den größeren Projekten
einen S3-Bucket,
wo dann halt diese quasi, ne,
so dieses typische logarithmische
von der letzten Stunde,
von der letzten Nacht,
vom letzten Tag,
von der letzten Woche,
vom letzten Monat,
die Dumps dann liegen,
die auch immer aufgeräumt werden.
Die kann man sich dann halt
runterziehen und dann sagen,
okay, da ist jetzt irgendein Bug
mit User 27.
Man kann ja Sentry
auch so einstellen,
dass die IDs geschickt werden
nach Sentry,
aber alle personenbezogenen Daten,
also per Default nämlich,
sind alle User-Daten raus,
also man kriegt gar nichts mit,
was natürlich schwierig ist,
wenn man nicht weiß,
was ist der Kontext.
Welcher User war das?
So, aber das kann man
relativ einfach
ein Miniscript schreiben,
du hast,
im Endeffekt alles,
was man nicht in Sentry
haben möchte, rauswirft,
das heißt vom GDPR
ist man super safe
und dann hast du halt
die User-ID in Sentry,
kannst damit das dann nachstellen,
hast vielleicht noch die Produkt-ID,
wo jemand geklickt hat,
keine Ahnung
und damit kann man
viele Probleme,
klar, wenn du irgendwas
ganz fieses mit Concurrency
oder verteilte Systeme
oder sowas,
das ist nochmal
ein anderes Problem,
aber ja.
Ja, in solchen Systemen
macht man halt einfach
keine Fehler.
Stimmt.
Darum ist das auch einfach
absolut gesehen besser,
in jedem Fall.
Es gibt ein Zitat
von Deutschland,
Donald Knuth,
der geschrieben hat,
beware the above code,
I've only proved it,
not tried it.
Passt auf,
was er mit diesem Code macht,
ich habe nur bewiesen,
dass er richtig ist,
aber ich habe ihn
nicht ausprobiert.
Ganz der Mathematiker.
Ja, da gibt es auch
so einen Anspruch,
ich weiß jetzt gar nicht mehr
von wem,
sagt dann so,
Definition von
funktionierender Software,
also funktionierende Software
kann man nur so nennen,
wenn sie zumindest
in Produktion gewesen ist
und da gescheitert
und man sie dann
schon mal ein paar Mal
verbessert hat
und dann so vorher
kann man nicht sagen,
dass sie funktioniert,
weil wahrscheinlich
nicht.
Genau.
Muss man erst
nochmal da durch.
Dann gab es
noch einen Vortrag
und zwar
100 Million
Parking Transactions
per Year
with Django.
Ja, die meinen halt
mit Transaktionen
was anderes als andere Leute,
daher war das so ein bisschen
verwirrend für mich,
aber sie meinen damit
tatsächlich,
wie viele Leute
sich so ein Parkzettel
umsetzen.
Ja, genau.
Hat er auch gesagt,
gibt es verschiedene Sorten,
je nachdem wo du parkst.
Das ist das Backup
von den Parkplätzen
in den Niederlanden, oder?
Und jetzt auch in Deutschland
hat er auch gesagt.
Ja, genau.
War langsam reinwachsen.
War aber nicht auf der Karte drauf,
hätte mich jetzt interessiert.
Ja, ich habe auch so eine App,
ich weiß nicht,
Pay by Phone oder was das heißt,
vielleicht benutzt ihr was ähnliches
oder sogar den gleichen
Telefon.
Ja, also da waren schon
viele schöne Sachen drin
und das ist halt
schön zu sehen,
dass man halt irgendwie,
das sind ja nur irgendwie
vier Leute oder so
und die machen das halt
quasi für alle Parkplätze
und das machen sie mit Django
und das funktioniert super.
Es war also ein ETL-System
haben die gebaut.
Genau, die haben so ein ETL-System
mit Django Admin gebaut, ne?
Das fand ich so ein bisschen
was ich dann gedacht hätte.
Also, ne, du musst Daten,
musst du erst irgendwo herbekommen
und dann musst du dich transformieren
und wieder zurückladen.
Also Extract, Transform und Load.
Genau.
Weiß ja nicht jeder.
Aber es ist trotzdem interessant,
dass es mit dem Django-Framework,
dass es auf der Skala funktioniert,
dass die es mit vier Leuten
maintained bekommen
und sich auch noch gut dabei fühlen,
sagt er.
Das würde ich unterschreiben,
ich hätte das auch das Gefühl,
dass es gut geht.
Ich glaube,
es gibt viele Sachen,
Setups, wo du das nicht
mit vier Mann hinbekommst.
Absolut.
Das ist so ein bisschen
der Take-away, oder?
Wie weit du es treiben kannst.
Es müssen auch vier gute Leute
sein dann tatsächlich,
die das gut organisieren können,
weil es reicht ja, ja.
Oder drei gute Leute
und einer macht das,
worauf die anderen keinen Bock haben.
Das kam auch bei diesen anderen Talks,
bei dem von Hake Benita.
Ich.
Gestern bei dem,
wie man von Integer
zu Big Integer wechselt,
wenn du mehr als
eine Milliarde Zeilen hast.
Da kam das durchaus
für mich so ein bisschen raus,
wie weit man mit diesen Tools
gehen kann.
Wie viel Schmerz
die doch die meiste Zeit
von einem fernhalten.
Man könnte ja jetzt,
also wir haben ja vorhin
über diesen Talk
von Hake Benita gesprochen,
da könnte man jetzt rausziehen,
dass das Migrationssystem blöd ist
und dass man gleich von Anfang an
SQL machen sollte
und lieber eigene Indizes
und so weiter.
Aber für mich das Fazit
ist ein anderes.
Für mich das Fazit ist,
du kannst das eigentlich
so machen, wie du willst
und sobald du dann
an die Grenze stößt,
gibt es trotzdem Mittel,
um über diese Grenze zu kommen.
Um die Grenze noch hinauszukommen.
Und auch unkompliziert.
Ja.
Weil das war ja kein Hexenwerk,
was er gemacht hat.
Ja.
Und er hat auch gesagt,
wenn es eine Möglichkeit gibt,
das mit den Django-Mitteln zu machen,
dann macht er das,
weil es einfach komfortabler ist
und zukunftssicherer
und Datenbanktransferierbar
und so weiter.
Ja.
Und das ist so ein bisschen
eine schöne Bestätigung,
dass man eigentlich
sich erstmal keine Sorgen
darüber machen muss
über den Erfolg.
Ganz viele Leute
machen sich dann Sorgen,
was ist,
wenn ich mal eine Million
User habe?
Okay.
Zu viele Sorgen
über den Erfolg gemacht.
Und für mich ist das
so ein bisschen die Botschaft,
da man kann das machen
und das funktioniert
und das ist gar nicht schlimm.
Wenn ich jetzt noch drei Nutzer habe,
vielleicht funktioniert das ja dann
auch trotzdem.
Ja, das,
vielleicht.
Beim ersten geht es noch,
beim zweiten,
ja.
Als Mathematiker,
der größte Sprung
ist eigentlich von eins zu zwei.
Alle anderen sind dann,
das ist egal.
Ja,
man kann ja auch
nur noch mit Agenten reden.
Ja.
Ist das dann schon viele?
Ist der Agent,
ist dann,
das ist ein anderes Thema.
Anderes Thema.
Genau, das war's.
Jetzt ist gerade Mittagspause.
Ja.
Es war Mittagspause,
wir haben schon was verpasst.
Ja, es läuft schon wieder was.
Aber was tut man nicht
für seine Hörer?
Ja, dann schaltet uns wieder ein.
Vielleicht morgen wieder,
wir wissen es noch nicht ganz genau.
Ja, mal schauen.
Wenn wir Zeit finden.
Ja, morgen ist auch noch
die Party abends
und wir können ja nicht eigentlich
oder vielleicht auch am Samstag
noch eine.
Ja, schauen wir mal.
Ja, also wie auch immer,
wenn ihr uns wieder hört,
bleibt uns gewogen,
schaltet wieder rein.
Hallo at peisenpodcast.de
für alles Feedback.
Vielen Dank, Manni.
Das sind wir effektiv am Ende.
Ja, vielen Dank.
Danke, dass ich hier sein durfte.
Danke auch.
Ja.
Und ja, dann bis morgen.
Bis zum nächsten Mal.
Tschüss.
Ciao.
Ciao.