Transcript: Refactoring

· 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 Episode 37.

Dominik

Wir wollen heute ein bisschen über Refactoring reden und natürlich ist wieder Jochen dabei.

Dominik

Hi Jochen.

Dominik

Jo, hallo auch Dominik.

Dominik

Und wir haben heute auch Ronny da.

Dominik

Hi Ronny.

Dominik

Hi.

Dominik

Jo, hi Ronny.

Dominik

Kennt ihr vielleicht auch noch.

Dominik

Grüße.

Dominik

Jo.

Dominik

Ja, vielleicht erstmal ein bisschen News.

Dominik

Ich weiß nicht, so viel Neues gab es noch nicht.

Dominik

Ja, haben wir News?

Dominik

Ich weiß nicht genau.

Dominik

Also am 6.

Dominik

Nikolas, das ist noch nicht so lange her, zwei Tage oder so, gab es Python 13.1.

Dominik

Ach, okay.

Dominik

Das ist an mir vorbeigekommen.

Dominik

Das habe ich gerade nicht bekommen.

Dominik

Ja, cool.

Dominik

Habe ich bei mir jetzt überall eingebaut und

Jochen

stable. Ich glaube, das war

Jochen

vorgestern oder so,

Jochen

oder gestern, ich bin mir gar nicht sicher.

Jochen

Vielleicht gestern ist Django 4

Jochen

released worden. Ja, stimmt, genau.

Jochen

Ja, das ist auch eine ganz gute Neuigkeit.

Jochen

Ja.

Jochen

Es ist gar nicht so viel Neues dazu gekommen,

Ronny

ehrlich gesagt. Aber es ist super viel weggefallen.

Ronny

Also die Backwards-Incompatibility-List,

Ronny

oh mein Gott,

Ronny

die ist ungefähr fünfmal so lang wie die

Ronny

neuen Features. Das ist echt krass.

Ronny

Das ist super, ja.

Dominik

ein paar Sachen rausgeflogen, die man nicht mehr braucht oder die gefährlich

Dominik

sind oder so, schon gar nicht so schlecht.

Dominik

Ja, ansonsten

Jochen

weiß nicht genau, machen wir auch

Jochen

News in anderen, für andere Sprachen?

Jochen

Ja, ich glaube hier

Jochen

PHP 8.1 ist irgendwie released

Jochen

und da gibt es ein neues interessantes Feature

Jochen

mit dabei und zwar

Jochen

async await

Jochen

so wie in Python halt auch

Jochen

nur anders, also

Jochen

also die Keywords

Jochen

aber es

Jochen

ist ein bisschen anders, man kann das halt

Jochen

man kann halt Async-Funktionen auch so callen

Jochen

ohne Await, was ganz

Jochen

interessant ist. In JavaScript übrigens auch so.

Jochen

Man muss

Jochen

halt nur, wenn man Await sagen will

Jochen

innerhalb von einer Funktion, irgendwie die Async

Jochen

definiert haben, aber man kann die auch

Jochen

einfach so aufrufen und

Jochen

ja, dann passiert irgendwie magisch das Richtige oder

Jochen

was Falsches oder was.

Jochen

Aber man hat halt daher, also was

Jochen

in Python tatsächlich ein bisschen nervig ist, ist man halt

Jochen

dieses Farbigkeitsproblem der Funktionen hat,

Jochen

dass man halt, wenn man irgendwo

Jochen

Async was machen möchte, dann muss

Jochen

alles Async sein.

Jochen

Man kann natürlich auch hingehen und sagen,

Jochen

okay, async.io.run

Jochen

oder so, aber das ist natürlich...

Dominik

Man muss dann erstmal den Event-Loop immer rausführen

Dominik

oder wenn man im Jupyter gerade ist, dann ist das auch immer

Dominik

ein bisschen doof und so, ja.

Jochen

Ja, also in Python ist es expliziter

Jochen

als in JavaScript und in PHP,

Jochen

aber es ist halt auch so ein bisschen

Jochen

unhandlicher zu benutzen vielleicht, aber

Jochen

naja, gut. Ja, aber das ist vielleicht

Jochen

auch noch erwähnenswert, weil damit wird in PHP

Jochen

auch dann irgendwann das möglich, was ja jetzt in Python

Jochen

jetzt, das kommt ja jetzt in Python, ist das

Jochen

jetzt in den ganzen Frameworks halt irgendwie so

Jochen

oder zumindest Django,

Jochen

ich kann nicht so genau, FastAPI halt auch, aber das

Jochen

war ja schon immer so angekommen, dass man halt

Jochen

irgendwie Async-Kram da machen kann

Jochen

und dann eben, ja, kann man halt solche Sachen machen

Jochen

wie auch Filesurfing vom Applikationsserver aus

Jochen

oder halt auch Websockets, relativ

Jochen

einfach und so und das geht dann halt, weil ich weiß

Jochen

gar nicht, wie das in PHP ist, da normalerweise eben

Jochen

Sachen, PHP, Filesurfen,

Jochen

das geht halt einfach nicht so richtig gut, weil

Jochen

üblicherweise hat man nach irgendwie

Jochen

einer Minute oder so werden die

Jochen

Prozesse gekillt, weil

Jochen

bei den meisten Hosern.

Dominik

Da brauchst du mich jetzt gar nicht fragen, ich kriege nullkummer gar nicht aus,

Dominik

wenn ich es ja sprache.

Jochen

Naja, aber genau, da geht es halt auf jeden Fall auch voran.

Jochen

Also sowieso per letzten Version

Jochen

viel dazu gekommen und ja.

Dominik

Ich kenne mich noch vom Gegenschubsen,

Dominik

um umzutreten.

Dominik

Tja, kann man natürlich auch machen.

Dominik

Ja, haben wir noch andere News?

Dominik

Haben wir noch was?

Dominik

Was war denn in Django 4

Dominik

drin alles Schönes?

Dominik

Wisst ihr das noch?

Jochen

Ja, neuer, also Django Redis

Jochen

ist irgendwie, also Redis-Kind

Dominik

wird da reingekommen. Automatisch, das gab ja immer sonst

Dominik

ein Redis-Package und jetzt kam es direkt als

Dominik

Default-Sets oder so, ne? Ja, es ist jetzt

Dominik

halt drin, weil es gab irgendwie eine Umfrage,

Jochen

was verwendet ihr denn so für Caching und

Jochen

Alle nehmen Redis. Genau,

Jochen

Memcachedie war eingebaut,

Jochen

aber alle nehmen Redis, daher

Jochen

macht es irgendwie nicht so richtig viel Sinn,

Jochen

das nicht eingebaut zu haben und ja,

Jochen

deswegen ist das jetzt halt drin.

Jochen

Ja, ansonsten, naja,

Jochen

war's nicht. Die anderen Sachen waren...

Jochen

Halt, die Set ist rausgeflogen, glaube ich.

Jochen

Genau.

Ronny

Aber ich glaube, das war echt mehr ein Aufräumen-Release.

Ronny

Gefühlt.

Ronny

Was ja auch eine gute Sache ist

Ronny

und was auch sehr gut zu unserer Refactoring-Session passt.

Ronny

Ja, absolut.

Jochen

Genau, das ist nämlich das Thema, glaube ich.

Jochen

Genau, das Thema.

Dominik

Ja, was ist denn das überhaupt, Refactoring?

Dominik

Was sagt ihr denn, was das ist?

Dominik

Also ich sage mal so, ich baute oft meinen Code um,

Dominik

aber ist das schon Refactoring?

Dominik

Also immer dann, wenn man halt ein bisschen später wieder draufguckt.

Dominik

merkt man halt so, oh, wie war ich doof oder

Dominik

oh, ist das aber hässlich oder schlecht, was ich

Dominik

vorgemacht habe. Mach ich das doch mal nochmal oder

Dominik

pass ein bisschen an oder mach es ganz von

Dominik

neu oder was heißt Refactoring

Dominik

für euch?

Dominik

Nimmt man sich da extra Zeit für? Gehört das in

Dominik

einen Sprint oder so?

Dominik

Ich würde jetzt mal sagen,

Jochen

meiner Verständnis nach gehört das

Jochen

halt schon dazu,

Jochen

wenn man sich

Jochen

der agilen Softwareentwicklung

Jochen

bedient als

Jochen

Prozessmethode,

Jochen

was auch immer, wie man das nennen möchte, dann würde

Jochen

ich sagen, ich sage mal so Definitions of Done,

Jochen

zum Beispiel bei Scrum, sagt,

Jochen

wann ist was fertig und dann würde

Jochen

aus meiner Sicht halt dazugehören,

Jochen

normalerweise, dass man sagt, man hat das auch irgendwie mal

Jochen

refactured oder so. Wie viel

Dominik

Prozent der Zeit würde in sowas wie? Och, keine Ahnung,

Dominik

das kommt drauf an, also. So ein Tag?

Jochen

Je nachdem, was man macht, nee, das kommt

Jochen

halt, also, und manchmal muss man es vielleicht

Jochen

auf das komplette System refacturen, weil.

Dominik

Wer refactort das denn, man selber, ein anderes Team,

Dominik

das eigene Team mit vier, fünf, sechs Augen

Jochen

im Prinzip? Nee, immer der, der fragt.

Jochen

Okay, also bei uns

Dominik

bin ich, also ich bin, weil ich mag

Dominik

das irgendwie, Code umzubauen, ich weiß auch nicht

Dominik

das ist so ein bisschen blödes Hobby, also es gibt

Dominik

ja Zen of Python, das ist ja eigentlich

Dominik

eher für andere Dinge da, da

Dominik

wollten wir auch nochmal eine Folge drüber machen, aber der erste

Dominik

Satz ist natürlich, beautiful is better than

Dominik

ugly

Dominik

und ich mag das irgendwie, wenn es hübsch ist

Dominik

aber ist das ein guter Grund

Dominik

zum Refactoren, dass es dann nachhübscher aussieht

Dominik

es tut halt dasselbe

Dominik

ist das wartbarer?

Jochen

Aus meiner Sicht eigentlich schon,

Jochen

aber da ist natürlich irgendwie

Jochen

quasi, ja, aber ich meine

Dominik

Man kann unendlich viel Zeit damit zu verbringen,

Dominik

immer wieder dran rum zu feilen und zu gucken, dass

Dominik

immer alles ein bisschen hübscher ist. Das macht halt kein

Dominik

einziges Feature mehr. Aber das ist auch vielleicht so ein bisschen,

Dominik

das hat man schon ein paar Mal erwähnt, so dieses

Dominik

warum Programmierer irgendwie

Dominik

Programmierer sein irgendwie nicht so

Dominik

Business, dass sich das wie. Wie ist nochmal

Dominik

dieser Talk, da hatten wir schon mal drüber gesprochen.

Dominik

Weiß ich gar nicht, welchen meinst du?

Dominik

Ja, ja, du kennst den auch noch, den hast du auch gesehen.

Dominik

der war auf der DjangoCon irgendwie ganz

Jochen

entspannt. Ach, der, der erste,

Jochen

der erste Talk auf der DjangoCon

Jochen

EU, ja,

Jochen

weil man mag halt programmieren

Jochen

und deswegen macht man das halt

Jochen

und ob es irgendwie am Schluss

Jochen

dabei was rauskommt oder nicht, ist eigentlich dann auch

Jochen

so ein bisschen egal, genau. Ich glaube, ganz

Ronny

wichtig ist halt, wie in allen Bereichen

Ronny

überall ist halt Pareto-Prinzip, also

Ronny

dass man einfach schauen muss, dass man

Ronny

also 80% der Sachen kriegst du halt

Ronny

einfach in 20% der Zeit refactored und die Details,

Ronny

die kosten dann richtig viel

Ronny

und da muss man abwägen.

Dominik

Die ganz wichtigen Details, darf man das weglassen? Ich weiß nicht.

Ronny

Es kommt immer ganz drauf an, würde ich

Ronny

sagen. Also ich meine, wenn man jetzt irgendwie an einer

Ronny

Software bastelt und da geht es gerade

Ronny

irgendwie um die, weiß ich nicht, Zahlungsschnittstelle

Ronny

oder Auftragsabwicklung, dann

Ronny

sollte man schon schauen, dass das vernünftig funktioniert

Ronny

und dass man da vielleicht auch eher einen Schritt

Ronny

weiter denkt, als einen Schritt zu kurz

Ronny

denkt. Aber es gibt doch in jedem System

Ronny

Bereiche, weiß ich nicht, irgendeine

Ronny

eine Administrationsseite, die zweimal im Jahr aufgerufen

Ronny

wird oder so und wenn die jetzt nicht ganz perfekt ist,

Ronny

jo, ich meine.

Dominik

Du sagst ja, der Business-Use-Case,

Dominik

das ist eigentlich, glaube ich, eine sehr gesunde Einstellung,

Dominik

wenn man sagt, es geht darum, Business-Value,

Dominik

also zumindest aus der Business-Sicht

Dominik

ist es eine sehr gesunde Einstellung.

Ronny

Aber ich würde nicht nur sagen das,

Ronny

also zum Beispiel, ich habe jetzt in einem

Ronny

Projekt, habe ich jetzt,

Ronny

ich habe ja vor

Ronny

einiger Zeit mir mal so ganz tolle Class-Based

Ronny

E-Mails für Django ausgedacht und

Ronny

habe jetzt in einem Projekt mal wirklich, weil

Ronny

ich jetzt Internationalisierung eingebaut habe, habe ich jetzt

Ronny

dann direkt alle E-Mails, weil ich

Ronny

da eh dran musste, weil ich die Templates halt anpassen musste

Ronny

und gucken musste, was halt die Sprache reingegeben wird, etc., etc.,

Ronny

habe ich halt dann direkt gesagt,

Ronny

okay, ich refactor jetzt direkt alle E-Mails zu Classbase,

Ronny

was ist natürlich viel,

Ronny

also das war definitiv in den 20%,

Ronny

ja, und nicht in den 80%,

Ronny

aber trotzdem weiß ich jetzt halt, dass wenn ich irgendwas

Ronny

mit den E-Mails machen muss und vielleicht mal auch

Ronny

generell was anpassen, zum Beispiel nochmal irgendwie das Layout

Ronny

überarbeiten, was eh für irgendwann ansteht bei dem Projekt und so was,

Ronny

habe ich halt danach einfach weniger Arbeit

Ronny

und das bohrt sich halt an, wenn ich das Ding ja eh gar

Ronny

auseinandernehme, dann mache ich das halt einfach noch mit.

Dominik

Gut, aber das ist jetzt auch wieder aus dem Effizienzgedanken heraus.

Dominik

Das heißt, du machst Refactoring deswegen, weil du später

Dominik

Arbeitszeit, Wartungszeit

Dominik

oder neue Feature-

Dominik

Entwicklungszeit sparst.

Dominik

Okay, das wäre auch so ein Effizienzgedanken.

Dominik

Also quasi extrem wichtig, dass man das dann tut.

Ronny

Und es schont dann auch meine Nerven,

Ronny

wenn ich das dann nächstes Mal entspannter

Dominik

machen kann. Ja, das finde ich auch. Also ich finde so

Dominik

Refactoren aufgrund von, wir brauchen das vielleicht

Dominik

nochmal und wie das da so steht,

Dominik

das versteht ja keiner. Das ist ein

Dominik

Eine Spaghetti-Band irgendwie hat irgendwas gebaut, weil er noch gar nicht wusste, wie das ging, hat das dann alles hingeschrieben.

Dominik

Das ging dann irgendwie, aber so richtig nutzbar und schön ist das alles nicht.

Dominik

Das ist irgendwie so, wie man es so kennt, so zusammengezimmert.

Ronny

Ich finde auch ein ganz wichtiger Punkt ist, dass halt die meiste Software, die funktioniert, wird ja konstant weiterentwickelt.

Ronny

Das ist ja einfach so.

Dominik

Da frage ich mich auch ehrlich gesagt immer, warum, aber okay.

Ronny

Und immer wenn neue Anforderungen dazu kommen, dann hat man die ja logischerweise vorher nicht bedacht, weil man ja nicht wusste, dass die kommt in den meisten Fällen oder in vielen Fällen.

Ronny

Und das heißt, man fängt dann an in etwas, das nicht dafür gedacht ist, mehr Sachen reinzubauen.

Ronny

Und das ist immer der Punkt, wo, glaube ich, intrinsisch einfach schon der Bedarf von einem gewissen Refactoring besteht.

Ronny

Vielleicht nicht bei der ersten oder zweiten Änderung, aber irgendwann gibt die Struktur das einfach nicht mehr her.

Dominik

Das ist halt genau die Frage. Wird was moderner? Muss man das dann, diesen modernen Stil, dann auch refactoren?

Dominik

Das ist aber eine Stilfrage. Das heißt, ich habe eine schönere Skulptur, die Skulptur hat eine andere Mode als vorher.

Dominik

Und deswegen mache ich es jetzt auf die gleiche Art ein bisschen neuer, ein bisschen anders.

Dominik

Das gibt ja jede Menge Dinge, die man neu machen kann.

Dominik

Ein schönes Beispiel finde ich Google.

Dominik

Google hat unheimlich viel Energie reingesteckt

Dominik

in das Gmail-Programm oder so.

Dominik

Und eigentlich würde ich fast setzen,

Dominik

das ist so quasi feature-complete zu dem, was man sich so wünscht.

Dominik

Man kann alles damit machen, was man mit zum E-Mail-Client

Dominik

eigentlich so machen will. Und die haben auch schon

Dominik

so viel Zeit draufgeschmissen, dass so viel Neues

Dominik

nicht kommt. Was ich jetzt immer sehe, da kommen irgendwelche

Dominik

Änderungen am Style, an der Grafik, die

Dominik

irgendwas eigentlich einfach nur anders machen.

Dominik

Die mich dann zum Beispiel eher nerven, weil ich brauche

Dominik

die einfach nicht. Ich will es so haben wie früher oder so, weil ich

Dominik

veränderungsresistent bin oder so.

Dominik

Und das ist aber dann

Dominik

mit Refactoring verbunden? Warum macht man das?

Dominik

Vielleicht, weil die Abteilung dann denkt so, okay, wir haben jetzt noch

Dominik

diesen Sprint, wir wollen nicht aufgelöst werden,

Dominik

wir wollen irgendwas machen und dann refactoren die da irgendwie rum.

Dominik

Ist halt eigentlich schon fertig, die Software.

Dominik

Und ja.

Jochen

Naja, du hast halt dann normalerweise irgendwelche Metriken,

Jochen

die halt an irgendeiner Stelle nicht so gut aussehen

Jochen

und dann machst du halt was, um das zu verbessern.

Jochen

Und manchmal wird das dann besser und manchmal wird das dann schlechter.

Jochen

Und dann nur schlechter

Jochen

für manche Leute und dann hast du halt

Jochen

vielleicht einfach Pech.

Jochen

Ja, genau.

Jochen

Naja, ist halt die Frage. Also ich meine, ja, man könnte auch sagen,

Jochen

Software ist irgendwann fertig.

Jochen

Also irgendwann ist halt der Wert,

Jochen

die neue Features bringen halt unter den Kosten,

Jochen

wenn du das halt priorisiert hast,

Jochen

nach irgendwie, was es reinkommt,

Jochen

irgendwie minus Kosten es zu entwickeln.

Jochen

Irgendwann wird das halt negativ.

Jochen

Und aus einer Business-Sicht

Jochen

müsstest du dann einfach aufhören zu entwickeln.

Jochen

Ja.

Jochen

Aber ja, ja, was stimmt?

Jochen

Mit diesem Schritt tun sich viele schwer.

Jochen

Ja, genau.

Dominik

Und dann wird er sagen, okay, gehen wir jetzt fertig,

Dominik

wir machen jetzt was anderes.

Dominik

Würde ich auch sagen,

Dominik

das wäre eigentlich, irgendwann ist es halt durch.

Dominik

Und dann, na klar,

Dominik

kann man irgendwann in zehn Jahren

Dominik

nochmal einen Designer draufsetzen und sagen,

Dominik

hey, wir machen das ein bisschen moderner, aber dann

Dominik

muss die API vielleicht im Hintergrund, bleibt halt gleich.

Dominik

Und was ich aber als Entwickler jetzt auch

Dominik

sehr super finde, ist tatsächlich

Dominik

Code schöner machen, weil man lernt immer was.

Dominik

Also ich kann ja eigentlich nicht so viel mit den Sachen,

Dominik

die ich neu mache, die kann ich vorher eigentlich

Dominik

meistens nicht. Also sonst sind die immer relativ schnell fertig

Dominik

und dann, aber wenn die neu sind, dann

Dominik

baue ich irgendwas neu, dann muss ich mir ein Konzept überlegen,

Dominik

ich weiß gar nicht, wo ich hin will und am Ende

Dominik

sehe ich halt immer, oh, auf dem Weg dahin

Dominik

bist du irgendwelche Sackkassen gelaufen,

Dominik

irgendwelche Abkürzungen gegangen, die du eigentlich gar nicht gehen solltest

Dominik

und hast voll irgendwas vergessen und das

Dominik

muss man dann nach und nach irgendwie einbauen. Aber das

Dominik

sorgfältig zu machen, das dauert halt viel mehr Zeit.

Dominik

Den ganzen Code kann man fast wieder neu schreiben und dann hat man

Dominik

am Ende was viel Schöneres da stehen.

Dominik

Und ich weiß nicht, ist das Refactoring?

Dominik

Und in einem halben Jahr später

Dominik

fasse ich es wieder an und es ist wieder irgendwie so.

Dominik

Ich denke, ah, das hättest du irgendwie schöner machen können.

Dominik

Also ich habe,

Jochen

ich kann das ja gleich mal direkt schon mal

Jochen

spoilern. Ich habe so ein Buch gelesen,

Jochen

das nennt sich

Jochen

A Philosophy of Software Design von

Jochen

John Osterhut oder so.

