Software Chirurgie

Auf der Fahrt nach Budapest zur CraftConf 2015  hatten meine Frau und ich eine intensive Diskussion über den Begriff “Software Craftmanship” und wie er wohl für das passt was wir in der Software-Entwicklung machen. Es fehlten ihr die Kopfarbeit und die Voraussetzungen bzw. Ausbildung, welche notwendig sind, um in diesem Bereich erfolgreich zu arbeiten. Die Begriffe Handwerker (im Deutschen noch ganz besonders), Architekt und Ingenieur passten nicht so richtig. Wobei ich zugeben musste, dass der Letztere wohl am besten sei. Da wir in der Softwareentwicklung (noch) keine eigenen Begriffe für unsere Tätigkeiten haben, bedienen wir uns Worten aus gekannten Bereichen. Seit der ersten Konferenz über Software Engineering 1968  leihen wir uns die Definitionen aus dem Bauingenieurwesen aus. Die Wahl dieser Metaphern kann aber nur eine Annäherung sein – zu gross sind die Unterschiede. Die physischen Gesetze wie man sie z.B. beim Brücken- oder Häuserbau vorfindet, gibt es in unserem Bereich nicht. Das Serien-Produktionsproblem die es in anderen Ingenieurs-Disziplinen wie z.B. bei der Serienproduktion im Autobau auftritt – bei uns nicht vorhanden. Kopieren ist einfach.

Und dann kam der Vortrag “Beyond Features: Rethinking Agile Planning and Tracking” von Dan North und seine Frage ob wohl der Begriff der Chirurgie (engl. : surgery) besser passen könnte. Seine Überlegungen, dass ein operativer Eingriff mi­ni­mal­in­va­siv ausgeführt werden soll, passt sehr gut auf die derzeitigen Bestrebungen im Bereich von Agile, Software Craftmanship und Lean, eine Lösung einfach zu halten und nur die Dinge zu bauen, die wirklich benötigt werden.

Hier ein paar Punkte die mir in diesem Zusammenhang durch den Kopf gehen und welche jedem erfahrenen Softwareentwickler bekannt vorkommen könnten:

  • chirurgische Eingriffe müssen schnell ausgeführt werden
  • ein Chirurg muss neben einer fundierten Ausbildung gute handwerkliche Fähigkeiten vorweisen können
  • es gibt einfache und sehr komplizierte Operationen
  • Komplikationen sind keine Seltenheit und man muss situativ reagieren können
  • es ist schwierig die Dauer einer Operation im Vorfeld abschätzen zu können, insbesondere dann, wenn etwas Neues versucht wird oder der Eingriff kompliziert ist
  • ein Team von unterschiedlichen Experten arbeitet zusammen
  • die Qualität der Arbeit hängt stark von den Fähigkeiten der Ärzte ab
  • die Umgebung hat einen entscheidenden Einfluss – im Fall einer Operation muss der Raum sauber sein, die Instrumente müssen bereit liegen und die Maschinen (hoffentlich nicht veraltet) müssen funktionieren
  • es kommen Fehler vor (Instrumente verbleiben im Körper, das falsche Bein wird amputiert)
  • neue Techniken können eine enorme Bereicherung und ganz neue Möglichkeiten bieten
  • Ärzte müssen sich ein Leben lang weiterbilden (oder möchte jemand von einem Arzt operiert werden, der noch mit dem Wissen aus seinem Studium in den 90igern arbeitet?)
  • kommt ein Arzt zu einem Unfallort muss er improvisieren können
  • es bleiben Narben
  • am liebsten geht man zu den besten Ärzten, aber wenn es schnell gehen muss oder man keine Krankenversicherung hat, nimmt man den Arzt, der verfügbar ist
  • es gibt Scharlatane die Heilung versprechen
  • mit jedem Eingriff lernt man hinzu, bekommt Routine und trotz viel Erfahrung kann man es immer noch besser machen

Meiner Meinung nach kann aber die Analogie zur Chirurgie nur eine Metapher bleiben. Aber ich finde sie hat etwas.

