Konstanten in Notes

One man’s constant is another man’s variable. (Alan Perlis)

Eine Konstante ist eine Variable, deren Wert sich zur Laufzeit nicht ändert. In einem neuen Release, sprich einer anderen Version des Quelltexts, ist es nicht ungewöhnlich, dass sich der Wert ändert. Beispiel: Erstmal ist 3.14 ein akzeptabler Wert für Pi. Später will man es genauer haben, 3.1415926.

Lotus Script ziert sich immer, den neuen Wert zu akzeptieren. Die Erbauer der Plattformen scheinen bei dem Wort “Konstante” mehr an Coulomb und Planck gedacht zu haben statt an Perlis.

So kann jeder es nachvollziehen, der Lotus Script programmiert:

  1. Erzeuge eine ScriptLib “Konstanten”, darin Public Const FOO = “Bar”
  2. Erzeuge in derselben Datenbank eine ScriptLib “Client”, die
    “Konstanten” einbindet und darin eine Klasse, die den Wert von FOO druckt.
  3. Erzeuge einen Agenten, der die FOO-Wert-druckende Klasse nutzt.
  4. Starte den Agenten. Ergebnis: Es wird “Bar” auf die Konsole gedruckt. So weit prima.
  5. Ändere den Wert zu “Bar2″.
  6. Starte den Agenten. Ergebnis: Es wird weiterhin “Bar” gedruckt.

Abhilfe: Projekt bereiningen und komplett neu kompilieren.

Immer alles duchzukompilieren kann reichlich nervig sein. Und fehleranfällig ist es, denn höchstwahrscheinlich vergißt man eine vererbte Bibliothek, die es nötig hat.

Durch diesen Kniff kann man es umgehen:
Nutze nicht “Public Const”, um Konstanten zu definieren, sondern
“Public Property Get FOO As String”. Was ist eine Konstante? Eine Read-only-Variable. Also eine Eigenschaft mit Getter und ohne Setter.

Schmankerl: Bestehender Code kann einfach umgearbeitet werden, weil der lesende Zugriff auf die Property aufrufkompatibel ist mit dem Zugriff auf die Konstante.

Veröffentlicht unter Allgemein | Kommentare deaktiviert für Konstanten in Notes

lieber Objektorientierung

Wir haben ein Verfahren in einer prozeduralen Programmiersprache, das mächtig kompliziert zu verstehen ist. Es geht darum, einen Auftrag anzulegen, so dass dieser Auftrag mit der Geschäftslogik unseres Unternehmens bearbeitet werden kann, mit dem Ziel, ihn zu erledigen. Was genau hinter “Auftrag” und “Geschäftslogik” steckt muss der Diskretion wegen ungenannt bleiben.

Heute habe ich nachvollzogen, wie die Prozedur “LegeAuftragAn” aufgerufen wird: Ausgehend von einem Agenten in LotusNotes schlängelt sich der Ablauf zu der genannten Stelle. Der Notes-Agent selbst ist schon Teil des Ablaufs – er iteriert über alle zu verarbeitenden Datensätze. Der Weg vom Agenten zu “LegeAuftragAn” geht durch drei Scriptlibraries und  ist gespickt mit allerlei Wenns und Abers und Fehlerbehandlung und Spezialfällen und auskommentierten Codezeilen. Bis ich an der passenden Stelle bin, ist der Stacktrace acht Stockwerke hoch und man muss mächtig auf dem Kiwief sein, die Stelle nicht zu verpassen.

Kann man das besser machen? Ja, objektorientiert. Wie? Grundlegende Idee: Ein Objekt “Auftrag” hat die Methode “anlegen”. Die Methode sucht den neusten Datensatz und prüft, ob es einen älteren gibt. Wenn es den gibt, dann Rekursion von Auftrag.anlegen, sonst weitermachen. Und der ganze dreckige Rest muss auch umgearbeitet werden, aber das ist nicht der springende Punkt. Kernpunkt ist die bessere Lesbarkeit und damit Wartbarkeit: Der Code “unterhalb” des Einstiegspunkts Auftrag.anlegen erklärt die Details des Anlegens eines Auftrags. Weniger denken, wie es der Maschine gefällt, sondern näher dran sein an den Dingen der Geschäftslogik – das ist der große Vorteil von Objektorientierung. Sie macht Abstraktion greifbar.

Veröffentlicht unter Allgemein | Kommentare deaktiviert für lieber Objektorientierung

Urbild