Jochen

Keine Ahnung, ob ich den jetzt richtig ausgesprochen habe.

Jochen

Das wurde mir empfohlen

Jochen

in der Hacker-News-Diskussion

Jochen

und deswegen werde ich jetzt ganz viel daraus

Jochen

zitieren oder beziehungsweise Dinge

Jochen

sagen, die da drinstehen, weil ich davon jetzt noch

Jochen

eine Menge weiß und dann demnächst habe ich das wieder alles vergessen.

Jochen

Vielleicht habe ich jetzt schon eine ganze Menge vergessen.

Jochen

Aber

Jochen

da ist ein schöner Satz. Am Anfang steht

Jochen

da sowas wie, ja, also Software

Jochen

schreiben ist ja eigentlich toll, weil es ist halt so eine der

Jochen

puresten, eine der

Jochen

reinsten kreativen Tätigkeiten,

Jochen

weil man halt nicht so...

Jochen

schaffen. Genau, weil man hat kaum

Jochen

Begrenzungen durch irgendwelche Dinge.

Jochen

Also alles, was man sich vorstellen kann, kann man

Jochen

im Grunde machen. Deswegen ist es halt sehr rein.

Jochen

Man ist nicht

Jochen

abhängig von irgendwelchen Dingen.

Jochen

Und

Jochen

da ist was dran. Ich weiß jetzt nicht, ob die meisten

Jochen

Leute das so sehen würden, aber das ist halt

Jochen

jetzt auch relativ weit auf der

Jochen

Entwicklerseite schon. Auf der Seite

Jochen

das ist halt

Jochen

ein Wert, wenn das schön ist.

Jochen

Sozusagen. Wenn es schön

Jochen

ist und rein ist und keine Ahnung, dann ist

Jochen

Ist das irgendwie eine wertvolle Geschichte?

Jochen

Und die andere Seite wäre halt, ist doch egal,

Jochen

Hauptsache es tut. Also Hauptsache die

Jochen

Features sind entwickelt und der Kunde ist glücklich

Dominik

und ich habe möglichst wenig Zeit dran im Rechner

Dominik

gesessen an der blöden Kiste, weil ich eine andere Sache machen kann.

Jochen

Der Product Owner hat es abgenommen

Jochen

und nach mir diesen Flut

Jochen

irgendwie so ein bisschen, also

Jochen

eher so ein pragmatischer Ansatz.

Jochen

Ich glaube, beide haben so eine gewisse

Jochen

Berechtigung.

Dominik

Ja, total. Also gerade wenn ich jetzt

Dominik

meinen Nutzen maximiere, dann will ich

Dominik

möglichst wenig Zeit am Rechner verbringen, weil ich ja

Dominik

damit mein Geld verdienen? Also, tu mir so, ich werde

Dominik

per Auftrag bezahlt oder sowas, ja? Dann würde ich

Dominik

möglichst wenig Zeit daran sitzen, weil ich möchte

Dominik

ja irgendwas andere Sachen machen. Und was dann

Dominik

unten drunter, wie das aussieht, ob es hübsch oder hässlich ist,

Dominik

ist einem dann völlig egal. Hauptsächlich sind sie schnell damit

Dominik

fertig und können das abhaken,

Dominik

den Auftrag erfüllt. Das sieht ja quasi

Dominik

der Manager eh nicht, weil der guckt ja eh nicht unter

Dominik

die Haube. Der guckt ja nur, was am Ende dabei rausfällt.

Dominik

Du zahlst es halt beim nächsten,

Ronny

bei der nächsten Aufgabe. Genau, aber

Dominik

das passiert mir egal. Und ob ich dann selber dann was Neues

Dominik

dranflatschen muss, kann ja sein. Also, man

Dominik

merkt es tatsächlich, aber erst, wenn man so Speed aufnimmt.

Dominik

Das heißt, wenn man das ordentlich macht, dann kann man diese Erweiterung, die Skalierung immer schneller machen und das Deliveren von neuen Sachen, wenn man es ordentlich gemacht hat, ist dann einfacher.

Dominik

Oder man kann halt Copy-Pasten aus dem anderen Projekt, wenn man es ordentlich gemacht hat und kann es ganz einfach auf die neuen Sachen generalisieren.

Dominik

Das sind halt aber so Sachen, die nicht ziehen, wenn man halt immer was anderes machen muss.

Jochen

Ja, sagen wir mal so, also der, wenn man jetzt rein aus der Business und auch aus der, sagen wir mal so, agilen Methodologie-Sicht da drauf guckt, dann ist der, es muss halt irgendwie funktionieren und ob das Feature fertig ist oder nicht, ist halt das, was man von außen sieht und das ist halt das Relevante.

Jochen

Das ist der deutlich dominantere, der deutlich dominantere Punkt, was halt dazu führt, dass der halt auch oft sehr stark betont wird in so, ja, kommerziellen Entwicklungen.

Ronny

Ja, ja, also der Manager, der interessiert sich nur für das KPI-Feature, fertig oder nicht, User-Story, das ist halt sehr atomar gesehen, also wenn man jetzt sagt, im Endeffekt, jedes Feature ist, also wenn man sich das wie so, weiß ich nicht, eine Menge von Commits im Branch oder sowas vorstellt, jedes Feature ist ja irgendwie ein Teil auf dieser Strecke zum Produkt, das irgendwann fertig oder irgendwann an einem Release-Punkt ist und wenn man das halt sehr atomar sieht, dann stimmt das natürlich, aber wenn man das halt über das große Ganze sieht, dann insbesondere bei langlaufenden Projekten, die halt wirklich konstant weiterentwickelt werden

Ronny

Und wo vielleicht dann auch irgendwie ein Geschäftsprozess oder irgendwas so wirklich dann Firmengeld drüber läuft, glaube ich, ist das halt viel zu kurz gedacht. Also ich kann da, ich habe letztens mit ein paar Entwicklern gesprochen und die waren in ihrem Projekt halt so ein bisschen, nicht wirklich schlimmer, es ging so ein bisschen, fing an Richtung Zombiescrum zu werden. Es war eine relativ hohe Bugquote, das Team ist sehr viel Sachen hinterhergelaufen generell.

Dominik

Backquote, ganz kurz, ist Anzahl an Bugs pro 100-Seilen-Code?

Ronny

Backquote ist quasi die Anzahl der Bug-Tickets an allen Tickets im Sprint.

Ronny

Ah, okay.

Ronny

Oder Bug-Story-Points auf die insgesamt Sprint-Story-Points gezogen, berechnet.

Ronny

Und das Team war halt latent frustriert.

Ronny

Der Product Owner hat so ein bisschen die Fähigkeit des Teams irgendwie angezweifelt,

Ronny

weil irgendwie da waren die Bugs und Sachen, die abgesprochen waren,

Ronny

haben dann plötzlich nicht mehr funktioniert.

Ronny

Das war halt insgesamt so eine latente Unmut auf allen Seiten. Es lief halt einfach nicht wirklich rund. Und dann haben die halt angefangen, halt so ein paar größere Sachen einfach mal anzugehen, weil dann war halt gerade so der eine große Release durch.

Ronny

Okay, wir machen irgendwie Coverage rein, also wir zwingen Coverage in der Pipeline, also sprich, neuer Code muss getestet sein, sonst kann ich nicht deployen, kann ich nicht, well, Commitment schon, aber nicht deployen, dann einfach mal geschaut, dass man einfach so Streamlining, wie kriegen wir alle möglichen Variablen beim Prot-Deployment, das immer wieder mal auf die Nase fällt, wie kriegen wir das raus und immer mehr solche Sachen halt, haben die halt dann angegangen und damit hat sich dann, also nicht nur, dass halt dann plötzlich die Backquote enorm gefallen ist,

Ronny

Also man glaubt nicht, was so ein simples Maß wie ich erzwinge Courage in der Pipeline, das ist so trivial, aber es hat total geholfen und auch die anderen Sachen und auf einmal hat sich dann, haben sie mir erzählt, einen ganz neuen Drive entwickelt, das ist echt faszinierend zu sehen gewesen und ja, da hätten die selber nicht drüber nachgedacht, dass das wirklich so einen großen Effekt haben kann, aber auf einmal ist auch so diese ganze Lethargie raus, wo man plötzlich mit hey cool, da geht was weiter, es klappt wieder, man hat plötzlich wieder auch Energie oder

Ronny

Musse, irgendwie Sachen anzupassen, zu refactoren,

Ronny

weil man halt eh das Gefühl hat, okay, es geht jetzt

Ronny

wieder nach oben. Wir versuchen nicht irgendwie dieses Haus

Ronny

immer so lange zusammenzuzimmern, dass es bloß

Ronny

nicht auseinanderfällt, sondern man macht halt wieder

Ronny

das Kreative, das Schöne halt.

Dominik

Ich finde das so ein bisschen schwierig,

Dominik

weil du hast auch was sehr Interessantes

Dominik

gesagt. Also, weil der,

Dominik

wenn es halt nur um diese User-Stories geht, ne, und

Dominik

dann möchtest du da irgendwas

Dominik

Schönes entwickeln,

Dominik

das funktioniert dann irgendwie, und dann hast du langfristig

Dominik

Ziele, die du erreichen kannst,

Dominik

wenn du am Anfang von Anfang an auf gute Qualität

Dominik

achtest oder halt viele Tests schreibst oder ein bisschen

Dominik

TDD machst, also je nachdem das, was so dein

Dominik

Overall Quality so ein bisschen, also wenn man ein bisschen mehr nachdenkt

Dominik

vielleicht am Anfang und ein bisschen mehr

Dominik

Know-how sich von Anfang an zum Holt, ist das glaube ich auch

Dominik

was, was dich langfristig austeilt, ja,

Dominik

weil man sich irgendwie alles von vorne neu machen muss.

Dominik

Aus Business-Sicht

Dominik

ist das aber so ein bisschen komisch, weil die, es ist eher so,

Dominik

die meckern immer die ganze Zeit rum, so, ah, warum läuft

Dominik

das denn noch nicht und warum sind da noch so viele Bugs und das verstehe ich alles nicht

Dominik

und es muss alles fertig sein und so,

Dominik

dann aber später sind die dann gewohnt, dass sie

Dominik

genauso viel Zeit und Geld aufwenden müssen für Neuentwicklung

Dominik

und du denkst so, ja, aber eigentlich ist das ja in zwei Tagen

Dominik

fertig, weil wir haben ja ordentlich

Dominik

am Anfang den Faktor und schön gemacht, das heißt, wenn man es richtig

Dominik

macht, könnte man die neuen Features alle direkt

Dominik

rausknallen, weil die super schnell gehen dann,

Dominik

aber das versteht dann keiner und das kann man auch nicht

Dominik

kommunizieren und ich sag mal, ist auch eher

Dominik

gefährlich, das zu kommen, weil dann so eine

Dominik

Erwartungshaltung entsteht, dass das halt immer

Dominik

so wäre und dass das auch

Dominik

nicht irgendwie clever dann vielleicht, ne, so

Dominik

für so ein ganzes Team. Ich glaube,

Ronny

Und da ist es halt super essentiell, dass man halt einfach eine gute Vertrauensbasis mit dem Product Owner hat.

Ronny

Tja.

Jochen

Genau, oder überhaupt diese Kommunikation zwischen irgendwie eben, ob das jetzt Product Owner ist oder, oft ist es ja so, der Product Owner ist ja noch so irgendwie quasi mehr oder weniger Teil des Teams.

Jochen

Ja, wäre gut.

Jochen

Genau, Product Owner und, also sagen wir mal Team irgendwie und dem Product Owner mit einem bezogen und halt irgendwie im weitesten Sinne das Management oder so.

Jochen

Wenn es da kein Vertrauen gibt, ist es schlecht.

Dominik

Ja, genau. Und auch ganz wichtig ist eigentlich, dass die Entwickler mit dem Kunden irgendwie eigentlich so viel zu tun haben oder mit dem Gedanken der User-Stories, dass sie halt da selber so committed drin sind auch.

Dominik

Weil wenn halt die immer nur irgendwie ihre Tickets wegschubsen, dann ist das dann irgendwann wurscht. Das ist halt genau so eine Kommunikationssache.

Dominik

Was der eigentliche Clou wäre, gutes Refactoring zu machen, von Anfang an das richtig zu tun, ist halt ein gutes Teamgespräch immer am Laufen zu halten, auch mit dem PO.

Dominik

Und zwar nicht nur über Tickets und Leistungen und KPIs, sondern halt auch …

Jochen

Aber tatsächlich, also ich meine, das ist halt auch das, also zu dem ganzen Agile-Kram gibt es halt auch einen kleinen Absatz in dem Buch, wo da halt so gesagt wird, ja, okay, Agile, voll gut, iterativ super, irgendwie, dass die Fachkompetenz nicht an den Reichen gekommen ist, also es gibt viele gute Sachen dabei, aber irgendwie, was nicht so toll ist, ist, dass diese ganzen Agile-Geschichten einen großen Wert auf diesen Was-bringt-es-fürs-Business-Punkt legen, was ja auch nicht unbedingt falsch ist,

Jochen

aber sozusagen sie tendieren dazu, das deutlich überzubetonen, weil es gibt halt auch diesen anderen Punkt, ist das denn jetzt gut designt zum Beispiel, ist das denn schön, ist das denn mit der geringstmöglichen Komplexität irgendwie gebaut worden und da gibt es jedenfalls auch meiner Ansicht nach nichts in dem, zum Beispiel bei Scrum, was eine Rolle, die dafür zuständig wäre, das durchzusetzen.

Jochen

Simpeles Better than Complex, ne?

Jochen

Ja, genau.

Jochen

Du kriegst halt, wenn das durch die Review

Jochen

beim Produkt-Oner, der da aber nicht aus einer technischen Perspektive

Jochen

drauf guckt, sondern aus einer Business-Perspektive

Jochen

durchgeht, dann ist das ja gut.

Jochen

Und das Team ist halt, wird immer dazu gesagt,

Jochen

ist dafür verantwortlich, dass halt das fertig sein muss,

Jochen

getestet sein muss und, aber

Jochen

tatsächlich, es gibt niemanden,

Jochen

der dann sagen kann, okay, das lasse ich nicht live gehen,

Jochen

das geht so nicht, das ist Kacke.

Jochen

Ich habe aber super Lust, bitte,

Jochen

Red zu Ende, dann. Ja, und das gibt's

Jochen

halt nicht und das ist halt etwas, was so ein bisschen

Jochen

fehlt und was man, wo man sagen

Jochen

würde, okay, aus der taktischen

Jochen

Perspektive ist das irgendwie, also es führt halt

Jochen

sehr, das Buch sagt, es gibt halt Unterschied

Jochen

zwischen taktischer Softwareentwicklung und

Jochen

strategischer und taktisch macht das

Jochen

irgendwie Sinn, die Features rauszukriegen, ja, und man

Jochen

hat halt auch ein Problem, wenn man das nicht hinkriegt,

Jochen

weil dann wird einem ja möglicherweise auch der Hahn zugedreht

Jochen

irgendwann, wenn man auf Reflection nicht so lange

Jochen

dauert, aber man muss halt

Jochen

diese strategische Perspektive auch berücksichtigen, weil

Jochen

ansonsten hat man halt irgendwann später ein Problem.

Jochen

Und diese Dinger summieren

Jochen

sich halt auf und machen Sachen halt am Schluss

Jochen

sehr, sehr teuer, um unerwarteter

Jochen

Weise auch, ja.

Jochen

Und ich würde jetzt sagen, so Refractoring ist halt

Jochen

auch so ein Ding, was halt im Grunde dafür da ist,

Jochen

die Komplexität von

Jochen

so einem Software-System halt zu reduzieren.

Jochen

Das wäre so, würde ich denken, das wäre ein Ziel.

Jochen

Ja.

Jochen

Wenn die Frage, was ist Komplexität? Komplexität

Jochen

würde ich jetzt auch so mal definieren, wie es in dem

Jochen

Buch wurde, dass er pragmatisch definiert als

Jochen

alles, was dazu führt,

Jochen

dass ein System schwerer zu ändern ist

Jochen

beziehungsweise dazu führt, dass man es nicht

Jochen

so gut verstehen kann, ist Komplexität.

Jochen

Also entweder Abhängigkeiten

Dominik

oder zu hohe Abstraktionsniveaus

Dominik

oder zu verschachtelte Namen, falsche Namen.

Dominik

Also ich finde, das ist relativ nah an diesem

Dominik

Code-Review-Gedanken dran.

Dominik

Ja, also kann ich den Code gut lesen?

Dominik

Sind die Namen so, wie ich sie

Dominik

haben will? Ist die Dokumentation schön?

Dominik

Sind halt die

Dominik

Designs so implementiert, wie man

Dominik

es erwarten würde vielleicht? Oder

Dominik

ist das irgendwas ganz anderes? Oder

Dominik

macht das Sinn?

Dominik

Auch ein bisschen

Dominik

Style? Ist das auch eine Frage? Du hast irgendwie,

Dominik

Er sagt, du wolltest den Unterschied zwischen Design und Style

Dominik

an der Stelle vielleicht erklären, was Design

Dominik

gemeint ist.

Jochen

Design ist tatsächlich, damit ist tatsächlich

Jochen

das quasi, wie funktioniert

Jochen

das System gemeint? Nicht so sehr, wie sieht's

Jochen

aus oder wie sieht der Code aus?

Jochen

Das ist alles nicht so, sondern eher wie

Jochen

funktionieren die Teile

Dominik

miteinander? Also tatsächlich so Pattern?

Dominik

Nee,

Jochen

also wie ist, also du hast

Jochen

ja, also ich meine, nimm mal sowas wie Design

Jochen

Patterns, da sieht man vielleicht, was damit gemeint ist.

Jochen

Ja. Das ist halt so,

Jochen

Das ist halt die Art, wie dein System

Jochen

designt ist.

Dominik

Also da gibt es mittlerweile

Dominik

so ein paar logische

Dominik

Strukturen, an denen man

Dominik

sich orientieren kann für Lösungen von

Jochen

bestimmten Problemen. Genau, aber

Jochen

man kann natürlich auch selber was machen, außer wenn man

Jochen

irgendwas tut. Ich meine, es ist ja die Frage, ob man sich an diese

Jochen

Patterns hält oder nicht oder die benutzt.

Jochen

Aber man hat auf jeden Fall hinterher ein Design.

Dominik

Interessant wäre, dass wenn man selber was baut, wo man keine Ahnung hat

Dominik

und dann immer mehr Ahnung davon bekommt und das dann

Dominik

refactored, ohne mal, dass man jetzt die Pattern kennt, ob

Dominik

jetzt die Lösung, die man hat, selber Richtung dieser Pattern

Jochen

konvergiert. Ja, genau, Design-Pattern, das ist genau

Jochen

das, worauf es dann halt irgendwie immer hinausläuft, genau.

Jochen

Das ist eigentlich die Idee dabei, ja.

Jochen

Ich wollte noch gerade eine Sache

Ronny

einwerfen zu der Sache mit der fehlenden

Ronny

Rolle im Scrum.

Ronny

Das ist auch eine Sache, über die ich jetzt in letzter

Ronny

Zeit relativ viel nachgedacht

Ronny

habe, weil wir ja auch

Ronny

ganz viele Scrum-Teams haben und im Endeffekt

Ronny

es ist natürlich schon so, dass

Ronny

wenn du einen guten Entwickler hast, dass der natürlich schon irgendwie

Ronny

darauf achten sollte, dass der

Ronny

jetzt irgendwie gute Arbeit abliefert. Das ist ja schon irgendwie auch

Ronny

Teil des Jobs. Aber diese

Ronny

Sache, dass man halt so eine Ebene höher denkt,

Ronny

dass man überlegt, okay, wann

Ronny

ist denn jetzt der Zeitpunkt gekommen, dass ich jetzt nicht das

Ronny

18. Feature noch da reinbauen kann, sondern dass ich es halt mal irgendwie

Ronny

besser refactoren muss,

Ronny

umstrukturieren muss. Oder

Ronny

zu überlegen, wie setze ich denn jetzt

Ronny

die Sachen so um, dass es in einem Jahr auch noch

Ronny

funktioniert. Das sind ja Sachen, die stehen ja nicht

Ronny

in der User-Story drin, die stehen nicht mehr in den Epics drin.

Ronny

Der Product Owner hat davon keine Ahnung,

Ronny

weil er ja kein Techniker ist.

Ronny

Der Scrum Master ist

Ronny

vielleicht Techniker, aber vielleicht auch nicht.

Ronny

Das heißt, der kann es auch nicht beurteilen. Dann hast du ein Team, das ja meistens gemischt aus Seniors und Juniors ist. Bei den Juniors kann man es eigentlich nicht erwarten, dass jemand, der ganz frisch im Job ist, schon irgendwie drei Jahre im Voraus denkt.

Ronny

Und es gibt tatsächlich auch super viele Artikel dazu im Internet, die genau versuchen, diese Idee des IT-Architekten aus dem klassischen Wasserfall irgendwie in dieses, ich habe jetzt ein Gänsefüßchen gesagt, IT-Architekt, das irgendwie in dieses Scrum reinzubringen.

Ronny

Und da gibt es halt auch wirklich lange Artikel und so dazu, wo halt wirklich dafür auch gesagt wird, dass man das braucht, wie du es gerade auch gesagt hast. Und das ist auf jeden Fall ein Muss. Und dann gibt es Artikel, die sagen, nein, braucht man nicht, weil und so weiter. Und ich glaube, dass die Wahrheit liegt wie immer dazwischen. Und ich glaube, eine Sache, die im Scrum nicht vorgesehen ist, aber eine Lösung dafür könnte sein, halt jemand, der sich halt, sage ich mal so, als Lead-Entwickler im Team sieht. Das ist im Scrum ja explizit eigentlich nicht gewünscht, weil ja alle gleich sind. Ja, und alle haben gleich die Verantwortung. Aber ich glaube, so zumindest, soweit man das gedacht hat.

