20
Oct 14

The abuse of “Thank you”

As a Scrum practitioner, how often do you use (or hear) phrases like

  • “Thank you for attending this meeting”
  • “Thank you for being on time for the Sprint Review”
  • “Thank you for providing feedback on the proposal”
  • “Thank you for the constructive atmosphere”

Attending a mandatory meeting is part of the job. Being on time is basic courtesy. Providing constructive feedback is what you are here for. IMHO, there’s absolutely no need to thank anybody for these trivial matters (*).

Au contraire, the inflationary use of “Thank you” waters down your message when it’s time to really thank someone (**). How about

  • “Thank you for going the extra mile to clean up module XYZ”
  • “Thank you for staying late to make up for the time we lost due to unforeseen circumstances”
  • “Thank you for helping me debugging this problem of mine”
  • “Thank you for explaining XYZ to me, I didn’t get it in the first place”

(*) If you need to convey a subtle message, you can always use “I’m really happy to see all of you on time”

(**) You already guessed it, I’m leaning heavily towards “Silence is praise enough”


20
Oct 14

Der inflationäre Gebrauch von “Danke”

Wie oft nutzen (und hören) wir als praktizierende Scrum-Adepten Versatzstücke wie

  • Vielen Dank, daß Sie an diesem Meeting teilnehmen
  • Vielen Dank für Euer pünktliches Erscheinen
  • Vielen Dank für den Feedback
  • Vielen Dank für die konstruktive Atmosphäre

Für mein Dafürhalten sind dies leere Floskeln. Die Teilnahme an Meetings ist Teil des Jobs. Soweit ich informiert bin, ist Pünktlichkeit eine Eigenschaft, die einem die eigenen Eltern beigebracht haben (sollten) (*). Auf Höflichkeit hat bereits die eigene Mutter bestanden. Nach meinen Informationen steht in den gängigen Arbeitsverträgen auch nichts über unsachliches Rumschreien.

Der inflationäre Gebrauch des “Danke” verwässert die Botschaft, wenn es wirklich angebracht / notwendig (**) ist, jemandem zu danken. Wie wäre es leerer Worthülsen mit

  • Vielen Dank, daß Du gestern am späten Abend noch das Modul XYZ aufgeräumt hast
  • Vielen Dank, daß Du heute morgen früher gekommen bist, um die rauchende Build-Maschine wieder zum Laufen zu bringen
  • Vielen Dank, daß Du mir beim Debuggen meines Problems geholfen hast, ich habe den Wald vor lauter Bäumen nicht gesehen
  • Vielen Dank, daß Du vorige Woche die Initiative ergriffen hast und den Kollegen die Architektur des Moduls XYZ am Beamer erklärt hast

(*) Falls man eine subtile Botschaft rüberbringen muß, paßt auch ein “Ich freue mich, daß ausnahmsweise wirklich alle pünktlich erschienen sind”.

(**) Ihr habt es geahnt: Ich bin ein Anhänger der “Ned g’schmipft is’ g’nug g’lobt” – Theorie.


07
Nov 13

Ein Tag im Leben des agilen Entwicklers Erwin L.

Vor langer Zeit, in einem Paralleluniversum. Eine völlig unrealistische Geschichte – Science-Fiction.

Jede Ähnlichkeit mit lebenden Personen oder Entwicklungsmethoden ist nicht nur nicht beabsichtigt sondern auch ausgeschlossen.

9:58 Uhr

Erwin Lindemann betritt kurz vor Beginn der Kernarbeitszeit leicht überhastet aber voller Elan das Büro. Wieder einmal war die Buslinie aufgrund einer Dauerbaustelle unpünktlich. Nach Ablage seines Jacke fährt er seine zwei Rechner hoch, um das Tagwerk zu beginnen. Merkwürdig, das Hochfahren seines MacOS Rechners mit diversen automatisch startenden Applikationen dauert doch ein ganzes Weilchen. Erwin Lindemann bespricht sich mit dem auch bereits anwesenden Kollegen Hugo B. und sie beschließen gemeinsam, durch Booten von einer Knoppix-DVD das Dateisystems des Macs einer genaueren Prüfung zu unterziehen. Knoppix prüft.

10:15 Uhr

Gerade als Erwin zur Kaffeemaschine strebt beginnt unglücklicherweise das Daily Scrum.

10:30 Uhr

