All experts are turkeys…

Bezug nehmend auf den immer wieder äußerst beachtenswerten Vortrag von Pragmatic Dave fällt mir nach stundenlangem Lernen in Kursen immer deutlicher auf, wie viel Idiotie wir Experten uns schuldig machen. Und wie „das Internet“ als freie Kommunikations- und Wissenstechnologie und die OpenSource-Philosophie als Fortsetzung des menschlichen Strebens nach Freiheit uns davon heilt!

Früher gab es doch einige höchstbezahlte Fachleute, die mit „sh vl br“ uva. auf der Cisco-Kommandozeile Eindruck schinden konnten. Solches Pseudo-Fachwissen über proprietäre Systeme – das auch im Falle von SAP und MS Dynamics NAV (uva.) immer wieder Rechnungen für marginale Leistungen in schwindelerregende Höhen steigen und Firmen mit ihren Investitionen in der Sackgasse landen lässt – ist glücklicherweise überholt: Wissen braucht keine Macht!

IT kann einfach bleiben, wenn der Benutzer das als Voraussetzung festsetzt. Automaten sind nicht dazu erschaffen worden, den Menschen Untertan zu machen und werden das auch nie machen, denn sie wollen nichts.

Maximal der Kapitalismus macht in unserer Zeit und unserer ersten Welt manche Menschen zu Untertanen. Die wollen das aber auch nicht anders: chacun à son goût.

Auf dem Boden bleiben…

Heimarbeit. Pause von Verzweigungen, Schleifen, Funktionen und Eigenschaften. Back to the roots:

ISO-OSI-Schichtmodell

Eric Amberg und das CompTIA Network+ Examen. „Aus internen Kreisen“ habe ich heute erfahren, dass es die Lehrer ganz schön schwer haben: die Plattform, auf der sie „virtuelle Klassenzimmer“ einrichten sollen, ist schwer überlastet – und wurde bereits von Schülern gehackt.

So. Suche Haus in Kroatien!
(Kuća tražena na prodaju u Hrvatskoj!)

Wir wiederholen…

Meine Empfehlung: der Kurs „Spring framework 5: Beginner to Guru, den ich im Februar 2019 angefangen habe, um die Basics von JHipster besser zu verstehen.

John Thompson erneuert in diesem Kurs zudem „deprecated Videos. Das mag erst einmal nerven („Bekomme ich den Kurs denn nie zu Ende…), dient aber auch zur Wiederholung.

Zum prinzipiellen Verständnis des Spring frameworks zählen sicher die

SOLID principles of OOP:

I.) Single Responsibility Principle

Single Responsibility Principle

  • Jede Klasse sollte eine Zuständigkeit verwalten
  • Es sollte nie mehr als einen Grund geben, eine Klasse zu ändern
  • Die Klassen sollten klein sein – nie mehr Code als auf einen Bildschirm passt
  • „Göttliche“ Klassen sollten vermieden werden
  • Große Klassen sollten in kleinere Klassen aufgeteilt werden

II.) Open-Close Principle

Open-Close Principle

  • Eine Klasse sollte offen für Erweiterungen sein
  • Eine Klasse sollte geschützt sein vor Änderungen
  • Es sollte möglich sein, das Verhalten einer Klasse zu ändern ohne die Klasse selbst zu ändern
  • Es sollten private Variablen mit Gettern und Settern verwendet werden – letztere Methoden ausschließlich dann, wenn diese gebraucht werden!
  • Es sollten wann immer möglich abstrakte Basisklassen verwendet werden, in denen den erbenden Klassen ggf. abstrakte Methoden zur Implementierung vorgegeben werden

III.) Liskov Substitution Principle (Barbara Liskov, 1998)

Liskov Substitution Principle

  • Objekte innerhalb eines Programms sollten austauschbar sein mit Instanzen ihrer Subtypen ohne die Korrektheit des Programmes zu ändern
  • Ein Verstoß gegen dieses Prinzip kann oft entdeckt werden mit dem „… ist ein …“-Test: ein Quadrat ist ein Rechteck
  • Jedoch: ein Rechteck „ist kein“ Quadrat!

IV.) Interface Segregation Principle

Interface Segregation Principle

  • Interfaces sollten detailliert und client-spezifisch (spezifisch für einen Anwendungsfall) ausgearbeitet sein
  • Eine Vielzahl client-spezifischer Interfaces ist besser als ein „Universal-Interface“
  • Alle Komponenten sollten fokussiert bleiben und Abhängigkeiten untereinander sollten vermieden werden
  • Der Zusammenhang zum Single Responsibility Principle ist offensichtlich: „göttliche“ Interfaces sollten vermieden werden