Ronny

Sonst sind die Teams ja auch immer nicht, ne?

Ronny

Genau, aber ich glaube, wenn du jemanden hast, der sich dafür verantwortlich fühlt und der das technische Know-how hat und wie gesagt, wichtig auch, dass er erstens weiß, dass er diese Rolle hat und zweitens auch, dass er das machen kann, dann glaube ich, kann das diese Brücke schon ganz gut überspannen, also diese Brücke spannen.

Ronny

Und wenn der PO dieser Person auch vertraut und wenn die Person sagt, nee, sorry, aber wir müssen das Technik-Ticket vorher machen, bevor wir das umsetzen, weil sonst wird sonst nichts, dann glaube ich, ist das so der Weg, den man da gut gehen kann.

Dominik

reden, wie immer. Aber du hast gerade vom klassischen Wasserfall-Software

Dominik

Architekten gesprochen, den musst du vielleicht nochmal kurz erklären, weil

Dominik

den kennt vielleicht auch nicht jeder.

Dominik

Also ich bin da jetzt auch kein Experte,

Ronny

ich bin auch mit agiler Entwicklung

Ronny

nicht aufgewachsen, aber schon die,

Ronny

wir haben nie wirklich nach klassisch Wasserfall

Ronny

gearbeitet.

Ronny

Die Idee dahinter ist eigentlich, dass ein

Ronny

T-Architekt, der

Ronny

im Agilen ist es ja, dass man iterativ

Ronny

und kleinteilig arbeitet und im Wasserfall

Ronny

ist die Idee, dass man am Anfang alle Informationen,

Ronny

die man hat, sammelt. 80% Planung

Ronny

und dann wird umgesetzt. Genau und also darum auch

Ronny

Wasserfall, du fängst halt quasi oben an und danach geht das

Ronny

diese Stufen einfach immer runter und am Schluss kommt halt

Ronny

in Gänsefüßchen eine fertige Software raus

Ronny

und da sind halt einfach ganz viele Probleme, weil

Ronny

wie gesagt, Software ist nie fertig

Ronny

und Wasserfall macht auch keinen Sinn und

Ronny

der IT-Architekt ist halt derjenige,

Ronny

der unter anderem halt

Ronny

dieses Lasten- oder Pflichtenheft

Ronny

schreibt initial, also sprich,

Dominik

der sich überlegt. Das ist der Entwickler dann aber auch,

Dominik

der quasi der Entwickler ist, ein

Dominik

IT-Architekt in dem Falle und

Dominik

baut. Nicht zwingend, nicht zwingend, also

Ronny

ich glaube, es ist tatsächlich auch eine eigene Rolle,

Ronny

gewesen oder ist es noch, also je größer die Firma, umso mehr Rollen hast du da separat, logischerweise. Aber ich glaube, die Idee ist wirklich, das ist jemand, der gar kein zwingender Entwickler sein muss, der aber trotzdem halt technisches Know-how hat und der versucht, alle Abhängigkeit und Eventualitäten, die dieses System betrifft, also alles, was man an Setup, Surroundings und so weiter hat, alles bedenkt und das alles niederschreibt.

Dominik

Ja, dann braucht der eigentlich relativ viel Ahnung vom

Dominik

eigentlichen Business und vom Kunden.

Ronny

Und halt auch technisch. Das ist das Wichtige.

Ronny

Dass man zum Beispiel sagt, weiß ich nicht, wenn ich

Ronny

jetzt irgendwas habe mit asynchronen

Ronny

Prozessen und Mailing, dass ich halt sicherstelle,

Ronny

dass irgendwo drüber nachgedacht ist, dass ich irgendeine

Ronny

Art von asynchronen Processing auch drin habe und

Ronny

nicht, dass das halt dann nachher irgendwann auffällt.

Ronny

Ups, blöd. Wie machen wir das denn jetzt?

Ronny

Blöd gesprochen.

Ronny

Blockiert leider den Prozess.

Ronny

Ja, also genau.

Jochen

Software-Architektur ist natürlich auch so ein verwandtes Thema.

Jochen

ja, genau.

Jochen

Aber ja,

Jochen

wer ist dafür zuständig, gibt es dann meistens, also

Jochen

es kann sein, dass sie dann halt nicht

Jochen

in den Teams immer mit drin sind, sondern übergreifen.

Jochen

Die gucken sich das dann halt mal an und

Jochen

machen dann irgendwie Vorschläge oder so. Aber ja,

Jochen

es ist unterschiedlich, wie das

Jochen

gehandhabt wird, aber genau. Also, dass

Jochen

da irgendwie sich jemand drum kümmern müsste,

Jochen

ist eigentlich schon, glaube ich,

Jochen

relativ offensichtlich.

Jochen

Ja, aber was, was, genau,

Jochen

was, was, ähm,

Jochen

was denkt ihr denn so, genau, was

Jochen

macht man denn, wenn man versucht, so ein Software-System

Jochen

einfacher zu machen?

Jochen

Was könnte man denn da tun?

Jochen

Muss man das refactoren?

Jochen

Ja gut, Refactoring ist

Jochen

jetzt sozusagen das, was man dann tut, aber

Jochen

wenn man, was wäre

Jochen

denn das Ziel von so einem Refactoring,

Jochen

wenn es darum geht, die Komplexität zu senken?

Jochen

Also ich würde

Dominik

tatsächlich mit diesem Schönheitsansatz

Dominik

ausreden.

Dominik

Ja, das ist ein bisschen abstrakt.

Dominik

Wahrscheinlich wisst ihr alle, was man damit meint,

Dominik

wenn ihr schon mal ein bisschen guckgeschrieben habt.

Dominik

Kennt ihr was, was agil ist, was stinkt irgendwie?

Dominik

Oder was, wo ihr denkt, oh, das ist aber hübsch.

Jochen

Was wir da am Anfang irgendwie dann so um die Ohren,

Jochen

ich habe das am Anfang nicht so richtig verstanden,

Jochen

ich werde vielleicht, geht es ja anderen Leuten auch so,

Jochen

immer wenn dann jemand draufgeguckt hat und meinte so,

Jochen

okay, vielleicht nicht so toll, dann hieß es immer so,

Jochen

ja, da muss man vielleicht mal so ein bisschen modularisieren oder so.

Jochen

Modularisierung, weiß nicht, ob euch das schon mal so,

Jochen

genau, da gibt es ein ganz berühmtes Paper von 1972, glaube ich, ist das,

Jochen

jetzt habe ich den Titel vergessen,

Jochen

naja, von David Parnas,

Jochen

genau, wo er zum ersten Mal

Jochen

diese Idee

Jochen

formuliert hat, dass, wenn du jetzt

Jochen

ein komplexes System hast,

Jochen

wo viele Abhängigkeiten sind oder so,

Jochen

dann ist es vielleicht eine gute Idee, das System so

Jochen

zu teilen, dass

Jochen

man nur noch einzelne Teile quasi

Jochen

verstehen muss und nicht alles auf einmal.

Jochen

Microservices. Und ja,

Jochen

wie man das dann macht, ist eigentlich relativ egal. Du kannst es mit

Jochen

Microservices machen, du kannst es aber auch

Jochen

mit Funktionen machen, mit Klassen,

Jochen

mit Modulen, Paketen, was auch

Jochen

immer. Völlig egal. Das ist letztlich

Jochen

nicht der wichtige Teil,

Jochen

sondern der wichtige Teil ist quasi

Jochen

kannst du

Jochen

dein System so aufteilen,

Jochen

dass

Jochen

sich die Komplexität deines Gesamtsystems

Jochen

reduziert auf die Komplexität

Jochen

des komplexesten

Jochen

Moduls sozusagen.

Jochen

Im Idealfall. Also weil zum Beispiel in Django

Dominik

gelingt es mir nicht immer, dass man so die Sachen

Dominik

voneinander trennt, weil viele Sachen sind von User's App abhängig

Dominik

oder sowas, das ist nicht so einfach,

Jochen

dass du irgendwie... Das ist nicht so einfach, das ist auch

Jochen

richtig, ja.

Jochen

Das ist genau das, ja, genau, ich wusste dann auch nicht so genau,

Jochen

was macht man denn dann da genau und so,

Jochen

das ist sehr schwierig, ja, ist es tatsächlich,

Jochen

ist auch sehr schwierig, finde ich immer noch

Jochen

schwierig, aber ja, also

Jochen

im Grunde ist das halt so die

Jochen

Idee, dass man das halt tatsächlich

Jochen

vielleicht irgendwie so hinbekommt

Jochen

und

Jochen

ja, das ist im Grunde auch,

Jochen

im Grunde jetzt rausfinden, wie sind diese Module

Jochen

und was soll damit was reden und wie sind die

Jochen

Interface ist, das ist eigentlich im Grunde das, was Software-Architektur

Jochen

macht, beziehungsweise was man halt auch

Jochen

macht, wenn man jetzt Design macht

Jochen

irgendwie. Also nochmal,

Dominik

Interface ist halt die Schnittstelle, quasi eine

Dominik

API, wo ein Modul mit dem anderen interagiert.

Dominik

Ja. Und dann muss man quasi

Dominik

definieren, welches Protokoll reden die miteinander und

Dominik

mit welchen Feldern und welchen

Dominik

Datentypen, welche wollen die denn haben.

Jochen

Und im Grunde ist,

Jochen

also das ist jetzt wieder,

Jochen

aus mir spricht dieses Buch,

Jochen

geht es da,

Jochen

ist der interessante Teil gar nicht da,

Jochen

wie man das jetzt technisch umsetzt oder so,

Jochen

sondern im Grunde ist

Jochen

die interessante Frage,

Jochen

naja,

Jochen

also man hat halt Abstraktionen.

Jochen

Also ein Modul ist ja auch so eine Abstraktion

Jochen

und eine Abstraktion hat immer

Jochen

das Ziel, dass

Jochen

man etwas,

Jochen

also quasi nur

Jochen

einen bestimmten Aspekt von etwas

Jochen

tatsächlich wissen muss und

Jochen

die ganze Komplexität dahinter ist halt versteckt.

Jochen

Und deswegen hat man diese Abstraktion

Jochen

und wenn die Abstraktion gut ist, dann

Jochen

muss man den Rest auch nicht wissen.

Jochen

Oder meistens nicht wissen. Wenn die Abstraktion

Jochen

schlecht ist, dann liegt die halt

Jochen

und dann muss man daran doch wissen und das ist dann schlecht.

Jochen

Aber wenn man eine gute Abstraktion

Jochen

gefunden hat, dann

Jochen

braucht man sich sozusagen mental

Jochen

nur mit dieser Abstraktion beschäftigen und gar nicht wissen,

Jochen

wie das im Detail alles funktioniert. Zum Beispiel Python.

Jochen

Ja, also eine Sprache,

Jochen

die so ein relativ hohes Abstraktionslevel hat,

Dominik

hat vielleicht auch schon über viele Probleme.

Dominik

Also das ist ja vielleicht auch der Grund, warum wir sowas benutzen

Dominik

und nicht mehr so alles in C schreiben oder so.

Jochen

Ja, natürlich. Also, obwohl C ist ja auch eine High-Level-Language schon, im Gegensatz zum Zabler.

Dominik

Ja, gut. Dass wir jetzt nicht mehr in Registern rumspringen wollen, wenn wir irgendwie ein Web-Service schreiben, ist ja schon mal gar nicht so schlecht vielleicht.

Dominik

Ja, C ist ja schon eine Hochsprache.

Ronny

Ich habe da tatsächlich ein ganz schönes Beispiel. Ich hatte letztens eine sehr undankbare Aufgabe.

Ronny

Es sollte in einem Projekt, sollte ich bei, also quasi eine Sache, die sich durch das gesamte System gezogen hat, das hat relativ viel mit Zeitberechnung zu tun, also wo irgendwelche Tage und irgendwelche Uhrzeiten Tage berechnet werden.

Ronny

Da sollte eine Sache, die vorher statisch war, also es gab halt im Endeffekt nur Tage, sollten diese Tage dann nach Regionen aufgeteilt werden.

Ronny

Also jetzt beispielsweise halt Feiertage, die halt jetzt nicht nur irgendwie, es gibt nicht fixe Feiertage, sondern es gibt halt die Feiertage je nachdem, wo halt jemand dann ist, also wie ein Zeitberechnungssystem.

Ronny

Und das hat halt wirklich querbeet eigentlich alle Bereiche des Systems betroffen, weil vorher war es halt einfach, du machst halt einen Abfall in die Datenbank, ist an diesem Tag ein Feiertag fertig.

Ronny

Danach musste aber gefragt werden, na gut, welche Leute betrachte ich denn gerade, ob jetzt Feiertage sind und wann haben die denn in dieser Region gewohnt und wann nicht mehr.

Ronny

Und auf einmal wurde das halt, war es halt super kompliziert, eine Sache, die vorher halt wirklich trivial war, wie die mit einem einzigen Select oder ORM, Abstraktion Select, halt super einfach abzufragen war.

Ronny

Und dann habe ich halt auch lange darüber nachgedacht, wie ich das überhaupt hinbekomme, weil, wie gesagt, ich habe nachher, glaube ich, an 300 Stellen im System irgendwas angepasst.

Ronny

Und die Lösung war tatsächlich dann ganz, ganz blöd Abstraktion.

Ronny

Also sprich, jetzt war halt ein Django-Projekt, ich habe dann einfach mir Custom Query Set und Manager-Methoden geschrieben, die das halt komplett wegkapseln, wo ich dann trotzdem einfach nur das Datum und vielleicht noch den Nutzer reingebe und darunter liegt dann halt irgendwie ein Riesenapparat mit irgendwas, da halt alles dann passiert, um das halt zu bestimmen, aber von oben verwendet es sich fast genauso wie die triviale Datenbankabfrage und damit habe ich es wirklich geschafft, also ich habe das quasi das ganze Ding umgebaut, ist ja auch irgendeine Art von Refactoring eigentlich,

Ronny

nur, dass es halt in dem Moment das Ticket war.

Ronny

Und ich habe wirklich nur drei oder

Ronny

vier kleine Bugs gehabt, weil halt

Ronny

wie gesagt, die ganze Komplexität an einer einzigen

Ronny

Stelle war und ich halt danach nur noch schauen musste,

Ronny

dass ich halt die Methoden austausche.

Ronny

Und das war, es hat

Ronny

mich selbst total überrascht, wie gut das funktioniert hat.

Ronny

Also das hätte ich mir selbst nicht zugetraut,

Ronny

dass die Idee dann doch so gut trägt.

Ronny

Ja.

Ronny

Ja.

Dominik

Wenn man so eine High-Level-App hier hat, die man

Dominik

gut bedienen kann, dann ist das schon echt was wert.

Jochen

Ja, also genau, und was sind

Jochen

gute Abstraktionen? Also

Jochen

nach dem Buch ist es halt so,

Jochen

ja, wenn Module tief sind,

Jochen

ist das gut und wenn die

Jochen

API halt klein ist, ist das auch gut.

Jochen

Also je kleiner die API und tiefer,

Jochen

je kleiner und tiefer, desto besser. Genau, du kannst mit einfachen

Jochen

Worten viel erreichen.

Jochen

Ja, also als sozusagen Beispiel

Jochen

für, das ist

Jochen

irgendwie eine schöne API, ist halt

Jochen

die File

Jochen

API von Unix benutzt, das ist halt auch tatsächlich

Jochen

eine sehr schöne, also das ist ja im Grunde

Jochen

Unix ist nichts,

Jochen

wir hatten das letztes Mal, in der letzten Episode,

Jochen

was wenn alles ein Dict wäre, Unix ist halt

Jochen

so, was wenn alles ein Pfeil wäre.

Jochen

Das ist irgendwie die Antwort darauf.

Jochen

Dann fällt halt Unix dabei raus.

Jochen

Und die Pfeil-API ist

Jochen

halt tatsächlich, die ist halt sehr, also man kann

Jochen

nicht, es gibt nicht viele Obterationen, die man machen kann.

Dominik

Also was heißt denn Open, Seek

Dominik

und Close?

Jochen

Es gibt Open, Seek

Jochen

und das war es eigentlich schon fast, ja.

Jochen

Also Close, weiß ich gar nicht, ob das ein eigener, ja doch.

Jochen

wahrscheinlich. Ja, aber stimmt.

Jochen

Genau. Und

Jochen

ja, es gibt noch I.O. Control,

Dominik

aber... Also wahrscheinlich Read&Write oder so, aber ja.

Dominik

Was ist I.O. Control? Ja, ja, man kann

Jochen

jetzt noch Spezialoperationen machen, da wird's dann auch

Jochen

allmählich hässlich. Aber

Jochen

tatsächlich eigentlich so mit Pfeil

Jochen

aufmachen, irgendwie drin rumzieken,

Jochen

lesen, schreiben,

Jochen

kommt man halt schon sehr, sehr weit.

Jochen

Und ja,

Jochen

das ist halt eine schöne Abstraktion, während

Jochen

zum Beispiel die

Jochen

Abstraktionen, das ist dann so ein Negativbeispiel

Jochen

gewesen, halt so, wenn man jetzt

Jochen

in Java irgendwie

Jochen

Dinge lesen will aus einem File, dann macht man

Jochen

erstmal irgendwie so einen Input-Reader

Jochen

auf und dann macht man so einen Buffered-Input-Reader auf,

Jochen

wenn man das vergisst, hat man ein Problem, das ist alles ganz langsam,

Jochen

man weiß nicht so genau warum und dann muss man die

Jochen

Dinger konfigurieren und die Exposen halt ganz

Jochen

viele Sachen, die man halt setzen muss und der

Jochen

Default-File ist halt, den man halt eigentlich

Jochen

immer hat, der ist halt nicht der,

Jochen

also wenn man es einfach nur so aufmacht, ein File, dann

Jochen

hat man halt keine

Jochen

gebufferte I.O. und das ist halt alles

Jochen

ganz schrecklich. Und man muss

Jochen

halt sehr, sehr viel Detailwissen in der

Jochen

API schon, also man konfiguriert

Jochen

da schon sehr viel rum und also

Jochen

man hat halt, die API hat eine große Oberfläche und

Jochen

es ist schwer zu benutzen

Jochen

und eigentlich, was sie macht, ist relativ

Jochen

trivial. Also es ist super flach.

Dominik

Also sowas wie in Python, with open

Dominik

filename is file, file.read.

Dominik

Genau, oder ja,

Jochen

for line and file oder sowas.

Jochen

Das ist halt irgendwie, und das macht halt

Jochen

auch bei der Default alles richtig.

Jochen

Wenn du das in Python machst, dann ist das halt direkt

Jochen

schnell und macht alles schon so, wie man

Jochen

das eigentlich normalerweise haben will. Für die Fälle,

Jochen

in denen man das nicht so haben will, kann man das ja immer noch

Jochen

konfigurieren, dass es sich

Jochen

anders verhält. Aber genau.

Jochen

Und das ist halt gutes versus schlechtes

Jochen

API-Design quasi.

Jochen

Und ja.

Jochen

Aber die richtige

Jochen

API für ein Problem, das man hat, oder

Jochen

überhaupt die richtige Abstraktion zu finden, ist natürlich

Jochen

nicht so einfach. Das ist halt richtig schwierig.

Dominik

Vielleicht auch einer der Gründe für PHP, warum das

Dominik

immer so schlecht angesehen wird an so zwei Stellen

Dominik

sich lange brauchte, bis es ein bisschen besser wurde.

Dominik

Also wie gesagt, ich habe immer noch keine Ahnung davon. Aber ist das

Dominik

einer der Erfinder, der irgendwie gesagt hat am Anfang so, ja, eigentlich

Dominik

kenne ich mich mit Programmiersprachen eigentlich gar nicht aus

Dominik

und ich wollte eigentlich auch nie Sprache machen. Aber hey,

Dominik

jetzt bin ich hier irgendwie und wir müssen jetzt irgendwie das

Dominik

wieder retten.

Jochen

Ja, aber ich meine, es ist schon

Jochen

einen langen Weg gekommen sozusagen, also

Jochen

mittlerweile ist der PRP.

Jochen

Aber ja, vielleicht einer

Dominik

der Gründe dafür, dass man sich über sowas noch keine Gedanken gemacht hat.

Dominik

Während Guido ja, glaube ich, von Anfang

Dominik

an, glaube ich, sehr auf diesem Level war, dass er schon

Dominik

so ein bisschen wusste, warum er

Dominik

Sachen wie machen wollte.

Dominik

Ja, ja, der hat

Jochen

viel Absicht mit dabei, ja.

Jochen

Ja,

Jochen

ja, keine Ahnung. Also ist da auch die Frage,

Dominik

ist da so eine neue Sprache, ein Refactoring

Dominik

von neuen Gedanken, die man

Dominik

auf dem Computer hat?

Dominik

Ja.

Jochen

Naja, ja, aber ich meine, es ist halt,

Jochen

es ist wirklich schwer zu sagen, also man kann

Jochen

das nicht unbedingt vorher,

Jochen

also ich glaube nicht, dass das, eben auch

Jochen

im Sprachdesign ist ja, also das wäre jetzt sozusagen,

Jochen

wie ist eine Sprache designt?

Jochen

da die richtigen Abstraktionen zu finden, auch

Jochen

super schwierig. Und da würden

Jochen

Leute dann auch direkt am Anfang schon

Jochen

unterschiedliche Ansichten vertreten und würden halt

Jochen

sagen so, okay, also es gibt dann

Jochen

halt ein Lager irgendwie, das

Jochen

sagen würde, so, ach, dieses

Jochen

dynamisch getypte, das ist alles

Jochen

nicht gut. Irgendwie statisch getypt,

Jochen

bestes getypt, voll gut.

Jochen

Muss alles statisch,

Jochen

