Follow my new blog

Freitag, 1. November 2013

Mitmachen: Flow-Designs gesucht

Für Programmieraufgaben gibt es ja nicht nur eine Lösung. Aber wie bunt die Lösungswelt ist, ist andererseits auch nicht ganz klar. Deshalb würde ich mich freuen, wenn Sie mitmachen würden bei der Sammlung von Lösungen.

Zu einem kleinen Programmierproblem möchte ich Lösungen in Form einer kleinen Bilderausstellung veröffentlichen. Dann können wir darüber diskutieren. Allerdings geht es mir nicht um Quellcode, sondern um visuelle Lösungen.

imageAlso:

Ich suche Lösungen zum Problem “Ordered Jobs” in Form von Flow-Designs.

Datenflüsse sollen im Mittelpunkt stehen. Aber wer die mit weiteren Bildern garnieren möchte, ist dazu herzlich eingeladen.

Die Ausdrucksmittel des Flow-Designs habe ich in vielen Publikationen beschrieben und über die Jahre verfeinert. Leider bin ich noch nicht dazu gekommen, einen aktuellen Stand an einem Ort zusammenzufassen. Mea culpa. Aber es gibt einen Spickzettel, der größtenteils aktuell ist und die Notation knapp beschreibt. Alternativ beschreiben einige Artikel unter der Überschritz “OOP as if you meant it” nochmal in Kürze meine aktuelle Sicht zu Flow-Design.

Wer mitmachen will, schreibt am besten einen Kommentar zu diesem Artikel mit einem Link zu einem PDF mit seinem Entwurf. Oder es können Links zu yuml.me Grafiken sein; mit den Aktivitätsdiagrammen kann man Flow-Designs recht ordentlich beschreiben. Oder schicken Sie mir eine Email mit einem PDF.

Am Ende bastle ich dann eine Zusammenschau mit ein paar Anmerkungen zu dem, was mir auffällt. Und ich lege auch meine Vorstellung von einer Lösung vor. Dann gibt es eine “Ausstellungseröffnung” hier im Blog :-)

Zu gewinnen gibt es nichts – außer Erkenntnissen.

Wer macht mit? Einsendeschluss ist der 30.11.2013.

Ich bin gespannt auf die Vielfalt der Lösungsansätze.

Und hier nun die Aufgabe in epischer Länge. Sie ist auch im Fundus der Programmier-Katas der CCD School zu finden.

Class Kata Ordered Jobs by Clean Code Developer School

Montag, 28. Oktober 2013

Knapp daneben macht auch nicht zufrieden

Software macht dem Kunden Spaß, wenn seine Anforderungen erfüllt werden. Dafür ist er bereit, Geld auszugeben. Und was sind seine Anforderungen?

Für mich gibt es drei Säulen, auf denen zufriedenstellende Software ruht:

  • Funktionalität
  • Primäre Qualität
  • Investitionssicherheit

Dass Software funktional ihren Dienst erfüllen muss, um zufrieden zu stellen, liegt auf der Hand. Eine Taschenrechner-Anwendung, die nicht korrekt rechnet, ist ihr Geld nicht wert.

Wenn der Taschenrechner aber nicht deutlich schneller rechnet als ein Mensch, dann ist etwas falsch. Ohne eine hohe primäre Qualität “Performance” ist er also sein Geld auch nicht wert. Er würde sogar nicht einmal geschrieben. Die primären Qualitäten sind mithin die hauptsächlichen Treiber der Softwareentwicklung.

Und schließlich wird niemand das Geld für die Entwicklung in die Hand nehmen, wenn nicht sichergestellt ist, dass die Nützlichkeit des Resultats lange bzw. lange genug erhalten bleibt. Investitionssicherheit ist gefragt. Die allerdings sieht für Software anders aus als für Hardware.

imageDas hatte ich schon ausführlich in einem früheren Blogartikel beschrieben. Doch jetzt ist mir klar geworden, wie diese Sichtweise auch sonst im Leben hilfreich ist. Neulich bin ich nämlich Bahn gefahren und ein mobil-Sonderheft der DB lag auf meinem Tisch, Thema: Nachhaltigkeit.

Dazu ist mir meine Bahncard eingefallen, die in diesem Jahr ebenfalls nachhaltig grün ausgefallen ist.

Farblich bewegt sich die Bahn also durchaus in eine positive Richtung. Mehr ökologisches Denken schadet ihr und uns allen sicherlich nicht.

Aber…

Mir stieß das Sonderheft auf, weil es eine aus meiner Sicht derzeit falsche Priorisierung darstellt. Es preist die Bemühungen der Bahn in Bezug auf die 3. Säule an, Investitionssicherheit. Die Bahn soll nicht nur heute funktionieren, sondern auch in Zukunft. Klar.

Weder Software noch die Bahn wird aber gemacht, um nachhaltig zu sein. Höhere Priorität müssen Funktionalität und primäre Qualitäten haben. Erst wenn es da stimmt, dann wird Nachhaltigkeit überhaupt relevant.

