-
34c3 preroll music
-
Herald: Der Fefe hatte mich gebeten,
mich kurz zu halten, weil, er hat Angst,
-
dass der Talk nicht in die 30 Minuten passt.
Von daher gebe ich jetzt mal Gas und
-
sage: „Antipatterns und Missverständnisse
in der Software-Entwicklung“!
-
Und wie sagte jemand gestern?
„Ach Fefe! Das ist doch der mit der Kolumne
-
beim ehemaligen Nachrichtenmagazin!“
Here we go!
-
Applaus
-
Fefe: Hallo hallo. Hallo hallo. Ja, ja
vielen Dank, dass ihr so zahlreich
-
erschienen seid. Ein bisschen zahlreicher,
als ich gedacht habe. Nächstes Mal mache
-
ich doch lieber parallel zu Minkorrekt
wieder. Es geht um Antipatterns.
-
Antipatterns sind Sachen, die man macht,
die man häufig macht, die populäre
-
Maßnahmen sind, um ein Problem zu lösen,
die dann aber entweder gar nicht
-
funktionieren oder nach hinten losgehen.
Und ich habe mir gedacht, beim Congress
-
gibt es immer so schöne Streitereien um
das Motto. Da mache ich auch mal ein Motto.
-
Und das hier ist so ein Motto, was
ich sehr profunde finde, und wo ihr
-
hoffentlich im Laufe des Vortrags sehen
werdet, warum das das Motto ist. Ja, „wer
-
lesen kann, aber es nicht tut, hat keinen
Vorteil dem gegenüber, der das nicht kann“.
-
Die Struktur des Vortrags…
Applaus
-
Die Struktur des Vortrags will ich an
einem Beispiel kurz umreißen.
-
Es geht immer damit los,
dass wir ein Problem haben.
-
Dann geht immer Seal Team 6
los und hackt irgendwas.
-
Also denkt euch hier ein Team von
Spezialexperten. Ja ich will jetzt nicht
-
die Seals beleidigen, bestimmt auch alles
nette Leute. Und dann kommt eine Umsetzung,
-
da geht es meistens in die Hose.
Und dann haben wir einen Effekt, und
-
hoffentlich, hoffentlich eine Erkenntnis
gewonnen. Ich habe mir gedacht, wir
-
versuchen mal so eine interaktive
Komponente. Und zwar wenn man sich so
-
Übertragungen aus dem britischen Parlament
ansieht, dann gibt es immer so ein
-
Gemurmel, wenn die Leute zustimmen. Und
ich dachte mir, wenn ich sage, „Hebt mal
-
den Arm, wenn euch das mal passiert ist“,
dann haben die Leute vielleicht Angst, auf
-
dem Stream zu landen und sich zu outen.
Deswegen dachte ich, wir murmeln mal. Also
-
wenn einer von euch sich bei einem Muster
wiedererkennt, könnt ihr mal versuchen.
-
Wir gucken mal, ob das klappt. Ja,
vielleicht hört man das dann. Okay.
-
Also, erstes Problem. Dieses Bild, ich
möchte das gleich dazusagen,
-
Lachen
ist mir gespendet worden.
-
Ich liefere hier keine Kunden ans Messer,
und es geht nur um Anekdoten.
-
Also wer sich glaubt, wiederzuerkennen,
liegt wahrscheinlich falsch.
-
So, das ist ein typisches Problem
in der Software-Entwicklung:
-
die Versionierung von und die Backups
von alten Versionen aufzuheben.
-
Das ist hier, ich hoffe, ihr habt das gesehen
oben in der Ecke, das ist ein USB-Stick.
-
Und die typische Idee ist: Wir machen
jetzt mal ein Versionierungssystem!
-
Und das ist eine gute Idee. Die
Umsetzung ist dann gewöhnlich:
-
der, der gerade ein akutes
Problem hat, bastelt schnell was,
-
und dann kriegt man so ein Git. Und Git
ist eigentlich gut, aber man hat halt
-
nicht nur Git, sondern man hat dann noch
so ein paar andere Versionierungssysteme,
-
und da gehen dann die Probleme los. Ja
also, ich habe mal einen, ich habe mal so
-
einen Kunden gehabt, die meinten: „Ist im
Git“, und dann meinte der Typ daneben:
-
„Ja, musst noch sagen, in welchem“.
Also das kommt vor.
-
Lachen
Ein anderer Effekt, den man häufig
-
sieht, ist, dass jeder überall einchecken
darf. Und das führt dann zu so Sachen wie:
-
man meldet als Bug so was wie: „In dem
Image sind aber noch set-UID-Binaries“
-
oder sowas. Und dann machen die die alle
weg, und dann installiert man die nächste
-
Version, und dann sind wieder welche, und
dann sagt der Typ: „Ja, ich habe die zwar
-
alle weg gemacht, aber hat halt ein
Developer wieder rein gemacht“.
-
Also Versionierung reicht noch nicht.
Da muss man noch mehr machen.
-
Überhaupt die Idee, dass Leute Binaries
einchecken, ist eine ganz schlechte.
-
Das findet man immer wieder.
Ich rede jetzt hier nicht von png
-
oder irgendwie ein mpeg von einer Webseite
oder sowas, sondern so eine Library oder
-
ein Executable. Das sollte man
eigentlich nicht tun.
-
Es gibt ganz wenige Ausnahmen.
Wenn ihr eine von den Ausnahmen habt,
-
wisst ihr es, und ansonsten
macht es nicht!
-
Das hier ist jetzt natürlich überspitzt,
aber so ähnlich habe ich das schon
-
mal gesehen, dass Leute verschiedene
Versionen einchecken, aber nicht
-
verstanden haben, was eigentlich die Aufgabe
von so einem Versionierungssystem ist.
-
Das ist auch nicht gut, macht das nicht!
-
Ich habe dann immer so einen Ratschlag
am Ende von den jeweiligen Antipatterns.
-
Und mein Ratschlag für Versionierungssysteme
ist: Git ist schon in Ordnung.
-
Ich bin mir der Ironie bewusst, dass meine
eigene Software im Moment als CVS
-
im Internet ist. Das hat historische Gründe!
-
Lachen und Applaus
-
Patches hält man am besten klein, damit
man sie einzeln anfassen kann,
-
wenn sie nicht sauber applyen.
Das ist ein Riesenproblem, wenn jemand
-
so einen Megabyte-Patch abliefert.
Deswegen macht das nicht.
-
Wenn ihr größere Sachen vorbereiten müsst,
dann macht das nicht als einen großen
-
Patch, sondern nehmt einen eigenen Branch
dafür. So ein Versionierungssystem will
-
euch helfen. Also beschäftigt euch mit den
Features, die sie euch bieten.
-
Wenn man Annahmen hat, über, welche APIs
verfügbar sind, oder welche Versionen von
-
Komponenten drin sein sollen, sollte man
das im Build in einem Skript checken.
-
Und nicht erst anfangen zu bauen, und nach
zwei Stunden abbrechen, weil irgendwas
-
nicht geklappt hat. Sowas möglichst
vorher testen, damit es schnell failt,
-
damit man schnell reagieren kann.
-
Es gibt häufig so die Idee in Firmen, dass
man verschiedene Abteilungen hat und jede
-
hat ihr eigenes Versionierungssystem oder
ihr eigenes Repository. Und das kann
-
funktionieren, aber es ist sehr selten, ja?
Häufig, der… der…
-
die Sache, die stimmen muss, damit es
klappt, ist, dass die APIs stabil sind.
-
Und erfahrungsgemäß glauben alle, dass
ihre APIs stabil bleiben werden, und
-
sie sind es dann aber nie. Also wenn ihr
das vermeiden könnt, macht das nicht.
-
So, das nächste Problem ist: die Bugs
fallen immer unter den Tisch, werden
-
vergessen, gefixt zu werden. Und die
offensichtliche Lösung ist:
-
wir machen so einen Bugtracker.
Umsetzung ist natürlich wie immer Seal
-
Team 6. Und der Effekt, der sich ganz
schnell einstellt, ist, dass man merkt,
-
man hat ganz viele Bugs. Und das
ist dann gleich das nächste Problem:
-
wir haben so viele Bugs,
was machen wir jetzt?
-
Eine Sache, die ich inzwischen als
Antipattern sehe, ist: Priorisieren von
-
Bugs. Ja, so eine übliche Umsetzung ist:
man hat sowas wie „Severity: Blocker“
-
oder das ist ein Security-Bug – das soll
hier eine Checkbox sein. Und der Effekt
-
davon ist, dass alle anderen Bugs liegen
bleiben. Das kann man immer und immer
-
wieder beobachten. Also die… der
eigentliche… was ich so beobachte, der,
-
der Effekt, der die meisten Bugs tötet,
ist, wenn eine Komponente einfach
-
abgeschafft wird. Und dann kann man
alles schließen in der Komponente.
-
Dass tatsächlich mal sowas
weggeht, gibt es nicht.
-
Applaus
Es gibt ein schönes Wort dafür, wo mir
-
jetzt die Übersetzungsteams bisschen leid
tun, nämlich Bug-Welle, im Sinne von einer
-
Bugwelle vor so einem Tanker. Ich versuche
das gerade mal zu etablieren, als Begriff.
-
Ich finde den nämlich sehr schön. So, also
jetzt haben wir ganz viele offene Bugs,
-
was machen wir denn jetzt? Nächstes
Problem. Und eine Idee, die häufig kommt,
-
und die auch erstmal total super klingt,
ist, dass man bug-freien Code belohnt.
-
Und zwar am besten mit so einem Bonus, am
besten in Geld. Wenn euer Team keine
-
offenen Bugs hat, dann werdet ihr belohnt.
Und das führt eben dazu, das ist mir mal
-
passiert, dass ich so eine Mail gekriegt
habe von einem Typ, wo ich ein paar Bugs
-
gefilet habe, und der kommt und meint: „Du
Arschloch, jetzt ist mein Bonus weg. Ich
-
kann meine Hypothek nicht abzahlen!“
Und da wusste ich dann auch erstmal nicht
-
direkt, was ich dem sagen soll. Der hat
das dann selbst gelöst, indem er alle Bugs
-
zugemacht hat und zwar mit NOTABUG.
Lachen
-
Hat mir natürlich versprochen, dass die
trotzdem alle gefixt werden. Aber das
-
könnt ihr euch ja vorstellen, wie gut das
klappt. Also sowas ist sehr… ist sehr mit
-
Vorsicht zu genießen. Reward- und
Incentives-Sachen am besten nicht mit
-
Geld. Es gibt auch ein Anti-Antipattern
dazu. Nämlich habe ich mal erlebt, dass
-
jemand alle Bugs im Code gefixed hat, aber
im Bugtracker waren die noch offen. Und
-
dann habe ich nicht verstanden, bin
hingegangen, und dann hat er mir erklärt:
-
„Ja, die brauchen mich ja nicht mehr,
wenn die Bugs zu sind.“
-
Lachen und Applaus
Der hat halt gesehen, hat halt gesehen, um
-
ihn rum die Kollegen sind alle nach Indien
abgeschoben worden, die Projekte, und
-
hat sich gedacht: „Na, die lass ich lieber
offen, die Bugs, dann werde ich hier noch
-
ein paar Monate bezahlt.“ Das hat mir
echt, das fand ich echt atemberaubend.
-
Da habe ich so ein paar Tage schlecht
geschlafen. Weil das ist ja schon… was
-
für ein Selbstbild hat der denn, wenn er
glaubt, irgendwie diese, diese Einträge im
-
Bugtracker halten ihn da am Leben? Ganz
furchtbar. Aber das gibt es in kleineren
-
Ausmaßen häufiger, dass Leute Bugs offen
lassen, weil sie wissen: wenn die Bugs weg
-
sind, dann kommt der Chef mit der nächsten
To-Do-Liste. Und der einzige Weg, mal eine
-
Woche Luft zu haben, ist einfach, die Bugs
nicht zu fixen. Das gibt es häufiger,
-
achtet mal darauf in eurer Firma, ob
ihr das auch sehen könnt. Ich würde fast
-
wetten: ja. Das ist ein häufiges Pattern.
Das ist auch ein Klassiker hier. Man hat
-
ein tolles Projekt, und das ist wunderbar,
aber es funktioniert nur auf dem Rechner
-
vom Entwickler. Und die Idee ist: man hat
jetzt einen Build-Server, ja? Wir haben
-
jetzt einen Build-Server, da wird
gebaut, das ist eine neutrale Umgebung,
-
alles super. Seal Team 6 bastelt kurz
was, und das sieht auch echt geil aus, ja?
-
Hier, so Drohnen-assistierte
Baugeschichten. Aber übliche Sachen, die
-
halt fehlschlagen, ist, dass dieser Build-
Server von dem Team ist, und baut halt den
-
Code von dem Team. Und die anderen Sachen
werden aus irgendwelchen antiken Snapshots
-
von anderen Leuten reingezogen. Oder was
ich auch mal gesehen habe: dass Libraries
-
dann so per SMB da reingelinkt werden.
Und das ist natürlich totale Scheiße, ja?
-
Aber das passiert, so was passiert. Eine
häufige Sache, die man auch sieht, ist,
-
dass man so einen Build-Server hat, aber
da muss dann jemand hinlaufen und so
-
„Build“ klicken. Und das ist auch nicht
schlau. Ich habe hier mal versucht, ein
-
Bild herauszusuchen. Die Idee beim
Build-Server ist es, dass der am besten
-
automatisiert baut, und zwar mindestens
einmal täglich. So, das habe ich auch
-
schon erlebt: der Build ist
fehlgeschlagen, und dann hat der
-
Entwickler eben auf dem Build-Server
angefangen, irgendwelche Dateien zu
-
editieren. Das ist jetzt gerade im
Wachstum von Devops ein Problem, was wir
-
häufiger sehen werden, glaube ich. Das
macht natürlich den Vorteil vom Build-
-
Server komplett kaputt, ja? Weil, dann habe
ich wieder den Effekt, das ist ja der
-
Rechner vom Developer, aber es ist halt nicht
mehr der unter seinem Tisch, sondern in
-
dem Rack da hinten, wo „Build-Server“
dransteht. So, ich hoffe, dass wir demnächst
-
ein Debian haben werden, was diese
Namenskonvention übernimmt.
-
Gelächter
Das sieht man auch häufig, ja, nicht nur
-
auf Build-Servern, sondern das wird halt
irgendwann aufgesetzt und danach bleibt
-
das halt so. Und das hält das ganze
Projekt zurück, weil dann irgendwelche
-
Software-Versionen da drauf sind. So übliche
Sachen sind irgendwie eine SSL-Library,
-
die kein aktuelles TLS 1.2 kann. Und das
werden wir mit 1.3 demnächst wieder haben,
-
das Problem. Oder irgendwie ein uraltes
C++, und dann können die Leute die neuen
-
Features nicht benutzen. Also das ist
alles ganz furchtbar. Will das mal hier
-
mit so einem schönen Müllhaufen
illustrieren. Der Grund, warum man einen
-
Build-Server hat, ist, dass man täglich
bauen kann, automatisiert, ohne dass da
-
jemand hingehen muss, und ohne dass jemand
hingehen kann, um irgendwas zu fixen. Da
-
gibt es keine Interaktion außer: „Bau mal
diese Version“, ja? Der Build soll
-
deterministisch sein. Das ist leider
unabhängig vom Build-Server, muss ich euch
-
erzählen. Es gibt tatsächlich Build-
Prozesse, da fällt jedesmal ein anderes
-
Binary raus, auch wenn man keine neue
Version ausgecheckt hat, weil irgendwie
-
parallel gebaut wird und irgendwelche
Dateien, die gebraucht werden, werden
-
asynchron von anderen Teilen aus dem
Parallel-Build erzeugt. Und wenn man Glück
-
hat, kommt die richtige an. Und wenn man
Pech hat, halt nicht. Also das muss man
-
fixen. Das ist Arbeit. Und es wäre mir
sehr lieb, dass so Open-Source-Entwickler
-
auch alle dafür sorgen, dass ihre Projekte
mit beliebiger Parallelität baubar sind.
-
Der nächste Grund für Build-Server
ist Agilität.
-
Applaus
Ja? Wenn ich irgendwas kaputtgemacht habe,
-
dann soll keine Panik ausbrechen, sondern
dann sage ich „Rollback“ und bau halt die
-
Version von vorhin nochmal, die
funktioniert hat. Wenn das nicht ein
-
Knopfdruck ist, dann könnt ihr den Build-
Server auch wegschmeißen. Und natürlich
-
möchte man möglichst schnell mitkriegen,
wenn jemand was eingecheckt hat, was den
-
Build bricht. Aber nicht sanktionieren!
Ich habe mal so eine Firma erlebt, die hat
-
dann so ein Britney-Spears-T-Shirt gehabt,
und das musste der Typ tragen, der den
-
letzten, zum letzten Mal den Build
gebrochen hat.
-
Lachen und Applaus
Macht das nicht. Das hat gut funktioniert,
-
bis sie so einen Britney-Spears-Fan als
Angestellten hatten.
-
Lachen
Ja. So, also das nächste Problem: ich habe
-
jetzt zwar einen Build-Server, und der
baut das zwar unabhängig vom
-
Entwicklerrechner, aber das Binary
funktioniert nur auf dem Rechner vom
-
Entwickler. Ist ein subtil anderes
Problem, aber verwandt. Und das löst man
-
heute mit Docker, ist ja klar!
Applaus
-
Und Docker ist im Prinzip keine schlechte
Idee. Man darf halt nicht Seal Team 6
-
basteln lassen. Denn da kommen
dann so Effekte wie: ich lutsche mir
-
irgendwelche Images von irgendwo aus dem
Internet rein. Klassiker sind so Ramses-
-
der-Zweite-Debian und MySQL drei Punkt
irgendwas von neunzehnhundert-äh.
-
So, dafür ist Docker nicht da. Docker ist
gerade dafür da, dass das agil änderbar
-
ist. Und wenn ihr das nicht macht, dann
ist es, als wenn ihr nicht lest. Könnt ihr
-
euch das gleich sparen. Also ich habe hier
mal Frankenstein als Illustration
-
gebracht. Das bringt nichts. Dann habt ihr
so ein Schrott-Projekt am Ende. Ich sehe
-
das häufig in der Industrie, dass die
Leute alle Nachteile mitnehmen, aber die
-
Vorteile gezielt stehen lassen.
Lachen und Applaus
-
Häufig gerade bei so Build-Systemen und
Docker ist, dass man die Komponenten in
-
irgendwelchen statischen Versionen hart-
codet, die halt aktuell waren, als es
-
aufgesetzt wurde, und danach nicht mehr
geupdatet werden, ja? Also ich habe in den
-
letzten Jahren immer mehr Leute mit
Build-Servern gesehen, die alles
-
automatisiert bauen. Und alle Dateien
im Image haben so denselben Time-
-
Stamp grob. Also man sieht, dass es alles
frisch gebaut wurde, aber es sind trotzdem
-
Versionen von 2004. Das ist sehr häufig,
achtet darauf bei euch, ja? Und wenn ein
-
Zulieferer euch Kram gibt, der vom
Build-Server kommt mit alten Versionen,
-
dann weist ihn darauf hin. Negatives
Feedback. Das ist sonst wie so ein
-
Rollator: bremst nur. Container hat man
für automatisiertes Deployment in
-
deterministischem Zustand. Das ist eine
Sache, die haben fast alle verstanden.
-
Aber was nicht so verstanden wird, ist
dieser, der Rollback ist eben auch
-
trivial, wenn man das mit so einem Docker-
System baut. Dann klicke ich halt „Mach mal
-
die alte Version“ und dann fällt das Image
der alten Version raus. Das ist ein
-
Feature, das ist nicht ein Seiteneffekt,
sondern das ist einer der Gründe, warum
-
man das überhaupt hat. Nutzt das auch.
Das ist nicht mehr… es tut nicht mehr weh,
-
wenn man was kaputtmacht im Build,
sondern dann kann ich zurückrollen. Nicht
-
nur im Versionierungssystem, sondern ich
kann auch einfach komplett, einen neuen
-
Build, fällt dann halt raus. Und am besten
macht man sowas über die Mittagspause, ja?
-
Daher vorhin der Ratschlag, im Skript
Abhängigkeiten testen. Und nicht nach zwei
-
Stunden den Build failen lassen.
Docker ist… und Container sind
-
eigentlich eine gute Idee. Aber die
meisten Leute nehmen nur die Nachteile
-
mit. Komponenten kann man agil updaten.
Das muss man auch tun. Also ist hier keine
-
schwarze Magie, die ich hier erzähle. Aber
es ist erstaunlich, wie viele Leute das
-
nicht machen. Und der mir als Security-Typ
natürlich am wichtigsten erscheinende
-
Aspekt bei Containern ist, dass man damit
Komponenten im Gesamtsystem isolieren kann
-
voneinander. Dass nicht ein Typ, der
diesen einen Prozess hackt, automatisch
-
alle anderen im Zugriff hat. Sondern die
laufen halt in ihren eigenen Containern.
-
Aber in der Praxis sieht man, dass dann
der Monster-Container gebaut wird mit den
-
50 Komponenten drin. Das ist nicht gut.
Also nehmt alle Vorteile mit. Richtig gut
-
ist das natürlich erst in Kombination, ja?
Der Git hat alle Versionen und dem Build-
-
Server kann ich eine Version zurufen und
dann fällt ein Image raus ohne
-
Abhängigkeiten. So, wenn ihr das nicht
habt, dann benutzt ihr das nicht richtig.
-
Ganz einfach. Das nächste Problem ist: Der
Code funktioniert nicht. Das kennen
-
wahrscheinlich auch alle, ist ein Problem.
Was machen wir jetzt? Und die Lösung ist:
-
Unit-Tests! Und die Umsetzung ist häufig:
ich habe hier gerade einen Bug, den fixe
-
ich mal, und den Check, ob der Bug weg
ist, den mache ich jetzt als Unit-Test. Ja
-
und das ist nicht gut. Da kriegt man dann
so eine Coverage von 2,3 Prozent, wenn es
-
hoch kommt. Und ich weiß nicht, ob ihr
alle das Video hier gesehen habt. Das war
-
so ein Automat, der erkennen sollte, ob
eine Hand drunter gehalten wurde. Und der
-
wurde halt von Weißen gemacht. Und die
haben halt nie eine andere Hautfarbe
-
getestet. Und da kommt dann halt nix raus.
So, das ist ein typischer Fall von „Unit-
-
Test-Abdeckung zu gering“. Ich glaube
auch, dass hier die Perspektive die
-
falsche ist häufig. Die Leute glauben, sie
machen Unit-Tests, damit sie wissen, dass
-
der Code jetzt okay ist. Nein! Unit-Tests
sind dafür da, dass sich was ändern kann
-
und [man] sehen kann, ob es -noch- geht.
Damit ich keine Angst mehr haben muss,
-
alten Code anzufassen. Das ist das, was
Unit-Tests euch abnehmen: die Angst, in
-
altem Code was zu fixen. Weil ihr den
nicht komplett versteht oder so. Und
-
je mehr Abdeckung ihr mit den Unit-Tests
habt, desto stärker ist diese Waffe.
-
Nutzt das.
Applaus
-
Ich muss hier ein bisschen durchgaloppieren,
weil ich zu viele Folien habe. Ich hoffe,
-
das verzeiht ihr mir. So, das nächste
Problem sind, dass die Leute nur positive
-
Tests haben. Die gucken: funktioniert das
hier? Und der Effekt ist normalerweise so gut
-
wie keiner, denn die ganzen interessanten
Bugs sind in der Fehlerbehandlung, dafür
-
braucht ihr auch Unit-Tests. Und zwar
müsst ihr eigentlich für alles, was
-
fehlschlagen kann, einen Test haben, der
das fehlschlagen lässt. Und dann gucken,
-
ob das immer noch funktioniert, wie es
soll. Das sind die Sachen, die am Ende
-
über Bande woanders einen Fehler erzeugen,
ja? Irgendwie eine Memory Corruption in
-
einem Fehlerfall, oder irgendwie „RAM wird
nicht freigegeben im Fehlerfall“. Und dann
-
stellt sich raus: das kann man als
Angreifer triggern. Und dann habe ich einen
-
Remote-Memory-Leak und der Prozess crasht.
Diese Art von Sachen sind völlig überflüssig
-
und mit ordentlichen Unit-Tests abfangbar.
Also macht das. Unit-Tests sind aber kein
-
Allheilmittel, den Eindruck möchte ich
nicht vermitteln. Selbst wenn ich 100%
-
Unit-Test-Coverage habe, kann ich
immer noch einen Fall übersehen haben.
-
Dennoch: das ist ein Ziel, was ihr haben
solltet. Es gibt Tools, um die Coverage zu
-
prüfen. Nutzt diese Tools. Das ist
wichtig. So, der nächste Fall, jetzt habe
-
ich Unit-Tests ausgerollt, ist: die
Entwickler haben Fälle vergessen zu
-
testen, ja? Das kommt häufig vor.
Und da gibt es einen neuen Hype: Test-
-
Driven-Development. Du schreibst erst die
Tests und dann den Code. Und da kann ich
-
leider nichts zu sagen, weil ich das noch
nie in der Produktion gesehen habe.
-
Ich kenne nur Leute…
-
Lachen und Applaus
-
Ich kenne nur Leute, die sich ganz sicher
sind, dass das total geil ist. Aber ich
-
habe es noch nie… also wenn ihr da
irgendwie wisst, dann schreibt mir mal
-
eine Mail, das würde mich echt
interessieren. Ja, das nächste Problem
-
ist: wir haben hier Code, und der tut
irgendwas, aber wir haben keine Ahnung,
-
wie das funktioniert. Und die Lösung ist
natürlich: Dokumentation! Ist auch eine
-
gute Idee, das will ich keinem ausreden.
Aber es kommt häufig vor, Seal Team 6
-
setzt ein Wiki auf, und da gibt es ganz
häufig so Effekte – da werde ich hier
-
Congress-Teilnehmern nichts Neues erzählen
– das Zertifikat ist gerade abgelaufen
-
oder das Wiki wirft Exceptions oder ist
nicht erreichbar oder so. Das ist ganz
-
häufig. Und dann fallen so Sätze wie: „Ja,
das hatte ich, glaube ich, ins Wiki getan“.
-
Und so: „Ja, das musst du halt bookmarken,
weil Navigation haben wir noch nicht“. Und
-
ganz häufig gibt es auch: „Jaja, das
hier oben, das stimmt nicht mehr“.
-
Also Wiki ist keine Lösung. Je kleiner man
die Schwelle setzt dafür, da was zu
-
editieren, desto mehr fällt es unter den…
vom Tisch. Weil die Leute
-
einfach das nicht als als wichtigen
Schritt sehen, sondern als so kleines
-
Ding. Das muss ein richtiger Schritt im
System sein, im Produktivbetrieb, dass
-
man sagt: „Jede Änderung wird dokumentiert,
Punkt.“ So, die nächste Idee, die man in
-
großen Firmen häufig hört, dass man sagt:
„Wir müssen hier mehr Kommunikation haben,
-
die Leute reden zu wenig miteinander“. Und
dann hat man so Großraumbüros.
-
Lachen und Applaus
-
Habe ich auch noch nie
funktionieren sehen.
-
Das klappt nicht, ja? Menschen
müssen sich mal am Stück konzentrieren
-
können. Und je mehr Unterbrechung man hat,
desto schlechter ist das. Und heute geht
-
der Trend sogar dahin…
-
Applaus
-
Heute geht der Trend sogar dahin, dass die
Leute sich Slack installieren. Die
-
plakatieren gerade in Berlin. Also, die
sich absichtlich gegenseitig unterbrechen.
-
Ist mir völlig ein Rätsel, warum Leute
sowas tun würden. Denn nach jeder
-
Unterbrechung braucht man so eine
Viertelstunde, bis man wieder drin ist.
-
Und diese Chatsysteme und auch Mail-
Unterbrechungen sind darauf ausgelegt,
-
dass man nie diese 15 Minuten schafft.
Ja, ich weiß, die Zeit ist knapp, ist gut!
-
lacht
Lachen
-
Meetings, ja. Meetings. Da muss ich,
glaube ich, nicht viel zu sagen.
-
Aber der Effekt ist immer derselbe: ich
kann mich nicht konzentrieren. Und das
-
ist ein ernstes Problem.
Da muss man aktiv gegenhalten,
-
ja? Das ist nicht so einfach. Ich habe
jetzt überlegt: soll ich vorschlagen, die
-
Meetings kurz zu machen? Aber das ist so,
habe ich auch nie funktionieren sehen, den
-
Ratschlag. Alle Leute glauben immer, sie
machen ihre Meetings kurz. Funktioniert
-
nicht. Daher sage ich: lieber selten und
One-on-One. Denn wenn man jetzt irgendein
-
Problem klären will, und da sitzen alle
Leute aus dem Team, dann gibt es eine
-
höhere Schwelle für den Einzelnen, zu
sagen: „Ja, da habe ich einen Fehler
-
gemacht.“ Deswegen lieber einzeln.
-
Applaus
-
Niemand, niemand hat Bock darauf, sich vor
seinen Kollegen zu entblößen. Und das muss
-
man also nicht künstlich herbeiführen. So,
jetzt kommen wir zur Security-Abteilung.
-
Wir haben Code und er tut irgendwas, aber
wir trauen dem nicht. Was machen wir
-
jetzt? Nächste Idee: naja okay, wir machen
erstmal die Compiler-Warnungen weg, ja?
-
Gute Idee. Der Effekt ist – und ich war
schockiert, dass es da einen Begriff für
-
gibt: Onion-Code. So, Onion-Code bedeutet,
dass ich so einen Chunk Legacy-Code habe,
-
der total viele Warnungen drin hat, und
den seit fünf Jahren keiner mehr angefasst
-
hat. Und da findet jetzt jemand einen Bug
drin. Und der würde den gerne fixen. Aber
-
dann compilet der Rest immer noch mit den
ganzen Warnungen. Und die müsste ich dann
-
fixen, damit ich den Fix einchecken kann
für den Bug. Und ich verstehe diesen Code
-
aber nicht. Ich verstehe nur den kleinen
Teil, wo ich den Bug gefunden habe. Und
-
dann mache ich einen Layer drum rum, und
der guckt diesen einen Fall, fängt ihn ab.
-
Und wenn das mehrere Leute machen, hat man
so eine Zwiebel. Und deswegen heißt das
-
Onion-Code. Das ist ganz furchtbar, ja?
-
Wenn ihr das irgendwo seht,
dann ‚burn it with fire‘!
-
So, nächster Vorschlag: wir haben nur noch
Releases ohne offene Bugs. Das klingt auch
-
total super. Und ich war auch mal bei
einem Kunden, der das probiert hat,
-
und da kam dann so eine Mail:
„Mach mal deine Bugs alle zu.“ Und
-
dann meine ich so: „Ich bin aber hier,
um Bugs aufzumachen, nicht um sie
-
zuzumachen.“ Und dann meinte er: „Ja,
die machen wir danach wieder auf, keine
-
Sorge.“
Lachen und Applaus
-
Muss ich, glaube ich, nicht erläutern, ob
die wieder aufgemacht wurden oder nicht.
-
Ja, externer Audit, und das tut mir in der
Seele weh, denn das biete ich geschäftlich
-
an, ja, das ist leider auch teilweise ein
Antipattern. Denn was hier passiert, ist,
-
dass die Leute so einen Blackbox-Pentest
beauftragen. Und ein Blackbox-Pentest
-
heißt, der Tester hat keinen vollen
Zugriff auf das System, der weiß nicht,
-
wie das funktioniert, sondern soll das in
dem Test selber rausfinden. Und dann
-
passiert sowas hier. Und was mich an der
Stelle am meisten beeindruckt hat, ist,
-
dass es dieses Bild schon gab. Das habe
ich jetzt nicht gemacht. So, das ist
-
leider üblich. Man testet nicht den Code,
sondern man testet den Pentester. Und ich
-
als Pentester habe jetzt natürlich… könnte
jetzt sagen: „Ja, ist mir doch egal, wen
-
die da testen, solange ich bezahlt werde.“
Aber ich habe da so einen Moralkodex. Ich
-
hätte gern dem Kunden geholfen und nicht
nur das Geld genommen. Das ist für alle
-
Seiten Scheiße. Macht das nicht. Ja,
Pentests. Ich sage, das ist ein
-
Compliance-Problem, dass die Leute alle
aus Compliance-Gründen Pentests machen.
-
Und das ist eigentlich an sich schon ein
furchtbares Zeichen, dass wir die Security
-
nicht hinkriegen, sondern Compliance
brauchen, um uns dazu zu bringen, dass wir
-
doch Security machen. Wir sollten uns alle
schämen! Fuzzing ist auch so ein Ding. Das
-
wird gerne gemacht. Fuzzing heißt, dass
ich zufällige Eingaben generiere und gegen
-
meinen Endpunkt werfe und gucke, ob der
platzt oder nicht. Und das ist
-
erschütternd erfolgreich, ja? Das
funktioniert. Und ich habe mal erlebt,
-
dass sie gesagt haben: „Nee, den Code
hier, den musst du nicht testen, den haben
-
wir schon zu Tode gefuzzt. Seit Monaten
läuft unsere Fuzzing-Farm.“ Und da stellt
-
sich dann heraus: die haben zwar
Milliarden von Test-Cases geprüft. Aber
-
das war immer derselbe.
Lachen
-
Total super. Und häufig ist Fuzzing so ein
Feigenblatt, womit dann andere Maßnahmen
-
nicht gemacht werden, weil wir haben doch
schon gefuzzt, und das ist auch in
-
Ordnung, ja? Also ich habe nichts gegen
Fuzzing an sich, denn es funktioniert
-
leider. Aber es darf kein Hindernis dafür
sein, andere wichtige Maßnahmen zu machen.
-
Das ist ein generelles Problem, was ich
häufiger sehe, dass, wenn das Management
-
die Wahl hat zwischen einer Maßnahme, die
wahrscheinlich funktioniert, aber keine
-
Metriken abwirft, und einer Maßnahme, die
wahrscheinlich nicht funktioniert, aber
-
Metriken abwirft, dass immer die mit den
Metriken gemacht wird. Management liebt
-
qualifizierbare Geschichten, wo irgend…
quantifizierbare Geschichten, wo
-
irgendeine Zahl rausfällt. Und das geht
häufig nach hinten los, ja? Ich habe also
-
mal so ein… das war ein wirklich
schockierendes Erlebnis für mich. Ich bin,
-
ich sage mal preiswert, aber nicht billig,
ja, also meine Tagessätze. – Ich weiß, ich
-
weiß! – So und dann gehe ich dahin, zu dem
Kunden, und der Kunde sagt: „Geh mal nach
-
Hause.“ Also ich wurde trotzdem bezahlt,
ja? Haben gesagt: „Geh mal nach Hause.“
-
Und ich so: „Wie jetzt?“ „Ja, ist warm
heute.“ Meinte ich so: „Was?“ „Ja die
-
Klimaanlage reicht für das Fuzzing-Lab
oder die Consultants.“
-
Lachen und Applaus
Ja. Gut. Das nächste Problem, das ist so
-
ein bisschen schwierig. Aber es ist mir
sehr wichtig, weil das so gerade im Kommen
-
ist. Die Coder sind überfordert. Und dann
sagt man: wir brauchen irgendeinen soliden
-
Ansatz. Thread-Modeling! Das ist gerade
im Kommen. Und das ist eine gute
-
Geschichte, aber es wird häufig
missverstanden. Thread-Modeling, der
-
übliche Ansatz ist, dass man sagt: jedes
Team macht ein Thread-Model für den Code.
-
Das ist gut. Ja? Aber häufig macht dann
der Feature-Owner oder Projektmanager
-
mit dem Dokumentationsteam zusammen, füllt
irgendwelche Formulare aus, und die
-
Developer sind überhaupt nicht betroffen.
Und das ist ein krasser Fehler. Denn beim
-
Thread-Modeling geht es nicht um das
Papier am Ende. Das ist kein Zertifikat.
-
Sondern es geht um den Weg zum Papier. Es
geht darum, dass die Entwickler mal aus
-
der Sicht des Angreifers versuchen, auf
ihren Code zu gucken, dass sie verstehen,
-
was da Angriffsoberfläche ist, dass sie
sehen, wo die Sachen sind, auf die man
-
aufpassen muss, welche Angriffe denkbar
sind. Wenn jemand anderes das Thread-Model
-
macht, das hätte man sich auch sparen
können, ja? Also: Thread-Model ist gut,
-
aber das müssen die Entwickler machen. Wir
sind fast durch. Ich habe noch ein paar
-
allgemeine Ratschläge, weil ich mir
dachte: ich kann euch hier nicht so
-
deprimiert nach Hause gehen lassen. Aus
Sicht des Management ist aus meiner Seite
-
ganz wichtig, dass man eine Fehlerkultur
etabliert. Das heißt: niemand wird
-
bestraft für Bugs. Denn sonst verstecken
die Leute Bugs, und das ist noch
-
schlechter, ja? Man muss Leute belohnen,
…
-
Applaus
Man muss Leute belohnen, wenn sie
-
einen Bug finden und fixen. Aber nicht
mit Geld belohnen, sondern mit Ruhm und
-
Ehre. Ich schlage immer vor, einmal die
Woche, irgendwie Freitag ab 4 oder so,
-
macht man so ein All-Hands-Meeting, wo –
wenn die Leute wirklich was Anderes
-
vorhaben, müssen sie nicht hingehen, also
kein Zwang – aber wo dann die alten
-
Hasen ihre schönsten Bugs erklären, ja?
Damit es als etwas Positives gesehen wird,
-
einen Bug zu finden, und damit die Jungen
was dabei lernen. Das ist eine gute Sache,
-
das kann ich empfehlen. Das funktioniert
auch gut, und das bringt auch das Team
-
zusammen. Und es nimmt so diesen Rockstar-
Status weg, der auch nur schadet. So, die
-
nächste Sache ist, dass man dafür sorgt,
dass der Bug auch von dem gefixed wird,
-
der den Code geschrieben hat. Es gibt
große Firmen, die teilweise ein zweites
-
Team dafür haben, Sicherheits-Bugs zu
fixen. Und dann kriegt der Typ, der das
-
programmiert hat, überhaupt nicht mit,
dass er die ganze Zeit schlechten Code
-
programmiert. Der zieht dann am besten
noch so von Team zu Team, hinterlässt
-
überall so Tretminen. Das ist wichtig,
dass es Feedback gibt. Und zwar nicht als
-
Strafe, sondern damit die Leute merken,
wenn sie Fehler machen, ja? Menschen
-
lernen aus ihren Fehlern. Dafür muss man
verstehen, wenn man einen Fehler gemacht
-
hat. Und das ist die, wo… komme ich
zurück zu dieser Meeting-Kultur. Wenn man
-
ein Meeting hat und sagt: „Du hast hier
aber Scheiße gemacht“, dann macht man den
-
vor dem ganzen Team nackig. Das hilft
überhaupt nicht, ja? Man… es ist auch
-
eine Kulturkreis-Frage. Manche
Kulturkreise können damit besser umgehen
-
als andere. Aber es gibt eben viele Leute,
die haben ein starkes Problem damit, dass
-
ihnen gesagt wird: „Du hast einen Fehler
gemacht“, ja? Weil das, in Japan zum
-
Beispiel ist es sehr wichtig, dass man der
Firma hilft und nicht gesehen wird, wie
-
man irgendwie an irgendwas schuld ist.
Also das ist schwierig, so etwas
-
aufzubauen. Aber das ist sehr wichtig.
Fehler sind nicht schlecht, sondern aus
-
den Fehlern kann man lernen, ja? Fehler
sind gut. Dann finde ich, dass die Firma
-
Werte kommunizieren sollte. Werte wie:
uns ist der Code wichtiger, die Güte des
-
Codes ist wichtiger als die Quantität, ja?
Es kommt nicht darauf an, hier mehr Kram
-
dran zu tun, sondern es kommt darauf an,
dass wir, wenn wir was geschrieben haben,
-
da auch noch einmal darauf zurückkommen
später, ja? Wenn wir was dazugelernt
-
haben, dass wir das auf den alten Code
anwenden. Und damit das stressfrei machbar
-
ist, braucht man ordentliche Unit-Tests.
So haben wir dann so einen Kreisschluss.
-
Die Anekdote, die ich hier erzählen
wollte, war, dass ich mit einem Freund
-
einen Job hatte. Und da war… Teil von dem
Problem war ein User-Interface. Und da
-
hatten wir beide überhaupt keine Ahnung
von. Und der Freund meinte dann ganz
-
locker: „Ja lass uns das in Qt machen.“
Und ich meinte so: „Wir haben beide keine
-
Ahnung von Qt. Was machst du hier?“ Und
da meint er: „Ja, das hätte ich gerne im
-
Resümee stehen, ja? Das muss… in meinem
Lebenslauf sieht das gut aus.“ Das ist
-
schon ein paar Jahre her. Aber was ich
sagen will: wenn die Firma den Leuten
-
nicht die Zeit gibt, Sachen zu lernen,
dann lernen sie das in Projekten der
-
Firma, und die werden dann Scheiße.
-
Applaus
-
Was man auch häufiger sieht, ist, dass das
Management glaubt, sie müsste die
-
Architektur der Software vorgeben, oder
welche Datenbank verwendet wird oder so.
-
Und das ist eigentlich auch immer eine
schlechte Idee. Denn entweder die
-
Architektur ist offensichtlich, dann hilft
es nichts. Oder sie ist nicht
-
offensichtlich, dann sind die Ratschläge
wahrscheinlich falsch, weil wir das
-
Problem noch nicht wirklich verstanden
haben. Also das ist auch eine Sache, da
-
sollte sich das Management
zurücknehmen an der Stelle.
-
Applaus
Und hier noch so ein bisschen Selbsthilfe
-
für Entwickler. Ist die letzte Folie, ganz
entspannt bleiben. Der Druck kommt immer
-
von euch selbst. Das Management kann viel
erzählen, ja? Deadline hier, Deadline da.
-
Lasst euch da nicht dazu bringen,
Überstunden zu fahren. Immer schön um 9
-
kommen, um 5 nach Hause gehen. Also…
Applaus
-
Wenn unrealistische Anforderungen
reinkommen, dann müsst ihr da ganz ehrlich
-
sein und sagen: „Das wird wahrscheinlich
nicht klappen. Ich nehme jetzt euer Geld
-
und arbeite daran. Aber ich sage euch
jetzt: das wird nix, ja?“ Immer schön
-
Paper-Trail hinterlassen, dass das nichts
wird und man es rechtzeitig gesagt hat.
-
Man kann dann dran arbeiten, weil viele
von euch werden wahrscheinlich die Kohle
-
brauchen, aber ehrlich sein, nicht so tun,
als wenn wir das mit ein paar irgendwie
-
die-Nacht-durchgemacht am Ende noch
reißen können. Das ist besonders in der
-
Spielebranche ein riesiges Problem, dass
die Leute total Burnout kriegen. Man muss
-
das verstehen mit dem Management wie ein
gegenseitiges Training, ja? Wenn ich dem
-
Management so etwas durchgehen lasse,
dann zeige ich ihnen: das ist die neue
-
Baseline, ja? Das erwarten die ab dann.
-
Herald: Soll ich mir einen Stuhl holen,
damit ich mich daneben setze?
-
Fefe: Kannst du machen,
das ist die letzte Folie.
-
Herald: Okay.
Fefe: Ganz ruhig!
-
So, und der letzte Satz,
den ich habe: Zeit ist… muss man sich
-
selber nehmen, ja?
Ich habe zwar gerade gesagt…
-
Lachen und Applaus
-
Herald: Raus mit dir!
weiter Applaus
-
Ich habe zwar gerade dem Management
empfohlen, euch Zeit zu geben,
-
aber wenn ihr darauf wartet,
das wird nichts.
-
Lachen
So, ich fürchte, die Fragezeit ist schon
-
vorbei, oder?
Herald: Jo.
-
Lachen und Applaus
-
Das Beeindruckende ist ja wirklich:
die sind alle da geblieben, und da ist
-
nicht einer vom Stuhl gefallen.
Fefe: Ja! lacht
-
Herald: Vielen, vielen Dank! Ausgänge
sind beide offen. Das war’s von Fefe.
-
Hier noch mal ein Applaus für ihn bitte!
-
Applaus
-
Abspannmusik
-
Untertitel erstellt von c3subtitles.de
im Jahr 2018