ja, und an der Stelle

Jochen

wird man sich ja schon, und das ist bis heute nicht raus,

Jochen

was jetzt nun besser ist.

Dominik

Ja, aber typisieren ist auf jeden Fall anstrengender,

Dominik

wenn man halt einfach mal so was

Dominik

schnellstens hinhotzen muss. Ich habe heute eine kurze

Dominik

Übung in Rust geschrieben,

Dominik

du musst halt jedes Mal an jeden

Dominik

kleinen Witzel dran schreiben, was das eigentlich sein soll

Dominik

oder sollte und dann beschwert er sich

Dominik

der Compiler immer, wenn es halt nicht stimmt, was

Dominik

ja auch gar nicht eigentlich schlecht ist, weil in der Benutzung will man ja, dass es

Dominik

eigentlich stimmt, weil man weiß,

Dominik

es ist halt dann egal, aber es funktioniert irgendwie trotzdem und das ist

Dominik

ein bisschen...

Jochen

Ja, aber das ist genau so ein Punkt.

Jochen

Genau, also wenn du

Jochen

du kannst ja jetzt auch zum Beispiel

Jochen

in Python Type Annotations

Jochen

machen.

Jochen

Ich habe jetzt

Jochen

erst so vor kurzem damit angefangen, mich so ein bisschen

Jochen

zu beschäftigen, weil vorher dachte ich mir so,

Jochen

Type Annotation schreiben,

Jochen

keine Lust.

Jochen

Und ach, mich interessiert das alles nicht.

Jochen

Ich bin ja nicht deswegen zu Python

Jochen

gegangen, damit ich irgendwie überall

Jochen

Typen

Jochen

dran schreiben muss.

Jochen

Aber mit FastAPI,

Jochen

Obwohl, das wir übrigens auch noch eine Folge machen wollen.

Dominik

Das ist cool benutzt zu haben. Aber dann macht das sogar

Dominik

dann Dinge, wenn du die Typen verwendest und so.

Dominik

Ja, ja, ja.

Jochen

Aber gut, da passieren auch Sachen dynamisch.

Jochen

Genau, ja.

Jochen

Das ist halt auch nochmal so ein, das geht ja schon fast

Jochen

darüber, die reinen Typ-Annotationen hinaus.

Jochen

Typ-Magie. Ja, also je nachdem,

Jochen

was für Typen man dann da hat,

Jochen

passieren halt unterschiedliche Sachen,

Jochen

aber dann auch zur Laufzeit.

Jochen

Das ist nicht nur für einen statischen

Jochen

Typ-Checker.

Jochen

Ja, aber natürlich, genau.

Jochen

das ist halt so ein Problem beim Sprachdesign.

Jochen

Will man jetzt Typisierung haben oder nicht?

Jochen

Weil natürlich fängt es halt

Jochen

Bugs. Ich habe das jetzt auch gemerkt, ich mache das seit einiger

Jochen

Zeit, mache ich auch Fast API und

Jochen

habe jetzt auch, dachte mir, oh gut, wenn

Jochen

ich das schon mache, dann schreibe ich die Annotation halt auch mit

Jochen

dazu. Und tatsächlich sind mir schon ein paar Mal

Jochen

Sachen aufgefallen, wo ich

Jochen

dann gemerkt habe, so, oh,

Jochen

da hat mir jetzt,

Jochen

ich lasse dann auch MyPi drüber laufen,

Jochen

wo mir dann MyPi auf die Finger haut

Jochen

oder halt eben Pylense oder was auch immer.

Jochen

So, da ist irgendwas nicht richtig.

Jochen

Und ich denke so, okay, also meistens ist es tatsächlich nur, ich habe es nicht richtig hingeschrieben, ich habe das irgendwie nicht richtig bedient. Und deswegen, und man muss es ein bisschen anders hinschreiben und dann stimmt es, aber das, was ich vorhatte, war schon richtig. Und dann ab und zu kommt dann doch so ein Ding, wo ich dann drüber nachdenke und dann so, oh Mist, tatsächlich, an der Stelle kann irgendwas nannen werden oder so. Das ist meistens sowas. Und wenn man ein bisschen drüber nachdenkt, dann wird einem klar, dass das auch tatsächlich so sein kann.

Jochen

Aber mir war das vorher gar nicht klar.

Jochen

Den Fall habe ich, ich dachte, das kann überhaupt nicht passieren.

Jochen

Ach doch, kann doch passieren.

Jochen

Und dann habe ich tatsächlich im Grunde einen Fall übersehen

Jochen

und da wäre ein Bug gewesen eigentlich.

Jochen

Ja, sowas hat er, ich glaube auch.

Jochen

Also die meisten Bugs, die ich irgendwann entdecke,

Dominik

sind wirklich viele Type-Bugs irgendwann.

Jochen

Ja, also viele sind es nicht gewesen, ein paar waren es.

Dominik

Also ich habe zum Beispiel, ihr kennt ja Antwerpen auf Code.

Dominik

Also Antwerpen auf Code ist so ein tolles Spiel,

Dominik

was man in der Adventszeit spielen kann,

Dominik

wo man halt so Coding-Rätsel macht, ganz süß immer gemacht.

Dominik

Diesmal ist es ein U-Boot.

Dominik

Und auch da, also ganz einfache Aufgabe, erste Aufgabe, iterieren über so ein Array vergleichen. Es gibt einen unheimlich großen Unterschied, ob man halt den Typ, das ist eigentlich nur eine Liste, also in einer Datei, von Zahlen, ob man da ein Int drauf castet oder halt nicht, weil halt der Vergleich, den man machen muss zwischen Zahlen, halt ein anderes Ergebnis hat, aber nur an zwei Punkten.

Dominik

Das heißt, man kommt am Ende irgendwie auf 1.300 Treffer

Dominik

und dann kommt man auf 1.301 Treffer,

Dominik

wenn man halt den Typ ändert oder sowas.

Dominik

Und das ist halt nur eine Sache richtig.

Dominik

Und das halt zu finden, dass man halt überhaupt so einen Bug hat,

Dominik

wenn halt das meistens stimmt.

Dominik

Ja, also in 1.299 Fällen ist das richtige Ergebnis da.

Dominik

Das geht halt nur wirklich, wenn man tatsächlich weiß,

Dominik

warum und welche Typen man da hat.

Dominik

Und wenn man das irgendwie sicherstellen kann.

Dominik

Und das geht halt mit Type-Ins ganz gut,

Dominik

weil du weißt halt, oh, da muss halt ein Int rein oder so.

Dominik

Und wenn man das vergisst, dann funktioniert das halt nicht.

Dominik

Und das ist mir auch erst klar geworden,

Dominik

als ich jetzt zum Beispiel die Lösung auch in Rust oder in Go

Dominik

geschrieben habe, weil dann

Dominik

klar ist, welchen Typ er hat und weil es halt

Dominik

immer das falsche anzeigt, wenn man halt den Typen nicht

Dominik

konvertiert.

Ronny

Ist aber auch, glaube ich, eine super Sache, wenn man

Ronny

so interne

Ronny

APs hat, also entweder, wenn man irgendwie

Ronny

so zentrale Funktionalität hat,

Ronny

die irgendwo liegt oder Sachen, die halt von vielen verschiedenen

Ronny

Seiten irgendwie verwendet wird oder

Ronny

von vielen verschiedenen Entwicklern,

Ronny

gehe ich inzwischen auch immer hin und versuche die

Ronny

so weit wie möglich zu typisieren in

Ronny

Python. Einfach, dass dann

Ronny

Und dass der nächste Entwickler, auch wenn ich das bin, einfach weiß, okay, da kommt jetzt, weiß ich nicht, vielleicht ein Nun raus oder eine Liste oder ist das ein Dictionary?

Ronny

Weil das sind halt wirklich so Sachen, meistens findet man es, bevor es wirklich auf Production geht.

Ronny

Aber selbst dann sucht man nochmal irgendwie fünf oder zehn Minuten, wenn man nochmal denkt, hey, ich hab doch und warum, was soll das denn?

Ronny

Und wenn einem dann die IDE dann direkt anzeigt, nee, nee, du machst die Äpfel mit Birnen, das ist einfach super praktisch.

Ronny

Und umso tiefer das bei mir drin ist, umso mehr versuche ich auch dann wirklich die Type-Ins zu machen.

Dominik

Ja, mit dem Nun ist halt echt ein Problem, ne?

Jochen

Aber, ja, da fällt mir auch gerade so eine Anekdote zu ein, da gibt es noch ein Buch, JavaScript, The Good Parts, glaube ich, auch ein relativ bekanntes Buch.

Jochen

Das muss halt dünn sein.

Jochen

Das ist tatsächlich relativ dünn.

Jochen

Da gibt es doch diesen Witz mit dem dicken Buch, der JavaScript.

Jochen

Genau, die Reference, das ist irgendwie zu tausend Seiten und dann irgendwie Good Parts ist halt irgendwie so ein Heftchen, ja, das stimmt.

Jochen

Und der Autor davon, ich glaube, das ist David Crockford oder ich weiß nicht genau, der ist auch in diesen Standardisierungsgremien drin und so und der schrieb dann halt auch irgendwo, weiß gar nicht, meinte so, naja, also irgendwie diese, ist eigentlich kein Wert oder ist irgendwie nix, Dinger sind ein Problem bei Sprachen, ja, also Python halt none, da gibt es halt ein Ding und es ist halt immer wieder in diesen, wenn man sich über so Standardisierungsfragen, ist immer die Frage, ist das eine gute Idee, sowas in der Sprache zu haben oder nicht?

Jochen

zum Beispiel SQL, ja, ist ja auch, Null

Jochen

ist für einen Großteil der

Jochen

wirklich hässlichen Sachen im

Jochen

Sprachstandard und auch für viele Bugs in

Jochen

Datenbankimplementationen, die dann halt

Jochen

auch irgendwie, und für viele Inkompatibilitäten

Jochen

in den Standards und so, also Null

Jochen

spielt da eine große Rolle, ja, wenn man jetzt sagt, so ein harmloses

Jochen

Ding wie Null, das kann ja nicht so viel kaputt machen,

Jochen

das Ding macht irgendwie dauernd und seit

Jochen

Jahrzehnten und konsistent irgendwie ganz viel Probleme

Jochen

und, ja, er meinte

Jochen

da so, ja, also es ist immer so, unter Leuten,

Jochen

die sich mit Sprachdesign beschäftigen,

Jochen

in Frage, will man sowas in der Sprache haben oder nicht?

Jochen

Und dann gibt es immer so einen einen Teil der Leute,

Jochen

die sagen, ja, doch, ist eigentlich schon gut, wenn man das hat.

Jochen

Ein anderer Teil sagt, nee. Aber absolut

Jochen

niemand, absolut niemand vertritt die Ansicht,

Jochen

es ist voll gut, zwei davon

Jochen

in einer Sprache zu haben. Und da was gibt, hat halt zwei.

Jochen

Das hat halt immer null und undefined.

Jochen

Und das ist halt wirklich, ah.

Jochen

Ja.

Jochen

Das ist halt irgendwie so.

Jochen

Ja.

Jochen

Und das macht Dinge wirklich komplizierter.

Jochen

Aber das Problem ist jetzt auch,

Jochen

die Type-Annotationen

Jochen

selber machen Sachen natürlich auch komplizierter.

Dominik

Ja, zum Beispiel zirkuläre Importe oder so was,

Dominik

das ist ja ein bisschen nervig.

Jochen

Nee, die Annotationen, also, achso, gut,

Jochen

okay, klar, da kannst du auf das Problem natürlich auch stoßen,

Jochen

ja klar, oder

Jochen

leichter, aber ich meine, wenn das

Jochen

jetzt eben, also entweder man macht

Jochen

halt, wenn man jetzt die Typen annotiert

Jochen

und man macht es jetzt so

Jochen

quasi einfach,

Jochen

man muss halt dann auch seinen Stil ändern,

Jochen

wenn die Typannotationen

Jochen

einfach bleiben sollen, dann muss man halt irgendwie

Jochen

das auf so relativ primitive

Jochen

Datentypen runterbrechen und kann dann

Jochen

eigentlich auch nur noch so relativ primitive

Jochen

Datentypen verwenden.

Dominik

Ja, man will ja eigentlich schon komplexere Daten,

Dominik

also so ein Pathentic-Objekt oder sowas

Jochen

hinten. Ja, gut, okay, also Pathentic ist nochmal,

Jochen

aber das Problem dabei ist halt,

Jochen

also wenn man das macht, dann hat man

Jochen

halt im Grunde, kommt man dann irgendwie so

Jochen

und wenn das Typsystem relativ einfach ist,

Jochen

was man so verwendet, dann kommt man halt

Jochen

bei einem Dialekt von Java raus, der halt super langsam

Jochen

ist. Was halt, und es sieht

Jochen

überhaupt nicht mehr aus wie Python eigentlich.

Jochen

Das ist halt irgendwie doof,

Jochen

aber wenn man jetzt Python

Jochen

idiomatisch schreibt, so Pythonisch

Jochen

irgendwie, dann

Jochen

wird das mit den Typ-Annotationen

Jochen

ziemlich schwierig. Also weil zum Beispiel

Jochen

so eine, da gab es letztens auch eine

Jochen

Podcast-Episode mit

Jochen

Luciano Ramaglio,

Jochen

der hat für Python geschrieben, das Buch,

Jochen

kann ich nur empfehlen. Es gibt jetzt, im Frühjahr kommt

Jochen

eine zweite

Jochen

Ausgabe, zweite Edition,

Jochen

Second Edition,

Jochen

wo er auch viel über Type-Annotationen und so schreibt.

Jochen

Und der hat sich das auch dann halt mal so richtig angeguckt und so und hat dann die Typ-Annotationen für die Max-Funktionen sich angeguckt.

Jochen

Und das Problem bei Typ-Annotationen ist jetzt auch, die können ja auch falsch sein.

Jochen

Die können ja richtig sein, falsch sein.

Jochen

Die können uns dann False-Positives geben.

Jochen

Es kann sein, dass etwas dem Typ zwar entspricht, aber tatsächlich ist es inkompatibel und innen knallt es irgendwo.

Jochen

Das sollte natürlich nicht passieren.

Jochen

Typ-Annotationen sollten so sein, dass es keine

Jochen

False-Positives und keine False-Negatives gibt, also auch keine

Jochen

das ist halt das, was mir immer

Jochen

passiert, wenn ich versuche, das hinzuschreiben, ich habe halt

Jochen

ganz oft False-Negatives, das heißt, mir sagt

Jochen

irgendwie MyPi oder so, da hast du

Jochen

was falsch gemacht und ich sage so, ne, das ist eigentlich nicht

Jochen

das ist eigentlich schon richtig, aber ich habe es irgendwie falsch

Jochen

hingeschrieben und bei

Jochen

einer Funktion wie Max ist das halt extrem

Jochen

schwierig und hat er halt in den

Jochen

Type-Annotationen dafür halt Fehler gefunden

Jochen

eben False-Positives, False-Negatives

Jochen

und hat dann versucht, das richtig zu machen, also es gibt irgendwo

Jochen

Type-Chat oder so

Jochen

da steht die Annotation für Max

Jochen

drin und das wurde dann

Jochen

richtig, richtig gemein, weil Max ist halt auch

Jochen

so eine komische, also es gibt so diverse Funktionen, so Max

Jochen

Len und so, die halt schön sind

Jochen

irgendwie, weil du kannst halt, es ist eine sehr

Jochen

generische Funktion, du kannst da alles reinwerfen und es macht

Jochen

eigentlich immer das Richtige,

Jochen

aber das jetzt zu annotieren ist halt

Jochen

die Hölle, also er hat dann irgendwie

Jochen

so, naja, also die

Jochen

eigentliche Implementation von Max sind halt

Jochen

irgendwie so 25 Zeilen oder so

Jochen

und allein die

Jochen

Typ-Annotationen waren hinterher, du musst halt

Jochen

sechs Overloads

Jochen

dafür irgendwie definieren, der Funktion

Jochen

und es waren viel, viel mehr

Jochen

Zeilen in den Typ-Definitionen als hinterher in der

Jochen

Annotation. Und dann ist natürlich die Frage, und es war

Jochen

sehr schwer zu verstehen und

Jochen

also irgendwie diverse

Jochen

subtile Fehler drin. Also dann ist

Jochen

halt die Frage, okay, wenn das so schwierig ist,

Jochen

die Typen hinzuschreiben, ja,

Jochen

macht das dann, ist dieses Verhältnis

Jochen

zwischen, und es

Jochen

ist halt komplett, es ist auch sehr schwer zu lesen, ja.

Jochen

Also es ist halt die Frage, ja, ist das dann wert noch?

Jochen

Und ja, das ist halt so die Frage.

Jochen

Und das gibt es genauso, weil das war auch aus dem Podcast.

Jochen

Da meinte er so, es gibt so ein Buch zu Java.

Jochen

Ich habe vergessen, welches das ist.

Jochen

Auf jeden Fall ist auch einer, der in der Sprache mitgearbeitet hat oder so,

Jochen

der schrieb dann halt zu, als die Generics eingeführt wurden,

Jochen

selber sagt er

Jochen

dazu, also die Generics waren ein Desaster

Jochen

in Java und

Jochen

es gibt diverse Geschichte, Konstrukte,

Jochen

die sie da gemacht haben, wo es

Jochen

dann, wo sie dann gesagt haben, so wir haben

Jochen

das jetzt irgendwelchen Professoren, die sich mit Typtheorie

Jochen

beschäftigen, gezeigt

Jochen

und die sagen, das stimmt,

Jochen

aber wir können das nicht

Jochen

bestätigen oder

Jochen

weil wir verstehen nicht,

Jochen

was das macht.

Jochen

Und das ist dann halt einfach so, ja gut, wozu macht man es

Jochen

dann jetzt, wenn man es nicht mal verstehen kann?

Jochen

Und also was man da sieht, ist halt, das Problem ist, dass die Sprache ist halt, also bei Python ist es halt auch so, die Sprache ist halt expressiver als die Sprache, die man verwendet, um die Typ-Annotationen zu machen. Und das hat ja schon in diversen Sprachen zu Katastrophen geführt. Also bei C++ mit den Templates, ja, ganz furchtbar, das ist ein Turing vollständig. Irgendwie, wenn man davon genug verwendet, versteht man auch nicht mehr, was da los ist. Der Compiler braucht ewig lange viel Hauptspeicher und schrecklich. Java, Generics, ganz furchtbar.

Dominik

Wie macht man das so, zum Beispiel mit einem JSON-Objekt?

Dominik

Wie würde ich das type-contentieren?

Dominik

Das ist so ein bisschen...

Dominik

Genau, das kann man.

Dominik

Das kann man tatsächlich.

Jochen

Also ich beschäftige mich ja gerade auch so ein bisschen mit TypeScript.

Jochen

Und da gibt es, also da kannst du,

Jochen

du kannst tatsächlich solche Sachen machen wie...

Jochen

Rekursiv definieren.

Jochen

Du kannst rekursive Typ-Definitionen machen, wenn es geht.

Jochen

Das geht in Python, glaube ich, bisher nicht.

Jochen

Ja, das kann gut sein, dass das in Python nicht geht.

Jochen

Also die Type-Definition für einen JSON,

Jochen

wo dann hinterher der TypeScript, der TypeScript-Compiler,

Jochen

auf die Finger haut, wenn du da auch

Jochen

bliebig rekursiv irgendwo etwas reinschreibst,

Jochen

was jetzt nicht mehr welches JSON wäre,

Jochen

wo du eine rote Klingel kriegst,

Jochen

das sind so 25 Zeilen rekursiv

Jochen

Type-O-Notationen in TypeScript. Das geht.

Jochen

Und das ist natürlich schon sehr cool, dass das geht.

Jochen

Auf der anderen Seite,

Jochen

ich beschäftige mich

Jochen

jetzt seit einer Zeit damit, also ich kann

Jochen

diese 25 Zeilen sehen.

Jochen

Ehrlich gesagt, ich verstehe sie nicht so ganz.

Jochen

Das ist halt auch wirklich, wirklich schwierig.

Jochen

Ja, da können ja rekursiv

Jochen

irgendwelche Dinge drin, irgendwelche Listen drin liegen,

Dominik

irgendwelche Dicks drin liegen, irgendwelche Listen drin liegen, wo vielleicht noch ein

Dominik

Zwingl ist und irgendwie Null oder irgendwas.

Dominik

Ja, es ist halt wieder eine Sprache

Jochen

für sich, also allein schon, dass du

Jochen

in Types, dass du halt sagst,

Jochen

okay, es gibt ja eben

Jochen

diese Generics, sag ich mal,

Jochen

du kannst halt nicht nur,

Jochen

du definierst die Typen nicht fix, sondern du sagst

Jochen

halt, also du kannst

Jochen

jetzt in der Funktion

Jochen

sagen, welchen Typ

Jochen

du zurück erwartest und den dann

Jochen

als Typ-Annotation verwenden.

Jochen

Du kannst also sozusagen Typen parametrisieren,

Jochen

die du irgendwo setzt. Du kannst eine generische

Jochen

Funktion haben und dann sagen,

Jochen

während du sie aufrufst, im Aufruf

Jochen

kannst du dir sagen, und die gibt jetzt das und das

Jochen

zurück. Und dann kann der Compiler

Jochen

das überprüfen, dass das stimmt. Und das kannst du dann

Jochen

auch noch rekursiv machen. Und das kannst du dann mit

Jochen

beliebig verschachtelten Sachen machen.

Dominik

Sollte man das vielleicht ein bisschen refactoren?

Dominik

Naja,

Dominik

also es wird halt

Jochen

Ich meine, es ist schon cool. Auf der einen Seite finde ich es

Jochen

voll cool, dass es geht. Auf der anderen Seite denke ich mir so,

Jochen