Im Hinblick auf Funktionalität und primäre Qualitäten stimmt es jedoch gerade nicht bei der Bahn. Züge, die nicht fahren, stellen grundsätzliche mangelnde Funktionalität dar. Züge, die grob unpünktlich sind, verletzen die primären Qualitäten Verlässlichkeit und Geschwindigkeit. Nicht funktionierende Türen und Toiletten, steckdosenfreie Waggons, fehlende Reservierungsanzeigen usw. verletzen sekundäre Qualitäten wie Bequemlichkeit oder gar Sicherheit.

Die beiden hauptsächlichen Säulen, auf denen die Bahn ruht – Funktionalität und Qualität – sind also morsch und bröckelig. Ihnen ist immer weniger zu trauen. Und da findet es die Bahn wichtig, in die dritte Säule zu investieren? Das ist bestenfalls naiv und schlimmstenfalls fahrlässig. Denn die Investition in diese Form der Nachhaltigkeit kann die Nachhaltigkeit in Bezug auf die Zwecke der Bahn untergraben.

Dasselbe kann natürlich auch Software passieren. Wo Funktionalität und Qualitäten im Argen liegen, sollte nicht mit Nachhaltigkeitsoffensiven “green washing” betrieben werden. Clean Code und ein Blick auf Wandelbarkeit oder Produktionseffizienz ist wichtig. Doch das ist kein Selbstzweck. Ein Ausbalancieren mit den Hauptzwecken der Software ist wichtig.

Die Bahn macht mich mit ihrem Fokus nicht zufrieden. Der liegt mindestens knapp neben dem, was ich von ihr zuallererst will. Genauso müssen wir aufpassen, in der Softwareentwicklung mit gut gemeinten Maßnahmen nicht das Wesentliche zu verfehlen.

Montag, 21. Oktober 2013

Wann tut Veränderung Not?

Als Berater und Trainer für Softwareprojekte stelle ich mir immer wieder die Frage, wann eine Organisation eigentlich Hilfe benötigt? Wann sollte sie sich verändern? Mit meiner Hilfe oder auch einfach durch Eigenleistung.

Ich komme gern in jedes Projekt und gebe einen Impuls oder begleite eine Veränderung des Produktionsprozesses oder der Architektur. Das macht mir Spaß, damit verdiene ich mein Geld. Befriedigend ist es allerdings nur, wenn meine Hilfe auch wirklich nötig ist. Wann ist das der Fall, wie kann man das feststellen?

Eine Analogie kommt mir in den Sinn: Wann ist es nötig, einem Menschen in Gesundheitsdingen zu helfen? Klar, natürlich nur, wenn der das will. Aber auch dann stellt sich ja die Frage, wie krank jemand ist.

Beispiel “dicker Mann”: Ist der Mann auf dem Bild rechts gesund? Er scheint sich ja seines Lebens zu freuen, wenn er so für das Foto posiert.

Ich traue mich nicht zu beurteilen, ob er gesund ist. Er mag nach meinem Ideal nicht gesund aussehen. Aber wer bin ich, dass ich meinen Maßstab als universell gültig ansehen könnte? Reicht es denn nicht, dass er sich wohlfühlt?

Doch, ich glaube, das reicht. Wer sich wohlfühlt, der ist gesund.

Mit einer Einschränkung: Das Wohlgefühl sollte nicht nur in einer Situation abgefragt werden, sondern unter Veränderungen. Denn Leben ist nicht statisch, sondern dynamisch. Irgendwas passiert ja immer. Wir müssen uns immer wieder unterschiedlichen Herausforderungen stellen.

Der Mann auf dem Bild wird aufstehen und aus dem Haus gehen wollen. Schafft er das? Er wird mit unterschiedlicher Witterung fertig werden müssen. Schafft er das? Er wird plötzlich einem Auto ausweichen müssen, das er bei der Straßenquerung übersehen hat. Schafft er das? Er wird sich einen Platz in einem Flugzeug oder Zug suchen müssen. Schafft er das? Oder er wird, wie der Mann in dieser Geschichte durch ein Drehkreuz gehen müssen. Schafft er das?

Wie schon in einem anderen Blogartikel beschrieben, halte ich die Fähigkeit, Veränderungen kompensieren zu können, für eine zentrale Anforderung an Gesundheit. Wer sich gesund nennen will, muss anpassungsfähig sein.

Solche Anpassungsfähigkeit hat aus meiner Sicht zwei Seiten: eine subjektive und eine objektive. Es gibt einige objektive Anforderungen, die alle Menschen erfüllen können müssen, wenn sie als Gesund gelten wollen. Dazu zähle ich mal die Fähigkeit, auf eine unerwartete Ansprache von hinten nicht mit einem Herzschlag zu reagieren oder bei einer Temperatursteigerung von 20° auf 30° Celsius nicht an einem Hitzschlag zu sterben.