Das Daily Scrum endet glücklicherweise pünktlich. Unglücklicherweise setzt der Productowner & Scrummaster in Personalunion (die Geschichte spielt sich bekanntermaßen in einem Paralleluniversum ab, in dem so etwas möglich ist und nicht mit dem Tode bestraft wird) unter völliger Überschreitung seiner Kompetenzen gleich noch eine Viertelstunde Backlogpflege-Workshop an. Erwin’s Koffeinspiegel sinkt lebensbedrohlich ab.

10:45 Uhr

Nach der gemeinsamen, harmonischen Backlogpflege – Kollege V. hat wieder einmal mit seinen “das braucht maximal 2 Storypoints” Schätzungen geglänzt – strebt Erwin mit stierem Block erneut der Kaffeemaschine zu, um seinen Koffeinspiegel auf ein halbwegs lebenserhaltendes Niveau zu bringen. Leider stürzt diese bei der Zubereitung des Heißgetränkes nach weniger Sekunden mit einer kryptischen Fehlermeldung ab – der Kaffee ist alle. Beim Nachfüllen bemerkt Erwin, daß die Kaffeevorräte insgesamt zur Neige gegangen sind. Er pilgert durch’s Büro, um den Kaffeeverantwortlichen zu finden und diesen auf diesen eklatanten Missstand aufmerksam zu machen. Hugo V., der Kaffeeexperte, berichtet gerade seinem Freund und Kollegen Karl Y., wie er es letzte Nacht im Online-Rollenspiel World of Witchcraft trotz erheblicher Widerstände eines als Mitspieler getarnten amerikanischen NSA-Analysten geschafft hat, auch die letzte Bastion der Unix-Elfen zu erstürmen. Da Erwin auch ein großer Freund von World of Witchcraft ist, klinkt er sich in das Gespräch ein und berichtet begeistert über das letzte Wochenende, als er World of Witchcraft bei einer LAN-Party des Karnevalsvereins in der örtlichen Mehrzweckhalle installierte. Alle Gesprächsteilnehmer sind sich nach eingehender Diskussion einig, daß aufgrund der Performance-Vorteile nur Ubuntu das Betriebssystem der Wahl sein könne, obwohl natürlich auch Gentoo wegen der aktuelleren Sicherheitsupdates in die engere Wahl gezogen werden müsse.

11:00 Uhr

Mit einer nun vollen Kaffeetasse bewaffnet kehrt Erwin voller Tatendrang an seinen Rechner zurück. Seine Story wurde beim Sprint Planning mit genügend Zeit beschätzt und er brennt darauf, die Story zu erledigen. Er läßt erst einmal einen svn update (die Geschichte spielt bekanntermaßen vor langer Zeit) und einen kompletten Build des gesamten Systems laufen, um auf den neuesten Stand des Quellcodes zu kommen. Sicher ist sicher. Eine solide Basis für den Tag.

Der Build dauert ein paar Sekunden und Erwin wirft einen Blick auf seinen Mac – Knoppix meldet keine Beschädigungen auf der Bootplatte. Nochmal den ausgewiesenen Experten Hugo B. kontaktiert. Dieser kratzt sich ausgiebig am Kopf und wirft die Frage auf, ob Erwin nicht mit einer SSD als Bootplatte besser bedient wäre. Eine gute Idee, denkt Erwin, und schaut gleich mal bei arlt.de nach den aktuellen Preisen. Arlt.de bietet eine Sandvox GTI 3000 für 129€ oder eine Alligator Vertex 2 für 149€ an, beide erscheinen ihm als geeignete Kandidaten. Erwin ist sich allerdings ob der angegeben Firmwareversionen unsicher und prüft auf dem bekannten Forum technik-freaks.de, ob bereits Erfahrungswerte mit dieser Firmware vorliegen. Siehe da, diverse Forumsmitglieder widersprechen dem detaillierten Testbericht der Alligator Vertex 2 und berichten von enormen Performance-Einbußen im Nanosekundenbereich bei Schreiboperationen für große Mengen von Dateien mit weniger als 0.5KB Größe. Der Experte Hugo B. ist sich nicht sicher, ob das Formusmitglied nicht “Nano” mit “Mikro” verwechselt hat und empfiehlt, nochmals beim konkurrierenden Forum hardware-für-dummies.de vorbeizuschauen. Aber die dort zahlreich vorgetragenen Argumente überzeugen Erwin nicht. Er entscheidet sich nach reiflicher Überlegung dafür, bei nächster Gelegenheit eine Sandvox GTI 3000 vorzuschlagen.