Schau Dir die Uhr in der Taskleiste deines Betriebssystems an. Manchmal muss man ‘draufklicken, um ein Ziffernblatt zu sehen. Ziffernblatt oben, darunter zwei Ziffernpaare mit Doppelpunkt dazwischen. Zwei Uhrzeiten? Nein, eine Uhrzeit mit zwei Ansichten. Wenn der Minutenzeiger 1/60stel weiterspringt, dann ändert sich zeitgleich die Ziffer ganz rechts.

In der Welt der Programmierung wird das mittels MVC-Muster implementiert. Es gibt einen Code, der die Uhrzeit “ist”, implementiert; eine Programmierung der grundlegenden Datenstruktur für die fachliche Beschreibung dessen, was wir “Uhrzeit” nennen. Das, was Du siehst, ist nicht die Uhrzeit. Es ist es Darstellung der Uhrzeit, das “V” in MVC.

Das Ziffernblatt ist eine Darstellung, ist ein Abbild eines Urbildes, des Models. Ebenso die zwei Ziffernpaare. Beide sind Abbilder des selben Modells. Das merkst Du daran, dass sich beide zeitgleich veränden.

In der Welt der Philosophie werden die Begriffe “Urbild” und “Abbild” mit Platons Ideenlehre verbunden. Die Uhrzeit, deren Darstellung Du siehst, könnte ein Objekt einer Klasse sein. Hier wiederholt sich das Ideenmuster. Das Objekt ist Abbild des Urbildes UhrzeitKlasse. Hier wiederholt sich das Ideenmuster. Die UhrzeitKlasse ist Abbild des Urbildes Uhrzeit. Was auch immer das sein mag. Was auch immer Du auf Deinem Monitor siehst – es ist sehr weit von der Wirklichkeit entfernt. Was auch immer das sein mag.

DSC_0977

(Münster, Dortmund-Ems-Kanal, ca. 67.2km, 4.Juli 2018)

Veröffentlicht unter Allgemein | Kommentare deaktiviert für Urbild

Dokumenten-Typen mit Metadaten

Kurz

Mittels einer Filter- und einer Factory-Methode werden unterschiedliche Objekte erzeugt, die ein gemeinsames Interface implementieren. Anlass war das Refactoring einer Software-Komponente, die Metadaten für unterschiedliche Dokumenten-Typen geschrieben hat. If-Orgien wurden entfernt.

Ausgangssituation

Es gibt sechs unterschiedliche Typen von Dokumenten. Der Einfachheit und Diskretion halber nenne ich sie hier “Typ-1″ bis “Typ-5″ und “Standard-Typ”. Jeder dieser Typen wird durch neun Werte charakterisiert, die ich unkompliziert aus Feldern der konkreten Lotus-Notes-Dokumente entnehmen kann. Die Felder nenne ich hier “Feld-1″ bis “Feld-9″. Einige Felder werden für allen Typen gebraucht, andere sind jeweils unterschiedlich, und manchmal werden keine Feldwerte ausgelesen, sondern Konstanten benutzt.

Der bestehende Code wiederholt mehrfach dieses Muster, hier in Pseudocode:

Das funktioniert zweifellos. Aber es hat zwei Nachteile.

Erstens: Wenn ich möchte, dass ein neuer nicht-Standard-Dokumenten-Typ verarbeitet werden kann, dann muss ich alle diese if-Blöcke finden und anpassen. Das ist aufwändig und fehleranfällig, weil dieser Code nicht alleine steht, sondern von anderem Code umgeben ist, der auch if-Blöcke hat.

Zweitens: Es ist nur schwerlich zu erkennen, welche Felder für welchen Typen benutzt werden. Das bremst Antworten für andere Entwickler aus, die mangels Dokumentation bei mir anklopfen. Und das macht es langwierig, Änderungen einzupflegen. Dieser Code ist so interessant wie ein fingernagelgrosses Stück Millimeter-Papier, aber leider ist er unentbehrlich.

OOAD und Pattern

Aus Sicht Objekt-Orientierter-Analyse-und-Designs liegt es nahe, den typenspezifischen Code in eigene Klassen zu kapseln, anstelle der Erbsenzählerei in den if-Blöcken. Also schaffe ich in Java ein Interface >>DocType<< mit der Methode “String getFeldwert ( int feldx )“. Die sechs Dokumenten-Typen stelle ich als Klassen “Typ-1-DocType” usw. dar, die dieses Interface implementieren.

Wie komme ich an ein jeweils passendes Objekt? Ich erschaffe einen DocTypeCreator. Der erzeugt für ein gegebenes Notes-Dokument ein passendes Objekt. Mit langem if-Block wie oben?