Jenseits relativ enger objektiver Grenzen ist das Feld subjektiver, ganz persönlich als notwendig angesehener Kompensationsfähigkeit weit. Ich persönlich fühle mich nur gesund, wenn ich zu meiner Wohnung im 4. Stock über die Treppe zügig hochgehen kann. Neulich haben jedoch zwei Frauen einige Regale bei mir abgeholt, die ich per ebay Kleinanzeigen verschenkt hatte, die mit dem 4. Stock nicht wirklich zurecht kamen. Sie waren Anfang 30, sehr korpulent und haben mich mehrfach gefragt, wie ich das denn aushalten würde, so hoch droben ohne Fahrstuhl zu leben.

Aber wie gesagt, selbst wenn ich diese Frauen für nicht gesund halten mag… Sie selbst fühlen sich bestimmt nicht so. Jedenfalls nicht in dem Maße, wie ich sie einschätze.

Und ich fühle mich nicht ungesund, wenn ich mich heute nicht in der Lage sehe, aus dem Stand einen Marathon zu laufen. Ein passionierter Triathlet kann das jedoch anders sehen.

Wie viel Kompensationsfähigkeit ist also nötig? Im Wesentlichen nur so viel wie man meint zu brauchen. Der Mann oben im Bild hält sich vielleicht für gesund, weil er Drehkreuze und Flugzeuge vermeidet und zuhause bleibt, um keinen Autos ausweichen zu müssen. Er hat dann sein Leben so eingerichtet, dass Veränderungen/Anforderugen, die Sie und ich kompensieren könnten, an ihn gar nicht erst herangetragen werden.

Das halte ich für völlig legitim. Jeder ist da seiner Gesundheit Schmied.

Jetzt von der Analogie zurück zur Softwareproduktion.

Organisationen sind für mich auch Organismen, die gesund oder krank sein können. Deshalb reicht auch dort nicht die Frage, ob sich eine Organisation gerade wohl fühle, um den Gesundheitszustand zu beurteilen. Vielmehr ist zu fragen, inwiefern sie sich fähig sieht, Veränderungen zu kompensieren.

Die Antwort auf diese Frage hängt natürlich davon ab, welche potenziellen Veränderungen eine Organisation überhaupt sieht. Wo können denn Herausforderungen lauern? Was ist das Äquivalent einer unerwarteten Ansprache von hinten oder einem Bus hinterherlaufen zu müssen?

Ich glaube, Organisationen im Allgemeinen und Softwarehersteller im Besonderen haben davon eine nur recht schwammige Vorstellung. Man baut nicht gezielt Kompensationsfähigkeiten auf, sondern mokelt einfach vor sich hin. Hauptsache man verdient genug Geld. Damit lässt sich doch im Grunde alles kompensieren, oder?

Da bin ich anderer Meinung. Aber das möchte ich hier gar nicht vertiefen. Ich will vielmehr überlegen, wo denn die Veränderungsherausforderungen lauern könnten. Vor Augen habe ich dabei ein Softwareunternehmen, das vielleicht 20 Jahre am Markt ist. Das sagt, es gehe ihm gut. Und als Beleg wird nicht nur der aktuelle Umsatz angeführt, sondern auch das Unternehmensalter. Ist das denn nicht Beweis genug für Gesundheit?

Ich erlaube mir, anderer Meinung zu sein. Nur weil jemand vielleicht 80 Jahre alt ist und sich gerade gut fühlt, heißt das noch nicht, dass er gesund ist. Der einzige Nachweis für Gesundheit liegt in der Zukunft durch Meisterung deren Herausforderungen.

Insofern glaube ich, dass mache, einige, wahrscheinlich sogar viele Unternehmen etwas zu selbstsicher sind, was ihre Gesundheit angeht.

imageWas hätte Lehman Brothers wohl im Jahr 2007 zur eigenen Gesundheit gesagt? Der Aktienkurs – als ein akzeptierter Gesundheitsindikator – sah doch stabil aus.

Leider war man dann doch aber weniger kompensationsfähig, als man dachte, würde ich sagen. Man rekelte sich wie der Mann oben auf dem Bett – und konnte nicht auf das Feuer reagieren, das ausbrach – obwohl es auch noch mitverschuldet war.

Eine Organisation, die schon 20 Jahre lebt, hat natürlich einige Erfahrung gesammelt. Sie hat selbstverständlich Kompensationsfähigkeit bewiesen. Doch ich glaube, dass wir diese Fähigkeit zunehmend unterschätzen. Wir haben immer noch ein veraltetes Bild im Kopf, nämlich das einer relativ statischen Welt. Denn in der ist vergangener Erfolg Garant für zukünftigen Erfolg.

Es gibt zwei Wege, sich gesund zu definieren: Man baut Kompensationsfähigkeit aus – oder man korrigiert seine Ansprüche nach unten. Mir scheint letzteres in weiten Bereichen synonym mit Altern zu sein. Wer älter wird, meint, sich bestimmten Herausforderungen nicht mehr stellen zu müssen.

Das ist natürlich legitim.

Aber es funktioniert nur, wo man unter Kontrolle hat, welche Veränderungen man kompensieren muss.