12:00 Uhr

Ein Blick in seinen Mailer offenbart Erwin, daß die Builds mal wieder nicht durchgelaufen sind. Naja, einer muß sich ja zuständig fühlen. Eine genauere Analyse zeigt, daß die periodisch erscheinenden Updatemeldungen des Betriebssystems das Buildscript zum Abbrechen bewogen haben. Gründlich wie er ist, installiert Erwin die neuesten Patches auf allen 4 Buildrechnern und startet die Builds erneut. Leider bricht der Build nun sofort mit kryptischen Fehlermeldungen ab. Eine Befragen von google.de und das Durchforsten diverser Foren ergibt, daß die im Buildsystem verwendete Version der Scriptsprache nicht mehr mit dem letzten Betriebssystem-Patch kompatibel ist. Erwin lädt seufzend die aktuellen Sourcen und übersetzt die Laufzeitumgebung der Scriptsprache neu. Endlich, die Buildscripts starten wieder. Daumen drücken.

13:00 Uhr

Mailer schließen und kurz in die Entwicklungsumgebung geschaut. Das am Vormittag gestartete svn update & der komplette Build brauchten wohl keine 5 Minuten. Ein Glück, daß Erwin bevorzugt auf einem Windows-Rechner arbeitet, auf dem solche kurzen Turnaround-Zeiten die Regel sind.

Leider ist das Frühstück heute morgen ausgefallen, es meldet sich ein Hungergefühl. Erwin bereitet sich in der Küche ein Mittagessen zu. Gerade die Kombination von Rohkost mit Quark ist wegen der fettlöslichen Vitamine für ein effizientes Arbeiten unerlässlich. Während er sein verdientes Mittagessen vor seinem Rechner zu sich nimmt, informiert Erwin sich auf heise.de über die neuesten Nachrichten aus dem IT-Sektor. Unglaublich, Roland Profalla von der CDU fordert eine Internetsperre für alle über 18-jährigen, damit der aktuellen Abhöraffäre um das Handy seiner Scheffin wirkungsvoll begegnet werden könne. Noch unglaublicher, was für inkompetente Kommentare andere Leser zu diesem Artikel abgeben. Erwin beschließt, diesen Internet-Trollen mit einem wohlformulierten Forumseintrag ein für alle Mal zu zeigen, wo der Hammer hängt.

13:30 Uhr

Erwin räumt sein Geschirr vorschriftsmässig in die Küche. Die Nahrungsaufnahme und der Anblick der Toilettentüre haben Erwin’s Verdauung in die Gänge gebracht. Er verschwindet auf der Toilette und liest den zufälligerweise in der neuesten c’t enthaltenen mehrseitigen Testbericht zu SSDs, der ihm allerdings auch bei genauestem Studium keine neuen Erkenntnisse bringt.

13:50 Uhr

Tatendurstig erscheint Erwin wieder aus den Niederungen seiner Verrichtung. Als er am Scrum-Raum vorbeikommt, sieht Erwin, wie der leicht gestresste Scrum-Master das Board umorganisiert. Hilfsbereit wie er ist, unterstützt Erwin den Scrum-Master, druckt die 100 neuen Kärtchen aus und heftet diese zusammen mit dem Scrum-Master an die Wand. Der Scrum-Master ist wieder entspannt.

14:15 Uhr

Zurück vor seinem Rechner will Erwin gerade tatendurstig mit der Bearbeitung seiner Story starten, als sich zwischen zwei Kollegen eine technische Diskussion um die Implementierung eines anderen Tasks entspinnt. Da die beiden Kollegen nicht wirklich weiterkommen, abgesehen sowieso eine gewisse Planlosigkeit bei generischer Programmierung offenbaren und zuguterletzt auch Erwin tangential betroffen ist, schaltet er sich in die Diskussion ein. Diese driftet kurz darauf in theoretische Spekulationen über mögliche Performance-Implikationen völlig unbekannter und nie geahnter Implementierungsvarianten ab. Da es schon 14:50 Uhr ist, entscheidet die Runde auf den Scheff zu warten, der jede Minute eintrudeln sollte, um diesem eine Entscheidung abzuringen.

15:00 Uhr

Der Scheff betritt gehetzt das Büro und wird von der immer noch beieinander sitzenden Runde sofort kassiert.