Nein, eleganter: Der DocTypeCreator hat eine Liste von DocType-Objekten, eins für jede implementierende Klasse des Interfaces >>DocType<<. Das Interface erweitere ich um zwei Methoden. Erstens um die Filter-Methode “boolean acceptDoc ( NotesDocument doc )“. So kann jede implementierende Klasse Auskunft darüber geben, ob sie für das fragliche Dokument zuständig ist. Zweitens um die Factory-Methode “DocType createDocType ( NotesDocument doc )“. So erzeugt ein DocType-Objekt ein weiteres DocType-Objekt seiner eigenen Klasse, das das gegebene Notes-Dokument als Datenquelle nutzt. Der DocType-Creator iteriert über die Liste seiner DocType-Objekte. Es braucht genau eine if-Abfrage: Wenn das aktuelle Objekt in der Iteration das Notes-Dokument akzeptiert, dann lasse es ein neues Objekt seiner Klasse mit eben diesem Notes-Dokument erzeugen.

Kröte

Diese Implementierung hat meines Erachtens nur einen Nachteil: Jede implementierende DocType-Klasse braucht einen parameterlosen Konstruktor, damit der DocTypeCreator an Objekte der unterschiedlichen Klassen kommen kann. Ein DocType-Objekt, das mit einem parameterlosen Konstruktor erzeugt wurde, kann nur dazu benutzt werden, um weitere gleichklassige DocType-Objekte zu erzeugen. Es hat aber kein Notes-Dokument als Datenquelle. So besteht die Gefahr, dass ein DocType-Objekt falsch verwendet wird. Dieser Gefahr begegne ich mit aussagekräftiger Dokumentation.

Vanille

Jeder DocType gibt nun übersichtlich Auskunft darüber, welche Feldwerte er liefert. Und um einen neuen Typen zu verarbeiten, braucht es nur zwei gefahrlose Schritte: Die Implementierung einer entsprechenden Klasse nach Muster >>DocType<< und das Erweitern der Liste im DocTypeCreator. Alle anderen Stellen bleiben unangetastet. Die Liste im DocTypeCreator könnte auch mittel Java-Reflections erzeugt werden.

Veröffentlicht unter Allgemein | Kommentare deaktiviert für Dokumenten-Typen mit Metadaten

Schuh

Ein bizarres Phänomen, das jeder beobachten kann, der offenen Auges durch die Welt geht, ist das des verlorenen einzelnen Schuhs. Da liegt ein einzelner Schuh in der Weltgeschichte. Vom Besitzer weit und breit nichts zu sehen. Wie ist dieser Schuh dahin gekommen? Wem gehörte er? Und wenn das, was vom Wagen fällt, dem gehört, der dem Wagen folgt – wem gehört er dann jetzt? Wie konnte dieses Kleidungsstück verloren gehen? Ein Taschentuch kann man verlieren, ein Feuerzeug, einen Schlüsselbund, Schal, Handschuhe – aber einen Schuh?! Das ist fast so, als verlöre man seine Unterhose. Soll ich ihn ins Fundbüro bringen?  Ist da jemand aus den Latschen gekippt?

DSC02239      Gorges d’Infernet 2010

Ich beobachte diesen Sachverhalt schon einige Zeit. Und weil jedes dieser Artefakte eine Geschichte hat und erzählt, habe ich angefangen, sie zu fotografieren. Immerhin geht es bei einer Fotografie auch darum: Um die Geschichte, die das Bild erzählt.

DSC_0536 Dortmund-Ems-Kanal ca. km 67.2, 2018

Ich schwöre: Nicht ich lege die Schuhe irgendwo hin, um sie dann zu fotografieren. Sie kommen genau so vor die Linse und auf den “Film”, wie ich sie vorfinde. Manche Tage sind sehr ergibig, aber ich konnte noch kein Muster dabei feststellen. Meine Hypothese war, dass man nach einem sonnigen Wochenende in der Nähe einer Party-Stelle mehr finden kann. Das kann ich aber nicht ausreichend belegen. Manchmal habe ich eine Intuition, fahre einen kleinen Umweg und – schupps – wieder ein Schuh. Fast scheint mir, als fände der Schuh mich.

DSC_0537 Dortmund-Ems-Kanal, Münster 2018