Da scheint es mir gerade für Softwareunternehmen jedoch Grenzen zu geben. Man unterschätzt bei aller Erfahrung des Unternehmensalters, dass es zu Veränderungen kommen kann, ob man will oder nicht. Und man unterschätzt, wie groß die sein können. Manche hat man überhaupt nicht auf dem Schirm und wähnt sich in einer statischen Welt.

  • Produktmarkt: Veränderungen in den Anforderungen an die Produkte lassen sich nicht kontrollieren. Kunden wollen immer mehr. Was sie wollen, ist letztlich nicht vorherzusehen. Wie schnell, mir wie viel Aufwand kann eine Organisation auf neue Anforderungen vom Markt reagieren? Nur weil man bisher ja auch irgendwie reagiert hat, heißt das nicht, dass man auch in Zukunft ökonomisch reagieren kann. Was wird also getan, um Kompensationsfähigkeit zu erhalten oder gar auszubauen?
  • Technologien: Technologien ändern sich. Darauf muss reagiert werden können. Früher oder später. Wie einfach ist das möglich? Neue Technologien können Aufwände senken oder Märkte erhalten/erschließen. Was wird getan, um hier Kompensationsfähigkeit zu erhalten oder gar auszubauen?
  • Personalmarkt: Weil sich Technologien entwickeln, entwickelt sich auch der Personalmarkt. Wie ist ein Unternehmen darauf vorbereitet, dass morgen die Fachkräfte die man heute braucht, nicht mehr zu finden sein werden? Was wird getan, um hier Kompensationsfähigkeit zu erhalten oder gar auszubauen?
  • Codemenge: Völlig unterschätzt wird das Wachstum der Codemenge, gerade weil man Erfolg hat. Diese zwangsläufige Veränderung braucht Kompensationsfähigkeit ganz eigener Art. Wer heute mit 50.000 LOC umgehen kann, kann nicht unbedingt mit 500.000 LOC in gleicher weise ökonomisch umgehen. Was wird getan, um hier Kompensationsfähigkeit zu erhalten oder gar auszubauen?

Wer meint, in diesen und anderen Unternehmensgesundheitsdimensionen heute ausreichend oder gar mit Puffer kompensationsfähig zu sein, den beglückwünsche ich. Das ist wunderbar.

Doch auch dann bleibt noch eine Frage offen: Wie sieht es denn in der Zukunft aus? Ich halte es für sehr wichtig, Kompensationsfähigkeiten zu beobachten. Ich persönlich kann das z.B. täglich beim Treppensteigen. Wenn ich merke, dass ich kurzatmig werde, dann ist meine Kompensationsfähigkeit gesunken. Dann sollte ich gegensteuern – auf die eine oder andere Weise. Ich kann ins Erdgeschoss ziehen oder mit Fitnesstraining beginnen. Je nach Anspruch. Welcher meiner ist, können Sie sich denken ;-)

Aber weiß auch eine Organisation, wie sich ihre Kompensationsfähigkeit entwickelt? Kann sie überhaupt gegensteuern, wenn die Tendenz nach unten zeigt?

Davon hängt letztlich ab, ob ich zum Einsatz komme. Denn meine Aufgabe ist es, Kompensationsfähigkeit herzustellen bzw. aufzubauen. In Zukunft werde ich darauf noch mehr achten und schauen, in welchen Bereichen es einen Mangel an Kompensationsfähigkeit gibt – und inwiefern darüber Bewusstsein besteht. Denn wenn ich entgegen den gesundheitlichen Grundvorstellungen eines Unternehmens anfange, Kompensationsfähigkeit aufzubauen, wird es früher oder später zum Konflikt kommen – oder meine Bemühungen verpuffen. Das macht dann keiner Seite Spaß.

Dienstag, 24. September 2013

Bye, bye, function. Hello, transformer!

Funktionen sollten nicht länger die kleinsten Bausteine unseres Codes sein. Sie vermengen nämlich zwei Aspekte: Kontrollfluss und Datenfluss.

Wenn eine Funktion die Kontrolle aufgibt, dann fließen Daten aus ihr heraus. Sie kann danach die Kontrolle nicht zurückbekommen. Erst ein erneuter Aufruf überträgt Kontrolle wieder an sie.

Wenn Daten aus einer Funktion fließen sollen, dann muss sie die Kontrolle aufgeben. Sie kann keine Zwischenergebnisse zur Weiterverarbeitung liefern.

Kontrolle und Daten fließen mit Funktionen also immer gleichzeitig. Das ist oft ok – aber eben nicht immer. Indem wir diese Aspektkopplung jedoch so tief in unseren Sprachen verankert haben, fällt es uns schwer, anders zu denken. Das halte ich aber für nötig, wenn wir evolvierbarere Software herstellen wollen.

Funktionen sind ein Relikt aus der Anfangszeit der Programmierung. Sie sind syntactic sugar für Maschinencodebefehle, die nicht nur ein Unterprogramm aufrufen (CALL), sondern auch noch anschließen ein Resultat für den Aufrufer bereitstellen. Dabei gibt es immer nur einen Punkt, an dem die Kontrolle ist: den Befehl, auf den der eine Befehlszeiger weist. Daten sind in diesem Paradigma wie Hunde, die ihrem Herrchen an der Leine folgen müssen. Sie können immer nur am selben Ort in Verarbeitung gedacht werden, wo auch gerade die eine Kontrolle ist.