mein Gott, was haben wir getan? Wir müssen ja mal ein Monster

Jochen

erschaffen. Aber ja,

Jochen

es ist...

Dominik

Also ist das eine Mode? Also ich habe auch

Dominik

das relativ oft benutzt. Ich benutze das auch gerne

Dominik

und ich versuche auch, das relativ vollständig so

Dominik

zu benutzen. Aber halt,

Dominik

ja, es hat halt irgendwie seine Grenzen auch.

Dominik

Also manchmal nutze ich das einfach nicht, weil es einfach keinen

Dominik

Sinn macht. Also für so ein Int oder String,

Dominik

okay, aber dann so komplexe Objekte...

Jochen

Ja, aber bei komplexeren Sachen wird es halt dann sofort ziemlich schwierig.

Jochen

Ja. Also eine

Jochen

Geschichte, die wohl cool ist, ist halt

Jochen

Protocols. Damit kann man halt

Jochen

also Typing.Protocols

Jochen

mit Python 3.8 glaube ich dazu gekommen, damit kann man

Jochen

dann viele der Probleme, die man sonst hat

Jochen

irgendwie gehen dann weg, weil man dann

Jochen

sagen kann, okay, ich erwarte hier nur ein Ding, dass

Jochen

also Protocols sind immer so kleine Sachen, wo du eine

Jochen

Methode hast oder vielleicht zwei oder so

Jochen

und dann musst du halt nur diese Methoden implementieren.

Jochen

Du kannst halt überprüfen, ob das so ist,

Jochen

ob das konform ist

Jochen

und dann fällt ein Großteil

Jochen

der Schmerzen weg, aber

Jochen

also wirklich, ja,

Dominik

Also wenn das zu komplex wird,

Dominik

vielleicht muss man dann refactoren, dass man einfachere Dinge

Dominik

macht, wie zum Beispiel nach Strings zu realisieren oder sowas.

Jochen

Nee, nee, nee, aber das Problem ist ja, also das willst du

Jochen

ja eigentlich vielleicht nicht. Du willst ja vielleicht sowas, so generische

Jochen

Funktionen haben wie Max oder so.

Jochen

Aber die kannst du praktisch nicht mehr gut annotieren, also außer

Jochen

du machst halt, es ist halt schwer, die zu annotieren.

Jochen

Das gute ist, wir müssen es ja

Ronny

nicht im Python, von daher vielleicht.

Jochen

Ja, genau. Und vielleicht ist es für die Fälle,

Jochen

einfach dann nicht typisieren,

Jochen

sondern sagen, okay, wir machen es an den Stellen, wo es halt was

Jochen

bringt und nicht so viel Arbeit ist. Und an den Stellen, wo

Jochen

es halt nicht gut geht, dann lassen wir es halt weg und dann schreiben wir halt

Jochen

eine generische Funktion. Magic Python.

Jochen

Genau.

Jochen

Das ist vielleicht irgendwie so der richtige

Dominik

Weg. Das haben wir kommen hinterher zu Tyson.

Dominik

Ja.

Dominik

Eine Sache,

Dominik

die mir noch aufgefallen ist, jetzt

Dominik

in

Ronny

den letzten Monaten beim Arbeiten

Ronny

bezüglich Refactoring, ist,

Ronny

es geht auch so ein bisschen Richtung Modularisierung,

Ronny

aber mehr Richtung

Ronny

die Semantik, denn wirklich die Sachen physisch

Ronny

irgendwie zu trennen. Und das ist,

Ronny

Wenn man relativ viel, also in meinem Beispiel relativ viel Business-Logik hat, also wenn man meistens fängt, also wenn man agil arbeitet, fängt so ein System mit MVP an, also sprich man hat, weiß ich nicht, irgendeinen Online-Shop, da kann irgendwer was kaufen, dann kriegt er vielleicht eine E-Mail, da gibt es irgendwie eine Bestellung und das war es im Endeffekt.

Ronny

Und dann kommt vielleicht noch ein anderer Fall dazu, noch ein Fall und noch ein Fall und irgendwann wird ein neuer Geschäftsbereich dazu gebaut und irgendwann hat man halt dann da ein riesiges Konstrukt von irgendwie E-Mails, die hin und zurück geschickt werden und irgendwelche Order-Objekte in der Datenbank, die riesig werden, wo hunderttausend Felder drin sind.

Ronny

Und das eigentliche Problem ist, dass dann an einem gewissen Punkt, das habe ich jetzt schon mehrfach gesehen, weder der Kunde noch die Entwickler eigentlich noch genau wissen, was eigentlich der Geschäftsprozess ist.

Ronny

Das System macht zwar ungefähr das, aber dann kommt plötzlich irgendwann mal ein Fehler, dann schickt man sich eine E-Mail und hat irgendetwas Falsches geschickt und dann stehen die Leute dann da und sagen, ja, was passiert da eigentlich genau?

Ronny

Und das finde ich einen total interessanten Refactoring-Ansatz, weil das halt nicht so, also keine Ahnung, wenn ich jetzt irgendwie merke, okay, das ist irgendwie ein schlechtes Pattern oder keine Ahnung, das ist nicht Lind-konform oder keine Ahnung was, dann geht man hin und refactort es halt, weil das schreit einen quasi an, das ist das Hässliche, was du meintest.

Dominik

Das ist ein Code-Review, wenn man relativ sehen kann, wie gesagt, Kommentare stimmen nicht oder Docs sind falsch oder es sieht hässlich aus, es ist zu lang, man kann es so ein bisschen umbauen, Namings sind komisch, dann kann man das schnell machen.

Ronny

Genau, aber so eine Sache, wenn man sagt, okay, ich habe jetzt da dieses Konstrukt und es ist auch alles vielleicht auch gar nicht so schlecht an sich für den Pattern, also man hat das vielleicht alles in Klassen drin und Services und du hast auch irgendwie Models gebaut, wo das auch alles irgendwie die Datenstruktur ist.

Dominik

Interessant ist immer noch Services, da müssen wir auch nochmal drüber reden, was das eigentlich ist.

Ronny

Aber wenn halt irgendwann dieser ganze Business-Prozess halt nicht mehr offensichtlich ist, da muss man halt einfach diese Art von Abstraktion, einfach eine neue Art von Abstraktion finden und da ist eine sehr interessante Sache, mit der wir uns jetzt beschäftigt haben, sind halt die Final-State-Machines.

Ronny

Dazu gibt es auch einen sehr coolen Vortrag von 2019. Ich habe vergessen von wem, aber da gibt es Django FSM. Das Problem ist, das Package ist leider deprecated und die neue Version ist noch in Alpha. Also man kann die schon nutzen, aber die Doku hat Lücken. Wen es interessiert, wir haben beim letzten Django Meetup in Köln haben wir länger drüber gesprochen. Das ist bei YouTube.

Dominik

Vielleicht nochmal ganz kurz dann erklären, was ist denn eine Finite State Machine?

Ronny

Also Final State Machine ist im Endeffekt relativ simpel, dass man sagt, ich habe ein Objekt und dieses Objekt kann in verschiedenen Status sein. Also sprich, ich habe einen Auftrag, der kann neu offen sein, der kann in Bearbeitung sein, der kann in Lieferung sein, der kann abgeschlossen sein, der kann bezahlt sein.

Ronny

Und dass es eine endliche Menge von Wegen gibt, wie ich von jedem Status, also nicht von jedem zu jedem, aber wie ich von einem Status zum anderen komme. Kann man sich im Endeffekt einfach wie ein Graf mit Pfeilen, also Kringeln und Pfeilen vorstellen. Und man hat halt im Endeffekt fix definiert, also erstmal auf dem grafischen Level, dass ich zum Beispiel von, ich kann nicht von offen direkt nach geschlossen kommen, weil davor muss es erstmal irgendwie bearbeitet, bezahlt und geliefert werden. Ja, oder so, das geht halt sonst nicht, so könnte man sich jetzt vorstellen, ja.

Ronny

Und der Vorteil an diesen, also das ist nur eine von vielen Möglichkeiten, um sowas anzugehen.

Ronny

Und wir haben das jetzt halt ausprobiert und es hat halt wirklich, wirklich gut funktioniert.

Ronny

Weil das Schöne ist, diese Graphen sind sehr, also die werden natürlich auch immer komplexer, wenn man halt sehr viel Business-Logik hat, aber trotzdem, die versteht halt wirklich jeder.

Ronny

Also der komplette Non-Techie kannst du das auf den Tisch legen und der weiß sofort, um was es geht.

Ronny

Und das Schöne ist halt, das geht mit der neuen Version glaube ich nicht, sondern mit der alten Version, wenn man diese Flows implementiert in Django, mit diesem Package,

Ronny

dann konnte man sich die Graphen auch rausrendern lassen.

Ronny

Also sprich, die Business-Logik,

Ronny

die man einerseits für als Entwickler sinnvoll ablegen kann,

Ronny

weil man halt auf einmal nicht mehr überall irgendwo langwurschtelt

Ronny

und irgendwie in jedem Service das irgendwie ein bisschen anders macht,

Ronny

je nachdem aus welcher Ära vom Projekt das dann halt gebaut wurde.

Ronny

Sondern man sagt, okay, ich habe einen Flow

Ronny

und hier definiere ich jetzt genau, was passiert,

Ronny

wenn Auftritt von offenen Bearbeitungen geht.

Ronny

Zum Beispiel, da geht eine E-Mail raus oder da geht keine E-Mail raus

Ronny

oder da muss jemand irgendwas machen damit, ja,

Ronny

und welche Variablen gesetzt werden.

Ronny

Und erstens ist es halt im Code sauber gekapselt

Ronny

Und die alte Version konnte, wie gesagt, direkt die Graphen rausrennen. Das heißt, wenn man ein hinreichend komplexes Business-Modell implementiert hat und dann kommt der Kunde und sagt, ich würde da gerne was dran ändern, dann kann man im Endeffekt auf den Knopf drücken, kriegt dann ein wunderbares PDF raus, kann darüber dann mit dem Kunden reden und sagen, okay, welche Pfeile sollen wir jetzt umbiegen und wo soll was anders passieren?

Ronny

Und das ist halt, also das ist halt wirklich auf einer ganz anderen Ebene und es ist halt so trivial, also ich bin eher schockiert, dass mir sowas noch nicht, also dass ich da so spät im Endeffekt drüber gestolpert bin über solche Sachen.

Dominik

Ja, ich glaube, was eigentlich schwierig ist, ist tatsächlich diese Dinger aufzumalen, weil ich glaube, selbst die Kunden kennen nicht immer ihren Flowchart, weil die halt nicht wissen, was passiert denn da und bevor sich das nicht jemand angeguckt hat und vielleicht mal das in der Realität getestet hat, oh, da ist aber noch ein Problem, dann tauchen diese einzelnen Ereignispunkte oder auch die States, die irgendwas haben kann, gar nicht auf.

Dominik

und das, bei uns hat das so einen ganz bösen

Dominik

Bug geführt. Ja,

Dominik

die Tests waren eigentlich ganz gut, also die haben eigentlich das getestet,

Dominik

was getestet werden soll, das heißt, Carbide war hoch,

Dominik

also der Code, aber es gab halt den Fall einfach nicht

Dominik

und das führte halt einfach dazu, dass fälschlicherweise

Dominik

beispielsweise, wir haben so 4MN-Quatsch

Dominik

gemacht, an ein paar hundert Vertriebler

Dominik

einfach so E-Mails rausgingen, die gar nicht rausgehen sollten

Dominik

oder so, oder zu oft und sonst halt so ein bisschen

Dominik

so, okay, ups

Dominik

und das böse schreit halt dann, man denkt sich

Dominik

halt so, nein, wir können den nur und total

Dominik

doof und das macht ja gar nicht, dass wir es sollen, das ist falsch

Dominik

Aber eigentlich ist halt nur der Fall, dass man halt nicht bedacht hat, dass es einen besonderen Fall geben kann, der halt nicht abgebildet wird.

Ronny

Genau, aber das Schöne ist halt, wenn man halt mit solchen Tools vielleicht auch direkt konzeptionell, also auch im Agilen einfach mal, wenn man die Tickets überarbeitet, sagt, hey, wir haben hier dieses Modell und wir arbeiten immer an diesem Modell, dann kann man halt vielleicht über solche Sachen auch schon viel früher stolpern, weil der Kunde dann plötzlich merkt, so ja, Moment mal, oder wenn der Kunde es an seinen Stakeholdern zeigt, also der Kunde an den Stakeholdern zeigt und sagt vielleicht, ja, Moment mal, aber ich arbeite doch die ganze Zeit an einem Pfeil, den es ja gar nicht gibt, da stimmt doch was nicht.

Ronny

Weil wenn das halt implementiert ist, dann ist es halt für die Non-Techies halt quasi weg. Das ist dann nicht mehr einsehbar. Und als Entwickler, natürlich sollte man das grob verstehen, wie du halt gesagt hast, das System ab einer gewissen hinreichenden Komplexität ist es halt vorbei. Dann kann man nicht mehr alles verstehen.

Ronny

Dann sind die Sachen hoffentlich irgendwie gekapselt und dann will man auch gar nicht mehr wissen, was da hinten passiert. Vielleicht muss ich das wissen für meine Sache, weil es irgendwas gibt, was halt noch keiner weiß.

Dominik

Vielleicht nochmal die Definitionsdinge. Finite State Machine.

Jochen

Deutsch ist endlicher Automat.

Dominik

Genau, also einen endlichen Automaten kann man quasi auf alles dann abbilden.

Dominik

Was ist denn mit unendlichen Automaten?

Jochen

Nein, du kannst damit nicht alles machen.

Jochen

Also endliche Automaten zum Beispiel, also etwas, was quasi äquivalent ist, sind reguläre Ausdrücke.

Jochen

Das ist halt auch eigentlich, wobei reguläre Ausdrücke, je nach Implementation, da gibt es auch noch ein bisschen mehr, was man machen kann.

Jochen

Aber das ist halt, ja, also wenn man endlich einen Automat hat, die Sprachen, die theoretische Informatik, hoffentlich rede ich nicht allzu großen Unsinn, das ist alles schon sehr lange her, aber im Grunde, wenn du endlich einen Automaten hast, dann sind die Sprachen, von denen akzeptiert werden, heißen regulär und deswegen auch reguläre Ausdrücke, weil es halt Ausdrücke sind, mit denen du reguläre Sprachen parsen kannst halt.

Jochen

aber du kannst damit nicht alles machen.

Jochen

Zum Beispiel, was du damit nicht machen kannst,

Jochen

sind halt so, also das

Jochen

ist immer so Informatik 1

Jochen

oder bei mir war das glaube ich

Jochen

tatsächlich Informatik 1 Klausur,

Jochen

musst du dann beweisen, dass eine bestimmte

Jochen

Sprache nicht mit einem endlichen Automaten

Jochen

passbar ist. Normalerweise

Jochen

nimmt man dann irgendwas, wo es so Klammer gibt.

Jochen

Du hast dann eine Sprache, die halt so Klammern hat,

Jochen

wo halt, ob du hinten eine Klammer zumachst, davon abhängt,

Jochen

ob du die vorne aufgemacht hast. Und dann gibt es

Jochen

dann so ein Pumpkin-Lammern, heißt das.

Jochen

Das kann man dann benutzen, um zu zeigen,

Jochen

dass man

Jochen

in keinem endlichen Automaten das parsen kann,

Jochen

weil man sich nicht merken kann,

Jochen

wie das...

Jochen

Dafür braucht man dann halt so einen Stack-Automaten

Jochen

oder irgendwie sowas.

Jochen

Was ist ein Stack-Automat?

Dominik

Wie gesagt, ich kenne keine theoretische Informatik.

Dominik

Was ist ein Stack-Automat?

Dominik

Ja, so ein Ding, was halt einen Speicher hat.

Dominik

Also einfach noch tatsächlich einen Stapel, den es gibt.

Dominik

Okay.

Dominik

Warum ist das Ding Automat?

Dominik

Ja, ich weiß gar nicht, ob das Stapelmaschine

Jochen

vielleicht auch, ich weiß es nicht genau, ich weiß gar nicht, ob das Automat heißt.

Dominik

Also alles, was halt dann ein unendlicher Automat quasi ist,

Dominik

das hat halt dann States, die du vorher nicht kennst oder sowas.

Dominik

Oder worum geht es da, dass du das nicht vorher wegdefinieren kannst?

Jochen

Nein, du musst dir halt sozusagen merken, was passiert ist.

Jochen

Das kannst du im eigentlichen Automaten nicht machen.

Jochen

Da hast du halt Zustände, die sind endlich und du kannst zwischen denen wechseln.

Jochen

Aber du kannst dir jetzt nicht merken, wo du schon überlang gelaufen bist oder so.

Jochen

Oder ob du Klammern aufgemacht hast oder nicht.

Jochen

Das geht halt nicht.

Jochen

Und genau, das nächste, also

Jochen

gehen wir mal die Dinger durch

Jochen

bei der theoretischen Informatik.

Jochen

Das zweite ist halt dann sozusagen Stackmaschinen.

Jochen

Damit kannst du halt dann kontextfrei Grammatiken

Jochen

parsen und dann gibt es halt noch

Jochen

Kontextsensitiv. Dafür brauchst du dann schon

Jochen

Loop-Rechenbar oder

Jochen

sowas und dann irgendwie gibt es noch

Jochen

irgendwie alles

Jochen

irgendwie und

Jochen

dafür brauchst du dann Turing-Maschinen. Oder halt

Jochen

ein While-Programm oder ein Vorprogramm oder was auch immer.

Jochen

Okay, also nochmal jetzt vielleicht

Dominik

zum Abschließen, was eine Turing-Maschine ist.

Jochen

Oh Gott, eine Turing-Maschine, ein Siebentuppel aus Sprache, Grammatik, Terminalsymbolen, Nicht-Terminalsymbolen, keine Ahnung, weiß ich nicht, Alphabet.

Jochen

Ja, also im Grunde das Ding, was halt sozusagen die Informatik als Fach irgendwie so ein bisschen begründet hat damals, 1937, gab es das Paper, glaube ich.

Jochen

Von Neumann-Architektur?

Jochen

Nein, nein, nein.

Jochen

Nein, nein, nein, du weißt was anderes.

Jochen

Das war ganz anders.

Jochen

Was ist das?

Jochen

Das ist, von all meinen Architekturen ist das halt Hauptspeicher, also dass der Speicher für Daten und Programme der gleiche ist, mehr oder weniger. Aber das ist halt wie eine Rechnerarchitektur, aber das ist halt Hardware, das ist Turing-Maschine, das ist ein theoretisches Konstrukt.

Jochen

Wie gesagt, das hat Turing da

Jochen

1930 veröffentlicht.

Jochen

Ich glaube, das Paper hieß

Jochen

On Computable

Jochen

Numbers with an Application to the

Jochen

Entscheidungsproblem oder sowas.

Jochen

Da hat er das Ding halt vorgestellt

Jochen

und in dem Paper bewiesen, dass

Jochen

das Problem

Jochen

nicht entscheidbar ist.

Jochen

Also ja, und genau.

Jochen

Das hat eigentlich die Informatik begründet.

Jochen

Beziehungsweise

Jochen

es gibt da halt noch irgendwie

Jochen

ein Paper zu Lambda-Kalkulus

Jochen

von Church. Das ist ein bisschen später rausgekommen.

Jochen

Das ist eigentlich ein Stückchen eleganter, aber

Jochen

ja.

Jochen

Ja.

Jochen

Aber genau, also das

Jochen

Typ 0 Sprachen,

Jochen

also mit der Turing-Maschine kannst du halt

Jochen

alles parsen, was du auch parsen kannst.

Jochen

Und mit einem regulären, also mit

Jochen

einem regulären

Jochen

Automaten, also

Jochen

mit einem endlichen Automaten halt nicht, sondern nur

Jochen

ganz spezielle Sachen. Aber

Jochen

trotzdem kannst du wahrscheinlich eine Menge damit abbilden.

Jochen

Ja, ich meine, so ist es nicht.

Ronny

Ja, vor allem in meinem Case ging es ja wirklich auch tatsächlich um Business Flows.

Ronny

Ja.

Ronny

Und ich glaube, das Interessante an Business Flows ist, weil das halt wirklich eine Sache ist, man muss ja dann im Endeffekt die gelebte Realität von dem Kunden oder von demjenigen, für den man das baut, muss man ja halt wirklich eins zu eins spiegeln, ohne dass man wirklich genau weiß, was die da eigentlich tun.

Ronny

Also wenn man jetzt, keine Ahnung, wenn es darum geht, verschicke E-Mails, dann ist das Ergebnis wichtig. Aber bei der Geschäftslogik, beim Geschäftsmodell, muss man tatsächlich das nachbauen. Also da kommt irgendwas daher, da werden irgendwie Daten reingegeben, dann wird mit den Daten irgendwas gemacht, dann wandert das irgendwo weiter hin.

Ronny

Und das ist, glaube ich, so der spannende Punkt, warum da halt zum Beispiel, ich meine, es gibt doch bestimmt noch 50 andere schlaue Ideen, wie man da umgehen kann, aber halt damit mit diesen endlichen Automaten halt schon mehr Struktur reinbringen kann.

Ronny

Ich glaube, wenn man das halt auch von Anfang an sich für irgendwas entscheidet und nicht halt sagt, wir machen das halt, wie ich halt den ganzen normalen Code programmieren würde, glaube ich, da kann man sich sehr viel Knater sparen und hat bestimmt zwei, drei Jahre Entwicklungszeit Entspannung vom, also quasi ein bisschen Schutz vor tiefgreifendem Refactoring.

Jochen

Ja, nee, klar, also es ist ...

Dominik

Um Refactoring zu vermeiden, aber das wäre jetzt aber auch nur Refactoring vermeiden, was quasi Bugs entfernt und die Features sicherer macht.

Dominik