Bisher habe ich nur Männer-Schuhe gefunden, es scheint also eine geschlechtsspezifische Eigenart zu sein. Kinderschuhe ausgenommen. Das rosa Ballerinaschüchen hat das kleine Mädel vielleicht schon immer gehasst. Deswegen hat es es in einem günstigen Moment abgestreift. Mammi hat nichts gemerkt, prima. Zuhause angekommen gibt es keine Schelte, denn nur der Verlust beider Schuhe kann auf Vorsatz beruhen, der bestraft werden muss.

DSC_0570 DSC_0576
In einer russischen Erzählung, deren Titel und Autor mir leider entfallen ist, wird “berichtet”, dass ein Busfahrer auf einer entlegenen Landstrasse einen Weizenberg rammt. Wutschnaubend stellt er die örtlichen Bauern zur Rede. Die entgegnen, dass erstens es nun mal so sei, weil eine Hydraulik versagt hatte, was letztlich den Berg erzeugte und zweitens alle Sicherheitsmassnahmen ergriffen worden waren, man habe nämlich einen einzelnen Stifel vor die Kurve gestellt, hinter der der Berg sich verbarg, ob er den denn nicht gesehen hätte. Schon vor Jahren habe ich einzelne Schuhe in Frankreich beobachtet, ohne sie zu fotografieren.

Weniger beziarr ist es, ein Paar zu finden, das ein paar Meter auseinandergerissen ist – die sind zusammen aus irgendeiner Tasche gefallen und Autos, Hunde, Kleinkinder und sonstwas hat sie mehr und mehr getrennt. Natürlich finde ich immer zuerst den einen und freue mich schon auf eine neue Geschichte. Dann halte ich aber doch Ausschau nach dem zweiten, um sicherzustellen, dass es eine lohnenswerte Geschichte ist.

DSC_0582 DSC_0581 neben der B51, Münster

Ist der Badelatschen zufällig auf der Bank? Manchmal scheinen Finder seltsame Dinge mit den verlorenen Einzelstücken zu tun …

DSC_8514 Haus-Kleve-Weg, Münster 2018

Einige verschwinden schneller, als ich sie ablichten kann.

Ich habe schon etliche Schuhe gesehen und einige fotografiert, aber ich konnte nie beobachten, wie einer verloren ging. Gibt es dazu eine passende Verschwörungstheorie? Und eine Community im Web, die sich dieser Sache annimmt? Vergiß “lost places” und “urban exploring”. Finde “lost shoes” und “fashion exploring” ;)

Veröffentlicht unter Allgemein | Kommentare deaktiviert für Schuh

Windowbuilder Kapriolen

Der Windowbuilder für eclipse ist ein feines Tool. Damit kannst Du unkompliziert ein gui bauen, das nur den Standard “Lieferumfang” von Java nutzt. Das wiederum hilft, die auszuliefernde Datenmenge klein zu halten und befreit von der Notwendigkeit, sich um externe Bibliotheken kümmern zu müssen.

Du kannst eine Eingabemaske nach eigenen Wünschen und Erfordernissen zusammenklicken, ohne die Details zu Rahmen und LayoutManagern und und und zu kennen.

Entscheidende Einschränkung: Wenn Du die so erstellte Eingabemaske im Windowbuilder weiter verwenden möchtest – und Du möchtest das, weil eine Maske selten alleine kommt – dann darf diese Maske nichts anderes sein, als Erbe von JPanel. Sobald ein weiteres Interface implementiert wird, kann der Windowbuilder Dein Panel nicht mehr darstellen.

Beispiel: Ich lasse gui-Komponenten gerne java.util.Observer implementieren. Eine gui-Komponente hat ein Model und stellt diesem Model eine Möglichkeit zum Callback bereit. Aber das versaubeutelt dann leider die weitere Verwendung im Windowbuilder. Schade.

Nachtrag: Die Einschränkung ist nicht uneingeschränkt vorhanden. Auf einm Linux Debian mit eclipse 4.5.2 und Windowbuilder 1.8.0.r45 ist sie nicht zu finden. Glück gehabt ;)

Und, liebe Windows-User, so werdet ihr diese Klippe umschiffen: Die gui-Komponente DatenPanel erbt beispielsweise von JPanel, wie gehabt. DatenPanel hat eine anonyme Klasse, die Observer implementiert. DatenPanel hat ausserdem ein DatenGuiModel, das ein Observable ist. Das DatenGuiModel wrappt ein DatenModel, bei implementieren ein gemeinsames Interface. UML-Skizze:

DSC_7708_klein

Funktionierendes Codebeispiel auf Anfrage.