Auch ich habe das Bild eines Arztes schon oft verwendet. Insbesondere dann, wenn ich mit unerfahreneren  Softwareentwicklern gearbeitet habe. Bei aller Theorie muss man immer im Auge behalten, dass das Ergebnis im Vordergrund stehen muss. Ein Arzt der an einen Unfallort kommt, findet dort nicht die idealen Bedingungen vor wie im Operationssaal. Trotzdem ist es seine Pflicht einem verletzten Menschen zu helfen. Und genau so ist es auch in der Softwareentwicklung. Es bringt nichts nur über die Schönheit unser Implementierung oder den richtigen Aufbau unserer Applikation zu philosophieren, wenn man für den Kunden keinen Nutzen erzeugen kann oder zu spät mit einer Lösung kommt. Im schlimmsten Fall ist der Patient tot. Im Fokus muss stehen, WAS gemacht werden muss um zu helfen – das WIE sollte man dabei aber nicht aus den Augen verlieren.

Wer gern etwas mehr Hintergrund zur Wichtigkeit von Metaphern haben möchte, dem sei das Buch “Leben in Metaphern: Konstruktion und Gebrauch von Sprachbildern” von George Lakoff und Mark Johnson empfohlen.

Auf jeden Fall werde ich versuchen richtige Chirurgen zu treffen und darüber zu sprechen. Schlussendlich bin ich in dem Bereich ein Laie. Und wenn sonst jemand Interesse hat: Einfach melden.

 

docker, golang and “Hello World” via HTTP

After reading the article “Create The Smallest Possible Docker Container” by Adriaan de Jonge I was wondering how long I need to install golang (again), write and build the server and get it running in a docker container. It took me ~30 minutes .

An interesting point is this the size of this container:

ollin/helloworldhttp                 latest                fd9ead3df193        16 minutes ago      4.072 MB

It’s only ~4 MB.

The virtual size of a small JRE  is ~386 MB (without any server):

seansummers/openjdk-7-jre-headless   latest                2cafc2975f19        7 months ago        386.6 MB

Adding a repository into /etc/apt/sources.list.d without python-software-properties installed

Here is an easy solution to install a new repository into /etc/apt/sources.list.d (e.g. ubuntu) without using the python-software-properties package. I found this in the relateiq/oracle-java8 Dockerfile . This example installs the Oracle JDK via the webupd8 java ppa.

echo "deb http://ppa.launchpad.net/webupd8team/java/ubuntu precise main" | tee -a /etc/apt/sources.list
echo "deb-src http://ppa.launchpad.net/webupd8team/java/ubuntu precise main" | tee -a /etc/apt/sources.list
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys EEA14886

and then the installation:

apt-get update
# auto accept oracle jdk license
echo oracle-java8-installer shared/accepted-oracle-license-v1-1 select true | /usr/bin/debconf-set-selections
apt-get install -y oracle-java8-installer

Spring Boot running in 2 min

Spring Boot 1.0.1 is released. I wanted to find the fastest way to get a spring boot app running. The usual “Hello world” was created and running in around 2 minutes. For the creation of the initial project files I used lazybones. The project template uses gradle as build tool. So I had to install gradle too. And the easiest way to install lazybones and gradle is gvm.

Install gvm:

curl -s get.gvmtool.net | bash
source "//.gvm/bin/gvm-init.sh"

Install gradle and lazybones:

gvm install gradle
gvm install lazybones

Create a project with the name “mycrm” with the template “spring-boot-actuator”:

lazybones create spring-boot-actuator mycrm

Change into project directory and build the runable jar:

cd mycrm
gradle bootRepackage

Run the application:

java -jar build/libs/spring-boot-sample-actuator-1.0.0.jar &

Get the hello world 🙂

wget -O - localhost:8080 | less

Done.

 

Probleme mit SSD der Marke Crucial

Seit Anfang der Woche hatte ich Probleme mit meinem Computer. Sporadisch hat sich KDE sehr komisch verhalten. Die Applikationen waren nicht mehr ansprechbar und schlussendlich war ein Hardware-Reboot notwendig.

Erst hatte ich KDE unter Verdacht und nachher habe ich meine Dockingstation für die Fehler verantwortlich gemacht. Das Verhalten war aber auch wirklich sehr sonderbar. Nicht einmal in den Log-Files war irgendetwas zu finden – keine Fehlermeldungen, einfach Nichts.