Aber das wäre jetzt nicht das Refactoring, was keinen Style schöner macht, Namenskonventionen besser einhält, dokumentierbarer macht.

Jochen

Ja, okay, stimmt, das ist natürlich auch eine Art von Refactoring, ja.

Dominik

Ja, man kann auch quasi irgendwas, also wenn man das übergibt, also wenn ich jetzt selber was geschrieben habe, was ich mich gut mit auskenne, ist es ja was anderes, als wenn jetzt jemand anders das benutzen muss.

Dominik

Und wenn man halt seinen Krug in einen Zustand versetzt, in der er halt irgendwie auch gut übergiebbar ist, dass halt jeder damit arbeiten kann.

Jochen

Ja, wobei man da ein bisschen vorsichtig sein muss. Ich meine, da geht es dann quasi um, würde ich mal sagen, Konsistenz.

Jochen

Und da ist leider, also meine persönliche Ansicht dazu ist, konsistent ist es dann so, ist es dann, wenn es mir gefällt.

Jochen

Taste kann man nicht schreiten.

Jochen

Aber das Problem ist halt,

Jochen

das habe ich ja auch mit...

Jochen

Wenn man seinen eigenen Code anguckt,

Jochen

der einem selber nicht mehr gefällt.

Jochen

Ja, aber wenn man so in Codebasen guckt,

Jochen

die es da so gibt

Jochen

und sich denkt so,

Jochen

oh, das ist alles ganz schrecklich,

Jochen

dann habe ich so den,

Jochen

dann zuerst fängt das Augenlid an zu zucken

Jochen

und dann irgendwann lasse ich Black

Jochen

über alles drüber laufen.

Jochen

Ja, ich kenne das aber auch von Jochen,

Jochen

das ist immer ganz super.

Dominik

Also er hat ja immer netterweise

Dominik

ein paar Sachen von mir mal korrigiert und so.

Dominik

Und ganz am Anfang war es so,

Dominik

äh, was ist das denn?

Dominik

Das geht ja überhaupt nicht.

Dominik

Alles wegschmeißen, neu machen.

Dominik

Nee, nee, kann man nichts mehr retten.

Dominik

wieder angefangen, neu gemacht und das ging dann so ein paar

Dominik

Mal, wieder wegschmeißen, nochmal weg. Und dann irgendwann

Dominik

hat er gesagt, ah, was ist denn das?

Dominik

Ja, das habe ich von dir kopiert.

Jochen

Ja, das mag sein, dass das

Jochen

vorkommt.

Jochen

Manchmal ist es auch einfach Quatsch.

Jochen

Da hat man sich so dran gewöhnt, dass irgendwie

Jochen

und dann macht man hinterher

Jochen

irgendwas dann falsch, wenn man

Jochen

davon ausgeht, dass es sowieso irgendwie nicht richtig ist.

Jochen

Man muss aufpassen, das ist nicht so einfach.

Jochen

Aber genau, also

Jochen

Also ja, ich tendiere dazu, das dann so zu machen.

Jochen

Ich glaube aber, es ist falsch.

Jochen

Ich glaube es ist, und eben auch da das Buch würde sagen,

Jochen

ja, Konsistenz wichtiger, weil es halt für Leute wichtiger ist,

Jochen

das zu verstehen und dass es genauso ist, wie sie das halt kennen,

Jochen

als dass es richtig ist.

Jochen

Weil richtig ist halt kein guter Wert quasi.

Jochen

Oder es senkt halt nicht die Komplexität.

Jochen

Also es kommt darauf an.

Jochen

Also ich meine, es gibt natürlich Situationen, in denen es so schlimm ist,

Jochen

da muss man halt was machen.

Jochen

Aber wenn es

Jochen

jetzt sozusagen nur unschön

Jochen

ist, aber halt in sich konsistent, dann ist

Jochen

es wahrscheinlich besser, das so zu lassen,

Jochen

weil es senkt halt

Jochen

nicht, also die Konsistenz

Jochen

zu brechen, erhöht halt die Komplexität

Jochen

ganz sicher, während

Jochen

das anders zu machen

Jochen

verringert die Komplexität vielleicht ein bisschen,

Jochen

aber wahrscheinlich

Jochen

gleicht das nicht das aus, dass man das dann halt

Jochen

inkonsistent gemacht hat und damit dann komplexer.

Jochen

Also, ja, es ist blöd.

Jochen

Das ist ja generell auch ein Problem,

Ronny

dass wenn man jetzt ein altes, gewachsenes Projekt hat,

Ronny

das man dann vielleicht im schlimmsten Fall übernimmt,

Ronny

aber vielleicht auch, wo man halt auch schon selber lange dran arbeitet

Ronny

und irgendwann kommt dann jetzt der Impuls,

Ronny

wir müssen da jetzt mal irgendwie anfangen, Sachen besser zu machen,

Ronny

das geht so nicht mehr weiter.

Ronny

Und da ist dann ja auch bei vielen motivierten Entwicklern,

Ronny

wie das bei mir früher auch so war,

Ronny

man geht dann und sagt, okay, machen wir irgendwie so gefühlt alles neu.

Ronny

Und dann fängt man irgendwie sieben Baustellen an

Ronny

und das klappt halt einfach nicht.

Ronny

Also ich glaube, die größte Kunst,

Ronny

wenn man wirklich so ein altes Projekt retten möchte,

Ronny

ist wirklich

Ronny

sich zu überlegen, wie kriege ich

Ronny

die Patterns, die ich möchte,

Ronny

unter den Nebenbedingungen meines

Ronny

Projektes, ohne dass ich quasi alles anzünden

Ronny

muss und ...

Dominik

Oh oh, lieber die Finger vorn lassen,

Dominik

das ist zu viel. Also ich habe tatsächlich

Ronny

mal jahrelang auf einem

Ronny

wirklich komplett von der grünen Wiese

Ronny

gewachsenen Plain-PHP-Projekt gearbeitet.

Ronny

Das war halt einfach, das war vorne und hinten

Ronny

eine Katastrophe. Also die Code-Basis war

Ronny

wirklich, wirklich schlimm. Da gab es nie irgendjemand,

Ronny

der drüber geguckt hat. Das waren alles,

Ronny

im Endeffekt alles von Freelancern gebaut, die, genau wie

Ronny

du es gerade gesagt hast, halt die dafür bezahlt wurden,

Ronny

möglichst schnelle Feature abzuliefern und dann nach mir

Ronny

die Sintflut. Böse, ich meine, nicht bei

Ronny

allen, aber es gab auf jeden Fall Leute und wenn du halt

Ronny

einen so im Team hast, dann ist halt schwierig.

Ronny

Ich habe einen Freund,

Dominik

einen Entwickler aus Malawi, der halt so

Dominik

versucht, günstige Aufträge ranzubekommen und

Dominik

weil die Kunden, die er hat, dann relativ wenig Budget

Dominik

haben und immer ausgeben, merkt man halt auch, welche

Dominik

Entwickler sich halt dann leisten können und

Dominik

wenn er halt dann so sieht, so die Leute, die

Dominik

von denen er das aufräumen

Dominik

muss, dass wenn er selber nicht weiß, worum es geht und die haben dann teilweise

Dominik

Panda selbst implementiert, weil sie nicht wussten, was das dann gab

Dominik

und hat so Sachen selber geschrieben und

Dominik

vorne auseinanderfallen, unheimlich viel Spaghetti-Zeug

Dominik

und das dann neu zu machen.

Dominik

Also die Arbeit, die hat, er ist

Dominik

die ganze Zeit am Limit und weiß überhaupt nicht, was da passiert.

Dominik

Das ist unheimlich schwierig, das besser zu machen

Dominik

und das zu refactoren, aber ich glaube, da ist dann

Dominik

gotische Knoten besser gelöst, indem man

Dominik

manchmal tatsächlich dann durchschneidet

Dominik

oder halt einfach verbrannte Erde hinterlässt und das

Dominik

neu anfängt oder so. Also es gibt es

Dominik

auf jeden Fall, aber

Ronny

es ist ja leider, zum Beispiel

Ronny

bei vielen Firmen, die so vor

Ronny

vor, weiß ich nicht, 10 Jahren, 15 Jahren

Ronny

angefangen haben und einfach ihr Geschäftsmittel

Ronny

irgendwie implementiert haben. Da wurde ja die

Ronny

meistens, oder vor allem auch so Frühzeiten des Web,

Ronny

da sind ja einfach sehr, sehr viele schlimme Dinge

Ronny

passiert. Da gab es auch teilweise noch keine

Ronny

Frameworks, das waren Leute, die dann

Ronny

nicht so richtig wussten, was sie da tun.

Ronny

Und

Ronny

das Problem ist aber, dass halt, weil

Ronny

halt auch da in der Firma dann nie jemand ist, der dann wirklich

Ronny

da versucht, das

Ronny

kontinuierlich besser zu machen. Dann kommt halt irgendwann,

Ronny

okay, es geht nicht mehr, ja, weiß ich nicht,

Ronny

ein Formular anpassen dauert eine Woche,

Ronny

wir müssen irgendwas machen.

Ronny

Und das ist halt dann, dass diese Firmen dann halt

Ronny

in so einem Deadlock sind, dass die halt nicht das Budget

Ronny

haben, diese riesige gewachsene Software mit

Ronny

28.000 Sonderfällen neu implementieren

Ronny

zu können, aber es geht auch nicht weiter.

Ronny

Und das ist halt genau der Fall und ich glaube, das ist ein sehr

Ronny

häufiger Fall, insbesondere

Ronny

wenn das halt so eine Software ist, die halt wirklich

Ronny

in-house dann für sich selbst entwickelt wurde,

Ronny

dass man da, da ist

Ronny

super wichtig, dass man reflektiert, das ist super wichtig, dass

Ronny

man, also vor allem, ich finde in solchen Fällen

Ronny

das Einzige, was einen irgendwie motivieren kann, an diesem

Ronny

Projekt zu arbeiten, dass man halt versucht, die

Ronny

Herausforderung halt anzunehmen und das irgendwie besser zu

Ronny

machen kontinuierlich. Und da ist es halt einfach

Ronny

super wichtig, dass man sich Patterns überlegt. Also beispielsweise

Ronny

bei diesem alten Plain PHP Ding

Ronny

war halt auch, das war halt einfach

Ronny

eine Kette von Skripten, die eingebunden

Ronny

wurden. Eine N-lange Liste.

Ronny

Niemand wusste genau, was da oben

Ronny

kommt und was unten kommt. Du hattest keinen Variablen

Ronny

Scope. Also das kann man sich nicht vorstellen, was das

Ronny

für ein Segen ist, dass man einen Variablen

Ronny

Scope hat. Und im Endeffekt

Ronny

habe ich dann, das war das, wo ich

Ronny

dann so mich am meisten darüber gefreut habe,

Ronny

dass es funktioniert hat. Ich habe mir im Endeffekt

Ronny

Django Class-Based Views in klein nachgebaut

Ronny

und es war ein Segen. Und es war

Ronny

im Endeffekt, das halt einmal zu bauen,

Ronny

also mir im Endeffekt grob abzugucken und dann

Ronny

halt ein bisschen fein zu schleifen, war ich in zwei, drei Tagen

Ronny

durch. Das war jetzt echt nicht viel Arbeit.

Ronny

Jedes Mal, wenn ich halt an irgendeinem View

Ronny

dran war, also View in Gänsefüßchen,

Ronny

letzte Skript der Reihe,

Ronny

habe ich halt dann einfach, okay,

Ronny

jetzt stelle ich das einfach oben. Habe ich dann mit dem Kunden noch

Ronny

abgesprochen, das hat dann auch meistens nicht rasend

Ronny

viel, weil es meistens nur einsortieren war. Ich habe gar nicht

Ronny

zum Code wirklich gemacht, aber da ich das dann

Ronny

plötzlich Scope hatte, konnte auch die IDE

Ronny

plötzlich mit Variablen arbeiten, hat einem

Ronny

plötzlich zum Beispiel gesagt, ey, da sind ganz viele, da ist ein

Ronny

ganzer, weiß ich nicht, 100-Zeilen-Zweig in diesem

Ronny

Dings, die Variable wird gar nicht gesetzt,

Ronny

die kommt nirgendwo her, das gibt's

Ronny

gar nicht, das kann man einfach rauswerfen, ja, also

Ronny

das war im Endeffekt mehr oder weniger eine

Ronny

Kleinigkeit und das war

Ronny

so ein Gewinn für dieses Projekt,

Ronny

weil, wie gesagt, man wusste

Ronny

was diese Views, man hat angefangen, man konnte,

Ronny

man wusste auch erst mal, wie ich überhaupt anfangen soll, aufzuräumen,

Ronny

ja.

Dominik

Ja, so unterschiedlich ist die, ne, ich hab

Dominik

da gehört. Also es gibt Leute auf der Welt,

Dominik

programmieren unterschiedlich.

Dominik

Zum Beispiel, ich habe jetzt von einem Freund gehört, der

Dominik

mit Ukrainen relativ viel zu tun hat,

Dominik

also wirklich, die dann lange Jahre schon

Dominik

so Auftragsarbeit machen für europäische Kunden

Dominik

oder sowas und die sich jetzt halt

Dominik

auf internationalen Vergleich da irgendwie gucken,

Dominik

wie das dann so aussieht. Und da gibt es Firmen aus

Dominik

anderen Teilen der Welt, irgendwo aus Asien oder sowas,

Dominik

die entweder nur genau das machen, was sie aufgeschrieben haben

Dominik

und halt nur genau

Dominik

Definition, das heißt, du brauchst ultra lange, wenn du

Dominik

mit dem zusammenarbeitest, um diese Definition aufzuschreiben,

Dominik

weil alles, was da nicht drin steht, das wird

Dominik

halt nicht gemacht. Das ist halt blöd.

Dominik

Oder die halt

Dominik

diese Abstraktions-Levels nicht benutzen.

Dominik

Auch vor allem aus dem anderen asiatischen

Dominik

Raum, wo du halt dann da stehst und

Dominik

anstatt, dass du so einen Pattern

Dominik

jetzt halt hast und eine abstrakte Klasse,

Dominik

dass du schreibst, werden halt alle

Dominik

100 einzelne Möglichkeiten

Dominik

einzeln implementiert. Und dann so, ja, kommen ja

Dominik

noch weitere, ja, 900 dazu,

Dominik

vielleicht wäre ein Abstraktionsniveau sinnvoll.

Dominik

Nur, nur, die 900 machen wir dann auch ganz schnell.

Dominik

So halt.

Dominik

das ist halt dann schwierig. Also wenn man das halt dann refactored,

Dominik

dann ist halt unheimlich viel Fleißarbeit auch dann.

Dominik

Wie man das irgendwie dann versucht

Dominik

zu modulisieren, auseinanderziehen.

Dominik

Ist Refactoring auseinanderziehen

Dominik

oder Extraktion? Ich weiß nicht.

Dominik

Ich glaube, es sind halt viele Facetten,

Dominik

oder? Ja. Ist auf jeden Fall eine davon.

Jochen

Ja. Ich würde sagen,

Jochen

eben, das ist halt, letztlich sollte es halt

Jochen

dazu führen, dass die Komplexität vom Gesamtsystem

Jochen

geringer wird. Und wenn du halt,

Jochen

dann ist halt die Frage, was ist Komplexität

Jochen

eigentlich? Ja, don't repeat yourself vielleicht auch.

Jochen

Genau, wenn du das jetzt so implementierst, also nehmen wir diesen Fall, du machst halt nicht eine generelle Lösung für irgendwas, sondern du hast halt dann 900 Spezialfälle, dann sieht das ja erstmal gar nicht so schlimm aus, aber tatsächlich, wenn du jetzt etwas hast, was all diese Fälle betrifft, quasi etwas, was du zum Beispiel immer tun musst, dann musst du die alle anfassen.

Jochen

Das heißt, du hast eine Abhängigkeit

Jochen

zwischen allen,

Jochen

die nicht sichtbar ist.

Dominik

Wir sind schon wieder bei Sennoff Heißen

Dominik

und können jetzt hier die Liste wieder runterbieten.

Dominik

Das Beispiel hier

Jochen

in dem Buch ist sozusagen, wenn du eine Webseite

Jochen

mit ein paar tausend Seiten hast und du hast

Jochen

halt irgendwo einen Banner da drin, das halt

Jochen

eine Hintergrundfarbe hat und

Jochen

du hast die jetzt halt einfach von Hand

Jochen

gesetzt in allen Seiten.

Jochen

Dann hast du halt eine

Jochen

implizite Abhängigkeit zwischen allen Seiten,

Jochen

weil du kannst diese Farbe nicht mehr ändern,

Jochen

ohne alle anderen Sachen anzufassen.

Jochen

Besser ist es halt,

Jochen

nur eine Abhängigkeit zu haben zu einem

Jochen

Modul irgendwie, wo du

Jochen

diese Farbe setzen kannst.

Jochen

Und dann hast du eine explizite

Jochen

Abhängigkeit, das heißt, du siehst auch, dass es die gibt

Jochen

und du kannst es an einer Stelle ändern

Jochen

und dann ist es halt für alle geändert.

Jochen

Das wäre ein Refactoring quasi.

Dominik

Es gibt ja so Sprachen, wo das nicht ging,

Dominik

zum Beispiel mit Variablen setzen oder so was.

Dominik

Also in HTML oder alten CSS oder so was

Dominik

waren Variablen ja nicht so einfach zu setzen.

Jochen

Keine Ahnung, ich weiß aber auch noch nichts über CSS.

Jochen

Das war zum Beispiel dann ein Problem,

Dominik

wenn du quasi eine

Dominik

Variable, also eine Farbe

Dominik

gesetzt hattest, auf eine Farbe, die es schon gab.

Dominik

Von zwei verschiedenen Komponenten.

Dominik

Weil, wie willst

Dominik

du denn jetzt, also das sind, ich weiß nicht, ein paar hundert

Dominik

Stellen, wo das auftaucht und die Farbe ist aber immer dieselbe.

Dominik

Wie kriegst du denn jetzt raus, was dann war jetzt vorher

Dominik

der Hintergrund 2, was war der Hintergrund 1 oder so?

Dominik

Solche Dinge,

Dominik

das ist halt ziemlich hässlich.

Dominik

Ja.

Jochen

Aber genau, also ja,

Jochen

Das Buch sagt dazu, wo kommt diese Komplexität

Jochen

eigentlich her und wie kriegt man sie klein?

Jochen

Es gibt eigentlich im Grunde nur zwei Quellen von

Jochen

Komplexität. Das eine ist halt solche

Jochen

Abhängigkeiten.

Jochen

Und das ist halt,

Jochen

wenn man viel davon hat, ist halt doof, weil

Jochen

das bedeutet halt, wenn du etwas änderst,

Jochen

musst du viele andere Sachen, die von allen Abhängigkeiten

Jochen

ja auch anfassen.

Jochen

Und die zweite Geschichte ist

Jochen

Obscurity.

Jochen

Ich weiß gar nicht, wie man das am besten übersetzt.

Jochen

Undurchsichtigkeit.

Jochen

Undurchsichtigkeit, ja.

Jochen

Nebel. Obskurität,

Jochen

ja, ich weiß nicht, genau.

Jochen

Unklarheit, Unklarheit vielleicht, ich weiß

Jochen

nicht, naja. Jedenfalls, das ist halt,

Jochen

das passiert,

Jochen

also, und das sorgt halt für noch schlimmere

Jochen

Probleme, das sorgt für so

Jochen

Unknown-Unknowns, dass du halt

Jochen

gar nicht, also wenn du viele Abhängigkeiten

Jochen

hast, ja, nehmen wir an,

Jochen

du hast halt irgendwie, du weißt

Jochen

halt, wenn du das jetzt änderst, dann musst du das an 100 Stellen

Jochen

auch noch anfassen, ja, dann weißt du halt so, oh mein Gott,

Jochen

das dauert jetzt lang. Aber was

Dominik

dann diese 100 Stellen eigentlich alles machen, das weißt du halt

Dominik

nicht vielleicht. Ja, aber wenn du

Dominik

genau, zum Beispiel, nehmen wir an, du hast jetzt

Jochen

diese eine Abhängigkeit, die sagt, wenn

Jochen

du die Hintergrundfarbe von diesem Banner ändern willst, dann

Jochen

machst du das hier. Und jetzt hast du aber

Jochen

in 10 Dingern, hast du es halt von Hand

Jochen

überschrieben. Aber das

Jochen

weißt du halt nicht mehr, das ist nicht dokumentiert.

Jochen

Dann, das sind halt diese Sachen,

Jochen

wo dir dann hinterher auffällt, dass

Jochen

ein Kunde sagt dann halt irgendwann so,

Jochen

oh, da stimmt aber die Farbe nicht. Wir hatten das

Jochen

doch geändert. Wieso ist denn die jetzt da an der Stelle falsch?

Jochen

Und dann kriegst du das sozusagen

Jochen

als Bugs wieder zurück,

Jochen

was du nicht wusstest, dass es

Jochen

diese Abhängigkeit gibt, aber die

Jochen

war halt nicht so gut.

Jochen

dokumentiert. Ja, und dann

Jochen

das sind die Schlimmsten, weil

Jochen

das Problem ist halt,

Jochen

du weißt halt gar nicht, dass du das

Jochen

eigentlich hättest machen sollen.

Dominik

Ja, was implizit dann tatsächlich einem nicht auf die Füße fällt.

Dominik

Ja, und dann ist halt

Jochen

die Frage, wo kommt das her und wie kriegt man das

Jochen

verhindert? Und oft ist es halt vielleicht Dokumentation.

Jochen

Das ist auch etwas, das

Jochen

fand ich nett,

Jochen

dieses Buch hat meine Einstellung zu

Jochen

Kommentaren und Dokumentationen so ein bisschen verändert.

Dominik

Jochen schreibt übrigens nie Dokumentation.