Veröffentlicht unter Allgemein | Verschlagwortet mit | Kommentare deaktiviert für Windowbuilder Kapriolen

eclipse zaubert Dekorator

Du hast eine Klasse K und möchtest das Observer-Pattern anwenden, beispielsweise um Änderungen der Instanz-Daten an ein gui zu melden. Mit eclipse geht das flott:

1. Nutze Menü “Refactor” – “Extract Interface” für K und erstelle KInterface.

2. Erstelle eine neue Klasse KGui, die von java.util.Observable erbt.

3. Erschaffe eine private Member-Variable k vom Typ K.

4a. Nutze Menü “Source” – “Generate Delegate Methods …” für k in KGui.

4b. Bei den Methoden, die Daten ändern, ergänze setChanged () und notifyObservers (), nachdem die Daten im “Backend”-Objekt geändert wurden.

5. Ergänze KGui um die Angabe “implements KInterface”. Das ist erfüllt, denn in Schritt 4 hast Du dafür gesorgt.

6. Nutze in Deinem Gui die Klasse KGui statt K. Mach das Gui zu einem Observer von KGui, reagiere passend auf update-Meldungen.

Deine Namen für das Interface und die Gui-Klasse werden vielleicht nicht dem obigen Muster folgen. Je mehr Attribute der Datencontainer hat desto mehr stupide Schreibarbeit erledigt eclipse für Dich.

 

Veröffentlicht unter Allgemein | Kommentare deaktiviert für eclipse zaubert Dekorator

Preißel, Stachmann: Git

René Preißel, Bjørn Stachmann: Git. Dezentrale Versionsverwaltung im Team. Grundlagen und Workflows. 3., aktualisierte und erweiterte Auflage. Heidelberg 2016, 327 Seiten, Paperback, 32,90€.

Neulich hat mein Chef dem Team einen Git-Workshop spendiert. Vielen Dank dafür und an den Referenten Bernd Hort. Zum vertiefen, festigen und nachschlagen habe ich das Git-Buch von Preißel und Stachmann ausgesucht.

Die meisten der 31 Kapitel umfassen 10 Seiten oder weniger und gliedern sich in Grundlagen (Kapitel 1-3),  tägliche Arbeit (Kapitel 4-14), Workflows (Kapitel 15-28) und Weiterführendes (Kapitel 29-31).

Im Vorwort finden sich wertvolle Hinweise zum Umgang mit dem Buch: Was muss ich lesen? Was kann ich als fortgeschrittener weglassen? Wo finde ich was? Und sie zeigen, dass sie den Stier Komplexität bei den Hörnern fassen wollen – mit Workflows. Das ist ein pragmatischer Ansatz. Beide Daumen hoch meinerseits, denn es ist genau das, was ich bei Loeliger als fehlend bemängel. Preißel und Stachmann bieten keine Befehlsreferenz – wollen sie auch gar nicht, sondern eine Hilfe für den Projektalltag. Der wird entweder mit der git-Konsole gemeistert oder mit einem GUI, und die zwei erklären, wie’s geht. Bei Klickibunti fiel ihre Wahl auf SourceTree – volle Punktzahl dafür, denn das setzen wir auch bei uns ein.

In der ersten Hälfte des Buches finden sich Erläuterungen zu grundlegenden Funktionen von git. Die einzelnen Kapitel sind in sich abgeschlossen und kurz und knackig ohne, dass es ihnen an Tiefe mangelt. Am Ende steht jeweils eine Zusammenfassung – das ist hilfreich.

Die andere Hälfte des Buchs befasst sich mit dem Thema “Workflows” und zeigt Vorgehen in alltäglichen Situationen: Wie fange ich an? Wann wird ein neuer Branch erstellt? Wie hilft git bei der Fehlersuche? Wie sorgen wir für die Auslieferung unseres Produkts? Was tun, wenn’s unübersichtlich wird? Wie kann man git und cvs gemeinsam nutzen? Wie kann ich auf git umsteigen? Es gibt ein Verzeichnis, das zu jedem beschriebenen Workflow eine aussagestarke Skizze zeigt und jeweils eine ganz kurze Beschreibung – als Gedächtnisstütze bestens geeignet.

Ein kurzes Kapitel behandelt die “Integration mit Jenkins”, anschließend werden noch einige Anregungen gegeben, was git sonst noch so kann: Themen wie “Patches”, “Archive”, “Hooks” und einiges mehr. Das letzte Kapitel behandelt in gewohnter Knackigkeit, wo es bei git hakelt.