15:10 Uhr

Der Scheff hat wie nicht anders zu erwarten auch keinen Plan (auch in Paralleluniversen vor langer Zeit ein weitverbreitetes Phänomen) und flüchtet sich in Allgemeinplätze wie “Da ist was falsch” oder “Das müßt Ihr anders machen”. Nach kurzem Nachdenken trumpft er dann mit einem “Was sagt denn eigentlich der Debugger? Schon mal reingeschaut?” auf. Verdammt – daran hatte natürlich niemand gedacht. Die Runde entscheidet sich, das Thema erst genauer am Rechner zu analysieren bevor man weiterdiskutiert. Als ausgewiesener ÖPNV-Jünger macht Erwin L. den Scheff noch dankenswerterweise darauf aufmerksam, daß die aktuelle Webcam für die Umgehungsstraße einen Bautrupp zeigt, der seit 11:00 Uhr gerade beide Fahrbahnen aufreißt und offensichtlich seit 2h nicht in die Pötte kommt, weil die Biervorräte zur Neige gegangen sind. Ein Ende wäre nicht abzusehen, da der örtliche Bioladen aufgrund eines Lieferengpasses aus Oberbayern kurzfristig auch keine Starkbiervarianten mehr anbieten könne. Der Scheff möge bei der späteren Heimfahrt vorsichtig sein.

15:15 Uhr

Erwin wendet sich wieder seinem Rechner zu. Wo war er stehen geblieben? Ah, seine Story. Genau. Noch schnell ein svn update – man ist ja paranoid – und Erwin beginnt mit der Bearbeitung. Erstaunlich – ein Kollege, der vor ihm am fraglichen Teilsystem arbeitete, hat bereits Tests für die fragliche Klasse entwickelt, obwohl aufgrund der externen Abhängigkeiten zu einer SQL-Datenbank sowie einem Regensensor eigentlich eine testgetrieben Entwicklung von vorneherein ausgeschlossen scheint. Erwin startet also seinen Tag mit dem Erstellen eines Tests für seine neue Funktion. Was könnte man denn testen? Hmm. Ah. CHECK(container.size() == 0);

15:20 Uhr

Noch schnell den neuesten Codestand aus dem svn besorgt und Erwin startet erwartungsvoll den Build, um den Code für seinen Test auszuprobieren. Oha, das Übersetzen dauert wohl mehr als fünf Sekunden, da hatte jemand doch noch eine größere Menge Code in der Zwischenzeit… Erwin beschließt, nicht auf das Ende des Übersetzungsvorgangs zu warten und wendet sich wieder seinem Browser zu. Oha, da ist ja noch der Reiter mit dem heise.de Forums-Thread zu Roland Profalla offen. Unfassbar, schon wieder über 30 Einträge aufgelaufen. Komplett planlos, diese Leute von der CDU. Und zuviel Zeit haben sie auch noch. Erwin beschließt seufzend, noch einen letzten Versuch zu starten und schreibt den Trollen nochmal sehr deutlich was er von ihnen und insbesondere der Heldenverehrung des Franz Josef Strauß in der bayrischen Geschmacksrichtung der CDU hält.

15:35 Uhr

Befriedigt wendet sich Erwin wieder seiner Entwicklungsumgebung zu. Der Build war inzwischen erfolgreich und dauerte nur 30sec – Erwin nutzt schließlich einen schnellen Rechner der neuesten Generation. Erwin ist begeistert, der Code für seinen ersten Test läuft auf Anhieb. Er schreibt einen weiteren Test, der schon eine etwas anspruchsvollere Lösung erfordert. Erwin bittet daher zwei andere Kollegen, die seit mehreren Minuten enthusiasmiert den gestrigen Champions-League Abend auf Sky Revue passieren lassen, ihr Gespräch im Besprechungszimmer fortzusetzen – er müsse sich konzentrieren. Abgesehen davon wäre er der Meinung, daß das von Jürgen Klopp favorisierte 4:2:3:1 System gerade gegen stärkere Mannschaften aus dem ehemaligen Ostblock zu gefährlich sei, weil aufgrund der fehlenden Überzahlsituation an der vorderen rechten Eckfahne Konter über die Außen nur sehr eingeschränkt abgefangen werden könnten. Der aktuelle Aushilfsstürmer sei auch ein reiner Strafraumspieler, der weder in der Arbeit nach hinten entsprechende Akzente setzen könne noch wisse, wo das Tor steht. Die Kollegen widersprechen selbstredend, verziehen sich aber nach längerer, erhitzter Diskussion unter Murren ins Besprechungszimmer.