Jochen

Nein, das wäre nie

Jochen

wäre zu hart, nein.

Dominik

Ja, der Code erklärt sich selbst und so.

Dominik

Ja, okay.

Jochen

Aber tatsächlich, ich würde auch sagen, also ja,

Jochen

ich meine, es gibt ja da unterschiedliche Ansichten zu, eine

Jochen

auch verbreitete, jetzt wenn man mal

Jochen

so Clean Code nimmt, auch ein Buch, was sich ja mit solchen

Jochen

Themen beschäftigt, von Robert

Jochen

Martin, Uncle Bob genannt,

Jochen

der sagt ja immer, ja, so

Jochen

wenn du einen Kommentar schreibst, gut,

Jochen

manchmal lässt sich das nicht vermeiden, musst du halt machen oder

Jochen

manchmal musst du halt, aber sei dir

Jochen

bewusst, wenn du das tust, das ist im Grunde ein Fehler,

Jochen

es ist im Grunde ein Versagen.

Jochen

Du hast versagt. Weil,

Jochen

wenn du es richtig gemacht hättest, dann hättest du es

Jochen

so hingeschrieben, dass man das nicht hätte kommentieren müssen.

Dominik

Ein paar Kommentare sind

Dominik

natürlich blöd, weil man muss sie halt aktualisieren und anpassen,

Dominik

wenn man sie... Ja, du hast halt eine mögliche

Dominik

Inkonsistenz auch erzeugt. Ja, genau. Das ist schon doof.

Dominik

Also man muss halt echt schon aufpassen. Aber

Dominik

es ist einfach an vielen Stellen sehr, sehr hilfreich,

Dominik

auch gerade, wenn man kollaborativ arbeitet,

Dominik

einmal kurz hinzuschreiben, was denn da passiert,

Dominik

warum denn da irgendwas passiert. Ja, absolut.

Dominik

Anstatt das halt einfach

Dominik

nicht zu machen, weil dann die Leute fragen sich,

Dominik

Da wird irgendwo schon abgerufen, warum.

Dominik

Oder so, sei es, wenn der Name toll ist und so.

Dominik

Ja, absolut.

Dominik

Ja, ja.

Dominik

Ja, ich muss auch sagen,

Jochen

also genau, dieses Buch hier nimmt das auch relativ detailliert auseinander.

Jochen

Und da sagt er halt so Sachen wie,

Jochen

ja gut, selbst wenn der Code selbst dokumentierend ist,

Jochen

dann einmal, du kriegst das Problem,

Jochen

die Variablen und die Funktionsnamen werden handelang.

Jochen

Du hast das Problem, du schreibst dann,

Jochen

wenn das die Dokumentation von deinem Ding ist,

Jochen

dann schreibst du die ja an jede Stelle, wo du die verwendest.

Jochen

Das ist ja auch Quatsch. Das sollte man ja nicht, also

Jochen

das ist ja auch irgendwie offensichtlich Quatsch. Das kann ja

Jochen

nicht sein. So, das sollte ja reichen, wenn man

Jochen

das an einer Stelle schreibt und dann

Jochen

ja, und

Jochen

hat halt noch so viele, viele Punkte

Jochen

und aber der allerwichtigste

Jochen

Punkt eigentlich, wo ich dann auch gedacht habe, okay, ich

Jochen

glaube, ich muss meine Einstellung dazu überdenken und vielleicht mal

Jochen

anders probieren und mal gucken, vielleicht funktioniert es dann ja anders

Jochen

besser, ist

Jochen

ja, also eigentlich

Jochen

das, was dein Code tut,

Jochen

ist eigentlich, oder das

Jochen

das Entscheidende beim Design

Jochen

von so einem System ist eigentlich nicht so

Jochen

sehr, der Code ist eigentlich gar nicht das

Jochen

Entscheidende, weil der Code ist halt die Implementation davon,

Jochen

aber das ist halt...

Dominik

Magie, Call, Call, Magie,

Dominik

Call, Magie, Call, Magie, aber was dabei

Dominik

rauskommt, ist wichtig.

Jochen

Die Abstraktionen sind wichtig und die stehen aber,

Jochen

Code ist möglicherweise gar keine so gute

Jochen

Art, um das, um diese

Jochen

Abstraktionen sichtbar zu machen oder

Jochen

irgendwie zu dokumentieren.

Jochen

Also natürliche Sprache ist dafür deutlich

Jochen

besser geeignet und man

Jochen

Eigentlich sollte man sich Gedanken über die Abstraktionen machen.

Jochen

Dann schreibt man in natürlicher Sprache hin.

Jochen

Und wie man das dann implementiert, ist ja nochmal eine andere Sache.

Jochen

Ja, das ist sehr schön.

Dominik

Weil bei Python, finde ich, von meinem Empfinden her,

Dominik

ich habe natürlich auch keine Ahnung,

Dominik

aber die Sprache ist, mit der man am nächsten an natürlicher Sprache

Dominik

schreiben kann, entwickeln kann und dass das irgendwie stimmt.

Dominik

Bei Sonic, es hört sich für mich irgendwie so ein bisschen mehr nach,

Dominik

ich schreibe wirklich was dahin, was ich auch so sagen könnte vielleicht.

Dominik

Also ein bisschen.

Dominik

Und das ist nicht immer bei allen anderen Sprachen.

Dominik

Nö.

Dominik

Eigentlich nie.

Dominik

Nie.

Jochen

Ja, naja, es gibt da ganz unterschiedliche Philosophien. Ich finde das sowieso auch interessant. Bei Go zum Beispiel gibt es auch bekannte, ich weiß jetzt nicht mehr, wie der Talk ist, aber einer, der auch die Sprache mitdesignt hat, der ist halt ein Verfechter von kurzen Variablen-Namen-Nehmen.

Jochen

Ja, aber letztens irgendwann

Jochen

ein... A, B, C, D und E.

Jochen

Auf einer Frostcon.

Jochen

Ja, also...

Jochen

Ja, also es ist nicht immer gut.

Jochen

Es gibt auch einen auf der Frostcon,

Jochen

da hatte ich letztens einen getroffen, der hatte

Jochen

einen sehr extremen Standpunkt und meinte, das muss mal lang sein.

Jochen

Kurze Variablen-Namen, schrecklich.

Jochen

Ganz furchtbar, geht gar nicht.

Jochen

Das ist schrecklich.

Jochen

Manchmal ist das schon nett, also gerade wenn man jetzt

Jochen

komplizierte Logik hat,

Jochen

dann kann das sein, wenn man lange Variablen

Jochen

hat, dann stehen einem die Variablen-Namen im Weg,

Jochen

dann sieht man überhaupt nicht mehr, was passiert.

Jochen

Das ist ja auch in der Mathematik so, da schreibt man auch eigentlich immer nur ganz kurz Sachen und Formeln so kurz hin.

Jochen

Das hat halt auch den Vorteil, dass man das dann auch überblicken kann, wenn man das alles ganz detailliert ausschreiben würde.

Dominik

Was ich dann manchmal mache, an der Stelle tatsächlich vorher die Zuweisung, zum Beispiel ED gleich Data vor irgendwas.

Dominik

Und dann mache ich dann nicht immer Data vor irgendwas, sondern nur das D.

Dominik

Irgendwie so, dann wird das so ein bisschen dadurch klar.

Jochen

Ja, genau. Und da macht das Buch auch einen interessanten Vorschlag und sagt so, ja, also der Name sollte umso länger sein, je weiter weg die Variable quasi von ihrem ursprünglichen Ort, wo sie mal definiert wurde, verwendet wird. Also je weiter das weg ist, desto eher musst du halt einen langen Namen nehmen oder desto länger muss der Name sein.

Jochen

Aber je näher du da dran bist,

Jochen

dann

Jochen

kannst du auch kürzere Namen nehmen

Jochen

oder sehr kurze.

Jochen

Weil

Jochen

dann ja immer noch alles im Blick ist.

Jochen

Du siehst halt, was da passiert

Jochen

irgendwie sofort.

Dominik

Also Readability Counts, das ist ja auch wieder

Dominik

so eine Sache, außer auf Python.

Dominik

Naja, also

Jochen

ja, das ist schon faszinierend.

Jochen

Genau, aber auch so was

Jochen

Obscurity kommt halt auch,

Jochen

da ist auch ein sehr schönes Beispiel beschrieben,

Jochen

wo Variable-Namen

Jochen

an böse, böse

Jochen

Überraschungen bescheren können.

Jochen

Also der Autor von dem Buch,

Jochen

der hat TCL mal diese Scripting-Language

Jochen

geschrieben, also diese Sprache designt.

Jochen

Vielleicht kennt man das auch von früher,

Jochen

da hat man so User-Interfaces

Jochen

damit gebaut, in Unix

Jochen

häufig TickleDK, ist das?

Jochen

Ja, TickleDK gibt's, ja. Genau, das ist

Jochen

die Python-Geschichte, mit Python kann man das

Jochen

auch machen, das ist die einzige UI-Geschichte,

Jochen

die in der Standard-Bibliothek drin ist.

Jochen

Und der hat aber noch diverse andere,

Jochen

der hat zum Beispiel ein Cloud-Dings gebaut,

Jochen

ein quasi verteiltes Betriebssystem

Jochen

und ganz viele coole, interessante Dinge.

Jochen

Und in diesem Dings gab es ein Fallsystem auch

Jochen

und in der Fallsystem-Implementation gab es irgendwie eine Variable,

Jochen

die hieß Block.

Jochen

Und da hatten sie einen ganz fiesen Bug,

Jochen

wo sie irgendwie Monate gebraucht haben, um den zu finden.

Jochen

Und der lag dann letztlich daran,

Jochen

Und das ist dann halt eben das, was dann diese Obscurity tatsächlich so schlimm macht.

Jochen

Der lag daran, dass sie Block subtil unterschiedlich in der Bedeutung verwendet haben.

Jochen

Also sie haben Block als Variablen-Namen benutzt, aber in dem einen Fall bedeutete er etwas leicht anderes als in dem anderen Fall.

Jochen

Und wenn du das liest, dann sieht es aber so aus, als ob das irgendwie das Gleiche ist.

Jochen

Aber wenn du es dann halt verwendest, so als wäre es das Gleiche, dann hast du halt einen subtilen Fehler gemacht.

Jochen

in ganz obskuren Fällen

Jochen

hat das dann halt irgendwie mal

Jochen

irgendwie zusätzliche Daten in irgendwie

Jochen

Files reingeschrieben oder so, weil irgendwas nicht richtig

Jochen

allein war oder so. Ganz Horror

Jochen

Bugs.

Dominik

Ja, ja, irgendwie so Magie, die passiert im Dunkeln, aber

Dominik

schwarze Magie macht irgendwas kaputt und du weißt

Dominik

nicht genau was.

Dominik

Ja, ja, schwierig. Und das

Jochen

halt dann, ja, das lag halt einfach daran, dass

Jochen

der Variablename halt

Jochen

zu generisch war. Also sie können halt zu generisch

Jochen

sein, sie können halt aber auch zu speziell sein.

Jochen

Also ich meine irgendwie, keine Ahnung,

Jochen

der Java-File-Input-Buffer-Stream-Schlag-mich-tot-Reader

Jochen

ist halt auch irgendwie dann nicht mehr so der Sinn.

Jochen

Das ist auch nicht so schön.

Dominik

Ja, aber das ist vielleicht ein Geschmacksfall,

Dominik

vielleicht auch anwendungsfrei spezifisch.

Ronny

Ich glaube, eine Sache, die man ganz generell festhalten kann,

Ronny

ist, wenn man irgendwas refactoren möchte,

Ronny

also jetzt nochmal ganz generell gesprochen ist,

Ronny

dass einem der Unit-Tests oder funktionale Tests

Ronny

oder was auch immer für Tests sehr, sehr helfen können.

Ronny

Und nicht nur, dass man quasi das, was man refactored hat, dass man das vernünftig testet, das sollte eh klar sein, sondern wenn es hinreichend kompliziert ist, dass man auch einfach mal Test schreibt für den Bestandscode, dass man einfach sicher sein kann, was macht das eigentlich und dass sich das nicht verändert hat.

Ronny

Ich habe letztens, ich weiß nicht, ob das mit euch war, ob ich mit euch darüber gesprochen habe, mit dieser Oracle-Implementierung, wo die dann auch gesagt haben, das Ding war irgendwie dermaßen alt und verbuggt, dass die dann quasi alles komplett mit Unitests zementiert haben. Also jeden Bug und jedes merkwürdige Verhalten, das das System hatte, haben die mit Unitests zementiert. Die haben irgendwie ein Jahr lang, glaube ich, nichts anderes gemacht.

Ronny

Und dann haben die angefangen, das zu refactoren, weil die halt einfach Angst hatten, weil also teilweise war es wohl auch so in der Community, dass die Leute halt auch auf diesen merkwürdigen Verhalten oder Bugs, wie man es halt nennen möchte, halt aufgebaut haben und Features draufgesetzt haben.

Ronny

Und die konnten das den Leuten nicht einfach wegnehmen, weil dann halt irgendwie ganz viele Sachen zerbrochen wären, weil das halt irgendwie so Teil der impliziten API gewesen ist und sowas.

Ronny

Und das kann tatsächlich auch helfen.

Ronny

Also ich habe das jetzt einmal gemacht, als ich jetzt ein größeres Teil angefangen habe zu refactoren, also einfach Tests für den Bestandscode zu schreiben.

Ronny

Das macht keinen Spaß.

Jochen

Ja, aber das mit den Tests ist auch ein gutes Stichwort.

Jochen

Das ist halt auch so, also natürlich, es gehört, dass man Sachen testet und das ist auch auf jeden Fall super.

Jochen

Also das ist eine der Dinge, die viel gebracht haben.

Jochen

Auf der anderen Seite, muss ich sagen, Test Driven Development, weiß ich nicht so genau.

Jochen

Da würde mich jetzt doch nochmal allmählich interessieren,

Jochen

ob es wirklich Leute gibt, die das so durchziehen

Jochen

und die das gut finden.

Jochen

Vielleicht müssen wir mal jemanden suchen.

Dominik

Es kommt drauf an, wenn man es selber schreibt

Dominik

und wenn man weiß, was man tut.

Dominik

Wenn man halt

Dominik

tatsächlich weiß, was man raushaben will, dann schreibt man

Dominik

einen Test, der das quasi,

Dominik

die Logik, die man implementiert, die zwei Methoden, quasi

Dominik

mit einem Testcase so

Dominik

das Ergebnis hat. Also zum Beispiel

Dominik

du hast halt einen Datensatz und

Dominik

du kennst das Ergebnis, das heißt, du machst einen Beispiel-Datensatz

Dominik

und am Ende weißt du, das Ergebnis kommt raus

Dominik

und dann weißt du ja quasi schon

Dominik

implizit in der Stelle wahrscheinlich

Dominik

oder explizit so ein bisschen, also du kannst

Dominik

auch hinschreiben in

Dominik

Logik, wie das

Dominik

aussehen soll, was muss passieren, damit das passiert,

Dominik

dass das stimmt und dann kannst du den Methoden schon die

Dominik

richtigen Namen geben, die du dann irgendwie füllen musst,

Dominik

die am Ende rauskommen sollen,

Dominik

wenn das jetzt nicht zu komplex ist und dann kannst

Dominik

du das implementieren und dann, wenn das für

Dominik

dein Testcase stimmt, wirst du ziemlich sicher sein, dass das

Dominik

auch für die anderen Fälle laufen

Dominik

sollte.

Jochen

Ja, aber ...

Dominik

Und wenn du das halt so machst, das ist halt so ein TDD-Fall,

Dominik

wo ich sagen würde, das kann dann ganz gut sein.

Dominik

Du kennst quasi einen Testfall.

Jochen

Wenn du genau weißt, was passieren soll.

Dominik

Genau, du kennst den Testfall.

Dominik

Du weißt den Testcase, den kennst du schon.

Dominik

Du weißt, okay, das sind meine Testdaten

Dominik

und du weißt, das Ergebnis von dem Test ist so.

Dominik

Und dann kannst du dafür dann eine Methode schreiben,

Dominik

die diesen Testfall richtig macht.

Dominik

Und wenn du quasi alle Testcases hast,

Dominik

dann ist dein Code schon richtig.

Dominik

Und das ist ein cooler Fall, wo man das machen kann,

Dominik

wo man dann halt für generische Fälle

Dominik

Code hat, der funktioniert und wo TDD Sinn macht.

Dominik

Wenn du es aber nicht hast, weil du nicht weißt, ob die Testcase

Dominik

vollständig sind, ob du irgendwelche Edge-Cases hast oder so was,

Dominik

dann ist es halt super nervig, weil dann

Dominik

muss ich Testhausen mal umbauen, irgendwas wegmocken.

Ronny

Aber das ist ja auch Teil des Prozesses,

Ronny

dass du halt die Tests auch ständig anpasst.

Ronny

Ja, genau. Also ich glaube,

Ronny

ich glaube, TDD, der größte

Ronny

Vorteil davon ist einfach,

Ronny

dass man erstens Code so schreibt,

Ronny

dass er testbar ist, weil das

Ronny

habe ich früher auch nicht so gemacht. Wenn man keine Unitest

Ronny

schreibt, dann schreibt man Code anders.

Ronny

Und das ist schlechterer Code.

Ronny

Das ist einfach eine generelle, richtige Aussage.

Ronny

Und das Zweite ist,

Ronny

du wirst, du kommst, wenn dann plötzlich

Ronny

der PO oder irgendwer Stress macht, dann lässt

Ronny

man die Tests nicht weg, weil die sind schon da.

Ronny

Ich glaube, das sind die beiden Hauptverkaufsargumente

Ronny

dafür.

Jochen

Ja, du kannst halt keinen ungetesteten Code

Jochen

schreiben. Das ist halt irgendwie natürlich so ein bisschen,

Jochen

das ist halt schon vielleicht gut.

Jochen

Aber eben,

Jochen

das gab es auch in der letzten Django-Chat-EP

Jochen

so, ich weiß nicht, letzte, vorletzte,

Jochen

keine Ahnung, da gab es auch, ging es auch

Jochen

um das Thema Test-Development und auch alle

Jochen

da meinten so, ja, ganz gut,

Jochen

ist eigentlich vielleicht nicht so schlecht, aber

Jochen

der Konsens in der Runde war halt auch so,

Jochen

naja, so wirklich machen, macht das dann doch keiner.

Jochen

Und auch mit dem Argument

Jochen

und das,

Jochen

was wir, glaube ich, auch schon mal gemacht haben, dass halt

Jochen

das Problem ist, wenn man

Jochen

jetzt, wenn klar ist, was zu tun ist,

Jochen

dann ist das vielleicht machbar, aber

Jochen

ich hatte auch heute wieder so einen Fall, wenn man nicht

Jochen

weiß, was man machen will, dann ist das

Jochen

ganz blöd, weil

Jochen

das hilft einem überhaupt nicht, dass man

Jochen

dann mit dem Text Test anfängt, weil man muss sowieso

Jochen

irgendwie rumprobieren und das dann

Jochen

in einem Test zu machen, macht irgendwie nicht so viel Sinn.

Jochen

Das Buch

Jochen

macht da auch einen interessanten

Jochen

Punkt und sagt halt, naja, also

Jochen

wenn du Test

Jochen

development machst, dann zwingt

Jochen

dich im Grunde das

Jochen

das Vorgehen,

Jochen

dir von Anfang an ganz

Jochen

viele detaillierte Gedanken

Jochen

über die Implementation zu machen, an der

Jochen

Stelle, wo das vielleicht überhaupt nicht

Jochen

zielführend ist, sondern du willst vielleicht

Jochen

am Anfang die erstmal Gedanken über das Design oder

Jochen

Abstraktionen machen und nicht über die Implementierung

Jochen

und das geht mit Test Driven Development

Jochen

gar nicht so richtig. Und was

Jochen

er dann vorschlägt, ist zu sagen, mach doch lieber

Jochen

Document

Jochen

oder

Jochen

Implementierst die Methoden, schreibst den Document dazu,

Jochen

weil das tut toll und schreibst dann

Jochen

sondern du schreibst halt nur

Jochen

in natürlicher Sprache sozusagen, was die

Jochen

Abstraktionen sind, was die ungefähr machen sollen

Jochen

und mit denen spielst du so lange rum, bis dir das

Jochen

Design gefällt und dann fängst

Jochen

du erst an, das zu implementieren.

Jochen

ehrlich gesagt, also ich versuche das jetzt,

Dominik

mal gucken, keine Ahnung. Okay, dann die Tests schreiben

Dominik

und dann implementieren vielleicht. Ja,

Jochen

aber genau, also ich weiß

Jochen

es nicht so genau, ob es wirklich funktioniert, weil ich habe immer so einen

Jochen

Verdacht, also bei mir ist es oft so, wenn ich irgendwie

Jochen

ich merke erst beim Rumprobieren

Jochen

damit und Rumspielen und Umstellen irgendwann

Jochen

ach, wie das Design eigentlich hätte sein

Jochen

sollen. Ich finde mir auch so. Ich kann das nicht

Jochen

gut mir vorher irgendwie,

Jochen

also, dass ich

Jochen

mit einem Design, dass ein

Jochen

gutes Design dabei rauskommen würde, wenn ich nur so

Jochen

mit abstrakten Geschichten rumspiele,

Jochen

das ist bei mir irgendwie nicht so.

Dominik

Man merkt ja auch mal ein paar Mal, wenn man auch das erweitert hat,

Dominik

also ist auch doch nicht so toll, dann musst du doch nochmal anders

Jochen

und für sich selber. Oft kommt halt die Idee für das

Jochen

Design aus der Implementation.

Jochen

Also dass ich merke so, okay, an der Stelle

Jochen

mache ich zwei, drei Umstellungen und dann merke ich so, okay,