Das Layout ist angenehm, keine Bleiwüste, aufgelockert durch Skizzen und “Schritt für Schritt”-Anleitungen. Die “Schritt für Schritt”-Anleitungen sind im Sinne von HowTos verfasst und haben ein eigenes Verzeichnis – toll. In der Marginalspalte finden sich Querverweise – praktisch.

Abgerundet wird das ganzen durch einen brauchbaren Index. Der listet nicht einfach alle Vorkommen aller Begriffe auf, sondern enthält 1) nur die interessanten Begriffe und 2) erwähnt er nur die wichtigen Seiten zum jeweiligen Begriff. So muss es sein.

Negatives? Ja. Die Haptik ist unangenehm, das Buch ist rutschig und kantig. Aber das gibt sich hoffentlich nach einiger Zeit steten Gebrauchs ;) Und es ist ein Paperback. Ein fester Einband wäre mir lieber gewesen.

Fazit: Praxisnah, alltagtauglich, gut zu lesen. Gutes Buch.

Veröffentlicht unter Bibliographie | Kommentare deaktiviert für Preißel, Stachmann: Git

SqlMonitor

Wie bemerkst Du, dass sich ein Wert in einer SQL-Datenbank geändert hat?
Du benutzt ein SQL-Tool, vielleicht Squirrel, und stellst eine passende Abfrage.
Diese Abfrage ungefähr 48 Mal am Tag auszuführen scheint Dir notwendig, aber wenig attraktiv.

Meine Abhilfe für dieses Problem besteht aus drei Teilen:

  • Der erste Teil ist der Scheduler, der für alle Betriebssysteme verfügbar ist. Bei Windows heisst das “Aufgabenplanung” oder “geplante Tasks”, bei Linuxoiden ist es oft “cron”. Wie auch immer es heissen mag: Es ist etwas, das auf Wunsch regelmäßig Programme starten kann.
  • Der zweite Teil ist das Programm, das durch den Scheduler gestartet wird. Dieses Programm ist sehr allgemein gehalten. Es liest eine Konfigurationsdatei ein und “weiss” dadurch, a) zu welcher Datenbank und wie es sich verbinden soll, b) welcher SQL-Befehl ausgeführt werden soll und c) was im Erfolgsfall zu tun. “Erfolgsfall” bedeutet hier, dass der gegebene SQL-Befehl ein nicht-leeres Ergebnis hat. Das “zu tun” ist etwas, das sich als ein Befehl auf der Kommandozeile darstellen läßt, beispielsweise das Senden einer Email.
  • Der dritte Teil ist die Konfigurationsdatei. Sie enthält alle Informationen, die das Programm braucht, um den jeweiligen Job zu erledigen.

Die drei Teile werden kombiniert: Erstelle eine passende Konfigurationsdatei und stelle den Scheduler so ein, dass er das Programm regelmäßig startet und ihm die Konfigurationsdatei als Parameter mitgibt. N unterschiedliche Überwachnungen brauchen dann n geschedulte Aufgaben und n Konfigurationsdateien.

Ich mag dieses Konzept, weil es einfach ist. Es nutzt die Bordmittel des Betriebssystems. Die Konfigurationsdatei ist gut für Menschen erstell- und veränderbar. Das Progrämmelchen selbst ist einfach gestrickt. Und nützlich :-)). Auf Anfrage erhältlich bei Matthias.Kopp@aysx.de.

Veröffentlicht unter Allgemein | Kommentare deaktiviert für SqlMonitor

Programmieren ist …

… wie Motorradfahren.
In der Kurve kommt es nicht darauf an, wieviele PS man hat. Man muss Augenmass haben, die Kurve richtig anfahren, im richtigen Winkel und in der richtigen Geschwindigkeit. Natürlich gibt es viele Fahrstile und “anders” bedeutet nicht zwingend “schlecht”. Eins ist sicher: Viele PS erhöhen weder den Spass noch die Geschwindigkeit, wenn man den Bogen nicht ‘raus hat.
Planung und Umsicht sind das A und O. Ich weiss _vor_ der Kurve, dass und wie ich rauskomme. Manchmal kommt es vor, dass mich etwas überrascht: Tiere, Geröll, sonstwas, das sich versteckt. Da hilft Erfahrung und Fahrkönnen.

Was nutzt ein Zertifikat? Nichts.
Wer will ein Projekt im Blindflug? Niemand.
Was tun, wenn’s brennt? Ruhe bewahren.

Veröffentlicht unter Allgemein | Kommentare deaktiviert für Programmieren ist …