Friday, September 27, 2013

NuGet: Dont you mess with the Cache!

Caching ist prinzipiell cool. Allerdings kann ein Cache auch Probleme "kaschieren". Benötigt ein Projekt-Build ein Package schaut NuGet erst in seinen lokalen Package Cache und lädt es erst vom Server herunter wenn es dort nicht zu finden ist. Super Sache. Für Entwicklungs-Builds will man die Version nicht immer hochdrehen sondern verwendet stattdessen gemäß Semantic Versioning die sog. pre-release Syntax. Lokal ist das kein Problem, man weiss ja dass der lokale Package Cache nutzerspezifisch unter %LocalAppData%\NuGet\Cache zu finden ist. Also einfach Package-Datei aus dem Cache-Verzeichnis löschen und weiter geht's! Aber wo ist der Package Cache auf einem Build-Server?

Thursday, September 26, 2013

New Programming Jargon:"Reptile Code"



With New Programming Jargon Jeff Atwood added all the modern programming metaphors to the  Jargon File. With Reptile Code i would like to propose one myself.

In "The Science of Discworld (1)" [1], chapter Mammals on the Make, biologist Jack Cohen elaborates on of one of science's remarkable misjudgments. At this time, the concept of DNA was often referred to as Blueprint of life. And it still is today:



It seemed to be a natural conclusion to approximate a species' level of evolution or its complexity by the length of its DNA strand, i.e. the longer the DNA code the more sophisticated the species.

This intuitively made sense. By analogy, the engineering blueprint of Jumbo Jet is a lot longer than that of a simple paraglider.


The embarassing result: Empirically, the DNA of a frog is much longer than the human DNA. Confusion took hold. Could it be that God considered simple reptiles higher than his flagship creation, man?

Later, it was found that human DNA is so much shorter because it is organized better [2].
Put simply, frog DNA contains a variety of contingency plans for environmental changes that accumulated in the course of evolution as lots of code patchwork. For instance,
if temperature between -14° und -7° do this,
else if between -7° and 0° do that,
else if ... etc.
Warmbloods like man escape this complexity through the elegant statement
set internal temperature to 36°.
Especially for developers, i find this view very accessible, because they very well know about metrics like Lines of Code (LoC) oder Cyclomatic Complexity (McCabe) from their own experience [3].

Hitting such code, you could probably say in Mr.Spock voice:
Fascinating! This component is likely to be hard to maintain: The average cyclomatic complexity of their methods differ with 57.63 significantly from that of the World Code Health Organization (WCHO) which recommended a maximum 20.
Compared to Mr. Spock just stating
Woah! Reptile Code!
really hits home and feels more natural.

Footnotes:
  1. As a teenager i loved reading Terry Prattchet Discworld-novels, especially the series Science of Discworld which were written together with co-authors Ian Stewart und Jack Cohen and which uniquely prescribes the wonderful cosmology of Roundworld and is amongst the best introductory works on evolution after Richard Dawkins.

  2. Later, it turned out that DNA-Code at times can "reorganize" and shift to a whole new organizational level of abstraction. It seems, evolution knows the concept of "refactoring" but she is a lot more cautious on eliminating "dead code" (perhaps of the deep coupling of SCM and the code itself).

  3. In general, long codes with a high McCabe-Complexity are a lot harder to maintaint, cf.:

Links:

Hanselman about Portable Class Libraries

Scott Hanselman über Portable Class Libraries.

Der "Von Neumannsche" Jenkins

Ein Teilaspekt des neuen Build Server ist dass er sich im Von Neumannschen Sinne selbst reproduzieren kann. Nun ja, nicht ganz alleine - Man muss noch den Knopf "Jetzt bauen" auf dem entsprechenden Job: Neuer Jenkins oder einen Post-Commit-Hook auf dem scripts-Repository aufsetzen.

Wordsmithing...

In On Writing Interfaces Well gibt Jonas Downey Tips zum Schreiben guter Fragen und Antwort-Optionen in Oberflächen. In seinem Team gibt es eigene Commits nur für das Feilen and den Formulierungen mit dem Tag Wordsmithing.

Monday, September 23, 2013

Testing Threading

Asynchronen Code zu testen ist schwierig. Umso leichter haben es Bugs sich dort einzurichten wo man schlecht mit dem Besen hinkommt. Ein kurzer Bericht aus dem Projektalltag.