V.) Dependency Inversion Principle

Dependency Inversion Principle

  • Abstraktionen sollten nicht von Details abhängen
  • Details sollten von Abstraktionen abhängen
  • Es ist wichtig, dass Objekte höherer Ordnung und Objekte niedrigerer Ordnung von derselben abstrakten Interaktion abhängen
  • Dependency Inversion nicht mit Dependency Injection verwechseln! Dependency Injection beschreibt, wie Objekte die weitere Objekte erhalten, von welchen sie abhängig sind

Berufung IT

Fragt mich doch meine liebe und geliebte Frau im längeren Gespräch, das sich wieder um die Frage nach dem Sinn des Lebens, dem Universum und dem ganzen Rest drehte, ob ich schon einmal darüber nachgedacht hätte, die mich berufende Leidenschaft IT fürderhin nurmehr als Hobby zu betreiben und einen anderen Beruf zu wählen. Abgesehen von meiner Herkunft als freier Reporter, dann Typograf und Fotosetzer (zeitgleich: Mediengestalter mit Schwerpunkt Medienoperating „print“) aus der Druckindustrie: auch handwerklich bin ich nicht ungeschickt, ob Holz- oder Metallbearbeitung; selbst im technischen und elektrotechnischen Bereich gehen meine Erfahrungen und mein Wissen über „die ersten Schritte“ hinaus. Und was es alles noch zu entdecken gibt, von dem ich jetzt noch nichts weiß…

Dabei ist die IT ein wunderbares Betätigungsfeld, der Mensch erfindet sich neu, Darwin 4.0. Was mich an eine eMail erinnert, die ich neulich absandte:

„ach ja, alle ITler haben zu tun, in ganz Deutschland.

Die gab’s vor 50 Jahren alle noch nicht!
Und die Steuerberater erst ab dem 6.05.1933 (ganz wie das weibliche Funkenmariechen und die Inthronisierung des Prinzenpaares in Köln).
Parlamentarische Politiker und Beamte sind ebenso wenig aus dem Meer gekrabbelt wie Rechtsanwälte (letztere sind aber wohl kurz nach dem senkrechten Gang entstanden, spätestens aber sobald der Daumen nach unten gestreckt werden konnte).

Wer hat denn vorher all die tausende Stunden Arbeit im Jahr gemacht, die jetzt immer noch keiner – fürstlich bezahlt – richtig zufriedenstellend erledigt?“

Das immer wiederkehrende Problem ist immer wiederkehrend vor der Tastatur zu suchen:

Alle wollen, dass es besser wird. Alle wollen, dass sich nichts ändert. Und am besten will jeder alles umgesetzt haben, was er sich just itzo so vorstellen kann, ohne im Nachhinein jemals selbst darunter leiden zu müssen.

Das widerspricht unter anderem leider der Mengenlehre. Gegen besseres Wissen – denn die Mengenlehre ist ein Teilbereich der Berufung – setzen wir IT-Berufenen genau diese widersprüchlichen, sprunghaften und allzu menschlichen Wünsche in Maschinensprache um – und verdienen uns mit diesen Sozialleistungen Gelder, von denen die große Masse im konventionellen sozialen Berufsumfeld nur träumen kann.

Bitte verwechselt agile Verfolgung eines Zieles nicht mit dem agilen Torkeln eines Betrunkenen, der erst am nächsten Tag erfährt, dass sein Ziel der Rinnstein wurde – was er in den meisten Fällen wohl nicht geplant, wohl aber vor dem Schlaf des Vergessens gewünscht hat.

Der Mensch ist nicht zu Höherem geboren.

Wordprust

…und das ich’s nicht vergesse: ein Update in Ehren, prost! Diese WordPress-Installation dient neben meiner persönlichen Belustigung und dem Festhalten des einen oder anderen technischen Belanges als Beigabe zu GitHub/Gogs, Jenkins, stackoverflow u.a. auch dem Langzeit-Wordpress-Test.

Was bleibt, ist, dass WordPress gerne mal seine externen Dateien („assets“) im Upgrade verliert – abgesehen von vielen kleinen Code-Schnipselchen, die sich so zur manuellen Nacharbeit ansammeln. Ebenso bleibt, dass eine vorher gesicherte Datenbank nicht ausreicht, um die Bilder dann ohne allzu viel manuelle Nacharbeit wieder mit dem richtigen Namen an die richtige Stelle zu bekommen.