16:20 Uhr

Nach 30min intensiven Nachdenkens immer noch keine Lösung für den Test gefunden. Erwin beschließt sein Gehirn durchzulüften, den Kollegen das Auffrischen der Kaffeevorräte abzunehmen und pilgert zum Kaffeeröster des Vertrauens. Glücklicherweise war der Kaffee im Angebot. Echte Arabicabohnen mit erhöhtem Koffeingehalt. Das Sprintziel erscheint erreichbar.

16:40 Uhr

Wieder zurück im Büro, wird Erwin vom Kollegen Q. abgefangen, der mit deprimierter Stimme von Abstürzen mit dem neuesten Build auf seiner Maschine berichtet. Erwin hört sich die Sorgen & Nöte geduldig & aufmerksam an, richtet Q. mit seiner bekannt optimistischen Art wieder auf und man verabredet sich auf den morgigen Vormittag, um gemeinsam das Problem zu analysieren.

16:55 Uhr

Wieder zurück an seinem Rechner ist die algorithmische Lösung schnell gefunden. Der zweite Test läuft. Saubere Sache. Es geht voran. Weiter im Text. Dritter Test.

17:15 Uhr

Aufgrund der kalten Witterung bietet sich Kollege Y. an, eine Runde Eis für die Mannschaft zu holen. Eine leckere Sache. Erwin erbittet zwei Kugeln Vanille aus biologischem Anbau sowie eine Kugel Schlumpfeis.

17:30 Uhr

Nach dem gemeinsamen, den Zusammenhalt des Teams stärkenden Verzehr des Speiseeises geht Erwin wieder an’s Werk. Er findet nach kurzem Suchen ein Stück Code, welches mit ein klein wenig Arbeit auch seinen vierten Test erledigen könnte. Aufgrund der fortgeschrittenen Stunde kopiert Erwin dieses Codefragment kurzerhand in seine Funktion, ein paar kleine Änderungen und siehe da, auch der dritte Test des Tages läuft erfolgreich durch. Erwin kommt in Schwung.

18:15 Uhr

Die kostenlose Time-Tracking Applikation seines Smartphones informiert Erwin darüber, daß er heute schon über 8h 15min Büro weilt. Er beschließt den Tag, indem er seine Arbeitszeit am JIRA Task logged: 2.5h (in diesem fiktiven Paralleluniversum wird Timetracking scheinbar zur Selbstkontrolle verwendet). Hmm, damit hat er die für diesen Task veranschlagte Zeit bereits um 1.5h überzogen. Und Erwin hat noch einige andere, komplexe Stories in diesem Sprint zu meistern, von den eingegangenen Code Reviews für bereits erledigte Tasks einmal ganz abgesehen. Das Sprintziel scheint gefährdet. Erwin notiert sich, dass er dies beim morgigen Daily Scrum zur Sprache bringen muss. Bei der nächsten Retrospektive muss er darauf drängen, dass die Zeiten für die einzelnen Stories & Tasks noch konservativer geschätzt und Stories vorab genauer analysiert und besprochen werden.

18:20 Uhr

Erwin Lindemann beschließt sein Tagewerk und strebt seinem heimischen Rechner zu, um endlich einmal produktiv eine neue Version von Debian aufzusetzen.

Wie erwähnt – die Geschichte spielt in einem Paralleluniversum. Vor langer Zeit. Völlig unrealistisch – Science-Fiction.

Jede Ähnlichkeit mit lebenden Personen oder Entwicklungsmethoden ist nicht beabsichtigt und definitiv ausgeschlossen.


08
Aug 13

A few brief thoughts on “Dysfunctional Programming”

Here are a few random thoughts on @SamirTalwar‘s post “Dysfunctional Programming” – learning functional programming in your favourite language (go read it now, I’ll wait for you).

This is an excellent technique to understand the underlying concepts of a new programming “paradigm”. Because the new “paradigm” (*) is not about the language per se, it’s about a new way of thinking about problems, code & potential solutions. A new paradigm presents a new set of constraints and opportunities to the developer. Most of the time, the constraints are pretty easy to emulate (as Samir describes eloquently), sometimes they just require discipline. Plus, you can take advantage of these new opportunities by emulating them in your language of choice (e.g. starting to emulate polymorphism with function pointers in plain C or, as Samir showed, implementing a map function for an immutable list class) (**).