Jochen

das ist jetzt alles, jetzt brauche ich gar kein Objekt mehr, das nehme ich da einfach

Jochen

und dick oder so und dann, oh, dann kann ich das ja so ausdrücken

Jochen

und dann kann ich so, oh, und jetzt ist das

Jochen

Design auch klar und

Jochen

das kommt halt aus dem, mit den

Jochen

Datenstrukturen rumspielen. Nicht so sehr

Jochen

aus dem sich abstrakte Gedanken machen.

Jochen

ich weiß es nicht. Ich probiere es mal aus, mal gucken.

Jochen

Also es klingt auf jeden Fall ganz interessant und es ist halt

Jochen

nochmal ein bisschen was anderes als Test-Driven

Jochen

Development. Und ja, ich glaube

Jochen

auch, das habe ich bisher einfach unterschätzt und

Jochen

irgendwie nicht richtig gemacht mit den

Jochen

Dokumentationen und Kommentaren. Das ist wahrscheinlich

Jochen

doch deutlich wichtiger, als ich gedacht habe. Da muss ich mal

Jochen

mehr machen.

Dominik

Ja, das klingt gut. Also tatsächlich

Dominik

dokumentierter Code. Sehr zen, sehr zen,

Dominik

sehr zen auf Weißen.

Dominik

Ah, ja.

Dominik

Ja, ich glaube, wir haben bei Refactoring

Dominik

ich habe nicht mehr so viel auf meinem Zettel,

Dominik

was ich hätte. Ich kann mal gerade gucken,

Jochen

ob ich habe, ich habe mir, was habe ich mir denn aufgeschrieben,

Jochen

was ich dazu noch? Ich muss natürlich sagen, mein

Dominik

Thyssen kaputt hatte ich am Anfang schon erwähnt, aber das ist nicht so schlimm.

Dominik

Ja, übrigens, ach so, genau,

Jochen

ich meine, das ist jetzt

Jochen

das, was ich mir aufgeschrieben habe,

Jochen

Red Flag, irgendwie extensive Dokumentation

Jochen

schreibt er auch, obwohl er eigentlich sagt,

Jochen

voll gut, er sagt, ja, wenn Leute

Jochen

viel, viel dokumentieren,

Jochen

ist auch ein Zeichen für schlechtes Design,

Jochen

weil das ist ja etwas, was

Jochen

nicht, ist ja nicht gut, dass man das hat, sondern

Jochen

Je mehr man dokumentieren muss ...

Jochen

Man muss viel erklären, ist auch ...

Jochen

Ja, wenn du viel erklären musst, ist nicht gut.

Jochen

Eigentlich sollte es offensichtlich sein

Jochen

und man sollte es mit wenig ...

Jochen

Ja, so ein oder zwei Sätze am Anfang,

Jochen

was machen, was behaupten,

Jochen

dann muss man die ganze Funktion nicht lesen,

Jochen

wenn das stimmt.

Dominik

Aber das finde ich auch so eine Sache,

Dominik

warum ich Type-Ins gut finde.

Dominik

Jetzt nicht, weil es unbedingt

Dominik

so die Typensicherheit alles sicherstellt,

Dominik

aber wenn ich halt den Funktionsnamen lese,

Dominik

der gut gewählt ist,

Dominik

die Type-Ins, die dazu passen,

Dominik

zu den Parametern, die die Funktion hat

Dominik

und dann den Dockstring,

Dominik

der idealerweise mir erklärt, was das macht,

Dominik

dann habe ich ja den Return-Wert,

Dominik

dann muss ich gar nicht in die Funktion reingucken, um dir alles genau

Dominik

angucken, sondern ich weiß halt, was sie tut, ah ja, okay,

Dominik

und kann zum nächsten übergehen. Das ist super,

Dominik

super schön zum Arbeiten. Ja, das ist dann halt

Jochen

beispielsweise eine gelungene Abstraktion, wenn du halt

Jochen

sozusagen der Interface

Jochen

Dokumentation schon ansehen kannst,

Jochen

also alles, daraus alles

Jochen

erfährst, was du brauchst, um das benutzen zu können.

Dominik

Ja, genau, also du kannst einfach die Docs

Dominik

skimmen, ja, und kurz gucken, ja, okay, jetzt mach das

Dominik

und das und das, musst gar nicht so genau den Code hier angucken,

Dominik

dann ist das auch egal, ob die Leute da so

Dominik

ordentlich gearbeitet haben irgendwann, ne? Ja.

Dominik

Ja, absolut.

Dominik

Ja, ja.

Jochen

Ich habe jetzt gerade noch mal geguckt, ich habe auch sonst nichts mehr

Jochen

eigentlich, was ich unbedingt unterbringen wollte.

Jochen

Nein, bei mir ist auch ab alles untergebracht.

Jochen

Oh, jetzt sind wir auch, wir sind ja schon relativ

Jochen

weit dran, wir haben immer viele Leute, die ab dann

Jochen

abspringen, jetzt kann man

Jochen

eine Meinung

Jochen

von Leuten, die sich

Jochen

die bis hierhin durchgehalten haben,

Jochen

wäre ganz interessant vielleicht.

Jochen

Und zwar habe ich, das war letztens

Jochen

im Stream, hat dann irgendjemand geschrieben, meinte so

Jochen

ach, es wäre doch voll gut, wenn ihr sowas hättet wie ein Discord

Jochen

oder so. Wollen wir sowas

Jochen

haben. Ich meine, wir haben Slack, aber Slack ist

Jochen

irgendwie, wie hat das jemand dann genannt? Ah, Slack ist ja

Jochen

eher so ein Boomer-Discord.

Jochen

Ja. Also Discord habe ich übrigens auch.

Dominik

Habe ich auch für meine eigenen Zeugs schon

Dominik

online einmal und so. Also ja,

Dominik

wir gucken uns den Teller an, aber ist ja kein Problem.

Jochen

Ja, oder ich meine, welche Plattform

Jochen

sollte man da verwenden? Discord. Discord,

Jochen

echt? Ja. Weil, also die Firma

Jochen

dahinter ist auch so ein bisschen unsympathisch, ne?

Jochen

Ja. Ja, die machen auch so NFT-Kram

Jochen

und Krypto...

Dominik

Dass das sagt jemand, der

Dominik

Werbung für VPNs macht.

Dominik

Spoiler, nein, ich weiß nicht.

Dominik

Ja, es ist alles so ein bisschen,

Jochen

ich weiß nicht so genau.

Jochen

Ja, okay, also Discord wäre gut.

Jochen

Ja, weil ich meine, dann könnten halt auch Leute da

Jochen

irgendwie mal, man könnte mit Leuten chatten

Jochen

und so, also könnten Leute live,

Jochen

wir machen jetzt noch nichts live.

Dominik

Also Discord würde ich auch

Dominik

sagen, ist cool.

Dominik

Was cool an Discord ist,

Dominik

das nutzen halt alle von früher

Dominik

und so vom Gaming und so weiter.

Dominik

Man kann halt super easy da halt irgendwie reingehen.

Dominik

Man hat halt Video, man hat halt Chat, man hat halt

Dominik

alles eigentlich, was man so will.

Dominik

Die Firma kenne ich gar nicht. Du hast irgendwas Böses über die Firma gehört?

Dominik

Ja, also

Jochen

es ist halt nicht so, dass man das selber betreiben könnte.

Jochen

Du bist halt dann abhängig von der Firma, genau wie bei Slack.

Jochen

Ja gut, du machst halt einen Channel auch für dich.

Dominik

Ja, ich weiß so ein bisschen, was du meinst.

Jochen

Also ich würde das natürlich,

Jochen

mir ist schon sympathisch zum Beispiel auch,

Jochen

was sie technisch machen. Die haben ja auch irgendwie

Jochen

da Rekorde

Jochen

aufgestellt, mit wie viel Clients

Jochen

an einem Server hängen können, mit Erlangen

Jochen

und so. Die machen halt

Jochen

das ist alles schon cool,

Jochen

aber irgendwie, ja, das ist halt

Jochen

eine Firma, also ich würde es gerne selber hosten können

Dominik

oder sowas. Ja, aber diese ganzen Indie-Lösungen,

Dominik

die es für sowas halt gibt, ich weiß nicht, die sind halt von

Dominik

der Nutzerbasis, glaube ich, gar nicht so interessant.

Dominik

Ja, man muss

Jochen

wahrscheinlich dahin gehen, wo die User sind, ne? Ja, genau.

Jochen

Hey, wir haben einen Instagram-Count.

Jochen

Gefällt mir gar nicht, aber gut.

Jochen

Sind wir doch nicht auf Instagram, schade.

Jochen

Ja, gefällt mir nicht. Genau, ja,

Jochen

Dann lass es doch noch auf Facebook.

Dominik

Nee, aber Discord finde ich ganz okay, es geht.

Dominik

Also bei mir ist eh immer an.

Dominik

Ja, gut, okay.

Dominik

Johannes auch da.

Jochen

Ja, ich weiß, der hat ja da auch irgendwie

Jochen

ein eigenes Ding aufgemacht, aber da ist auch gar nicht so wahnsinnig viel los.

Dominik

Ja, aber das liegt auch ein bisschen daran,

Dominik

also unter anderem,

Dominik

dass er das halt auch so wie seine Sachen

Dominik

benutzt, wie seine Spielfirma.

Dominik

Ja.

Dominik

Naja, aber wie auch immer.

Dominik

Nutzst du auch Discord auf der Arbeit?

Dominik

Nein. Okay, also ich habe meine eigene

Dominik

mit Leuten, ich würde da auch mit Kunden drüber sprechen,

Dominik

also ich finde, das ist so die beste

Dominik

Teams-Alternative zum Beispiel, wenn ich jetzt

Dominik

so Kundenprojekte habe, wenn die auf meine Plattform kommen

Dominik

und ich nicht auf deren muss, dann

Dominik

die Kommunikation ist irgendwie schöner, professioneller,

Dominik

sauberer, cleaner irgendwie.

Dominik

Aber es ist noch wieder

Dominik

so eine ästhetische Sache und keine Ahnung,

Dominik

alles kommerzieller.

Jochen

So besser als Teams zu sein, ist jetzt nicht so

Jochen

furchtbar schwierig, ehrlich gesagt.

Jochen

Beispiel, weil wir darüber reden, wo die

Jochen

User sind und so.

Dominik

Die sind ja auch schon alle leider da, meistens dann.

Dominik

Ja, ja, ja.

Dominik

Wollen wir noch Pics machen?

Dominik

Stimmt, wir haben noch Pics.

Dominik

Bonny darf anfangen.

Ronny

Ich habe mich jetzt motiviert von der letzten DjangoCon

Ronny

jetzt echt intensiver mal mit HTMX auseinandergesetzt.

Ronny

Oh ja.

Ronny

Und das finde ich wirklich sehr, sehr cool.

Dominik

Ja, dann machen wir auch irgendwann eine Folge.

Dominik

Das ist tatsächlich toll.

Ronny

Ich bin ja tatsächlich auch nicht so ein Riesen-JavaScript-Freund.

Ronny

Und dass diese Karotte quasi kleinseitige Weblogik

Ronny

ohne JavaScript zu schreiben, ist schon sehr, sehr groß für mich.

Ronny

Ich habe da letztens noch einen sehr interessanten Vortrag

Ronny

von dem Macher gehört.

Ronny

Ich glaube, das war von der ...

Ronny

Das war Packern US oder so.

Ronny

Carson Cross heißt der irgendwie.

Ronny

Ja, genau, genau.

Jochen

Der hat auch sehr schön erklärt, wie REST eigentlich funktioniert.

Ronny

Genau, und dass es ja eigentlich darum geht,

Ronny

HTML-Schnipps hin und her zu schicken

Ronny

und nicht JSON-APIs zu bauen.

Ronny

Ja.

Ronny

Und es ist ein super interessanter Vortrag,

Ronny

hat mir ein Kollege empfohlen.

Ronny

Und ich habe mich jetzt damit nochmal beschäftigt, habe heute noch ein kleines Feature damit gebaut.

Ronny

Ich muss gestehen, ich glaube, ich habe es noch nicht so 100 Prozent, also es tut die Beispiele, die da drin sind, relativ simpel.

Ronny

Also ich klicke irgendwo, dann tauchst du dich was aus, das ist klar.

Ronny

Aber wenn man halt so ein bisschen darüber hinausgehen möchte und halt, ja, einfach mal irgendwo Daten schicken oder so, also mal Postdaten schicken, die Patterns habe ich noch nicht so ganz raus.

Ronny

Ich bin leider nicht ganz ohne jQuery ausgekommen, das hat mich persönlich dann sehr geärgert, weil erstens jQuery und zweitens JavaScript.

Ronny

Ähm, aber, ähm,

Ronny

ich glaube, wenn, also die Dokumentation

Ronny

lässt leider in meinen Augen ein bisschen zu wünschen

Ronny

übrig und googeln kann man auch nicht, weil

Ronny

Google immer denkt an mein HTML.

Ronny

Ähm, das ist beides ein bisschen blöd.

Ronny

Ja, wie HTTPX ist auch mal doof.

Ronny

Äh, ja, genau. Und, ähm,

Ronny

ja, aber ich, ich glaube, wenn,

Ronny

äh, dass das sehr viel Potenzial hat, das macht auf jeden Fall

Ronny

sehr viel Spaß, damit zu arbeiten. Ähm,

Ronny

und im Endeffekt die Idee ist halt einfach, dass man halt

Ronny

Custom JavaScript Code durch

Ronny

äh, Custom HTML Tags

Ronny

ersetzt. Mhm. Und, ähm,

Ronny

Das ist echt cool. Also ich hab da auch

Ronny

letztens meine Findings, wie man das mit

Ronny

Django verheiraten kann,

Ronny

auch in einem kleinen Artikel zusammengeschrieben.

Jochen

Das hab ich mir noch nicht angeguckt. Ich weiß nur, dass es gibt. Es gibt ein

Jochen

Paket von Adam Johnson,

Jochen

also der mit dem

Jochen

Was tut das Paket denn?

Ronny

Tatsächlich sind das eigentlich vier Zeilen Code,

Ronny

man muss dem CSF beibringen und das war's.

Ronny

Ah, okay. Also das ist

Jochen

Django HTMX heißt das Paket, glaube ich.

Jochen

Ah, okay. Ich weiß gar nicht, was das tut.

Jochen

Weiß ich auch nicht. Aber das ist auf jeden Fall,

Jochen

Der Autor ist auf jeden Fall

Jochen

schon mal ein Hinweis darauf, dass man sich das mal

Jochen

angucken sollte. Auf jeden Fall, ja.

Jochen

Und ja,

Ronny

genau. Ja, muss ich echt mal machen, weil wie gesagt,

Ronny

ich habe es halt einfach zu Fuß gemacht, weil ich wusste, dass das Paket

Ronny

existiert und sind, wenn man es halt mal einmal gefunden hat,

Ronny

das sind literally halt einfach vier Zeilen JavaScript,

Ronny

die man einbinden muss, dass man halt dem

Ronny

HTMX quasi den CSF-Token injectet.

Ronny

Ja, der muss auf jeden Fall in unserer nächsten

Ronny

Folge hören, da werden wir da auch nochmal drauf eingehen.

Ronny

Joa. Ja.

Ronny

Jochen?

Jochen

Ich weiß nicht so genau, was pücke ich denn

Jochen

Also ich picke Pendulum.

Jochen

Ich glaube, das hatte ich schon mal gepickt. Weiß ich nicht.

Jochen

Ich weiß immer, weil ich kann mir immer nichts merken.

Dominik

Du musst immer so einfache Sachen picken. Ja, kennst du Pendulum?

Dominik

Nee. Nein. Das ist eine Date-Time-Parsing-Bibliothek.

Dominik

Cool. Ja, da kannst du so ein bisschen

Dominik

einfacher, so ein bisschen schöneres Interface, ein bisschen moderner.

Dominik

Früher hat man, glaube ich, Maya viel benutzt.

Dominik

Kennst du, wie es irgendwie ist, als du nicht tot bist oder so?

Dominik

Und ja, aber da kann man so schöne Sachen machen,

Dominik

wenn man Date-Times irgendwie machen

Dominik

möchte, in Time-Zone wechseln und

Dominik

so zu Strings umbauen und sowas.

Dominik

Okay, interessant. Ich bin letztens

Dominik

habe ich, das war, nein,

Dominik

das war gestern, glaube ich.

Dominik

Irgendwie so einen kleinen,

Jochen

da war, das mich mit JavaScript

Jochen

beschäftigt und Zeit.

Jochen

Ich wollte eigentlich nichts Kompliziertes machen. Ich wollte zum Beispiel

Jochen

einfach nur ein Date-Objekt einfach darstellen.

Jochen

Ja. Und

Jochen

das war

Jochen

ganz schrecklich. Also

Dominik

Pendulum ist für Python, für sowas, weil das auch immer

Dominik

nervt, meiner Meinung nach, sehr schön eigentlich.

Dominik

Ja, also da ist

Jochen

das JavaScript-Date-Ding, also

Jochen

das hatte, also sowas wie

Jochen

Stove-Time gibt es da halt einfach nicht.

Jochen

Wenn man jetzt die Differenz

Jochen

zwischen zwei Dates bildet,

Jochen

in JavaScript, ja, du hast ein Date-Objekt,

Jochen

ein anderes, machst eins minus das andere,

Jochen

was kommt dabei raus? Wisst ihr das?

Jochen

Ein Integer. Bei Python kommt so ein

Jochen

Time-Delta raus.

Jochen

Genau, bei JavaScript

Jochen

kommt die absolute

Jochen

Zeit in Millisekunden raus. Ja, tatsächlich.

Jochen

Was natürlich ein bisschen

Jochen

blöd ist, wenn man jetzt Mikrosekunden braucht oder keine Ahnung

Jochen

oder was ganz anderes oder

Jochen

oder halt an den Tagen

Jochen

interessiert ist oder so.

Jochen

Ja, das hat mich

Jochen

ja, ich kann es so empfehlen,

Dominik

weiß ich jetzt nicht, aber Pendulum in Python macht genau das

Dominik

so ein bisschen schöner, so ein bisschen mehr moderner

Jochen

vielleicht. Okay, gut. Keine Ahnung, ich kann es

Jochen

nicht mal angucken.

Jochen

Ist das du noch ein Pick?

Jochen

Ja, vielleicht picke ich einfach

Jochen

Blue statt Black.

Jochen

Macht im Grunde das gleiche, nur halt mit

Jochen

einem einfachen Tick statt

Jochen

Doppel-Einführungszeichen.

Dominik

Wir hätten noch mal letztens irgendwas mit Black, was man

Dominik

Darker. Darker war auch schön.

Dominik

Weil Darker macht nämlich inkrementelles Black und zwar

Dominik

immer nur auf die neuen Änderungen.

Dominik

Was ganz gut ist, wenn man halt

Jochen

so, dass es halt immer dunkler wird mit der Zeit.

Dominik

Und wenn man, weil das macht auch Sinn, dann halt

Dominik

als Git-Commit-Hook irgendwie einzusetzen. Darker, weil

Dominik

dann nur die neuen Sachen halt

Dominik

tatsächlich gelintet werden und das ist ganz schön.

Jochen

Okay, aber Blue ist ein bisschen, oh warte, was ich auch

Jochen

noch picke ist Pip-Tools. Da habe ich letztens auf Twitter gesehen

Jochen

auch jemand, ich habe

Dominik

angefangen, weil du mir das gezeigt hast, wollte ich gerade

Dominik

was damit machen und ich komme immer nicht dazu.

Jochen

weil ich habe nämlich auch, ich verwende ja sonst

Jochen

Poetry und

Jochen

genau, dann jetzt für das

Jochen

neueste Ding mit FastAPI und

Jochen

Frontend-Dings da, für mein

Jochen

Deploy-Teil, da habe ich jetzt auch

Jochen

Pip-Tools verwendet, weil mich Poetry so

Jochen

genervt hat, weil es so lange braucht und

Jochen

Also Pip-Tools sind so richtig toll, fand ich es jetzt auch

Jochen

und weil es halt oft auch irgendwie komisch kaputt

Jochen

geht und es ist schwer zu installieren.

Jochen

Pip-Tools gibt eine Empfehlung von dir?

Jochen

Ja, also genau, heute auf Twitter

Jochen

meinte jemand so, also Poetry

Jochen

eigentlich super sexy sieht das aus und so, aber ich bin

Jochen

durch. Ich nehme jetzt wieder PIP-Tools, weil

Jochen

es funktioniert einfach nicht.

Jochen

Und da dachte ich so, ja, und dann habe ich

Jochen

in diesem Twitter-Thread, den musst du dir mal auffallen,

Jochen

ganz viele Leute was Ähnliches gesagt haben. Also da

Jochen

viele Leute sagen so, oh, furchtbar langsam,

Jochen

geht immer kaputt.

Dominik

Ja, also es geht auch bei mir ständig, ständig

Dominik

kaputt und ich muss immer was fixen, das nervt

Dominik

extrem. Aber es ist schon

Dominik

eigentlich eine gute Idee und eigentlich sollte es genauso aussehen.

Jochen

So was sollte es geben, aber es sieht halt nicht richtig aus.

Jochen

Aber vielleicht sollte man es einfach mal fixen,

Dominik

anstatt was Neues wieder zu machen, was auch nicht

Dominik

funktioniert. Vielleicht.

Dominik

Gutes Schlusswort.

Dominik

Vielleicht sollte man das mal refactoren.

Dominik

Danke, Ronne, dass du wieder da warst.

Jochen

Vielen Dank für eure Aufmerksamkeit.

Jochen

Für die Einladung.

Dominik

Bleibt uns gewogen. Schaltet uns gerne wieder ein.

Dominik

Bis zum nächsten Mal. Bis dann mit Werbung.

Dominik

Tschüss. Tschau.