Wednesday, September 18, 2013

Neuerungen in Grails 2.3

Im Rahmen eines Projektes hatten wir für einen REST-Adapter die Verwendung des auf Groovy basierenden Web-MVC-Framework Grails erwogen, dies aber dann verworfen. Der vorgeschobene Grund war Zeit und Budget im Griff zu behalten. Der ehrliche Grund ist wohl eher das Eingeständnis von Grails keine Ahnung zu haben und daher nicht vergleichend einschätzen zu können wie aufwendig eine Grails-Implementierung gegenüber Groovy ist.

Über die Kunst des Weissagens

Im dritten Teil seiner Online-Kolumne Source Reflection #3: Über spekulierende Softwareentwickler reflektiert Jörg Friedrich über den spekulativen Charakter von Entwurfs- und Programmier-Entscheidungen in der Softwareentwicklung. Er stellt fest, dass
[Prognosen] umso unsicherer [werden], desto mehr es auf die Handlungen von Menschen ankommt. "Woher soll ich wissen, welche Anforderungen ich an die Software haben werde, bevor ich ausprobiert habe, was ich mit ihr machen kann?" – so könnte man eine alte Psychologenweisheit auf den Softwareentwicklungsprozess anwenden.

Fazit: Wir brauchen weniger Anforderungs- und dafür mehr Unsicherheits-Management. Könnte er da Recht haben?

Wednesday, September 11, 2013

Sind Taskforces die besseren Scrum-Teams?

Crosspost Sind Taskforces die besseren Scrum-Teams?. Für mich der interessanteste Unterschied:
Taskforces müssen sich aufgrund ihrer Kurzlebigkeit nicht um ihre Konflikte kümmern.

*duino: Entwickeln auf der Platine

*duino: Für das direkte Entwickeln auf der Platine gibt es neben Arduino (Java) und Netduino (.NET) jetzt auch Espruino (JavaScript). Stark!

7 Habits of Highly Effective Jenkins Users

7 Habits of Highly Effective Jenkins Users - Ein Vortrag von Andrew Bayer (Jenkins Guy).
Da sind direkt ein paar gute Vorschläge dabei, z.B. "Never build on master".

Monday, September 9, 2013

Code Metrics in VS2012

Gerade gestern hat mich ein Artikel unseres alten Scrum-Trainers Markus Gärtner erneut auf die Cyclomatic Complexity-Metrik aufmerksam gemacht. Diese ist besonders praktisch weil sie zu einer Methode direkt sagt wie viele Unit Tests man dafür haben sollte.

Auch in aktuellen Sprints haben wir viele Fehler erst wieder sehr spät beim manuellen Testen bemerkt, sodass wir Schwierigkeiten hatten die angedachten Szenarios bis zum Termin überhaupt einmal durchzuspielen. Die meisten der dazugehörigen Bugs waren schwer zu finden da sie sich gut in teils sehr langen Methoden mit vielen if-else-Verschachtelungen versteckten (d.h. hohe Cyclomatic Complexity). Die entsprechenden Code-Pfade waren vom Entwickler wohl kaum - wenn überhaupt - durchlaufen worden.

Grund genug für mich den Dachboden meiner grauen Zellen zu durchforsten.

Wednesday, September 4, 2013

Business Process Model Notation (BPMN) ist ISO-Standard

Nach einer Meldung von heise Developer ist die BPM-Notation jetzt als ISO-Standard akezeptiert. Grund genug sich einmal damit auseinanderzusetzen, oder?



Beispiel eines Geschäftsprozessdiagramms, erstellt mit der BPMN. Eigentlich ganz einfach, oder?

Tuesday, September 3, 2013

Multicore JIT in .NET 4.5

Mehr zufällig als beabsichtigt bin ich beim Update meiner Paint.NET-Version auf das Multicore JIT-Feature in .NET 4.5 aufmerksam geworden. Rick Brewster, seines Zeichens Autor von Paint.Net, hat auf seinem Blog erklärt warum Paint.Net so schnell startet. Schließlich sind managed-Applikationen auch unter .NET dafür bekannt sich beim Startup gegenüber nativen Anwendungen etwas Zeit zu lassen.