Das ist alles wunderbar und verständlich. Das hatte seine lange Zeit. Doch ich glaube, wir sollten jetzt darüber hinaus gehen. Dadurch wird dieses Paradigma nicht überflüssig. Die Newtonsche Physik gilt ja auch weiterhin. Aber wir denken dann nicht mehr, dass alles nur mit diesen Mitteln erklärt und beschrieben werden muss. Die relativistische Physik umfasst die Newtonsche. So sollte auch ein neues Paradigma das bisherige umschließen.

Ist da schon alles mit der Funktionalen Programmierung gesagt? Hm… Nein, ich glaube, nicht. In der steckt ja schon im Namen die Funktion, also das, was wir überwinden sollten.

Aber wie können Kontrollfluss und Datenfluss entkoppelt werden? Mit Continuations bzw. Observern.

Aus einer Funktion

R f(P p) {
  …
  return r;
}

würde z.B. eine Prozedur wie

void f(P p, Action<R> continueWith) {
  …
  continueWith(r);
}

Diese Prozedur hat alle Freiheiten, Kontroll- und Datenfluss zu entkoppeln:

  • Sie kann ein Resultat via continueWith() liefern und dann die Kontrolle aufgeben – oder auch nicht.
  • Sie kann entscheiden, überhaupt ein Resultat zu liefern.
  • Sie kann sogar entscheiden, mehrfach ein Resultat zu liefern.
  • Und schließlich ist eine solche Prozedur auch nicht darauf festgelegt, nur über einen “Kanal” Daten zu liefern.

void f(P p, Action<R> onR, Action<T> onT) {
  …
  onR(r);
  …
  onT(t);
  …
}

Solange der Name der Continuation auf die Prozedur bezogen ist, erhält sie keine Information über den Kontext der Weiterverarbeitung ihres Output. Wie eine Funktion erfüllt sie damit das Principle of Mutual Oblivion (PoMO).

Ich nenne so ein Unterprogramm Transformator. Funktion impliziert gleichzeitigen Kontroll- und Datenfluss. Transformator ist als Begriff hingegen noch nicht verbrannt. Und irgendetwas gibt es ja immer zu transformieren, oder? Zahlen in andere Zahlen, Zeichenketten in andere Zeichenketten oder Zahlen in Zeichenketten oder Zeichenketten in Wahrheitswerte oder in-memory Daten in persistente Daten usw. usf.

Unsere Programmiersprachen sind natürlich für den Umgang mit Funktionen optimiert:

var y = f(x);
var z = g(y);
h(z);

Das lässt sich leicht hinschreiben und lesen. Aber leider ist es begrenzt in seiner Ausdrucksfähigkeit, weil eben Kontrolle und Daten immer gleichzeitig fließen müssen.

Die Alternative mit Transformatoren ist nicht so schön, ich weiß:

f(x, y =>
g(y,
h));

Mit ein wenig Übung kann man das allerdings auch flüssig lesen und hinschreiben. Aber es ist zumindest ungewohnt. Schöner wäre es, wenn man z.B. schreiben könnte:

f –> g –> h

In F# geht das ähnlich – allerdings nur für Funktionen. Bei aller Fortschrittlichkeit ist man auch dort dem alten Paradigma verhaftet. Es sitzt tief in uns.

Wie eine Lösung aussehen kann, weiß ich auch nicht. In meiner Entwicklung von Funktionen hin zu Transformatoren möchte ich mich dadurch aber nicht beschränken lassen. Denken kann ich Transformatoren, visuell darstellen kann ich Transformatoren, codieren kann ich Transformatoren. Da wird sich doch auch eine textuelle Notation finden lassen, oder?

Der Pfeil scheint mir ein passender Operator, wenn mit Transformatoren nun Datenflüsse in den Blick kommen. Vielleicht könnten dann mehrere Flüsse so notiert werden:

f.onR –> g.onY –> h,
f.onT –> m,
g.onZ –> n;

Das Diagramm dazu wäre:

image

Das ist wunderbar übersichtlich. Der heutige C#-Code hinkt leider hinterher:

f(x, r =>
  g(r,
    h,
    n),
  m);

Aber ich bin unverdrossen. Den Übergang von Funktionen zu Transformatoren halte ich für wichtig. Wir lösen uns damit aus der Umklammerung der von-Neumann-Maschinen. Nicht Kontrolle ist wichtig, sondern Resultate, d.h. der Fluss von Daten.

Kontrolle kann in mehreren Transformatoren gleichzeitig sein. Oder Kontrolle kann vor uns zurück springen, wenn sie denn nur an einem Ort zur Zeit sein kann.

Die Funktion als Werkzeug wird damit nicht überflüssig, sondern nur als Sonderfall neu positioniert. Transformatoren können sich wie Funktionen verhalten, wenn es sein muss. Können, müssen aber nicht. Und das find ich so wichtig. Mit Transformatoren ist entkoppelt, was nicht zwangsläufig zusammengehört. Freiheit für die Daten!

Sonntag, 22. September 2013

Nie mehr ohne – Das Kondom fürs iPhone