Hier kommt mein Segen: das www darf auf Informationstechnologienetz umgetauft werden.

html5, css grid flex und die Welt dreht sich…

Glückwunsch nach Stuttgart, ein neues Licht will am nächtlichen Säuferhimmel erleuchten: s-brett.com möge seine Türen zeitnah wieder öffnen!

Beileibe nicht nur deswegen wühle ich mich nebst JHipster (konkretisiert mit Spring und Angular) auch in die wohl absichtlich verwirrenden Untiefen von html5, JS, CSS, weiteren zugehörigen frameworks, Präprozessoren und unzähliger Bibliotheken mit jeweiligem Inkompatibilitäts-Wiki und dem Wandel der IT seit 1989 an sich. Dabei kommt nach einiger Recherche und dem Lernen der letzten, neuen Spinnerei irgendwann immer ein recht altes Bild in mir hoch. Vor dem Internet gab es für mich u.a. auch die mütterliche Heimstatt. In jener hingen Bilder an der Wand, auf manchen waren Hühner im Aquarell-Comic-Stil. Eines davon hat – soweit meine Erinnerung mich nicht trügt – einen Hahn auf einsamer Flur angedeutet. Mit einer Gedankenblase über dem kleinen, kammbedeckten Schädel: „Von der Wahrheit haben wir oft nur einen Schimmer. Doch wahr ist: nah ist sie uns immer.“

Und auf der Arbeit durch das CSS grid lande ich bei der Wiederholung mancher CSS flexbox Befremdlichkeit im Vergleich wieder einmal auf dem zugehörigen complete guide: sinnvollerweise ist wenigstens die Tabelle zur Browserkompatibilität einzelner box-dann-hies-es-flexbox-jetzt-heißt-es-flex-properties als schnöde table ausgeführt. Und das hat schon 1997 geklappt, wie mir ein Blick ins Datenarchiv und weinenden Auges in meine seit langem dahingegangene, zehnjährige Selbstständigkeit gezeigt hat. Auch offensichtlich wird da gleich: mit 21 Jahren fast ebenso alte Websites mit csssequenz-Animationspfaden und dergleichen Spielereien lassen sich heute nicht mehr fehlerfrei öffnen.

Mühevolle, vergebliche Berufung.

SQL-Joins bzw. Python pandas Objektvereinigungen

A bzw. B:

  •  in SQL eine Menge an Werten, die aus der Abfrage über eine Spalte einer Tabelle entstehen
  • in pandas ein pandas.Series-Objekt (eindimensionales ndarray mit Achsen-Namen), das ggf. aus der Abfrage eines pandas.DataFrame (zweidimensionale, größenveränderliche, möglicherweise verschieden typisierte Tabellendaten) resultiert
  • für Python pandas gilt: „left“ = 1st Dataframe; „right“ = 2nd Dataframe

Alle Werte der Menge A

SQL:
SELECT * FROM A LEFT JOIN B ON A.Key = B.Key
Python pandas:
A.join(B, on=[‘A.Key‘], rsuffix=‘_B‘)

Alle Werte, die nur in der Menge A sind