Nachdem wir herausbekommen hatten (Danke an Nico W. und Stephan Cl.), dass meine Rootpartition bei solch einem Fehlverhalten plötzlich read-only war, dachte ich an einen Fehler im Kernel. Diverse Einträge in den Foren wiesen darauf hin. Aber die Ursache wurde nirgends beschrieben, was mich stutzig machte.

Irgendwann konnte ich dann doch an die Kernel-Nachrichten via dmesg herangekommen – mit viel Geduld und Glück. Danach war das Problem recht schnell identifiziert.

Der SSD-Hersteller Crucial hat seine SSD’s der Serie M4 mit fehlerhafter Firmware ausgeliefert. Nach 5’000 Betriebsstunden setzen sich diese SSD’s nach einer Stunde in den Modus read-only. Crucial ist aber so nett einen Firmware-Upgrade zur Verfügung zu stellen, der dieses Problem beseitigt:

http://www.crucial.com/support/firmware.aspx

Einspielen des Upgrades war ohne Probleme und nun läuft mein Rechner wie ein Bienchen.

/ch/open Workshoptage – 12.09.2013 – WS 15: Coderetreat – honing the craft together

20130616_142005_v1
Art Basel 2013 | Unlimited | Chen Zhen | Continua

Jipiii, es klappt. Am 12.09.2013 ist ein Code Retreat bei den /ch/open Workshoptagen. Wer also Lust hat an seine Programmierfähigkeiten zu feilen… es hat noch freie Plätze.

Ablauf wird analog sein wie ich es in meinem letzten Post geschrieben habe. Eventuell überlege ich mir noch eine neue Aufgabenstellung, damit es nicht langweilig wird, wenn zu viele Leute schon mal das Game of Life gemacht haben.

Freue mich sehr darauf. Es macht immer wieder Spass und man lernt immer wieder dazu…

Update 2013-10-07

Hier noch der Link auf die Präsentation die ich beim Workshop an den ch/open-Workshoptagen verwendet habe.

Danke nochmals an alle Teilnehmer! Es hat riessigen Spass gemacht mit Euch zu arbeiten.

 

Coderetreat

Coderetreat 2012 @ ZurichJa, lange habe ich nichts mehr hier geschrieben und doch ist so viel passiert.

Am 8. Dezember 2012 habe ich am Global Day of Coderetreat in Zürich teilgenommen. Bei diesem Anlass treffen sich Softwareentwickler weltweit verteilt an verschiedenen Orten um ihr Handwerk das Programmieren zu üben. Der Anlass hier in Zürich war sehr gut organisiert und hat in den Büros von Namics stattgefunden.

Die Rahmenbedingungen:

  • Problem: Conway’s Game of Life
  • Test Driven Development
    • schreibe einen Test der fehlschlägt
    • bringe den Test zum laufen
    • refactor den Code
    • beginne von vorn
  • Generelle Regeln für den Code = Xp Simplicity Rules
  • Pair Programming – es sitzen immer zwei Leute vor einem Rechner und arbeiten zusammen an der Lösung
  • Sessions – man arbeitet mit seinem Partner für 45 Minuten an der Problemstellung, dann 15 Minuten Pause zum Besprechen und zum Erfahrungsaustausch
  • Constrains – in jeder Session bekommt man unterschiedliche Rahmenbedingungen die es einzuhalten gilt, dies waren z.B:
    • no return values – keine Rückgabewerte bei Methoden
    • no condititionals – kein if, kein while
    • baby steps – jede TDD Iteration innerhalb von 3 Minuten, dann 2 Minuten, dann eine Minute.

Im Zentrum steht das Üben. Es ist nicht notwendig am Ende etwas Funktionierendes vorweisen zu können. Auf diese Weise soll ermöglicht werden, dem Zeitdruck des normalen Arbeitsalltages zu entfliehen und Neues auszuprobieren.  Der Tag war sehr eindrucksvoll und wertvoll für mich. Unter Anderem musste ich feststellen, dass unter Zeitdruck auch besserer Code entstehen kann. Bisher war ich immer der Meinung, mehr Qualität auch mehr Zeit braucht – aber ja, es geht auch anders.