Einer der letzten Smartphone-freien Orte war bisher die Dusche. Das ist nun vorbei. Denn jetzt gibt es das Kondom fürs iPhone, genannt SmartSkin.

image

Ich habe es von meiner Freundin und Kollegin Andrea Kaden geschenkt bekommen, die als Anhängerin der Papierlosigkeit keinen Bereich auslässt. (Als hätte ich sonst mit Papierbergen im Bad zu kämpfen… ;-) Und so habe ich denn heute das erste Mal mit Musik geduscht:

image

Der Überzieher hält dicht. Soweit die gute Nachricht. Für die Dusche reicht das. Auch fürs Lesen in der Badewanne. Wahrscheinlich kann das iPhone auch ins Wasser fallen, ohne Schaden zu nehmen. Ausprobiert habe ich das aber nicht.

Wie bei sonstigen Kondomen ist dieser Überzieher wahrscheinlich eher für den einmaligen Gebrauch gedacht. Man kann ihn solange aufgezogen lassen, bis das iPhone wieder geladen werden muss. Dann muss er runter, denn eine Öffnung für den Ladestecker ist natürlich nicht vorgesehen.

Aber wenn man vorsichtig ist, leiert die Kunststoffhülle nicht zu sehr aus. Dann kann das iPhone Kondom auch mehrfach zum Einsatz kommen. Ob das jedoch im Sinne des Erfinders ist…? Ich weiß nicht.

Das Aufziehen ist einfach. Üben an einem “Surrogat” wie bei anderen Kondomen entfällt:

imageimageimage

imageimage

Am Schluss wird die Öffnung auf der Rückseite des iPhones mit einem Klebestreifen verschlossen. Dessen Klebefähigkeit scheint mir der Schwachpunkt für mehrfachen Gebrauch.

Nun wünsche ich allen iPhone-Freunden eine gute Zeit unter der Dusche mit ihrem Liebling :-) War das nicht immer euer Traum? Es unter der Dusche tun… Lesen, Musik hören oder ein Hörbuch oder eine Diashow ablaufen lassen…? Es tun sich ungeahnte Erlebnisse auf!

Donnerstag, 22. August 2013

Kinderleicht eine Programmiersprache lernen – Das Nostalgie-eBook

imageIch hatte das Buch echt vergessen, das ich 1985 geschrieben hatte. Jetzt ist es mir beim Ausmisten meiner Regale in die Hand gefallen. 220 Manuskriptseiten ausgedruckt auf einem Nadeldrucker. Wahnsinn!

Damals war ich noch beseelt vom Informatikunterricht in der Schule, den ich zwei Jahre zuvor mit dem Abi hinter mir gelassen hatte. Und seitdem war ich mächtig auf einem Apple II mit Z-80 Karte und CP/M zugange. Dort konnte ich mit Turbo Pascal fortsetzen, was wir auf einer Dietz Mehrplatzanlage mit Bernsteinmonitoren angefangen hatten. Seufz… Sweet memories…

imageSo hatte ich begonnen – zunächst mit meinem Schulfreund Helge Baumann –, eine Anleitung zum Programmieren für Pascal zu schreiben. Die trockenen, eher akademischen Bücher, die ansonsten verfügbar waren, schienen ungeeignet für den Schulgebrauch. Wenn ich mich recht erinnere, hatten wir im Unterricht auch kein Lehrbuch.

1983 oder so begonnen, dauerte es allerdings bis 1985, um das Werk fertigzustellen. Abitur, Bundeswehr, Studiumsbeginn in Hamburg und Liebeskummer hielten die Arbeit am Manuskript immer wieder auf.

Irgendwie habe ich es dann aber doch geschafft. Nur gelangte der Text dann weder an meine alte Schule, noch zu einem Verlag, der ihn hätte veröffentlichen wollen. Teubner war zwar grundsätzlich interessiert an mir als Autor, nur nicht mit dem Thema und der Form. Und so ist das Manuskript in einem Ordner geblieben und mehrfach umgezogen.

image

Das Ziel damals war, eine Einführung in die Programmierung für eine populäre, nicht akademische Programmiersprache zu liefern, die auch den Laien anspricht. Alles sollte ganz einfach und konkret beschrieben werden. In kleinen Schritten.

imageDie Beispielprogramme sollten durchaus ganze Anwendungen sein, nicht nur Algorithmen. Und auch der Entwurf und die Lesbarkeit von Software waren wichtig. Deshalb gibt es viele Struktogramme. Niedlich, oder? Aber das war damals state-of-the-art.

Vor allem aber sollte die Sprache entspannt sein und der Text durch Bilder aufgelockert werden. So finden sich im Manuskript denn auch mehr als 60 liebevoll von Hand gezeichnete Illustrationen.

Die in den Text zu bringen, war 1985 nicht einfach. Da gab es keine Textverarbeitungsprogramme wie Word, auch keinen Scanner, keine Grafiksoftware. Also habe ich im Text beim Schreiben Platz für die Zeichnungen gelassen und sie nach dem Ausdruck direkt aufs Blatt gezeichnet. Wenn ich mir überlege, wieviel Mühe das gemacht haben muss… Aber ich kann mich nicht mehr daran erinnern.