SQL:
SELECT * FROM A LEFT JOIN B ON A.Key = B.Key WHERE B.Key IS NULL
Python pandas:
A[~A[‘A.Key‘].isin(B[‘B.Key‘])

Alle Werte, die in Menge A und gleichzeitig in Menge B sind

SQL:
SELECT * FROM A INNER JOIN B ON A.Key = B.Key
Python pandas:
A.join(B, on=[‘A.Key‘], how=‘inner‘)

Alle Werte, die entweder in Menge A oder in Menge B sind

SQL:
SELECT * FROM A FULL OUTER JOIN B ON A.Key = B.Key WHERE A.Key IS NULL OR B.Key IS NULL
Python pandas:
pd.concat([A, B].loc[lambda df: ~df.index.duplicated()]

Alle Werte aus Menge A und B

SQL:
SELECT * FROM A FULL OUTER JOIN B ON A.Key = B.Key
Python pandas:
pd.merge(A, B, how=‘outer‘, on=[‘A.Key‘,‘B.Key‘], validate=“one_to_one“, indicator=True)

Weitere Varianten und komplexere Vereinigungen in der pandas-Dokumentation.

Download SQL-pandas-Cheatsheet

Deep Thought

Dem Deutschen Volke - Schriftzug

Die Antwort „42“ auf die Frage nach dem Sinn des Lebens, dem Universum und dem ganzen Rest ist bekannt. Zaphod Beeblebrox und seine Begleiter, darunter ein depressiver, suizidaler Roboter versuchen, gejagt von einem der unausstehlichsten Völker des Universums, den Vogonen, mithilfe des Unendlichen-Unwahrscheinlichkeitsantrieb und gemeinsam mit uns die eigentliche Frage auf diese Antwort zu entdecken.

Einen unserer Empfindung nach nicht unerheblichen Beitrag, Dem Deutschen Volke zu helfen, aus dem Bann der Überregulierung, falscher Methodik, überkommener Hetz-Proklamationen à la AFD, dem Untergang der Erde sowie den Vogonen zu entkommen, leistet folgender Beitrag:

Ein Vortrag keinesfalls nur für Programmierer, von  „Pragmatic“ Dave Thomas, einem „alten Hasen“, der uns empfiehlt, nicht jedem Quacksalber – auch ihm nicht – auf den Leim zu gehen, aus dem Quark zu kommen, die Cojones auszupacken, Courage zu zeigen. KEINE PANIK!

„It takes guts“ – gute, deutsche Handwerkskunst, Eigeninitiative und ein seit Jahrmillionen in der Evolution genau so wie in modernen Steuerungen praktiziertes Vorgehen anhand eines „proportional-integral-derivative controllers“. Leider ist sogar die Deutung im deutschen Teil des Wikipedia-Universums mit der einzigen Definition des PID-Reglers nur eine ziemlich beschränkte Sicht auf die umfassendere, englische Definition und auch die Suche nach „Kontrollschleife“ fördert nichts zu Tage.

Mehr Klarheit zur praktischen Anwendung nicht nur in großen Schiffen und kleinen, selbstausbalancierenden Robotern, sondern im Rahmen alltäglicher Progresskontrolle im Privat- und Berufsleben bringt die Definition zum „agile life“ im hier verlinkten Video:

Agility – what to do

  • Find out where you are
  • Take a small step towards your goal
  • Adjust your understanding based on what you learned
  • Repeat

und falls sich auf diesem einfachen Weg Alternativen ergeben:

Agility – how to do it

  • When faced with two of more alternatives that deliver roughly the same value, take the path that makes future change easier

Das Preussische, Vogonische hat uns auf Platz 17 der leistungsfähigsten Digitalökonomien (IMD World Competitiveness Ranking 2019) verbannt. Irgendwann mag jeder, vom kleinen Angestellten bis hin zu den Gelähmten der jeweiligen Regierung, sich denken, dass auch die Deutschen dazu lernen sollten und schon lange nicht mehr mit dem Finger auf andere zeigen brauchen.

Hier die ersten zehn Länder des Rankings, an denen wir uns ein Beispiel nehmen könnten:

  1. USA
  2. Singapur
  3. Schweden
  4. Dänemark
  5. Schweiz
  6. Niederlande
  7. Finnland
  8. Hongkong
  9. Norwegen
  10. Südkorea

Diese Rankings können laut einem Artikel im Wirtschaftsteil der „Welt“ „durchaus als Weckruf verstanden werden“. Natürlich nimmt ein agiler Deutscher wie ich solche Schweizer Rankingtabellen nicht ernst – zumal die schönsten Länder auf unserer Erde meiner Ansicht nach viel zu weit hinten vertreten sind: die Möglichkeit, Schönheit im eigenen Leben verwirklichen zu können, stellt doch wohl die größte „competitiveness“ [Wettbewerbsstärke, Konkurrenzfähigkeit] dar.

Und schon sind wir wieder bei der Agilität: das bedeutet dem Vortrag von Pragmatic Dave zufolge vor allem auch, sich nicht von Experten einschüchtern zu lassen – sie kennen weder Deinen oder meinen individuellen Platz, noch den vorherrschenden Kontext, noch die individuelle Erfahrung, noch den nächsten richtigen Schritt auf Deinem oder meinem Weg. Wir haben nicht nur in unserem Leben auf dem Lande bereits einige Menschen kennen lernen dürfen, die weder den Begriff Agilität kennen, noch mit Software-Programmierung zu tun haben und uns mit der Weisheit ihres „höheren Alters“ ganz ähnlich klingende Tipps gegeben haben. Mitunter ist auch die deutsche Geschichte mitsamt Altersvorsorge und Leistungsprinzip kein Kontinuum, wie wir es gerne eingeredet bekommen. Wie stets kommt der deutsche Kant und seine Imperative zum Tragen!

Some people think they are important. Don’t let them tell you what to do.

Thank you Pragmatic Dave – you made my day twice!

Hier noch die zugehörige Vortrags-Präsentation von der GOTO 2015.