A great session at SoCraTes 2013, I enjoyed it a lot, and will pass this on in an internal workshop at extragroup GmbH.

(*) Most likely, the paradigm isn’t new per se (witness the latest “hype” – functional programming) – it’s just new to you – or, if you’re old enough, you’ve accumulated so much crap in your head that you purged your knowledge about the paradigm over the years anyway.

(**) I have fond memories of moving from structured programming to oo programming way back when using a Burroughs B20 with Pascal (yes, this was considered a leading edge language at that time). Talk about an old dog.


31
May 13

Bruce Springsteen & The E Street Band – Munich 5/26/2013

Nilsbruce

A great show requiring quite some effort by both the band and the audience – Everybody involved made it work by sheer willpower. The weather didn’t bode well for the show:

It was f&$%cking cold. The band had heaters on stage to warm their hands. Everybody wore hats, scarves and gloves. I recall Nils Lofgren even upgrading his scarf to a somewhat warmer version early in the set.

It was f&$%cking wet. The rain was pouring down all afternoon and all evening.

It was f&$%cking windy. The gusty winds in the Olympic Stadium didn’t make the weather more comfortable.

But the pit audience endured the rain and stood in line & waited for the concert more than 7 hours+. #235 got me a place about 3rd row right in front of Nils Lofgren.

As @markusrill eloquently put it:

Springsteen’s show in Munich was a most amazing display of professionalism, showmanship and heart.

The set was targeted towards keeping the crowd moving, the full Born in the USA album (much appreciated) was played. Bruce mentioned a couple of times how much they appreciated us supporting the band despite the weather. After having seen the Hannover show 2 days later I think it’s a safe bet that he was out in the pouring rain on the front platform even more often than usual to show his support for the audience.

Front

My personal highlights were (*)

  • Long Walk Home (unfortunately without Steve’s solo part)
  • Seaside Bar Song (hadn’t heard it live so far)
  • Rosalita (of course)
  • My Hometown (with audience participating in the outro)

Horns

Was it worth waiting in the cold rain for 7h+ to see the concert from the pit? You bet. It was worth every minute. Uplifting. They’re that good.

(*) With quite a couple of concerts under my belt, I’m still waiting for “Racing in the Streets”.


23
Mar 13

Achievement unlocked: iOS Programming – The Big Nerd Ranch Guide 3rd Edition

Achievement unlocked: Despite being a busy father of three and having a day job I pour a lot of energy into, I finally managed to spend countless nights to work through @AaronHillegass’ and @joeconwaybnr’s excellent “iOS – The Big Nerd Ranch Guide 3rd Edition” (and the countless challenges presented therein). I attribute this to a) my generous intake of Monster Energy drinks late at night and b) the compelling way the material is presented.

The book is at it’s best when the authors take the reader through a series of chapters developing what at least remotely resembles a real-life application introducing new concepts along the way, like MapKit, UITableViews, UISplitViewControllers, UIGestureRecognizers or accessing Web services.

I especially appreciated the bottom-up approach of not using template applications to get up-to-speed quickly but starting from scratch instead which helps tremendously practicing basics over and over again.

The weaker parts of the book are those not dealing with “real-life applications” like the chapters on Core Graphics and Core Animation. Although those explain the technology in reasonable detail, they lack the motivation and “connection” of how to use those technology in a “useful” application.

A very minor complaint – The naming of variables is not very consistent across different chapters, I suggest either sticking with abbreviations or going with fully spelled variable names. (*)

But who am I to complain, I barely managed to cough up the hours every night to actually work through the book.

I learned a ton. Strongly recommended.

Off to creating my first iPhone app (you read it here first)…

(*) Run & hide, a nit-picker 😉


15
Mar 13

Developing a Vectorworks 2013 Plug-in, TDD-style – Updated Epilogue

The code

I have updated the project files for my series “Developing a Vectorworks 2011 Plug-in, TDD-style”.

Please download the Xcode 4.6 / Visual Studio 2010 project files (haven’t tested it explicitly, but should work with Visual Studio 2012, too) for use with Vectorworks 2013 including all the sources here – SimpleCabinet2013.zip. The folder SimpleCabinet2013 should be dropped into Vectorworks 2013 SDK’s Sources folder, like this:

Please note that the projects assume that the folder hierarchy is set up like this.