image

Und nun liegt es nach 28 Jahren wieder vor mir. Fühlt sich ein Stück wie ein fremdes Buch an. Aber wenn ich dann drin lese, merke ich natürlich schon, dass das von mir ist ;-) Vieles hat sich seitdem verändert an mir, aber eben nicht alles.

imageSpannend finde ich, dass mir das Manuskript wirklich entfallen ist. Anfang der 2000er, als ich einige Bücher zu .NET und Datenbankprogrammierung geschrieben habe, war mir, als hätte ich noch nie so lange Texte entwickelt.

Heute schaue ich sogar ein wenig neidisch auf mein früheres Selbst. Wie hat der das geschafft, der damalige Ralf, diese Ausdauer aufzubringen? Mir macht es heute große Schwierigkeiten, Texte von mehr als 50-60 Seiten zu schreiben. Dabei wäre das sehr nötig, um mal eine kompakte und kohärente Darstellung von Flow-Design anbieten zu können.

Durch das Schreiben von Artikeln und Blogpostings bin ich aber so auf kurze Texte getrimmt, dass mir immer wieder der Atem für Längeres fehlt. Ich muss mich wohl noch ein bisschen mehr anstrengen. Vielleicht macht mir der Manuskriptfund in einem Regal ja Mut. Oder ich finde eine Form für die Darstellung, die zu meiner Ausdauer passt.

image

Nach soviel Schwelgen in Erinnerungen hier nun aber meine ambitionierte Einführung in die Programmierung mit Turbo Pascal. Zum Schmunzeln und als Anregung für Ausflüge in die eigene Vergangenheit.

Mit den heutigen Möglichkeiten ist es nun kein Problem mehr, so ein Manuskript zu veröffentlichen. Ich könnte mittels lulu.com auch in wenigen Stunden ein Papierbuch machen, das “der geneigte Leser” dann online erstehen kann. Wahnsinn, wie weit wir in den letzten 28 Jahren gekommen sind.

imageUnd andererseits… Wahnsinn, wieviel dann doch bei der Programmierung gleich geblieben ist. Die Syntax hat sich verändert - Java, C#, JS statt Pascal –, auch das Programmierparadigma ist anders – objektorientiert statt prozedural – dennoch stehen Menschen, die ins Programmieren einsteigen wollen, vor denselben Problemen. Mit einer Programmiersprache statt mit Hammer oder Pinsel umzugehen, ist eine ganz eigene Herausforderung.

Und da unter den aktuellen Sprachen immer noch grundsätzlich dieselben Konzepte liegen wie damals… Vielleicht könnte der Text dem einen oder anderen Programmieranfänger auch heute noch mit seiner Anschaulichkeit helfen.

Viel Spaß beim Durchblättern!

Pascal - Eine kinderleichte Einführung by Ralf Westphal

P.S. Wer mag, kann übrigens die Einführung online mitprogrammieren. Hier ein Beispiel aus dem Text ausgeführt in der online IDE http://www.compileonline.com/compile_pascal_online.php:

image

P.P.S. Natürlich ist mir aufgefallen, dass die Sprache bzw. der Dialekt, mit dem ich damals programmiert habe vom selben Erfinder stammt wie die Sprache, mit der ich heute arbeite. Turbo Pascal wie C# sind von Anders Hejlsberg.

Ob das aber auch für die Sprache gelten wird, mit der ich in 28 Jahren arbeite…? Ich bezweifle es. Abe wer weiß… ;-)

Mittwoch, 14. August 2013

Vom Nutzen und Nachteil (technischer) Schulden

Gerade habe ich einen Beitrag von Norbert Eder zum Thema “Technische Schulden” (technical debt) gelesen. Er fragt, wer denn schuld sei an den Schulden.

Sich darüber Gedanken zu machen, finde ich nicht falsch. Aber wie bei anderen Artikeln zum Thema erscheint mir die Darstellung leider einseitig. Vielleicht entspricht das der aktuellen Stimmung im Land, die vieles was mit (Geld-)Schulden zu tun hat, sehr skeptisch sieht?

Doch wir sollten uns von diesen großen Problemen mit Schulden nicht ins Bockhorn jagen lassen.

Schulden sind nicht per se schlecht.

Die Möglichkeit, Schulden machen zu können, ist vielmehr die Grundlage für eine entwicklungsfähige Zivilisation.

Was sind Schulden?

Schulden sind eine Vorwegnahme von Möglichkeiten. Eigentlich habe ich heute eine gewisse Möglichkeit nicht - aber indem ich Schulden mache, habe ich sie dann doch.

Beispiele:

Ich kann mir heute kein Auto kaufen, weil ich nicht genug Geld habe? Dann leihe ich mir Geld - ich mache Schulden - und kann mir doch ein Auto kaufen. Später zahle ich das Geld zurück.