Da ich meine Erfahrungen gern teilen wollte, habe ich im April 2013 bei meinem Arbeitgeber Inventage auch solch einen Anlass organisiert und durchgeführt. Das Feedback war generell positiv. Ich empfehle jeder Entwicklungsabteilung solche oder ähnliche Anlässe durchzuführen. Man lernt die Arbeitsweise der Kollegen besser verstehen, übt seine Gedanken über das Programmieren auszutauschen, lernt die kleinen Tricks der Anderen kennen (und wenn es nur ein Shortcut ist),  lernt besseren Code zu schreiben, und, und, und… Wenn jemand Hilfe benötigt, solch einen Anlass zu organisieren, dann meldet Euch einfach.

Wer nicht auf den nächsten Coderetreat warten möchte: Hier in Zürich gibt es codersonly. Diese Gruppe von Leuten trifft sich regelmässig am Donnerstag Abend im Cafe Plüsch, um  gemeinsam an  Code-Katas zu trainieren und sich übers Software entwickeln auszutauschen.

May the Craft be with you.

Understanding JavaScript via TDD

I got interested in JavaScript via the book “Seven Languages in Seven Weeks” by Bruce Tate. I read it one year ago. The chapter about the prototyping nature of the language “Io” was an eye opener. The book itself is worth to write about – but not today.

As every developer I used JavaScript a little bit. But really understanding whats going on is definitely another thing. The last weeks I wrote a little shopping list as a client for my vert.x experiments. It is a single page app and uses knockout.js, jquery and bootstrap for the UI. I use Java as my general purpose programming language since 1997 and I think I know Java quite well. So, I was a little bit frustrated that I don’t understand every construct in JavaScript. After playing with some frameworks and CoffeeScript I decided to build up a comparable Test Driven Environment as I use when I developing in Java. I wanted to use a xUnit like test framework. But there are so many test frameworks that it was difficult to decide which one to use. After looking at several post and at stackoverflow I got the feeling that js-test-driver or QUnit are good candidates.

Then I found this really good book: “Test-Driven JavaScript Development” by Christian Johansen. Christian uses js-test-driver in his book. The main goal for js-test-driver is to be the runner for the tests. It has also assertions but I wanted to have more readable tests. I heard about Jasmine and a friend (thanks to Patric) also mentioned it. The integration was done in 10 minutes and the tests are better to read now. I really like this BDD style.

After a while I thought about a better way to connect a browser to the driver. I didn’t want to start a browser every time and press the connect link because I’m writing “Understand Tests” mostly.  Robert C. Martin describes this kind of tests in his book “Clean Code“. These tests are very handy to understand a framework, a library or as in my case also language features. I wanted to start the js-test-driver together with something like a headless browser. PhantomJS is such a thing. js-test-driver-phantomjs starts the driver and the headless browser with one simple command. This setup is also very useful for Continuous Integration! Intellij IDEA has also a nice plugin for js-test-driver.

Of course, I can write a test in the console of some browser, but if I close the browser the tests are gone. The tests are inside my project now and I can look at the tests as often as I like. And testing the JavaScript-part of my application works the same way as I know it from the Java-World.

 

 

 

 

 

 

Asus RT-N66U – 64K NVRAM

This is a very short description how I upgraded my ASUS RT-N66U router. My router had a CFE bootloader version 1.0.1.2. This version only supports 32K NVRAM, which was not enough for my DD-WRT configuration.

Disclaimer: Following this steps can brick your router. If you are unsure, don’t use this description!

Hard Reset

Hard Reset will clear out the NVRAM. For this router use the WPS button, not the reset button.

Upgrading CFE

I followed the original description:¨CFE bootloader update¨.

Install DD-WRT

I installed the Fractal Build version  20202 mega for RT-N66U with CFE upgrade via ASUS Firmware Restoration tool. This Firmware Restoration tool is part of the ASUS RT-N66U B1 Utility (choose your OS -> Utilities).

Result

References:

  1. dd-wrt.com forum “Asus RT-N66U
  2. dd-wrt.com wiki “Asus RT-N66U