The project features two targets, a testing target named “CppUnitLite2” and the plug-in module shared library target, which outputs to /Applications/Vectorworks2013/Plug-ins. You will notice that all classes plus tests are contained in ExtObject.cpp. I’m doing this for small spikes – in real life, I would put each class in a separate file, no code in the header file etc.

The code drop features additional tests, refactorings and more usage of VWFC in SimpleCabinetCreator.

There’s also a Vectorworks document with a Simple Cabinet object included for your convenience.

Episodes


15
Feb 13

Uncle Bob Martin @ Objektforum Karlsruhe

On Feb 6, Robert C. Martin (“Uncle Bob”) gave a talk on “Automated Acceptance Testing: Expressing Requirements as Tests” @ ObjektForum Karlsruhe.

A few statements I found worthwhile for future reference:

  • Deployment is a business decision

  • Agile is not about getting more done, it’s about getting bad news early
  • Don’t let the tool dominate you
  • Not a lot of fixture code to write (to enable automated acceptance testing)
  • Test one thing only once

Here’s a thought which struck me while Uncle Bob waxed eloquently about Fitnesse and showed the DSL he created for testing Fitnesse:

A textual representation of a program’s or component’s output is the major prerequisite for automated acceptance testability. If you struggle with automated acceptance tests – as we do (CAD system with rich user interactions and complex objects being generated, dealing with complex object lifetime issues – “this can’t be tested automatically”) – focus on generating a simple textual representation of the results & interactions etc. This is the foundation of automated acceptance testability. It will be way easier to think about automated acceptance testing once you have this foundation in place.

Thanks to Robert for giving an energized talk despite being attacked by a flu virus and to andrena objects ag for organizing the ObjektForum event series.


09
Nov 12

Ersteres ist wahrscheinlich, letzteres aber nicht auszuschließen.

Manchmal liest Du Artikel von Software-Architekten, die auf 4 Seiten ausbreiten was man in 2 oder 3 Sätzen sagen könnte – entweder bin ich schlicht zu minderbemittelt, um der Relevanz & Sinnhaftigkeit der Diskussion zu folgen oder die Autoren haben völlig die Bodenhaftung verloren.

Ersteres ist wahrscheinlich, letzteres aber nicht auszuschließen.


06
Nov 12

Chaining Setters in C++ (Builder Pattern)

I have seen chaining of setters (in the context of builder pattern implementations) quite a few times in Java code recently, so I thought I jot down a quick C++ version for future reference (tried to get everything in one class for brevity purposes). No rocket science to be seen here, folks, but still a nice technique for creating objects (*):

class Pizza {

private:
	
	class PizzaProperties {
		
	private:
		
		PizzaProperties() : fSize(0), 
							fWithCheese(false), 
							fWithPepperoni(false),
							fWithBacon(false) {
		}
		
		int fSize;
		
		bool fWithCheese;
		bool fWithPepperoni;
		bool fWithBacon;
		
		friend class Pizza;
		friend class PizzaBuilder;
	};
	
	
public:
	
	class PizzaBuilder {
		
	public:
		
		PizzaBuilder(int size)  {
			fProperties.fSize = size;
		}
		
		PizzaBuilder& WithCheese() {
			fProperties.fWithCheese = true;
			return *this;
		}
		
		PizzaBuilder& WithPepperoni() {
			fProperties.fWithPepperoni = true;
			return *this;
		}
		
		PizzaBuilder& WithBacon() {
			fProperties.fWithBacon = true;
			return *this;
		}
		
		Pizza Build() {
			return Pizza(fProperties);
		}
		
	private:
		
		PizzaProperties fProperties;
	};
	
	
private:
	
	Pizza(const PizzaProperties& properties) : fProperties(properties) {
	}
	
	PizzaProperties fProperties;
};

So it’s quite convenient to build up different Pizza objects just by chaining the different “setters” – no need for default parameters, dealing with constructor bloat (# of parameters and # of constructors) etc. Plus, it’s quite efficient because the “setters” return a reference to a Pizza only, no memory allocation needed.


	Pizza largeMargheritaPizza = 
		Pizza::PizzaBuilder(30).WithCheese().Build();

	Pizza smallHotPizza = 
		Pizza::PizzaBuilder(20).WithCheese().WithPepperoni().Build();

(*) The code focusses on the chaining aspect of a builder pattern implementation – not the use of different builder objects for creation.