Oder: Eigentlich habe ich keine Zeit, spät nachts einen Film zu schauen. Ich müsste schlafen, um morgen fit zu sein. Aber ich schaue doch den Film, nehme also “Zeitschulden” auf, die ich morgen zurückzahle. Entweder Zahle ich sie morgen durch längeren Schlaf zurück. Oder ich zahle sie in Form von weniger Fitness zurück.

Oder: Wenn ich lange gesund leben will, sollte ich z.B. nicht rauchen. Wenn ich es doch tue, dann habe ich jetzt vielleicht mehr Lebensqualität - die ich später aber mit weniger oder gar keinem Leben bezahle.

Solche Ermöglichungen im hier und jetzt haben natürlich ihren Preis. Jetzt Geld, Aufmerksamkeit, Lebensqualität zu haben, kostet in der Zukunft Geld, Aufmerksamkeit, Lebensqualität. Und zwar mehr als ich jetzt bekomme.

Aber das mag es mir ja wert sein. Aus welchen Gründen auch immer.

Wer Schulden macht, handelt ökonomisch.

Schulden eröffnen Chancen

Viele Chancen im Leben erfordern mehr Möglichkeiten als wir gerade haben. Wenn wir sie wahrnehmen wollen, müssen wir Schulden machen.

Beispiele:

Nur wenn ich jetzt ein Auto habe, kann ich einen bestimmten Job bekommen, der mir die Chance auf eine Karriere bietet. Wenn ich keine Schulden machen kann, geht mir die Chance durch die Lappen.

Eigentlich will ich nach Hause gehen, um zu schlafen, damit ich morgen Fit bin im neuen Job. Aber da begegnet mir eine tolle Frau: das ist eine Chance auf schöne weitere Stunden oder gar eine glückliche Partnerschaft. Wenn ich jetzt keine Schulden bei meiner Energie und Aufmerksamkeit machen kann, geht mir diese Chance durch die Lappen.

Während die Rückzahlung von Schulden meist in derselben Währung stattfindet, liegen die Chancen eher in anderen Bereichen. Aus Geld-Schulden wird eine Karriere, aus Energieschulden wird Verliebtheit, aus Nikotinabhängigkeit wird Gemeinschaftsgefühl.

Wer Schulden macht, der sucht sein Glück.

Auf das Maß kommt es an

Alles hat sein bekömmliches Maß, auch Schulden.

Schulden machen zu können, also ökonomische Entscheidungen durch die Verschiebung von Möglichkeiten in Bezug auf sein Glück treffen zu können, das ist grundsätzlich eine gute Sache.

Doch wenn man das unbedacht tut, dann kann man sich auch ins Unglück stürzen. Das passiert, wenn man seine Kapazität zur Rückzahlung von Schulden überschätzt. Nicht bei jeder Schuld ist auch klar, wie hoch ihr Preis ist.

Bei einem Kredit für´s Auto ist der Preis klar, aber die Entwicklung der Karriere vielleicht nicht. Beim Zigarettengenuss ist weder der genaue Preis, noch die Entwicklung der “Rückzahlungsfähigkeit” klar.

Man tut also gut daran, genau hinzuschauen, welche Schulden man wann zu welchem Preis aufnimmt.

Und man tut gut daran, die Rückzahlung zu planen, damit sie einen nicht zur Unzeit erwischt. Gewöhnlich steigt auch der Preis der Schulden, je länger die Rückzahlung aufgeschoben ist. Der Schuldiger fordert sein Recht; die Schuld, die Ermöglichung heute geht auf seine Kosten. Sei das eine Bank oder der eigene Körper.

Schulden erfordern Bewusstsein und Maßhaltung

Technische Schulden

Für technische Schulden gilt natürlich dasselbe wie für alle anderen Schulden auch.

Technische Schulden sind nicht schlecht. Sie machen vielmehr eine Werteabwägung zum Wohle eines größeren Ganzen möglich; sie gehören in den ökonomischen Werkzeugkasten jedes Entscheiders in der Softwareentwicklung.

Wie alle Schulden, sollten auch technische allerdings nur bewusst und in Maßen aufgenommen werden. Der Rückzahlungsplan sollte von Anfang an klar sein.

Wer heute sich durch Entscheidungen für suboptimale technische Qualität die Möglichkeit zu einer früheren Präsentation oder geringen Kosten erkauft - der muss gewahr sein, dass diese Schuld zurückgezahlt werden muss. Wieviel, wann und an wen soll gezahlt werden?

Wer daran nicht denkt, der bekommt immer zum ungünstigsten Zeitpunkt Besuch vom Schuldeneintreiber. Sie kennen das aus vielen Krimis. Und dann ist die Panik groß. Dann beginnt das Bitten und Betteln. Doch der Schuldeneintreiber ist immer gnadenlos. Er mag etwas Aufschub gewähren - doch am Ende muss gezahlt werden. Und zwar niemals weniger als ursprünglich geschuldet.

Also:

Technische Schulden sind nicht böse - solange Sie damit sinnig umgehen.

Aber kennen Sie Ihr Maß. Lassen Sie sich nicht verleiten. Denken Sie vom ersten Tag an die Rückzahlung.

Und vermeiden Sie wie auch sonst im Leben, alte Schulden mit neuen Schulden zu begleichen.