Schlüsseltechnologie

Schlüsseltechnologie

By Xyrillian NoisesTechnology
Download on the App Store

Schlüsseltechnologie episodes

  • STP087: Graphen von Null bis Dijkstra

    Nachdem wir den Begriff schon ein paar Male gestreift haben, heute ein genauerer Blick auf Graphen. Darin: informierte und uninformierte Suche sowie eine Erkundung der Dresdner Umgebung.

    Shownotes
    • oft erwähnt, aber nie systematisch eingeführt: der Begriff Graph

      • Graph: eine Menge von Knoten mit Kanten dazwischen
      • z.B. Nahverkehrsnetz: Knoten = Haltestellen, Kanten = Direktverbindung zwischen zwei Haltestellen
      • z.B. soziale Medien: Knoten = Personen, Kanten = "ist befreundet/folgt"
      • anders als bei Listen (STP077) oder Maps (STP079) große Variabilität darin, was ein Graph fundamental ist
        • z.B. gerichtete vs. ungerichtete Graphen: Haben die Kanten eine Richtung oder nicht? (siehe Beispiele oben)
        • häufig verwendete Unterarten von Graphen:
          • Baum: ayzklischer ungerichteter zusammenhängender Graph (z.B. siehe STP077/STP079: zum effizienten Abspeichern von sortierten Listen bzw. Maps)
          • azyklischer gerichteter Graph (z.B. Versionsverwaltung, Familienstammbaum, Firmen-Organigramm)
          • planarer Graph: siehe "Untangle"
          • Wie durchschreitet man einen Graphen? -> Suchalgorithmen, im allgemeinsten Fall die zwei wichtigsten "uninformierten" Suchalgorithmen

            • Breitensuche: von einem Startpunkt pro Runde alle Nachbarn von bereits besuchten Knoten besuchen
            • Tiefensuche: vom Startpunkt aus immer erst einen Nachbarn besuchen und dann dort wieder einen Nachbarn; sobald keine weiteren unbesuchten Nachbarn möglich sind, Backtracking zum vorherigen Knoten, bis ein neuer unbesuchter Nachbar gefunden wird
            • sowohl Breiten- als auch Tiefensuche erzeugen beim Durchschreiten des Graphen einen Suchbaum, der ein Spannbaum ist (vgl. Spanning Tree bei Ethernet in STP028)
            • Abwägung: Tiefensuche ist einfacher zu implementieren und hat weniger Speicheraufwand (braucht nur eine "besucht-Markierung" und keine Kandidatenliste), kann aber in der Praxis problematisch sein :)
            • Beobachtung: Breitensuche findet garantiert den kürzesten Pfad vom Startpunkt zu einem gewünschten Endpunkt

              • Abwandlung für Wegfindung: Dijkstra-Algorithmus
              • Voraussetzung: Kanten haben auch noch ein Gewicht (analog zu einer Streckenlänge)
              • Breitensuche merkt sich bei jedem Knoten den kürzesten Gesamtweg zu diesem Knoten
              • beim Auswählen des nächsten Besuchskandidaten Wahl des Knotens mit dem kürzesten Gesamtweg
              • Erweiterung zum A*-Algorithmus mittels Ergänzung um eine Heuristik, die beschreibt, wie nahe gefundene Knoten am Ziel sind (damit je nach Situation enorme Effizienzsteigerung möglich, siehe z.B. dieser Blogpost der Factorio-Entwickler)
              • im Gespräch erwähnt: #WissPodWeihnacht 3: Das Haus vom Niko…hä?!? mit Geschichten aus der Mathematik

                1 hr 16 min
              • STP086: Literatur: Ein Plädoyer für schlanke Software

                Die Erfahrung, dass das Plastikgehirn gelegentlich länger für die Dinge braucht, die wir ihm aufgeben, kennen wir alle. War das früher nicht schon mal besser? Oder sollte es nicht zumindest der Vergangenheit angehören? Oder täuschen wir uns und verklären die Vergangenheit…

                ShownotesAnhand von "A Plea for Lean Software" (1995) von Niklaus Wirth besprechen wir zwei wesentliche Fragestellungen. Zuerst einige Vorbeobachtungen:

                • Frage 1: Warum ist Software (bzw. Produkte im Allgemeinen) immer weniger langlebig?

                  • COBOL-Software aus den 60ern ist immer noch im Einsatz, aber React-Apps von vor 5 Jahren sind hoffnungslos obsolet
                    • siehe Vermutung, dass in der Frontend-Entwicklung Schnelllebigkeit von YouTube-Influencern getrieben wird
                    • bei COBOL/Fortran-Systemen auch regulatorische Hürden (z.B. Steuerungsoftware für Atombomben in Fortran 77, weil ein Umstieg auf neuere Versionen Tests der Software erfordern würde, aber Atomwaffentests verboten sind)
                    • vgl. Erfahrung von ttimeless: Fensterbeschläge von vor 30 Jahren noch top, aber neuere von vor 5 Jahren tw. schon abgeranzt (Geplante Obsoleszenz? Survivorship-Bias?)
                      • Wie schätzt man Qualität bei selten gekauften Produkten ab?
                      • im Gespräch erwähnt: Backblaze Drive Stats
                      • sich gegenseitig beschleunigende Marktmechanismen (Qualitätsschwund durch Sparmaßnahmen in der Produktion, Mode)
                        • passend dazu: "Ich sah neulich eine alte Episode von 'Der Preis ist heiß' aus den 80ern, die UK-Edition mit [Bruce Forsyth]. Die Preise waren Dinge wie Mikrowellen, Fernseher, Möbelstücke und so weiter. Die Preise waren weit, weit höher, als was ich je geraten hätte. Wir sind mit der Vorstellung aufgewachsen, dass eine Mikrowelle weniger als 100 Pfund kosten sollte, obwohl sie unter Berücksichtigung der Inflation mittlerweile 400 kosten sollten. Alles ist scheiße günstig geworden."
                        • These von ttimeless: mehr Leute machen mehr Zeug machen mehr Altlasten (Xyrill erhöht um eine Coding-KI-Industrie und möchte sehen)
                        • Frage 2: Warum waren Computer in den 90ern schneller?

                          • welch Ironie, dass wir uns nach der Zeit zurücksehnen, in der der Autor unseres Textes sich über verschwenderische Programmierweisen aufregt
                          • vgl. Frage im MDR: Wann kriegen wir wieder Akkulaufzeiten von einer Woche wie bei den alten Nokia-Handys?
                          • offensichtlicher Einfluss: mehr Leistung, die sich nicht als konkrete Funktion äußert (z.B. höhere Auflösung erfordert mehr Videospeicher, moderne Konnektivität ist objektiv komplexer, als nur auf einen Anruf oder eine SMS zu warten)
                          • Gegenrede: "Ich war dabei bei den meisten dieser alten Maschinen und meiner Erinnerung nach waren sie immer langsam, weswegen es ein derart unerbittliches Rennen um das Upgrade auf eine schnellere Maschine gab, und warum für eine lange Zeit Leute jedes Jahr ihren alten Computer ersetzten. [...] Dieser Topos von 'wie konnten Dinge langsamer werden, damals war alles so schnell' ist eine fehlerhafte Erinnerung"
                          • andere Perspektive aus demselben Thread: "Weil wir erweiterbare anstatt zusammensetzbarer Software schreiben. Wir liefern nicht Funktionen aus, sondern Apps. Wieviele Instruktionen braucht man, um in Maschinensprache 1+1 auszurechnen? Wieviele Instruktionen braucht man, um die Suchleiste zu öffnen, den Taschenrechner zu finden und die Berechnung auszuführen?"
                          • vgl. Freak Show 273 im Kapitel mit dem Nachruf auf Niklaus Wirth: in den 60ern vorherrschende Vorstellung unmittelbar bevorstehender Ablösung von Programmierern durch Computer, aber mehr Rechenleistung erfordert noch mehr Programmierer (vgl. Softwarekrise, für den Verweis auf kombinatorische Explosion von Software-Komplexität siehe STP070)
                          • Komplexitätsquellen laut Wirth

                            • "verbesserte Benutzerführung und Funktionalität" laut Wirth keine gute Begründung
                              • aber Wirth begründet das mittels seines eigenen extremen Fokus auf Basisfunktionalität ("Diese grundlegenden Aufgaben haben sich [... angesichts u. a. der] Ersetzung von aussagekräftigen Befehlswörtern durch hübsche Bilder [nicht geändert].")
                              • Desktop-Metapher und Skeuomorphismus waren essentiell darin, Computersoftware einem breiten Publikum näherzubringen
                              • vgl. Brooks (essentielle vs. versehentliche Komplexität), aber unterschiedliche Grenzziehungen
                              • Wirth bevorzugt ziemlich explizit "simple" statt "easy"
                              • jede Funktion, die der Kunde haben will, wird eingebaut, ob sie sich nun sinnfällig in das ursprüngliche Design einfügt oder nicht
                                • Komplexität durch Komplikationen
                                • monolithischer Systementwurf ("Jeder Kunde zahlt für alle Funktionen, aber nutzt nur wenige von ihnen.")
                                  • vgl. oben "wir liefern nicht Funktionen aus, sondern Apps"
                                  • Xyrill baut Systeme auch eher monolitisch, weil sich für ihn der Wartungsaufwand verringert, wenn alles in einer Codebase liegt
                                  • Komplexität wird an sich als Funktionalität missverstanden: "Immer mehr scheinen die Leute Komplexität als Raffinesse zu interpretieren, was rätselhaft ist — Unverständliches sollte Argwohn erregen, nicht Bewunderung."
                                    • *hust* *hust* ✨KI✨ *hust* *hust*
                                    • kapitalistischer Anreiz: damit Nutzer in der eigenen Teergrube binden und Support und Beratung verkaufen
                                    • gutes Design erfordert systematische Iteration auf dem ersten, offensichtlichen, überkomplizierten Entwurf
                                      • vgl. Antoine de Saint-Exupéry ("Es scheint, dass Perfektion nicht dann erreicht ist, wenn nichts mehr hinzuzufügen ist, sondern wenn nichts mehr wegzunehmen ist.")
                                      • aber: Zeitdruck ("akribische Ingenieursroutine zahlt sich kurzfristig nicht aus")
                                      • Wirth drischt hier stark auf die Kunden ein, die ständig neuen Klimbim wollen, was etwas aus der Zeit gefallen wirkt (bzw. nur etwas deplatziert; heute sind "die Kunden" die Werbeabteilung, die noch mehr Datenspuren sammeln will)
                                      • deswegen auch extrem langsame Einführung von Techniken für methodisches Arbeiten (z.B. stark typisierte Programmiersprachen): "Methodisch korrektes Design [...] ist offenbar unerwünscht, weil auf diese Weise entwickelte Produkte zu viel Zeit bis zur Markteinführung brauchen."
                                        • Wirth beschwert sich, dass in den 90ern die Programmiertheorie der 70er (z.B. abstrakte Datentypen) erst langsam in Produktivumgebungen Einzug fand
                                        • passend dazu kommt zurzeit die Programmiertheorie der 90er (z.B. algebraische Datentypen wie in STP072, affine Typsysteme) erst langsam in die heutigen Produktivumgebungen, aber C hält sich immer noch hartnäckig
                                        • Wie heraus aus der Teergrube? Wirth bespricht sein eigenes Oberon System

                                          • ursprüngliches Ziel: ein Betriebssystem inklusive Userspace, das kompakt genug ist, um als Lehrmaterial verwendet und in Lehrbüchern besprochen werden zu können
                                          • extreme Konzentration auf "Grundfunktionen" (z.B. keine grafische Oberfläche, nur Textinteraktion)
                                          • Implementation in einer typsicheren Programmiersprache mit Objektorientierung, um starke Modularität auf Codeebene zu ermöglichen
                                            • Xyrill ist hier etwas skeptisch, dass Objektorientierte Programmierung hier einen großen Unterschied macht, aber für Wirth ist das extrem wichtig
                                            • keine abgeschlossenen Programme, sondern nur Funktionsaufrufe
                                              • also vmtl. kein Speicherschutz in Hardware, sondern nur durch Typsicherheit
                                              • "Wenn ein Modul M eine Prozedur P anbietet, dann kann P aufgerufen werden, indem man einfach auf den Text 'M.P' zeigt, sobald er irgendwo auf dem Bildschirm erscheint, und eine Maustaste drückt"
                                              • statt einer Leiste mit Icons eine einfache Textbox mit Befehlsnamen
                                              • vgl. Plan 9, Smalltalk, Forth
                                              • der Preis des schlanken Systems ist der Aufwand für den sauberen Entwurf
                                              • Am Ende neun Lektionen für das Design schlanker Software. Wir zitieren Nummer 7:

                                                Die Reduktion von Komplexität und Größe muss in jedem Schritt das Ziel sein: im Lastenheft, im Design, und beim detaillierten Programmieren. Die Kompetenz eines Programmierers soll nach der Fähigkeit gemessen werden, einfache Lösungen zu finden, und ganz bestimmt nicht nach Produktivität, gemessen in "Anzahl Codezeilen, die pro Tag ausgeworfen werden". Produktive Programmierer tragen zum sicheren Desaster bei.

                                                1 hr 30 min
                                              • STP085: Barrierefreiheit im Web (Teil 3)

                                                Nachdem wir das eingegangene Feedback besprochen haben, starten wir zur letzten Etappe dieses überraschend ergiebigen Themas. Weder fehlt es an Anekdoten noch an vorbei fahrenden Krankenwagen und zuletzt müssen auch noch ein paar Worte über Spiele verloren werden.

                                                Shownotes
                                                • siehe STP081: gemäß des neuen Barrierefreiheitsstärkungsgesetzes müssen Webseiten und Webapplikationen die AA-Kriterien der WCAG 2.1 erfüllen

                                                  • WCAG = Web Content Accessibility Guidelines (Webinhalte-Barrierefreiheits-Richtlinien) der Web Accessibility Initiative des W3C
                                                  • Kriterien sind gruppiert in 4 Grundprinzipien und darin 13 Richtlinien
                                                  • Kriterien gehen jeweils von A (Pflicht) über AA (Kür) bis AAA (Sahnehäubchen)
                                                  • in STP081 und STP083: das Grundprinzip 1 (Wahrnehmbarkeit) und 2 (Bedienbarkeit) mit insgesamt neun Richtlinien, heute der Rest
                                                  • zum Mitlesen: WCAG 2.2 (aktuelle Version, nur Englisch) oder WCAG 2.0 (etwas ältere Version, in offizieller deutscher Übersetzung)
                                                  • Grundprinzip 3: Verständlichkeit

                                                    • Richtlinie 10: Lesbarkeit
                                                      • A: Sprache der Webseite muss programmatisch auslesbar sein
                                                      • AA: Sprache jedes Teils der Webseite muss programmatisch auslesbar sein
                                                      • AAA: für ungewöhnliche Ausdrücke, Fachwörter und Abkürzungen soll eine Definition zugänglich sein; für komplizierte Texte (alles über Hauptschulniveau) soll eine Alternativform in einfacher Sprache vorliegen; Aussprachehinweise sollen zugänglich sein, sofern die Bedeutung eines geschriebenen Wortes von der Aussprache abhängt (z.B. "umfahren" vs. "umfahren")
                                                      • Richtlinie 11: Vorhersehbarkeit
                                                        • A: Bedienung von Steuerelementen soll nicht unvorhersehbar eine Seitennavigation oder dergleichen auslösen; Hilfemechanismen (inkl. Kontaktinformationen) müssen (sofern vorhanden) auf jeder Unterseite gleich funktionieren
                                                        • AA: Navigationsmechanismen und wiederholte Steuerelemente müssen auf jeder Unterseite gleich erscheinen und funktionieren
                                                        • AAA: Navigation nur aufgrund von expliziter Anforderung durch die Nutzer:in
                                                        • Richtlinie 12: Hilfestellung bei der Eingabe
                                                          • A: fehlerhafte Eingaben müssen klar hervorgehoben werden; benötigte Eingaben müssen klar als solche gekennzeichnet sein; Daten sollen nicht mehrmals abgefragt werden (beim zweiten Mal entweder automatisches Ausfüllen oder eine Option zur Datenübernahme), außer wenn Sicherheit es erfordert oder die vorliegenden Daten veraltet sind
                                                          • AA: bei fehlerhaften Eingaben sollen Korrekturvorschläge gegeben werden (soweit möglich; z.B. nicht, wenn Geheimniswahrung gefährdet wäre); rechtlich verbindliche Vorgänge sollen entweder umkehrbar sein oder einen separaten Bestätigungsschritt anbieten; Authentifizierung soll keine Tests für geistige Leistungsfähigkeit erfordern (z.B. für Captcha muss eine alternative Methode existieren, außer wenn der kognitive Test nur Bilderkennung oder Wiedererkennung vergangener Eingaben umfasst; Passwort-Manager-Blocker sind verboten)
                                                          • AAA: kontextsensitive Hilfe bei jeder Eingabe; jegliche formularbasierte Eingabe soll entweder umkehrbar sein oder einen separaten Bestätigungsschritt anbieten; Komplettverbot von Captchas ohne Alternativmethode, die keinen Test für geistige Leistungsfähigkeit umfasst
                                                          • Grundprinzip 4: Robustheit

                                                            • Richtlinie 13: Kompatibilität
                                                              • A: für alle Steuerelemente sind der Name und die Rolle programmatisch auslesbar (z.B. mittels ARIA (Accessible Rich Internet Applications, barrierefreie reichhaltige Internet-Anwendungen))
                                                              • AA: für alle Steuerelemente sind der aktuelle Status bzw. eventuelle Statusnachrichten programmatisch auslesbar (z.B. durch Screenreader)
                                                              • Feedback zu STP003

                                                                Dominic schreibt Themenvorschläge, und außerdem:

                                                                Vor kurzem ist mir ein Video untergekommen, das die unterschiedlichen Gatter sehr anschaulich zeigt und das ich hiermit empfehlen möchte. (Allerdings empfehle ich das Englische original denn die deutsche Synchronisation ist eine ✨KI✨-Stimme)

                                                                macht weiter so und vielen Dank

                                                                Feedback zu STP084

                                                                Daniel schreibt:

                                                                Hallo Xyrill, hallo stell es dir in einer unbekannten Fremdsprache vor ttimeless,

                                                                TL,DR: macht 'ne Folge über alternative Betriebssysteme für Smartphones

                                                                Ich habe euren Call for Action aus der Episode 84 des STP gehört. Bei mir liegt aktuell das Thema Betriebssystem fürs Smartphone auf dem Tisch (dazu später mehr) und da habe ich mich gefragt, ob ihr dazu nicht eine Folge oder einen Teil einer Folge machen könnt.

                                                                Xyrill sagte ja mal, er wechselt alle paar Jahre zwischen Android und iOS. ttimeless hat sich hierzu, glaube ich, noch nicht geäußert (Was mit Holz? Zwinkersmiley).

                                                                Es gibt ja inzwischen einige Custom ROMs auf dem Markt und einige Projekte sind auch schon wieder eingestampft (dazu später mehr).

                                                                Ich glaube, GrapheneOS wurde bei euch schon mal angesprochen, mindestens im Pentaradio. Das ist ja bekannt für seine Security Features  und Einstellmöglichkeiten, hat aber den klitzekleinen Nachteil, das es nur auf einer Hardware läuft (Google Pixel).

                                                                Ubuntu Touch macht anscheinend auch Fortschritte. Außerdem schon lange verfügbar sind LineageOS und /e/os. Weitere: DivestOS, CalyxOS (dazu später mehr), Pixel Experience, usw, usf.

                                                                Ich finde, auch im Zuge der Di.day Initiative lohnt sich ein Blick auf dieses Thema. Auch, wenn es hier ein gewisses Skill Level, die Fähigkeit zum Verzicht und Bock auf Bugs bzw Bastelfreude braucht, um mit einem alternativen Betriebssystem auf dem Smartphone unterwegs zu sein.

                                                                Jetzt kommt das "später": Ich habe mir im letzten Jahr ein Fairphone 4 angeschafft und mir CalyxOS draufgeholfen. Nur um kurz nach der Installation und Einrichtung die Nachricht von den Leutis vom Projekt zu erhalten, dass erstmal keine Updates mehr over-the-air ausgeliefert werden. Wie es mit dem Projekt weitergeht, kann ich ihrer Kommunikation leider nicht entnehmen. ¯\_(^^)_/¯

                                                                Ich brauche also bald mal ein neues Betriebssystem und ich dachte, ihr habt bestimmt was Spannendes dazu beizutragen. Sei es aus eigener Erfahrung und/oder aus eurem technikbegeisterten und technikversierten Umfeld.

                                                                Der Endgegner in diesem Game ist übrigens die einzige App, die ich nicht durch FOSS ersetzen kann: die Banking-App...

                                                                Es liegt in der Natur der Sache, dass ich diese App nicht wie einen Messanger oder Musikstreamingdienst wechseln kann.

                                                                Ich weiß, dass euer Wissensdampfer langsam den Eisberg umschifft (Lob der Sorgfalt) und ihr Zeit für die Produktion neuer Folgen braucht. Selbst wenn dieses Thema erst in einigen Monaten rankommen sollte, freue ich mich zu hören, was ihr dazu zu sagen habt.

                                                                Ansonsten noch vielen Dank für viele unterhaltsame und lehrreiche Stunden und einen Podcast, bei dem ich schon einige Folgen  mehrfach gehört habe. Ganz stark.

                                                                Der im Gespräch erwähnte Datenspuren-Vortrag ist "Na endlich: Linux auf dem Smartphone".

                                                                Feedback zu STP081/083

                                                                Toni schreibt:

                                                                Lieber Xyrill, lieber ttimeless,

                                                                ich wurde heute von einem Kollegen auf euren Podcast aufmerksam gemacht. Ausschlaggebend war eure kleine Episodenreihe zum Thema Barrierefreiheit im Web. Ich bin selbst geburtsblind und schon immer mit den Hürden im Netz konfrontiert, schlussendlich hat mich das dazu geführt, dass ich im Rahmen meiner Promotion derzeit zum Thema Zugänglichmachung von interaktiven visuellen Kollaborationswerkzeugen forsche. Studiert habe ich ursprünglich Spieleentwicklung.

                                                                Ihr hattet in eurem Podcast zu Wortmeldungen von Betroffenen aufgefordert. Nun ist das ja schon eine Weile her - ihr meintet im Podcast, ihr nehmt die Folge Ende August auf, das sind ja immerhin schon 4 Monate. Ich finde es super, dass ihr in eurem Podcast über die Barrierefreiheit im Web aufklärt und würde mich noch viel mehr darüber freuen, wenn sie tatsächlich auch die Mehrheit umsetzen oder zumindest die Notwendigkeit dafür einsehen würde - in der Praxis wird man bei Nachfragen tatsächlich immer eher mit Skepsis und Unwillen konfrontiert, selbst aus der eher liberalen und auch der Open-Source-Community. Zudem ist das BFSG auch leider eher ein zahnloser Wolf - es gibt zwar Richtlinien, an die sich technisch jeder halten muss, insbesondere öffentliche Dienste und Dienstleister mit einer gewissen Mindestgröße, aber wo kein Kläger, da kein Richter. Menschen, die von Barrierefreiheit betroffen sind, befinden sich statistisch eher am unteren Ende der Existenzgrenze und machen sich mehr Sorgen um ihr täglich Brot als darüber, Geld in Klageverfahren zu stecken. Und selbst wenn damit Erfolg zu verzeichnen wäre, wäre gerade für große Firmen der Verlust immer noch sehr viel geringer, als das Investment, ihre Webpräsenzen von vornherein umzurüsten.

                                                                Mein Ansatz hier ist daher, Barrierefreiheit direkt schon in der Lehre mitzudenken. Darum bin ich unter Anderem an der Hochschule Anhalt tätig und versuche, meine Studierenden von vornherein darauf einzuschwören.

                                                                Ich könnte vermutlich einen halben Roman dazu verfassen, und auch auf den einen oder anderen Punkt aus eurem Episoden eingehen, aber wie zielführend das ist kann ich nicht sagen. Wenn euch so etwas interessiert, könnte man dazu aber ja gern mal quatschen, oder ihr fragt nochmal nach konkreten Kommentaren, dann setze ich mich hin und mache euch eine Liste fertig ;).

                                                                Bis dahin habt ihr vermutlich einen neuen Hörer dazugewonnen, je nachdem, ob ich noch einen Podcast mehr in meinen täglichen Informationswust reinquätschen kann ;). Macht weiter so, haltet die Ohren steif, und viel Erfolg und Glück im Jahr 2026.

                                                                1 hr 14 min
                                                              • STP084: Cursed Computer Iceberg Meme, Runde 3

                                                                Mal wieder stehen uns angesichts der Merkwürdigkeit der Computertechnik die Haare zu Eisberge.

                                                                ShownotesWir setzen unsere Betrachtung des Cursed Computer Iceberg Meme aus STP042 und STP064 fort. Dieses Mal hat Xyrill sich vorgenommen, einen Pick aus jeder Ebene des Eisbergs zu besprechen.

                                                                • "Above the Iceberg" - Oberhalb des Eisbergs: Spectre/Meltdown
                                                                  • Beispiel eines Seitenkanalangriffs (vgl. Besprechung von nicht-zeitkonstanten Operationen in STP041)
                                                                  • war damals (2018) auch im Pentaradio besprochen worden
                                                                  • und im Chaosradio
                                                                  • Grundlage: moderne Prozessoren erzielen ihre Geschwindigkeit zu guten Teilen durch spekulative Ausführung zukünftiger Instruktionen (siehe STP011)
                                                                  • Idee: Angreifer kann nicht auf geschützten Speicher zugreifen, aber die spekulative Ausführung weiß das nicht
                                                                  • spekulativ ausgeführter (und dann verworfener) Befehl ist so gebaut, dass je nach dem Wert eines geschützten Bytes eine unterschiedliche Speicherseite angefasst wird
                                                                  • dann Auslesen des Wert des Bytes durch Timing-Seitenkanal: zuletzt angefasste Speicherseite ist im Cache und schneller lesbar
                                                                  • "On the Iceberg" - Auf dem Eisberg: Schriftarten können Schadcode enthalten
                                                                    • Kombo mit "Middle of the Iceberg" weiter unten
                                                                    • "Below the Water" - Unter der Wasserlinie: Magic the Gathering is Turing Complete
                                                                      • vgl. unsere Besprechung von "aus Versehen turingvollständig" in STP042 sowie von Turingmaschinen in STP063
                                                                      • Kyle Hill hat dazu auch noch ein neueres Video auf seinem eigenen Kanal
                                                                      • "Middle of the Iceberg" - Mitte des Eisbergs: Font-Hinting ist turingvollständig
                                                                        • noch ein Fall von "aus Versehen turingvollständig" (siehe STP042)
                                                                        • Hinting: Anpassung der Form einer Glyphe an die tatsächliche Schriftgröße in Pixeln etc., um ungewollte Rasterisierungs-Artefakte zu reduzieren (grafisches Beispiel)
                                                                        • in TrueType: Hinting in einer VM, die durch Code in der Schriftartendatei gesteuert wird; damit Einschleusung von Schadcode möglich, wenn diese VM Schwachstellen hat
                                                                        • Problem: heute Schriftarten nicht nur im Betriebssystem vorinstalliert, sondern auch dynamisch geladen als Webfont
                                                                        • "Bottom of the Iceberg" - Unterseite des Eisbergs: Es gibt keine elegante Lösung für FizzBuzz
                                                                        • "Below the Iceberg" - Unterhalb des Eisbergs: SAT-Solver werden immer schneller
                                                                          • SAT (von engl. "satisfiability"): Erfüllbarkeitsproblem der Aussagenlogik
                                                                          • relevant deswegen, weil man viele Probleme als SAT-Problem umformulieren kann (z.B. Sudoku, Raumplanung, Paketmanager)
                                                                          • "Deep Water" - Im tiefen Wasser: FJCVTZS
                                                                            • FJCTVZS = "Floating-point Javascript Convert to Signed fixed-point, rounding toward Zero" (Konvertierung eines float64 in einen int32 mit Rundung zur Null hin und Modulo 2^32 bei Überlauf)
                                                                            • ARM ist zwar RISC (siehe STP075), aber eine spezielle Instruktion für Zahlenumwandlungen in JavaScript-Engines ist offenbar doch wertvoll
                                                                            • "The Abyss" - Der Abgrund: Die große Adressdatei der japanischen Post
                                                                              • eine Lektion darin, wie wichtig saubere Daten sind, und dass man auf bei der Erstellung von Dateien auf ihre Verwendung achten muss (Parallele zu Dokumentation)
                                                                              • Es gibt weiterhin mehr zu entdecken. Wir sehen uns wieder in STP105.

                                                                                1 hr 8 min
                                                                              • STP083: Barrierefreiheit im Web (Teil 2)

                                                                                Der versprochene zweite Teil ist da. Auch heute soll es darum gehen, wie eine angenehme Erfahrung im Internet und allgemein an Computern aussehen könnte. Zum Thema, ob wir alles geschafft haben, siehe Shownotes unten. Frohe Weihnachten allerseits.

                                                                                Shownotes
                                                                                • siehe STP081: gemäß des neuen Barrierefreiheitsstärkungsgesetzes müssen Webseiten und Webapplikationen die AA-Kriterien der WCAG 2.1 erfüllen

                                                                                  • WCAG = Web Content Accessibility Guidelines (Webinhalte-Barrierefreiheits-Richtlinien) der Web Accessibility Initiative des W3C
                                                                                  • Kriterien sind gruppiert in 4 Grundprinzipien und darin 13 Richtlinien
                                                                                  • Kriterien gehen jeweils von A (Pflicht) über AA (Kür) bis AAA (Sahnehäubchen)
                                                                                  • in STP081: das Grundprinzip 1 (Wahrnehmbarkeit) mit insgesamt vier Richtlinien, heute der Rest
                                                                                  • zum Mitlesen: WCAG 2.2 (aktuelle Version, nur Englisch) oder WCAG 2.0 (etwas ältere Version, in offizieller deutscher Übersetzung)
                                                                                  • Grundprinzip 2: Bedienbarkeit

                                                                                    • Richtlinie 5: Zugänglichkeit per Tastatur
                                                                                      • A: alle Aktionen per Tastatur ansteuerbar, die nicht eine genaue geometrische Ansteuerung erfordern (z.B. Zeichenfläche in einem Zeichenprogramm); kein Steuerelement kann den Tastaturfokus so fangen, dass man den Fokus nur mit einer anderweitigen Aktion (z.B. Mausklick) brechen kann; etc.
                                                                                      • AAA: ausnahmslos alle Aktionen per Tastatur ansteuerbar
                                                                                      • Richtlinie 6: Ausreichend Zeit
                                                                                        • A: wenn Interaktionen ein Zeitlimit haben, muss das Limit (wann immer möglich) in irgendeiner Form umgehbar oder zurücksetzbar sein (Aufgaben sollen abschließbar sein, ohne dass ein Zeitlimit plötzlich den Fortschritt zunichte macht); jegliches automatische Bewegen/Scrollen/Blinken/Aktualisieren muss abschaltbar sein
                                                                                        • AAA: absolut keine Zeitlimits für Interaktionen; bei Relogin aufgrund abgelaufener Sitzung darf kein Fortschritt verloren gehen; Benutzer müssen jederzeit über laufende Zeitlimits informiert sein, die kürzer als 20 Stunden sind
                                                                                        • Richtlinie 7: Keine Anfälle
                                                                                          • A: Inhalte, die mehr als 3x pro Sekunde blinken, müssen eine Intensität unter den Grenzwerten für Epilepsierisiko liegen
                                                                                          • AAA: gar kein Blinken schneller als 3x pro Sekunde; Animationen infolge von Benutzerinteraktionen müssen abschaltbar sein
                                                                                          • Richtlinie 8: Navigierbarkeit
                                                                                            • A: sinnvolle Titel auf jeder Seite; über mehrere Seiten wiederholte Informationen sind überspringbar; Steuerelemente haben eine sinnvolle Fokusreihenfolge; der Zweck von Links soll soweit wie möglich aus dem Linktext allein erkennbar sein (z.B. nicht "[Hier klicken], um den Kauf abzuschließen")
                                                                                            • AA: statische Seiten sollen auf mehrere Wege auffindbar sein; Seiten sind mittels Teilüberschriften und Labels sinnvoll strukturiert; Tastaturfokus auf Steuerelementen soll klar erkennbar sein; Steuerelemente mit Fokus sollen nie komplett verdeckt sein (z.B. durch ein danebenliegendes Ausklappmenü); etc.
                                                                                            • AAA: aktueller Ort des Nutzers innerhalb einer Webseitenstruktur soll klar erkennbar sein (z.B. "Sie sind hier: [Start] > [Blog] > [Archiv] > Name des aktuellen Artikels"); etc.
                                                                                            • Richtlinie 9: Alternative Eingabemethoden
                                                                                              • A: Webseiten/-applikationen, die Mehrpunkt-Interaktion erlauben ("Touch-Gesten"), sollen auch eine Alternative für zeigerbasierte Einzelpunkt-Interaktion erlauben; Aktionen infolge fehlerhaften Runterdrückens der Maustaste sollen abwendbar oder umkehrbar sein; Interaktion durch Bewegungssteuerung soll auch durch Steuerelemente ersetzbar sein sowie gegen Fehlaktivierung resistent sein; etc.
                                                                                              • AA: Klickflächen müssen mindestens 24x24 CSS-Pixel groß sein (vgl. Fitts' Gesetz)
                                                                                              • AAA: Klickflächen müssen mindestens 44x44 CSS-Pixel groß sein; alternative Eingabemethoden sollen beliebig gleichzeitig nutzbar sein (ohne explizites Umschalten)
                                                                                              • im Gespräch erwähnt: Zenons Paradoxon von Achilles und der Schildkröte, The Topological Problem with Voting (Video)
                                                                                              • In Teil 3 dieser Serie folgen noch Grundprinzip 3 (Verständlichkeit) und 4 (Robustheit).

                                                                                                1 hr
                                                                                              • STP082: Literatur: Vom Mythos des Mann-Monats, Teil 3

                                                                                                Als letzten Streich in der Besprechung dieses Werkes hört ihr einen Mitschnitt von den Datenspuren von 2025-09-19; und da wir leider nicht den ganzen Rest des Buches in unsere Bühnenzeit bekommen haben, auch noch den Rest in der gewohnten Form. Applaus für den Presenter!

                                                                                                ShownotesFortsetzung aus STP068 und STP074. Wir lesen weiterhin die englische Erstausgabe von 1975, die im Internet Archive digitalisiert wurde.
                                                                                                Erneut als Vorbemerkung: Aus Quellentreue sagen wir "Mann-Monat" statt "Person-Monat".

                                                                                                Kurzzusammenfassung der bisherigen Folgen

                                                                                                Für die Zuschauer im Saal, die die vergangenen Folgen nicht gehört haben. Das übergreifende Motiv in dieser ersten Hälfte des Buches ist, wie sich die Arbeit in großen Teams von kleinen Teams unterscheidet.

                                                                                                1. Die Teergrube
                                                                                                2. So wie man in der Teergrube erst gefangen ist, wenn alle Beine drinstecken, so resultiert die Trägheit von Software-Entwicklung aus einem Zusammenspiel mehrerer Faktoren. Ein Programm zu schreiben, ist einfach. Aber die Produktisierung erfordert viel mehr Aufwand: für Generalisierung, Testabdeckung, Dokumentation und fortlaufende Wartung. Außerdem muss sich das Programm in ein größeres System einfügen. Vom Programm zum Programmsystemprodukt erhöht sich der Aufwand um ungefähr eine ganze Größenordnung.

                                                                                                3. Vom Mythos des Mann-Monats
                                                                                                4. Konventionelle Planungsmethoden funktionieren nur, wenn Personen und Monate austauschbar sind. Das beachtet jedoch weder die unterschiedlichen Kompetenzniveaus verschiedener Teammitglieder noch den zusätzlichen Zeitaufwand durch Kommunikation innerhalb des Teams sowie zwischen Teams. Da Programmierer aber schlecht im Schätzen von Zeitaufwand sind, wird in der Praxis der Zeitplan oft an den Bedürfnissen der Kunden ausgerichtet, nicht an den technischen Randbedingungen. Wenn dann das Kind in den Brunnen gefallen ist, tritt das Brooks'sche Gesetz in Kraft: "Das Hinzufügen weiteren Personals zu einem verspäteten Softwareprojekt verspätet es weiter."

                                                                                                5. Das OP-Team
                                                                                                6. Um die Kommunikationskosten zu verringern, stellt Brooks ein Modell für kleinere Teams vor, die in Analogie zu einem OP-Team organisiert sind, in dem immer nur einer auf einmal die eigentliche Programmierarbeit leistet und alle anderen nur zuarbeiten. Die genaue Beschreibung ist sicherlich überholt: Heutzutage braucht man zum Beispiel keinen Schreiber mehr, der Lochkarten sortiert. Aber vielleicht haben wir auch etwas verloren, als wir Sekretärsrollen ersetzt haben dadurch, dass jetzt die rare Expertin Termine im Outlook schubsen und Präsentationsfolien zusammenklicken muss.

                                                                                                7. Aristokratie, Demokratie und System-Design
                                                                                                8. Die Kathedrale von Reims wurde von acht Generationen von Baumeistern errichtet, weist aber trotzdem eine beachtliche gestalterische Kohärenz auf, weil die nachfolgenden Generationen das ursprüngliche Design respektiert haben. Daraus muss aber nicht folgen, dass ein einzelner Architekt alle Entscheidungen trifft und die Erbauer nur stupide die Pläne umsetzen. Auch auf der Umsetzungsebene gibt es viele interessante Designentscheidungen zu treffen; und ein guter Architekt hört auch auf seine Erbauer, wenn es um Fragen von Praktikabilität geht.

                                                                                                9. Das Problem des zweiten Systems
                                                                                                10. In diesem Dialog zwischen Architekt und Erbauer stellen sich also oftmals Ideen des Architekten als unpraktikabel heraus und werden verworfen. Doch wenn das erste System erfolgreich war, gewinnt der Architekt an Prestige und Erfahrung, die dazu verleiten kann, beim nächsten Mal alle Sachzwänge zu ignorieren. Ein weiteres klassisches Diktum von Brooks ist deswegen: "Dieses zweite ist das gefährlichste System, dass man jemals entwirft."

                                                                                                11. Weitergabe von Informationen
                                                                                                12. Damit ein Entwurf von 10 Architekt:innen von 1000 Mitarbeiter:innen und nochmal deutlich mehr Nutzer:innen verstanden wird, braucht es gute Dokumentation: Handbücher für Benutzer, und Architekturpläne für Erbauer. Brooks schlägt hier einiges vor, was heute in der Industrie gelebte Praxis ist (oder zumindest sein sollte), zum Beispiel maschinenlesbare Spezifikation von Schnittstellen und automatisierte Tests zur Überprüfung der Kompatibilität. Sein Ruf nach sorgfältiger Pro/Kontra-Abwägung zwischen mehreren möglichen Design-Optionen verhallt im Zeitalter agiler Softwareentwicklung jedoch oftmals ungehört.

                                                                                                13. Warum ist der Turm zu Babel gefallen?
                                                                                                14. Offensichtlich ist ineffektive Kommunikation einer der wesentlichen Gründe dafür, dass Software-Großprojekte scheitern oder erst mit deutlicher Verspätung liefern. Somit stellt sich die Frage nach der optimalen Teamstruktur in einer Software-Entwicklungsabteilung. Brooks hält eine baumförmige Struktur für unausweichlich, damit Entscheidungskompetenzen klar geregelt sind. In jedem Entwicklungsteam sollte es sollte es neben einem Architekten (dem Chefentwickler des Teams) auch einen Produzenten geben, der sich um die Kommunikation mit anderen Teams kümmert. Da eine Personalunion zwischen beiden Rollen nicht skaliert, muss entweder der Architekt der Chef des Produzenten sein: Dies passt aber nicht zu den separaten Management-Karrieren in den großen Firmen. Oder der Produzent ist der Chef des Architekten: Dies kann aber nur funktionieren, wenn der Produzent die technische Autorität des Architekten akzeptiert.

                                                                                                  Kapitel 8: "Calling the Shot"
                                                                                                  • "Calling the Shot" hier im Baseball-Sinne: vorher ansagen, wo der Ball nach dem Schlag landet

                                                                                                    • Wie lange wird eine System-Programmierungsaufgabe dauern? Wieviel Aufwand ist nötig? Wie schätzt man das?
                                                                                                    • Problem: Code schreiben alleine ist noch einigermaßen abschätzbar, macht aber nur einen kleinen Teil (vllt. ein Sechstel) des Gesamtaufwandes aus

                                                                                                      • Aufwand steigt exponentiell mit der Komplexität des Programmiersystems, weil Interaktionen zwischen verschiedenen Teilen des Systems beachtet werden müssen und Kompromisse im Design erfordern (vgl. Kapitel 1)
                                                                                                      • und dann zusätzlicher Overhead, sobald Kommunikation zwischen mehreren Teammitgliedern erforderlich ist (vgl. Kapitel 2)
                                                                                                      • Brooks fasst dann Erkenntnisse aus mehreren quantitativen Studien zusammen; Highlights:

                                                                                                        • Geschwindigkeitsschätzungen waren zu Beginn immer ziemlich akkurat, aber im Verlauf des Projektes wird mit zunehmender Komplexität alles immer träger
                                                                                                        • Aufwand scheint am stärksten von der Gesamtmenge an Code abzuhängen (sprich: 1000 Zeilen Code sind ähnlicher Aufwand, unabhängig von der Sprache) -> Überleitung in das nächste Kapitel
                                                                                                        • Kapitel 9: Zehn Pfund in einem Fünf-Pfund-Sack
                                                                                                          • wenn Code kein Wert an sich, sondern eine Verbindlichkeit ist, wie kann man Code reduzieren?

                                                                                                            • Hochsprachen -> vgl. "No Silver Bullet" und intrinsiche vs. versehentliche Komplexität ("essential vs. accidental complexity"; besprochen im Pentaradio vom Dezember 2022)
                                                                                                            • Xyrill sieht einen Bezug zum Hype um Coding-KI und die damit verbundenen Werbeversprechen
                                                                                                            • Brooks zieht eine Parallele zu Hardware-Entwurf: "Weil die Größe ein wichtiger Teil der Benutzerkosten eines Programmiersystem-Produktes ist, muss der Erbauer Größenziele setzen, die Größe im Auge behalten, und Techniken zur Größenreduktion ersinnen; genau so, wie ein Hardware-Erbauer Komponentenzahlziele setzt, die Komponentenzahl im Auge behält, und Techniken zur Reduktion der Komponentenzahl ersinnt. Wie jede Art von Kosten ist Größe an sich nicht schlecht, aber überflüssige Größe ist es."

                                                                                                              • vgl. Kapitel 1 (siehe STP068), wo bereits ein vordefiniertes Ressourcenbudget für jedes Teilprogramm gefordert wurde
                                                                                                              • heute (leider?) nicht mehr en vogue; Speicher ist zu günstig geworden
                                                                                                              • "Repräsentation ist die Essenz des Programmierens": Brooks hält den Entwurf passender Datenstrukturen für sehr viel relevanter als die Auswahl passender Algorithmen

                                                                                                                • Xyrill stimmt offensichtlicherweise zu, siehe STP071/072
                                                                                                                • "Zeig mir deine Flussdiagramme ohne die [Datenbank-]Tabellen, und ich werde verwirrt bleiben. Zeig mir deine Tabellen, und ich werde die Flussdiagramme wahrscheinlich nicht brauchen; sie werden offensichtlich sein."
                                                                                                                • Xyrill vermutet, dass hierher seine tiefe Abneigung gegen Prozess-Designer rührt
                                                                                                                • Kapitel 10: Die dokumentarische Hypothese

                                                                                                                  Die Hypothese: Verborgen in einem riesigen Papierhaufen verborgen, werden eine kleine Zahl von Dokumenten zu kritischen Angelpunkten, um die sich das Management eines jeden Projektes dreht. Dies sind die zentralen Werkzeuge eines Managers.

                                                                                                                  • "Auf einen neuen Manager, der gerade aus dem Handwerk gewechselt ist, erscheint der meiste Papierkram als vollständiges Ärgernis, als unnütze Ablenkung, und eine weiße Flut, die droht, ihn zu umspülen. Und in der Tat sind die meisten dieser Dokumente genau das."

                                                                                                                    • doch einige Dokumente sind essentiell und das wesentliche Arbeitsergebnis des Managers
                                                                                                                    • Mindestsatz laut Brooks: Zielsetzungen/Spezifikationen, Zeitplan, Budget, Ressourcenzuteilung, Personalzuteilung (letzteres vgl. Conway's Gesetz: "Organisationen, die Systeme entwerfen, sind gezwungen, Systeme hervorzubringen, die die Kommunikationsstruktur dieser Organisation kopieren.")
                                                                                                                    • wesentliche Funktionen von Dokumentation für den Manager:

                                                                                                                      • Festhalten von Entscheidungen: Aufschreiben legt Widersprüche, Denkfehler und -lücken offen
                                                                                                                      • Kommunizieren von Entscheidungen: Manager sind die meiste Zeit Kommunikatoren und nur relativ selten tatsächlich Entscheider
                                                                                                                      • Erinnern von Entscheidungen: klare Dokumentation einer Entscheidung mit Begründung ermöglicht spätere Rezension und Entscheidung, wann eine Richtungsänderung angebracht ist
                                                                                                                      • Kapitel 11: Plane damit, eines wegzuwerfen ("Plan to Throw One Away")
                                                                                                                        • Analogie zu Pilotanlagen in der Chemietechnik: beim Übergang von Laborprozessen zu Fabrikproduktion im großen Maßstab sind Skalierungsprobleme und methodische Fragen zu lösen, sodass man nicht sofort die Fabrikanlage in der finalen Größe bauen kann

                                                                                                                          • "Plane damit, eines wegzuwerfen. Du wirst es sowieso tun."
                                                                                                                          • Programmierer waren zu Brooks' Zeiten damit beschäftigt, die Lektion zu lernen, und sind es heute immer noch
                                                                                                                          • damit im Zusammenhang: Wie geht man mit Veränderungen der Umstände um? Wieviel Veränderung der Umstände ist man bereit, zu akzeptieren?

                                                                                                                            • These: Unwillen zur Dokumentation ist Unwillen, sich auf eine Entscheidung festzulegen, von der man schon weiß, dass sie immer nur vorläufig sein kann
                                                                                                                            • bis hin zu Teamstruktur: "In einem großen Projekt muss der Manager zwei oder drei Topprogrammierer als technische Kavallerie vorhalten, die zu Rettung galoppieren können, wo immer der Kampf am schwierigsten ist." (Xyrill ist sich nicht sicher, ob er da mitgeht)
                                                                                                                            • Software-Maintenance laut Brooks besteht hauptsächlich aus "Änderungen, die Designfehler beheben"

                                                                                                                              • Xyrill stimmt nur im Teil zu: der meiste Aufwand bei Maintenance heutzutage ist "Bit Rot" (Umgang mit der stetig fortschreitenden Fäulnis im Ökosystem), also nur indirekt Behebung von Designfehlern
                                                                                                                              • jede Behebung eines Fehlers kann aber auch neue Fehler erzeugen (sowohl auf handwerklicher Ebene als auch auf Design-Ebene)
                                                                                                                              • automatisierte Tests helfen, sofern sie eine hinreichend gute Abdeckung erzielen und nicht so aufwändig sind, dass sie den Arbeitsprozess behindern
                                                                                                                              • trotzdem: Programme werden im Verlauf ihres Lebenszyklus immer komplexer, wodurch die Rate von Folgefehlern steigt
                                                                                                                              • der letzte Satz des Kapitels war bereits im Juni im Pentaradio zitiert: "Das Erbauen eines Programms ist ein entropieverringernder Prozess […] Die Wartung eines Programms ist ein entropieerhöhender Prozess, und selbst die gescheiteste Umsetzung kann das unausweichliche Absacken des Systems in unreparierbare Obsoleszenz höchstens verzögern."

                                                                                                                                Kapitel 12: Scharfe Werkzeuge
                                                                                                                                • Programmierer sind eine der wenigen Berufsstände, die ihre eigenen Werkzeuge bauen

                                                                                                                                  • da Effizienz aus der Qualität des Instrumentariums folgt, sollen Softwareentwicklungs-Manager Ressourcen abstellen für "Werkzeugmacher"
                                                                                                                                  • aber: heute anderer Fokus als damals; weniger Bedarf nach z.B. Debugging-Werkzeugen (das bringt die Programmiersprache mit) und mehr Bedarf nach z.B. CI/CD oder Linting
                                                                                                                                  • Brooks bespricht dann Strategien, die nicht auf den allgemeinen Fall übertragbar sind

                                                                                                                                    • Rationierung der Rechenzeit auf raren Mainframes: heute haben wir überproportionierte PCs für jeden Entwickler, sowie elastische Cloud-Infrastruktur für alles, was da nicht heraufpasst
                                                                                                                                    • Umgang mit Prerelease-Hardware: betrifft die allermeisten großen Software-Projekte nicht (aber siehe dieser Vortrag von einem AMD-Chipdesigner)
                                                                                                                                    • Brooks stellt als offensichtlich wertvolles Werkzeug Hochsprachen auf eine Stufe mit interaktiver Programmierung

                                                                                                                                      • "Ich bin überzeugt, dass nur Schwerfälligkeit und Faulheit die universelle Annahme dieser Werkzeuge aufhalten; die technischen Schwierigkeiten sind nicht länger valide Ausreden."
                                                                                                                                      • Vorteile von Hochsprachen: erhöhte Produktivität (aufgrund weniger Code; siehe Kapitel 8/9), weniger Programmierfehler (nicht nur aufgrund weniger Code, sondern weil ganze Fehlerklassen eliminiert werden)
                                                                                                                                      • bei interaktiver Programmierung Bezug zu MIT Multics (dem Vorgänger von AT&T Unix): Xyrill hatte hier zuerst an Systeme wie Smalltalk gedacht, aber offenbar ist "interaktiv" hier das Gegenwort zu "Batch Processing"
                                                                                                                                      • Kapitel 13: Das Ganze und die Teile
                                                                                                                                        • Wie verhindert man Probleme beim Zusammenfügen mehrerer Teilprogramme zu einem Gesamtsystem?

                                                                                                                                          • Brooks enumeriert hier viele bereits erwähnte Sachen: strukturierte Programmierung in Hochsprachen, Debugging (entweder interaktiv auf der Zielmaschine, oder post-mortem mit einem Speicherabbild), Tests (sowohl für Einzelkomponenten als auch das Gesamtsystem)
                                                                                                                                          • Missverständnisse bzw. Unklarheiten in der Spezifikation: siehe Kapitel 4-6 für Prozesse zum Erhalt der konzeptionellen Integrität des Gesamtsystems

                                                                                                                                            • Xyrill beobachtet, dass das Schreiben der Spezifikation oftmals mehr Konzentration erfordert als das Schreiben des Code (hohe Entscheidungsdichte, dichtes Konsequenzgeflecht)
                                                                                                                                            • Brooks empfiehlt einen Ansatz nach Niklaus Wirth: "Programmentwicklung durch schrittweises Verfeinern" mit verschiedenen Stufen von je nach Stufe möglichst groben Designs, die dann jeweils durch die nächste Stufe verfeinert werden
                                                                                                                                            • Probleme beim Verfeinern stellen dann evtl. die Designfehler auf der gröberen Ebene bloß -> damit der Versuchung entgehen, ein schlechtes Grunddesign mit immer mehr Epizyklen zuzukleistern
                                                                                                                                            • Empfehlung: klare Markierungen, wenn zum Zwecke der Fehlerbehebung der dokumentierte Zustand des Systems manipuliert wird

                                                                                                                                              • Brooks beschreibt Verkabelung gemäß Plan mit gelben Kabeln und manuelle Änderungen mit lilanen Kabeln, damit diese ins Auge stechen und dann beim nächsten Update des Kabelplans berücksichtigt werden
                                                                                                                                              • in Software nicht so sehr formalisiert, wie es sein sollte (am ehesten in Form von Systemen, die manuelle Änderungen am Produktivsystem unterbinden)
                                                                                                                                              • weitere Empfehlungen:

                                                                                                                                                • immer eine Komponente nach der anderen hinzufügen, nicht mehrere auf einmal
                                                                                                                                                • Aktualisierungen nicht ständig einspielen, sondern nur ab und zu, damit man zwischendurch den stabilen Zustand des Systems beobachten kann
                                                                                                                                                • Kapitel 14: Wie man eine Katastrophe ausbrütet ("Hatching a Catastrophe")
                                                                                                                                                  • Zeitpläne scheitern meist nicht durch ein großes Hindernis (auf welches mit einer großen Anstrengung reagiert würde), sondern durch eine Anhäufung kleiner Hindernisse

                                                                                                                                                    • vgl. politische Reaktion auf Versagen: Einsturz einer einzelnen Brücke mobilisiert sofort Unterstützung, aber schleichender Verfall aller Brücken ist alternativlos
                                                                                                                                                    • Tod durch tausend Schnitte: heute ist der Chefentwickler krank, morgen ist eine Festplatte auf dem Datenbankserver kaputt, übermorgen verspätet sich der Hardwaretest aufgrund Problemen in der Lieferkette
                                                                                                                                                    • Erkennen von Verspätungen erfordert einen festen Zeitplan mit spezifischen Meilensteinen

                                                                                                                                                      • Gegenbeispiel: "Implementation 90% fertig" stimmt so gut wie immer :)
                                                                                                                                                      • "Chronisches Überziehen des Zeitplans ist ein Teammoral-Killer."
                                                                                                                                                      • "Aber die anderen sind auch zu spät dran."

                                                                                                                                                        • trotzdem ist es ratsam, sich selber ranzuhalten, damit man nicht auf dem kritischen Pfad landet und dann das ganze Großprojekt ins Stocken bringt
                                                                                                                                                        • Manager sollten den kritischen Pfad kennen, damit sie rechtzeitig wissen, wo ihre Aufmerksamkeit am wertvollsten ist
                                                                                                                                                        • Kapitel 15: Das andere Gesicht
                                                                                                                                                          • "Ein Computerprogramm ist eine Nachricht des Menschen an die Maschine. [...] Aber ein geschriebenes Programm hat ein anderes Gesicht, dasjenige, dass seine Geschichte dem menschlichen Benutzer erzählt."

                                                                                                                                                            • selbst für Programme für den eigenen Gebrauch, damit man sich in einem Jahr noch daran erinnert, was das Programm tut
                                                                                                                                                            • Brooks möchte, dass Dokumentation aus drei Teilen besteht

                                                                                                                                                              • wie man ein Programm verwendet (klar)
                                                                                                                                                              • wie man dem Programm glaubt (Testfälle zum Ausprobieren)
                                                                                                                                                              • wie man das Programm verändert (Dokumentation über die interne Struktur, das Dateilayout, verwendete Algorithmen und Datenstrukturen)
                                                                                                                                                              • Brooks findet Strukturdiagramme super, und Flowcharts scheiße: man solle lieber äquivalenten (Pseudo-)Code hinschreiben

                                                                                                                                                                • Xyrill stimmt zu: die meisten Flowcharts aus der Praxis sind abgrundtief hässlich und unlesbar chaotisch
                                                                                                                                                                • Ergebnis: der Code sollte einfach selbstdokumentierend sein bzw. seine Dokumentation inline enthalten (vgl. Donald Knuth und "Literate Programming")
                                                                                                                                                                • offensichtlich ist das alles aus der Zeit, bevor Software ein einzeln verkauftes Produkt war
                                                                                                                                                                • im Gespräch erwähnt: The Architecture of Open Source Applications; ein Buch darüber, guten Open-Source-Code zu lesen und zu durchdringen

                                                                                                                                                                  Epilog

                                                                                                                                                                  "Die Teergrube der Software-Entwicklung wird noch eine ganze Weile klebrig bleiben. Man kann davon ausgehen, dass die Menschheit auch weiterhin Systeme in Angriff nehmen wird, die gerade so innerhalb oder gerade so außerhalb des Möglichen liegen; und Softwaresysteme sind vielleicht die vertracktesten und komplexesten aller menschlichen Schöpfungen. Das Verwalten dieses komplexen Handwerks wird von uns fordern: den bestmöglichen Einsatz neuer Sprachen und Systeme, die optimale Anwendung bewährter Methoden des Ingenieurmanagements, großzügige Mengen gesunden Menschenverstandes, und die gottgegebene Demut, die eigene Fehlbarkeit und Beschränkungen zu erkennen."

                                                                                                                                                                  Podcast-Empfehlungen
                                                                                                                                                                  • Gilda con Arne – Der Politik-Podcast
                                                                                                                                                                  • Dlf Doku Serien
                                                                                                                                                                    • einige Trailer für Dokus
                                                                                                                                                                    • Tech Bro Topia
                                                                                                                                                                    • Rechtsextreme vor Gericht
                                                                                                                                                                    • Neuland
                                                                                                                                                                    • Die Geschichte geht weiter – Victor Klemperers Tagebücher 1918-1958
                                                                                                                                                                    • 1 hr 42 min
                                                                                                                                                                    • STP081: Barrierefreiheit im Web (Teil 1)

                                                                                                                                                                      Es gibt Menschen, die körperliche oder mentale Einschränkungen haben. Für diese Menschen könnte unsere Welt angenehmer gestaltet werden. Welche Vorteile auch nicht behinderte Menschen aus entsprechenden Maßnahmen ziehen und was diese Maßnahmen sind, darum soll es heute gehen. Und an einem anderen Tag auch.

                                                                                                                                                                      Shownotes
                                                                                                                                                                      • seit 28. Juni 2025 gilt das Barrierefreiheitsstärkungsgesetz als nationale Umsetzung der EU-Richtlinie 2019/882 über die Barrierefreiheitsanforderungen für Produkte und Dienstleistungen

                                                                                                                                                                        • gilt insbesondere auch für alle digitalen Dienstleistungen (Webseiten, Apps, Ticketautomaten, etc.)
                                                                                                                                                                        • Leitmotiv heute: Ist das nur was für Menschen mit Behinderungen?
                                                                                                                                                                        • Webseiten und Webapplikationen müssen die AA-Kriterien der WCAG 2.1 erfüllen

                                                                                                                                                                          • WCAG = Web Content Accessibility Guidelines (Webinhalte-Barrierefreiheits-Richtlinien) der Web Accessibility Initiative des W3C
                                                                                                                                                                          • WCAG 2.2 (aktuelle Version von 2024) enthält eine Reihe von Kriterien, gruppiert in 4 Grundprinzipien und darin 13 Richtlinien
                                                                                                                                                                          • Kriterien gehen jeweils von A (Pflicht) über AA (Kür) bis AAA (Sahnehäubchen)
                                                                                                                                                                          • zum Mitlesen: WCAG 2.2 (aktuelle Version, nur Englisch) oder WCAG 2.0 (etwas ältere Version, in offizieller deutscher Übersetzung)
                                                                                                                                                                          • Grundprinzip 1: Wahrnehmbarkeit

                                                                                                                                                                            • Richtlinie 1: Textalternativen
                                                                                                                                                                              • A: Textalternativen für alle Nicht-Text-Inhalte
                                                                                                                                                                              • Richtlinie 2: Alternativen für zeitbasierte Medien
                                                                                                                                                                                • A: Audiobeschreibung oder Alternativdarstellung für voraufgezeichnete Bewegtbilder, Untertitel für voraufgezeichnete Videos mit Ton
                                                                                                                                                                                • AA: Untertitel für Live-Videos etc.
                                                                                                                                                                                • AAA: Gebärdenübersetzung für Sprache in Audio/Video etc.
                                                                                                                                                                                • Richtlinie 3: Anpassbarkeit
                                                                                                                                                                                  • A: Struktur und Beziehungen in dargestellter Information sollen programmatisch auslesbar sein (z.B. in HTML Strukturierung anhand semantisch aufgeladener Tags wie , , , ); Darstellung soll in korrekter Lesereihenfolge erfolgen; Struktur der Information soll nicht nur aus sensorischen Charakteristika wie Form, Farbe, visueller Anordnung oder Klängen hervorgehen
                                                                                                                                                                                  • AA: Inhalte sollen sowohl in Hochformat als auch Querformat funktionieren; Eingabefelder sollen programmatisch als solche erkennbar sein
                                                                                                                                                                                  • AAA: alle Steuer- und Inhaltselemente sollen programmatisch auslesbar sein
                                                                                                                                                                                  • im Gespräch erwähnt: Rot-Grun-Sehschwäche
                                                                                                                                                                                  • Richtlinie 4: Unterscheidbarkeit
                                                                                                                                                                                    • A: Farbe nicht als einziges Unterscheidungsmerkmal (z.B. zwischen guten und schlechten Optionen); Abspielen von Audioinhalten soll durch den Nutzer kontrollierbar sein
                                                                                                                                                                                    • AA: Text- und Hintergrundfarben sollen ein Kontrastverhältnis von mindestens 4.5:1 aufweisen (außerdem 3:1 für aktive Steuerelemente); Text soll ohne Spezialwerkzeuge um bis zu 200% vergrößerbar sein; Inhalte sollen unabhängig vom Bildschirmformat ohne exzessives Scrolling erreichbar sein; etc.
                                                                                                                                                                                    • AAA: Kontrastverhältnis für Text mindestens 7:1; Audio mit Sprache soll geringe Hintergrundgeräusche aufweisen; Text soll mit kurzen Zeilenlängen und mindestens anderthalbfachem Zeilenabstand dargestellt werden; reiner Text soll nicht als Bilddatei ausgespielt werden; etc.
                                                                                                                                                                                    • 1 hr 5 min
                                                                                                                                                                                    • STP080: Common Weakness Enumeration (Teil 2)

                                                                                                                                                                                      Im zweiten Teil zu üblichen Schwachstellen hören wir neben einigen Querverweisen auch Xyrills Meinung zu seiner favorisierten Verwundbarkeit.

                                                                                                                                                                                      Shownotes
                                                                                                                                                                                      • Platz 9: CWE-862; fehlende Autorisierung

                                                                                                                                                                                        • siehe Besprechung von Authentifizierung und Autorisierung in STP039
                                                                                                                                                                                        • Lösung: Just do it! :)
                                                                                                                                                                                        • passend dazu Platz 14 und 18: CWE-287 und CWE-863; fehlerhafte Authentifizierung bzw. Autorisierung
                                                                                                                                                                                        • außerdem Platz 15: CWE-269; unzureichende Privilegienkontrolle
                                                                                                                                                                                        • als Sonderfall Platz 25: CWE-306; fehlende Authentifizierung an kritischer Stelle
                                                                                                                                                                                        • daraus folgend Platz 17: CWE-200; Preisgabe sensitiver Informationen an nicht Zugriffsberechtigte
                                                                                                                                                                                        • Platz 10: CWE-434; Unbeschränktes Hochladen von Dateien des falschen Typs

                                                                                                                                                                                          • und dadurch z.B. Einschleusung von Schadcode (Xyrill fühlt sich an den "OpenOffice kann dienstags nicht drucken"-Bug erinnert)
                                                                                                                                                                                          • Lösung: nur bekannte Formate akzeptieren
                                                                                                                                                                                          • passend dazu Platz 16: CWE-502; Deserialisieren unvertrauenswürdiger Daten
                                                                                                                                                                                          • Lösung: unbekannte Daten mit sicheren Parsern validieren
                                                                                                                                                                                          • Platz 21: CWE-476; Zugriff auf Nullzeiger

                                                                                                                                                                                            • besprochen in STP045
                                                                                                                                                                                            • Platz 22: CWE-798; Zugriff mit hartkodierten Anmeldedaten

                                                                                                                                                                                              • In wieviele Plasterouter kommt man wohl immer noch mit Username admin und Passwort letmein rein? :)
                                                                                                                                                                                              • tatsächlich auch bei Enterprise-Hardware oftmals Standardpasswörter voreingestellt, die dann beim Einrichten (versehentlich?) nicht geändert werden
                                                                                                                                                                                              • Platz 23: CWE-190; Ganzzahlüberlauf ("Integer Overflow or Wraparound")

                                                                                                                                                                                                • besprochen in STP003 (Überlauf in Logikgattern) und STP037 (berühmte Überlauffehler)
                                                                                                                                                                                                • Platz 24: CWE-400; unkontrollierter Ressourcenverbrauch

                                                                                                                                                                                                  • Rückbezug zu STP079 (Komplexitätsattacke in Hashmaps)
                                                                                                                                                                                                  • außerdem noch Xyrills Favorit: CWE-655; unzureichende psychologische Akzeptabilität :)

                                                                                                                                                                                                    39 min
                                                                                                                                                                                                  • STP079: Feld von Feldern

                                                                                                                                                                                                    Nach einem kurzen Feedback gehen wir diesmal zu Karten… nein, Abbildungen über. Das ist am Anfang kein Problem. Nur wenn die Eimer für Streuwertfunktionen kleiner werden, hat ttimeless etwas Schwierigkeiten.

                                                                                                                                                                                                    Shownotes
                                                                                                                                                                                                    • Rückbezug STP077: Liste von Listen

                                                                                                                                                                                                      • verschiedene Datenstrukturen implementieren dasselbe Datenformat mit unterschiedlichen Laufzeitcharakteristiken
                                                                                                                                                                                                      • heute analog dazu Besprechung von assoziativen Datenfeldern
                                                                                                                                                                                                      • Rückbezug STP072: assoziative Datenfelder (wir sagen hier "Maps"; heißt je nach Programmiersprache auch "Objekt", "Dictionary", etc.)

                                                                                                                                                                                                        • eine Sammlung von Wertepaaren mit jeweils einem eindeutigen Schlüssel ("Key") und einem zugeordneten Wert ("Value")
                                                                                                                                                                                                        • z.B. Wörterbuch: Schlüssel ist das Lemma, Wert ist die Definition
                                                                                                                                                                                                        • z.B. Verzeichnis im Dateisystem: Schlüssel ist der Dateiname, Wert ist die Datei (bzw. das Unterverzeichnis)
                                                                                                                                                                                                        • praktisches Beispiel: Wörter zählen
                                                                                                                                                                                                        • es geht hier nur um Wertepaare, die aktiv im Speicher vorliegen, nicht um berechnete Abbildungen (Gegenbeispiel: Suchmaschine bildet von Suchanfrage auf Ergebnisseite ab)
                                                                                                                                                                                                        • Ansatz 1: "Sammlung von Wertepaaren" als Liste umsetzen

                                                                                                                                                                                                          • sofern unsortiert, ist die algorithmische Komplexität für die meisten Operationen sehr schlecht
                                                                                                                                                                                                            • z.B. Suchen nach einem bestimmten Schlüssel in linearer Zeit (O(n)), wenn man die Liste von vorne nach hinten durchgehen muss
                                                                                                                                                                                                            • z.B. Einfügen eines neuen Schlüssels auch nur in linearer Zeit, weil man einen evtl. existierenden Eintrag mit demselben Schlüssel finden und ersetzen
                                                                                                                                                                                                            • praktikable Umsetzung unter Verwendung einer sortierten Liste, um bestimmte Schlüssel schnell aufzufinden
                                                                                                                                                                                                              • meistens mittels eines balancierten Baums, z.B. in Rust BTreeMap oder in C++ std::map
                                                                                                                                                                                                              • Problem: Schlüssel müssen sortierbar sein (Beispiel: Strings, Ganzzahlen; Gegenbeispiel: komplexe Zahlen, Fließkommazahlen, ungeordnete Mengen)
                                                                                                                                                                                                              • Problem: auch bei sortierbaren Schlüsseln können Vergleiche teuer sein
                                                                                                                                                                                                              • Wie können wir die Vergleiche günstiger machen?
                                                                                                                                                                                                              • Ansatz 2: Vorsortierung anhand von Streuwertfunktionen (Hashes)

                                                                                                                                                                                                                • Idee: bei Suche nach einem bestimmten Schlüssel wird ein Hash des Schlüssels ermittelt (in Größenordnung einer kleinen Ganzzahl, z.B. 4 oder 8 Byte; nicht ein kryptografisch starker Hash wie SHA-2 mit 28-64 Bytes); damit schnelle Vergleiche möglich -> Hashtabelle
                                                                                                                                                                                                                • Strategie 1: Gruppierung der Wertepaare in "Buckets" anhand der ersten K Bits des Hash-Wertes des Schlüssels
                                                                                                                                                                                                                  • K richtet sich nach der Gesamtanzahl an Wertepaaren (z.B. für 50 Elemente könnte man K = 5 oder 6 und damit 2^K = 32 oder 64 Buckets wählen)
                                                                                                                                                                                                                  • innerhalb der Buckets einfache Listen von Wertepaaren, die in diesen Bucket fallen; idealerweise nur ein Eintrag pro Bucket
                                                                                                                                                                                                                  • durch dynamisches Anpassen der Bucket-Anzahl Abwägung zwischen Speicheraufwand für evtl. leere Buckets einerseits und Zeitaufwand für Durchsuchen übervoller Buckets andererseits
                                                                                                                                                                                                                  • Strategie 2: wie 1, aber jeder Bucket kann maximal ein Element aufnehmen
                                                                                                                                                                                                                    • bei Kollisionen strategisches Ausweichen auf andere Buckets in einem systematischen Muster, bis ein freier Platz gefunden wird
                                                                                                                                                                                                                    • große Variation von Implementationsstrategien für dieses "strategische Ausweichen"
                                                                                                                                                                                                                    • Vorwärtsbezug zu STP080: Komplexitätsattacke auf Hashmaps (eine Instanz von CWE-400)

                                                                                                                                                                                                                      • Problem, wenn Hashmap mit nutzerdefinierten Daten gefüllt wird: Angreifer könnte Daten so wählen, dass sie alle im selben Bucket landen wollen
                                                                                                                                                                                                                      • damit extrem hohe Rechenlast durch ständige Kollisionen
                                                                                                                                                                                                                      • Lösung: Durchmischen des Hash mittels prozessinterner Geheimzahl (siehe STP044 zu Zufallszahlen)
                                                                                                                                                                                                                      • Feedback zu STP065

                                                                                                                                                                                                                        Mole schreibt:

                                                                                                                                                                                                                        In STP065 vermutest du, dass der Ethernet-Port wegen Authentifizierung abgeschafft wurde. "Beim WLAN muss man sich authentifizieren, beim Ethernet kann man sich einfach anstecken und lossurfen." Das ist so natürlich nicht richtig. Im Enterprise-Umfeld gibt es für sowas 802.1x. Das wird übrigens auch beim WLAN zur Authentifizierung mit einem RADIUS-Server benutzt. Außerdem gibt es da SNMP-Traps. Da schaltet dann der Port ab und der Admin bekommt eine Nachricht, wenn die falsche MAC antwortet. Das gab es schon lange vor WLAN.

                                                                                                                                                                                                                        Nächstes Problem: Du erklärst, das die NUCs vom VOC für das Streaming zuständig sind. Das ist so auch nicht richtig. Die machen nur das Encoding in die Subformate, wenn der Talk schon geschnitten ist. Für das Streaming sind die Cubes, ordentliche PCs mit extrem teuren Spezial-SDI-Encoding-Karten. Die Kisten brauchen auch echt Leistung, weil die das live machen.

                                                                                                                                                                                                                        1 hr 3 min
                                                                                                                                                                                                                      • STP078: Common Weakness Enumeration (Teil 1)

                                                                                                                                                                                                                        Nachdem wir kurz über Alex' Feedback gesprochen haben, soll es heute mal wieder um Sicherheit gehen; diesmal speziell darum, was Personen die Software schreiben beachten sollten, um die bekantesten Fallstricke sicher zu umgehen.

                                                                                                                                                                                                                        Shownotes
                                                                                                                                                                                                                        • Rückbezug STP049: CVE-Datenbank für bekannte Sicherheitslücken in bestimmten Programmen (z.B. Heartbleed ist CVE-2014-0160)

                                                                                                                                                                                                                          • betrieben von dem privaten Forschungsinstitut Mitre Corporation auf Basis von Fördermitteln der US-Regierung
                                                                                                                                                                                                                          • April 2025: kurzzeitige Verwirrung nach Aussetzen des Fördervertrages, dann einen Tag später Kommando zurück (Pentaradio berichtete)
                                                                                                                                                                                                                          • neben CVE pflegt Mitre Corp. eine weniger bekannte Datenbank: CWE (Common Weakness Enumeration), ein Klassifizierungssystem für Arten von Sicherheitslücken
                                                                                                                                                                                                                          • wir besprechen die jährliche Rangliste der CWE Top 25 mit Stand von 2024
                                                                                                                                                                                                                          • wertvoll, weil man so als interessierter Laie oder Programmierer-Generalist ein Gefühl für wichtige Angriffsvektoren bekommt
                                                                                                                                                                                                                          • Platz 1: CWE-79; fehlerhafte Neutralisierung von Eingaben während der Erzeugung von Webseiten ("Cross-Site Scripting", XSS)

                                                                                                                                                                                                                            • siehe Beispielbild im Link
                                                                                                                                                                                                                            • Webseiten können JavaScript-Code enthalten, der auf dem Browser des Endanwenders ausgeführt wird
                                                                                                                                                                                                                            • wenn Webseiten aus Eingaben anderer Benutzer zusammengebaut werden, können diese Code einschleusen
                                                                                                                                                                                                                            • Lösung: Escaping (Entfernen oder Ersetzen von Zeichen mit syntaktischer Bedeutung), kann durch Template Engines teilweise automatisiert werden
                                                                                                                                                                                                                            • passend dazu Platz 7: CWE-78; fehlerhafte Neutralisierung von Eingaben während der Erzeugung von Befehlszeilen
                                                                                                                                                                                                                            • außerdem Platz 13: CWE-77; dasselbe für alle anderen Befehlssprachen, die nicht JavaScript oder die System-Shell sind
                                                                                                                                                                                                                            • allgemeiner als Platz 12: CWE-20; unzureichende Überprüfung von Eingaben
                                                                                                                                                                                                                            • Lösung: "assume all input is malicious"; nur Eingaben akzeptieren, die strikten Formatvorgaben folgen (z.B. unter Einsatz von regulären Ausdrücken, siehe STP021)
                                                                                                                                                                                                                            • Platz 2, 6 und 20: CWE-787 und CWE-125; Schreiben bzw. Lesen außerhalb des allokierten Speicherbereichs ("Out-of-Bounds Write/Read") sowie als übergeordnete Kategorie CWE-119; allgemeiner Pufferüberlauf ("Buffer Overflow")

                                                                                                                                                                                                                              • und passend dazu Platz 8: CWE-416; Benutzung nach dem Freigeben ("Use after Free")
                                                                                                                                                                                                                              • alle bereits besprochen in STP047
                                                                                                                                                                                                                              • Lösung: speichersichere Programmiersprachen, Speicherprofiling-Tools wie Valgrind (siehe STP076)
                                                                                                                                                                                                                              • Platz 3: CWE-89; SQL-Injektion

                                                                                                                                                                                                                                • SQL siehe STP012: Abfragesprache für relationale Datenbanksysteme
                                                                                                                                                                                                                                • Beispiel siehe XKCD 327
                                                                                                                                                                                                                                • Lösung: Datenwerte von der Abfrage trennen (z.B. SELECT * FROM users WHERE name = 'Alice' -> SELECT * FROM users WHERE name = $1 mit Datensatz ["Alice"])
                                                                                                                                                                                                                                • passend dazu Platz 11: CWE-94; Code-Injektion (dasselbe für Programmcode); Überlapp zu CWE-77
                                                                                                                                                                                                                                • Platz 4: CWE-352; Cross-Site Request Forgery (CSRF)

                                                                                                                                                                                                                                  • Angreifer möchte im Namen des Opfers eine Aktion ausführen (z.B. auf Rechnung des Opfers in einem Webshop bestellen)
                                                                                                                                                                                                                                  • Angreifer schiebt dem Opfer ein manipuliertes HTML-Formular unter, dass beim Abschicken die gewünschte Aktion auslöst, aber mit den Cookies (und damit der Identität des Opfers)
                                                                                                                                                                                                                                  • Lösung: CSRF-Tokens (echte HTML-Formulare erhalten ein einmalig nutzbares Token, dass nicht vom Angreifer gefälscht werden kann)
                                                                                                                                                                                                                                  • passend dazu Platz 19: CWE-918; Server-Site Request Forgery (SSRF)
                                                                                                                                                                                                                                  • dabei manipuliert der Angreifer nicht ein menschliches Opfer oder einen Webclient, sondern einen Webserver, mit seinem privilegierten Zugriff andere Webserver abzufragen
                                                                                                                                                                                                                                  • Platz 5: CWE-22; Pfaddurchquerung ("Path Traversal")

                                                                                                                                                                                                                                    • z.B. bei Webservern mit statischen Inhalten: entsprechende Dateien liegen im Dateisystem in einem bestimmten Ordner
                                                                                                                                                                                                                                    • Dateien außerhalb dieses Ordners sollen eigentlich nicht zugreifbar sein, aber manchmal geht http://example.com/../../../etc/passwd oder dergleichen
                                                                                                                                                                                                                                    • Lösung: magische Pfadelemente wie .. (bei Pfaden) oder / (bei Dateinamen) ablehnen
                                                                                                                                                                                                                                    • Feedback zu STP063

                                                                                                                                                                                                                                      Alex schreibt:

                                                                                                                                                                                                                                      danke für den Podcast. Ich bin wie immer weit im Rückstand mit Hören, habe zu Folge 63 aber mal die Turing-Maschine für die Subtraktion neu gebastelt. [...] Den Input muss man mit folgender 0 eingeben, also 1110110 z.B.

                                                                                                                                                                                                                                      Gebaut habe ich das auf https://turingmachinesimulator.com/.

                                                                                                                                                                                                                                      //----------------------------------------------------------------------
                                                                                                                                                                                                                                      //Syntax:
                                                                                                                                                                                                                                      //-------CONFIGURATION
                                                                                                                                                                                                                                      name: sub
                                                                                                                                                                                                                                      init: q0
                                                                                                                                                                                                                                      accept: qe
                                                                                                                                                                                                                                      //-------DELTA FUNCTION:
                                                                                                                                                                                                                                      //[current_state],[read_symbol]
                                                                                                                                                                                                                                      //[new_state],[write_symbol],[>|<|-]
                                                                                                                                                                                                                                      // < = left
                                                                                                                                                                                                                                      // > = right
                                                                                                                                                                                                                                      // - = hold
                                                                                                                                                                                                                                      // use underscore for blank cells
                                                                                                                                                                                                                                      q0,1 // 1en 1.Op überspringen
                                                                                                                                                                                                                                      q0,1,>
                                                                                                                                                                                                                                      q0,0
                                                                                                                                                                                                                                      q1,0,>
                                                                                                                                                                                                                                      q1,0 // 0en überspringen
                                                                                                                                                                                                                                      q1,0,>
                                                                                                                                                                                                                                      q1,1
                                                                                                                                                                                                                                      q2,1,>
                                                                                                                                                                                                                                      q2,0 // mehr als eine 1 im 2. Op? Ja->q5, nein->q3
                                                                                                                                                                                                                                      q3,0,<
                                                                                                                                                                                                                                      q2,1
                                                                                                                                                                                                                                      q5,1,>
                                                                                                                                                                                                                                      q5,1 // 1en 2.Op überspringen, dann auf letzte 1 des 2.Op
                                                                                                                                                                                                                                      q5,1,>
                                                                                                                                                                                                                                      q5,0
                                                                                                                                                                                                                                      q6,0,<
                                                                                                                                                                                                                                      q6,1 // letzte 1 des 2. Op durch 0 ersetzen
                                                                                                                                                                                                                                      q7,0,<
                                                                                                                                                                                                                                      q7,1 // zurück, 1en 2. Op überspringen
                                                                                                                                                                                                                                      q7,1,<
                                                                                                                                                                                                                                      q7,0
                                                                                                                                                                                                                                      q8,0,<
                                                                                                                                                                                                                                      q8,0 // zurück, 0en überspringen
                                                                                                                                                                                                                                      q8,0,<
                                                                                                                                                                                                                                      q8,1 // letzte 1 des 1. Op auf 0 setzen, zurück zu q1
                                                                                                                                                                                                                                      q1,0,>
                                                                                                                                                                                                                                      q3,1 // letzte 1 des 2. Op auf 0 setzen
                                                                                                                                                                                                                                      q4,0,<
                                                                                                                                                                                                                                      q4,0 // zurück, 0en überspringen
                                                                                                                                                                                                                                      q4,0,<
                                                                                                                                                                                                                                      q4,1 // letzte 1 des 1.Op auf Null setzen, zum Ende
                                                                                                                                                                                                                                      qe,0,>
                                                                                                                                                                                                                                      1 hr 5 min

                                                                                                                                                                                                                                    About Schlüsseltechnologie

                                                                                                                                                                                                                                    From the publisher's feed

                                                                                                                                                                                                                                    Die IT hat unser Leben in den letzten Jahrzehnten von Grund auf verändert. Aber wie funktioniert sie wirklich? Das möchte ttimeless mal erklärt bekommen. Zum Glück hat Xyrill Antworten.

                                                                                                                                                                                                                                    More shows like Schlüsseltechnologie

                                                                                                                                                                                                                                    Freak Show by Metaebene Personal Media - Tim Pritlove

                                                                                                                                                                                                                                    Freak Show

                                                                                                                                                                                                                                    9 Listeners

                                                                                                                                                                                                                                    Lage der Nation - der Politik-Podcast aus Berlin by Philip Banse & Ulf Buermeyer

                                                                                                                                                                                                                                    Lage der Nation - der Politik-Podcast aus Berlin

                                                                                                                                                                                                                                    219 Listeners

                                                                                                                                                                                                                                    Logbuch:Netzpolitik by Metaebene Personal Media - Tim Pritlove

                                                                                                                                                                                                                                    Logbuch:Netzpolitik

                                                                                                                                                                                                                                    5 Listeners