hacks

Project visualization with redesigned Gantt charts

When reading the Edward Tufte forum on Project Management Graphics I was surprised (and relieved) that a lot of people seem to have their problems with Gantt charts and their doubtful usefulness for project management.

After some thoughts on the topic I’d like to present my proposal for visualization of project flows. In case it matters: I’m currently part of a half a billion Euro construction project in Austria.

The real world example

The image below shows one Gantt chart of the project I’m currently involved in.

dfgh

Actual Gantt chart of “my” current project.

Aside from its professional look it transports surprisingly little content. My main points of criticism are:

  • On the one hand, with more than a hundred tasks on the left I get overwhelmed by things I’m not responsible for anyway.
  • On the other, my 15 tasks lack important detail.
  • Since it’s not possible to combine overview with sub-project specific detail I have to manage my tasks in parallel.
  • I easily lose track between tasks and the bars on the far right. Gridlines would be a bad idea as well since they add too much clutter.
  • Data is sparse and the chart needs too much space for the presentation thereof.
  • In my context of software development the chart’s implicit focus on sequential, waterfall-like project flows does not fit my reality of ever-changing project plans.
  • I definitely need to print it out to be able to use it.

What would I need?

First of all: Everybody can read a Gantt chart so let’s stick to some reasonable habits: bars that encode project duration by length and diamond symbols that mean milestones, i.e. important dates.

When I think of project management, the whole story is about one core task: Align your output and handover dates with those of others.

As a member of any project team I simply cannot be interested in the task of each individual. However the Gantt chart’s focus lies on the presentation of single tasks. I state that any visualization for project management should focus on people or teams, i.e. responsibilities, rather than tasks.

My second point revolves around overview and detail: My own tasks should be presented in greater detail than data of other teams. My only concern with them is deliverables when we approach mutual handover dates.

The Redesign

Here’s some example data taken from one of my schedules:

Responsible Task Start End
Construction Define location Sun Jan 01 2012 Sun Apr 15 2012
Construction Finish site Thu Aug 01 2013 Milestone
IT Develop prototype Sun Jan 15 2012 Sat Jun 02 2012
IT Testing Sun Jun 03 2012 Sun Jul 01 2012
Business Process Give feedback Sun Jun 03 2012 Sun Jul 01 2012
Supplier Deliver parts (prototype) Thu Mar 01 2012 Sun Aug 05 2012
IT Update integration Sun Jul 01 2012 Tue Aug 14 2012
IT Evaluate prototype (hands-on) Wed Aug 15 2012 Mon Oct 01 2012
IT Evaluate prototype (remote monitoring) Tue Oct 02 2012 Wed May 01 2013
IT Production Mon Aug 19 2013 Wed Jan 01 2014
Business Process Launch prototype environment Wed Aug 15 2012 Milestone
Business Process Go live Mon Aug 19 2013 Milestone
Procurement Procure Mon Apr 01 2013 Wed May 01 2013
Supplier Deliver parts (production) Wed May 01 2013 Mon Aug 12 2013

Classic Gantt chart

And here goes the corresponding Gantt chart:

srg

Gantt chart encoding the tabular data above. (Written in JavaScript).

My version, aka: Gantt90

My enhanced version is shown below. Instead of single tasks I only show the responsible team. Additionally I rotate by 90 degrees – thus Gantt90 – to shift the attention from process flow to responsibility, from a mechanical point of view to a more social one if you want to put it like this.

While the information conveyed is almost equal, the charts size is halved. Hence even the thumbnail becomes readable.

dsf

Proposed redesign of a Gantt chart: teams instead of tasks and rotation by 90 degrees.

Adding detail

Since I’m a member of IT, the two blue bars on the right should now convey more information than the others. I do that by highlighting my team and showing the specific tasks along the time axis. Enough detail for the team, and I manage to simultaneously keep track of other teams’ schedules.

sd

Overview and detail combined. The chart could even be made recursive with sub-teams of IT on the right. (…)

Thinking of my big example from the beginning it will be necessary to further divide the detail view on the right. Since projects – tasks as well as teams responsible – fit into hierarchical, tree-like data structures my chart would recursively expand to the right. (IT would then be divided into developers, testers, administrators, etc. and the new chart would resemble its left neighbour – both aligned with the common time axis.)

What about connecting lines?

You may have noticed that I skipped the connecting lines between the taks. I’m convinced that a proper visualization should signalize the project’s inherent structure on its own. Even if the lines are not there, you can see the dependencies between tasks and/or milestones anyway. Your brain does quite a good job at pattern recognition.

tldr: Like spreadsheets, Gantt charts are used to visualize business fiction rather than to manage projects. I’ve proposed a modified Gantt chart to better visualize projects by drawing attention to responsibility rather to single tasks.

Thanks to Elena Reitman’s tweet I stumbled upon the Tufte forum.

I highly recommend the book Envisioning information by Edward Tufte. The charts and the source code used can be found here.

politisches

Du sollst hingehen!

Der asketisch, in der Wüste lebende Johannes predigt von Umstürzen und der Ankunft eines neuen Anführers für das Judentum. Eine wachsende Anhängerschaft scharrt sich um den Prediger, darunter auch ein charismatischer Endzwanziger aus dem von Rom besetzten Judäa; sein Vater wahrscheinlich einer der zahlreichen römischen Soldaten. Der junge Mann hat nach heutigem Empfinden Leadership-Skills, bügelt sein Negativ-Image als uneheliches Kind durch eine gute Story im sonst recht lückenhaften Lebenslauf aus. Er lässt sich von Johannes taufen und wird zum Messias befördert. Die Sekte wird sowohl dem jüdischen Establishment als auch den Römern zu mächtig, schlussendlich wird der Sohn Gottes ans Kreuz genagelt.

Berichte von Zeitzeugen und spätere Schriftsteller schreiben von den Vorfällen, doch lediglich drei Evangelien sowie ein nicht recht passendes viertes sollen später die Hauptgrundlage der Religion darstellen. Apostel Paulus, der Jesus zwar nie zu Gesicht bekommen hat, aber dennoch in Vorderasien fest missioniert, rückt die jüdische Splittergruppe in neues Licht und begründet somit das Christentum. Dank ihm sind wir heute nicht beschnitten, sündigen solange wir danach auch beichten gehen und dürfen Schweinsbraten essen.

Warum Johannes der Täufer oder aber Apostel Paulus nicht als Begründer unserer Religion gelten, warum wir nicht Juden sind, wie Jesus Christus einer war, oder warum wir dessen Kreuzigung an einem Freitag feiern habe ich jedenfalls nie verstanden.

Rund 2000 Jahre später kassieren Kirchen in Österreich unglaubliche 3.8 Milliarden Euro jährlich an Subventionen. Damit tun kirchliche Organisationen viel Gutes. Aber wir alle leisten uns damit auch Indoktrination Religionsunterricht in Schulen, Verwaltungsapparat, eine kirchliche Kommission, die ihre eigenen Missbrauchsvorfälle aufklären soll, und viel Marketing, damit meine Kurzgeschichte oben spiritueller klingt.

Karitative Einrichtungen können und müssen daher anders finanziert werden. (Das wäre ja sonst so, als leisteten wir uns ein Bundesheer nur um ein paar Zivildiener für Altenpflege abstellen zu können…)

Wichtig: Beim Volksbegehren gegen Kirchenprivilegien geht es nicht gegen den Glauben oder gar gegen die römisch-katholische Kirche. Es geht darum, dass die Bevorzugung einzelner Religionsgemeinschaften gegenüber anderen Weltanschauungen in einem modernen Staat keine Berechtigung hat. Es geht um konsequente Entflechtung von Kirche und Staat.

Daher: Bis zum 22. April das Volksbegehren unterschreiben.

Buchtipp

James D. Tabor, Die Jesus-Dynastie. Wissenschaftlich fundiert zeichnet Tabor das aus heutiger Sicht wahrscheinlichste Bild des Leben Jesu'. (Amazon.de)

James D. Tabor, Die Jesus-Dynastie. Wissenschaftlich fundiert zeichnet Tabor das aus heutiger Sicht wahrscheinlichste Bild des Leben Jesu’. (Amazon.de)

Ausflugstipp

Luftg'selchter Pfarrer in St. Thomas am Blasenstein. (Wikipedia)

Luftg’selchter Pfarrer in St. Thomas am Blasenstein. (Wikipedia)

hacks

Campus-Tetris revisited

Ich habe bereits über die Raumbuchung am Campus WU und eine damit verbundene Visualisierung der Belegung gebloggt. Hier in aller Kürze eine Visualisierung der Nachfrage nach Räumen.

Das Raumbuchungstool des Campus WU ist darauf ausgelegt, dass Mitarbeiter_innen wie Studierende – also etwa 30.000 Personen – selbständig und unbürokratisch Räume buchen können. Das dadurch drohende Chaos eines heillos belegten Gebäudes verhindern wir durch mehrere Parameter, wie etwa schrittweises Freigeben von Ressourcen, Speichern von Bedarfen in Raumgruppen anstatt in spezifischen Räumen, automatisierte Allokation, oder individuelle Berechtigungen. (Viele der hier genannten Dinge haben wir uns übrigens bei der Konkurrenz simulieren lassen.)

Anyway – wir sind nun seit genau einer Woche online und haben rund 8.000 Termine und somit bereits die Hälfte des kommenden Wintersemesters eingesammelt. Die Frage liegt also nahe, welche Räume (Raumgruppen) stark nachgefragt werden, und – am allerwichtigsten – wo etwaige Konflikte auftreten. Nach ein paar Stunden Python und Javascript kam dann mein Erfolgserlebnis, das ich auch gleich auf Twitter verewigen musste.

Programmieren mit d3.js (Data Driven Documents) macht also Spaß.

  d3.select("#applications")
    .append("g") 
      .attr("id", "application-frame")
    .selectAll("rect.application_frame")
    .data(data.slots)
    .enter()
    .append("rect")
      .attr("class", "application_frame")
      .attr("x", function(d) { return linear_scale(time_to_float(d.start) ) })
      .attr("y", function(d) { return POOL_POS[d.pool_id].y } )
      .attr("height", function(d) { return POOL_POS[d.pool_id].height } )
      .style("fill", function(d) { return occupancy_to_color(d.occupancy) })
      .transition()
        .attr("width",fifteen)
        .duration(500) // this is 1s
        .delay(function() { i = i +1; return i * 2; })         
  ; 

Ergebnis der Bastelarbeiten ist ein interaktives Diagramm, das mit dem Kalender-Widget oben gesteuert wird. Entlang der Tageszeit wird pro Raum-Pool (die Kapazität ist anhand der Fläche codiert) die Belegung inkl. der angefragten Termine visualisiert. Je stärker die Nachfrage, desto dunkler der Blauton. Liegt die Nachfrage über dem Angebot, wird das Blau zu einem gefährlichen Rot – hier gibt’s also dann etwas zu bereinigen.

sdsd

Visualisierung der angefragten und verfügbaren Kapazitäten pro Datum.

Das Ergebnis mit der traumhaft-schönen Animation auf YouTube. Das Diagramm ist erstaunlich responsive – immerhin werden mit jedem Klick eine Tabelle mit einer halben Million Einträge sechsmal durchsucht, der Tag in 60 Viertelstunden zerteilt und anschließend die Auslastung live berechnet.

Links

travel

Montenegro (Schwarzenberg)

OS7061 nach Podgorica – die Dash 8 ist zwar voll, Touristen sind jedoch keine an Board. Montenegro Anfang April ist wohl auch keine typische Urlaubsdestination.

Am Flughafen nehmen wir einen serbischen Leihwagen entgegen, die Fahrt in die Innenstadt Podgoricas ist abenteurlicher, als so manche Durchquerung Afrikas. Schon jetzt wird klar, warum zwar Handlung, aber nicht der Drehort des James Bond Streifens Casino Royale hierher verlegt wurde:

Wo sind die schönen, dichten Wälder und sattgrünen Wiesen geblieben, die beim Landeanflug lockten? Wo ist das Hotel Splendide, das einen sehr ordentlichen Eindruck machte, wo das Casino, in dem Bond den Krieg gegen den Terror am Pokertisch führt?
FAZ, Reisebüro Bond

hg

Montenegrinisches Stilleben. Die Kirche ist eines der wenigen Bauwerke, die nicht vom österreichischen Steuerzahler via Hypo Alpe Adria finanziert wurden.

sf

Verpackung naja, der Preis stimmt.

hd

Mathias, aka Matiesko, bei Brunswick. Was soll man sonst tun, wenn man im Hotel ein “There is nothing to see here” gesagt bekommt?

gf

Auch die deutsche Modeindustrie stellt sich auf die Vorliebe der Einheimischen zu Trainingsanzügen ein.

dd

Sehenswert: Weltkulturerbe Kotor.

gf

Kotor II.

Wer Lust auf Osteuropa off the beaten track bekommen hat, dem sei das vereiste Sofia im Jänner empfohlen.

travel

Das Meta-Foto

Beim Sortieren meiner Fotos ist mir aufgefallen, dass – egal wo man hinfährt – man doch immer derselbe bleibt.

is

Istanbul (Türkei) 2012.

rttrt

Baños (Ecuador) 2011.

erwt

Antigua Guatemala (Guatemala) 2012.

sa

Soweto, Johannesburg (Südafrika) 2011.

gg

Hakone (Japan) 2012.

rez

Budva (Montenegro) 2013.

python

Table syncing with Python

Recently, I had to move around a lot of data in an annoyingly error-prone process: I would receive awfully colorful spreadsheets in ever changing formats. Frightened by seemingly infinite creativity of Excel users I decided to move the data to a staging environment first. After some quality checking – aka: Excel exorcism – I subsequently would merge the source data with my production database, the target.

In the lingo of database people, I needed to implement INSERT, UPDATE and DELETE. Regarding my Python programme, this meant covering three cases:

  • new records in the source (INSERT),
  • changes between source and target (UPDATE) as well as
  • lost records, which only appear in target (DELETE).

In the context of a production system the latter case is the nasty one: You cannot simply delete records when you already have child records (i.e. foreign key relationships) in your system. So this meant shovelling data around manually. Thus my programme only handles the first two cases automatically and simply warns about the third case.

hxht

Moving around data and breaking some rules for the sake of backwards compatibility.

Object-relational mapping and a set()

The central piece of my Python code is an object-relational mapping between every database record and my custom class:

class Room(object):
    
    def __init__(self, pk, name, size):

        self.pk = pk
        self.name = name
        self.size = size

The “Syncer” does the work of fetching from target and source databases, comparing and taking proper action. I store all the records in a Python set() – a very powerful data structure for the task.
class RoomSyncer(object):
    
    def __init__(self):
        
        self.target_rooms = set()
    
    def get_target(self):
        """Fetch rooms from production db"""
        
        ...
        
        for room in target:
            ...
            self.target_rooms.add(
                Room(pk, name, size )
                )    

If you run into the problem that your target and source do not resemble each other (i.e. that their attributes are different) you cannot instantiate with the __init__() method in both cases. Use a factory method instead:
class Room(object):

    ...

    @classmethod
    def from_source(cls, pk, other_name, size):
        
        # do some magic to make objects simiar
        name = other_name
        
        return cls(pk, name, size)

class RoomSyncer(object):
    
    def __init__(self):
        
        ...
        
        self.source_rooms = set()
    
    def get_source(self):
        """Fetch rooms from staging db"""
        
        ...
        
        for room in source:
            ...
            self.source_rooms.add(
                Room.from_source(pk, other_name, size )
                )          

set() operations

So far we have two sets filled with our objects: target and source. If you subtract the target from the source you’ll get the newly arrived objects:

# rooms only in source
rooms_to_add = self.source_rooms - self.target_rooms

Oh no! The code won’t work since Python does not know whether your objects are equal or not. Hence the set operations won’t work out of the box. So you have to override the __hash__ and __eq__ methods – Python will then compare as you  would expect (more info on stackoverflow):
class Room(object):
    
    ...

    def __eq__(self, other):
        
        return self.pk == other.pk
    
    def __hash__(self):
        
        return hash(self.pk)

With this simple update you can now easily determine objects that only appear on one side. The last thing we need to do is to cover the UPDATE case. By overriding the methods above we implicitly confine the powers of Python’s set data structure. For a more sophisticated search for updates we’ll have to look at every attribute. Luckily for us, a Python object is just a simple dictionary under the hood. As a consequence we simply have to test the candidate dictionaries for equality:
class Room(object):
    
    ...

    def cmp(self, other):
        # is entire object equal?
        
        return self.__dict__ == other.__dict__

class RoomSyncer(object):
    ....

    def cmp_rooms(self, rooms):
        """objects appear on both sides"""

        rooms = self.target_rooms.intersection(self.source_rooms)

        for r in rooms:

            # simply get one object by key
            t = self._get_target(r.pk)
            s = self._get_source(r.pk)

            if t.cmp(s):
                # objects are identical
                ...
            
            else:
                # update
                ...

    def _get_target(self, pk):
        for r in self.target_rooms:
            if r.pk == pk:
                return r
    
    def _get_source(self, pk):  
        for r in self.source_rooms:
            if r.pk == pk:
                return r

travel

Projekt “Trans-Kalahari” oder: Afrika für Fortgeschrittene

Eine Tour de Force von Jo’burg nach Windhoek

Eine Hochzeit in Kapstadt war Anlass meiner inzwischen sechsten Reise ins Subsahara-Afrika. Doch wer schon fünfmal zuvor gut organisierte Safariparks und Game Lodges gesehen hat, der will eine Tour für Spezialisten: Und so kam es, dass Isabella und ich eine sehr spezielle Tour mit einigen Überraschungen machten…

Aber was wäre anders zu erwarten gewesen, gründete die ganze Idee der Routenplanung auf dem Botswana-Special der britischen Serie Top Gear. Hier zunächst unser Routenüberblick:


Größere Kartenansicht

Tage 12
Gefahrene Kilometer ca. 2.500
  davon ca. 1.000 Offroad, v.a. Sand und Schlamm
Fahrzeug Toyota Landcruiser mit 2 Tanks, Wassertank, 2 Reservereifen,
Wagenheber, Spaten, ... komplette Campingausrüstung inkl. Grill, 
2 Gasflaschen, Kühlschrank und Dachzelt
Spritverbrauch ca. 350l Diesel
1 Satellitentelefon (Iridium) für Notfälle
1 GPS (am Smartphone)

Jo’burg nach Botswana

In Johannesburg schlafen wir beinahe schon traditionell im außergewöhnlich schönen Ashdown House. Das Frühstück ist erlebenswert, beim Verlassen des Anwesens habe ich den ersten Autounfall, da der vollkommen überdimensionierte Toyota Landcruiser rückwärts ausschließlich im Blindflug operiert. Die Schäden am Schiebetor sind schnell repariert, und wir können uns aufs Einkaufen und Volltanken konzentrieren.

Die erste Nacht der Tour verbringen wir im Waterberg Wilderness Reserve nahe der Grenze zu Botswana. Über die Grenze (Martin’s Drift) schmuggeln wir etliche Kilogramm Fleisch und Milchprodukte, da diese in Südafrika billiger, vor allem aber wohl auch frischer zu haben sind. Die unglaublichen Distanzen werden uns hier erstmals bewusst, als wir’s bis zum Sonnenuntergang nur noch bis Palapye schaffen, einer jener  Orte, die man wirklich nicht gesehen haben muss.

Die Salzwüste durchquert

Unser Ausgangspunkt der nächsten Etappe ist der Ort Letlhakane. Bei der örtlichen Shell starrt die Tankwartin angespannt auf die Anzeige der Zapfsäule. Dann: Stromausfall – und sie schreibt mit absoluter Selbstverständlichkeit die letzte Zahl, die sie gesehen hat, auf einen weißen Zettel. Nach einer halben Stunde bezahlen wir die Summe aus fünf derartigen Teil-Betankungen, natürlich Cash denn die Kreditkartenkassa sei selten online, sagt sie.

Wir suchen übrigens vergeblich die Stelle, an der man die Nationalparkgebühren oder sonstwas entrichten muss. Und so fahren wir ganz ohne der üblichen Bürokratie weiter, und vor uns erstreckt sich ein weißes Meer aus Salz. Einen steinigen Weg geht es noch hinab und dann war’s das auch mit Weg und Navigation: Von hier aus heißt’s gerade aus mit Karte und GPS – in weiter Ferne tanzen drei Windhosen am Horizont.

ghtr

Entering Makgadikgadi: Nein, das ist kein Meer am Horizont!

Die Makgadikgadi (sprich: Machadichadi) ist eine Ansammlung mehrerer Salzpfannen der halben Größe Österreichs. Zwischen Savannen-artigen Inseln erstrecken sich endlose Weiten von Salz verkrusteten Schlamms. Die Oberfläche ist dank Hitze hart, bricht man allerdings ein, versinkt man im Schlamm darunter. Insbesonders während der Regenzeit – und ja, es war Regenzeit! – wird die Durchquerung so zum Glücksspiel: Hält die Oberfläche oder bleibt man in dieser Crème brûlée aus Salz und Dreck stecken?

dfsw

Wir sammeln gutes Karma: Der rote Pickup im Hintergrund ist aus dem Sand befreit!

Auf einer der Inseln suchen zwei Beamte des Landwirtschaftsministeriums unsere Hilfe. Nach zwei langen Tagen im Sand waren sie doch recht froh, als wir ihren Wagen nach etwa einer Stunde herausgezogen hatten. Botswana ist das Land der Veterinary Fences, Zäune die Migration großer Herden kontrollieren und so vor Maul- und Klauenseuche schützen. Stecken die Zaunwächter also gerade nicht im Sand fest, untersuchen sie gerne Autokühlschränke auf landwirtschaftliche Produkte. Dabei gilt, fährt man nach Süden, sind sie um Längen strenger, als wenn man sich in entgegengesetzter Richtung bewegt. Man muss dann oft auch über Seuchenteppiche marschieren oder abenteuerliche Wasserdurchfahrten durch Desinfektionsbecken machen.

mi

Spaghetti-Kochen am Salzsee.

Kubu Island

Kubu Island

Spät nachmittags erreichen wir Kubu Island, das uns angesichts der glühenden Hitze und den Moskitos gar nicht willkommen heißen will. Nach ein paar obligaten Fotos geht’s also weiter, und zum Sonnenuntergang kommen wir mitten im Nirgendwo zum Stehen. Eine kurze Nacht später geht’s am Morgen weiter: Nach Durchquerung der letzten Pfanne verliere ich im Busch die Orientierung, und wir verlieren uns in einem endlosen Grasland ohne Spuren anderer Fahrzeuge vor uns. Wir irren also so gut wie möglich zurück zum letzten confirmed point und treffen auf eine kleine Ansiedlung von Viehhirten. Vor lauter Glück, wieder einen Weg zu haben, schenken wir den Kindern Essen und Kleidung. Es kostet uns noch ein paar anstrengende Stunden bis Gweta, aber als wir nach zwei Tagen wieder Asphalt unter den Füßen haben, fühlt sich das enorm sicher und gut an…

tz

Been there, done that!

Okavango Delta

Maun, das klang in meinen Ohren immer abenteuerlich wie Timbuktu, Chichicastenango oder Samarkand. In Wirklichkeit ist Maun ein hässlicher Haufen aus Baumärkten und Tankstellen: Sogar der typische Gewerbepark des nördlichen Niederösterreich sticht da durch architektonische Lieblichkeit hervor. Die Lodges rund um Maun kann man sich als Normalsterblicher nicht leisten: 600 USD pro Kopf und Nacht aufwärts waren uns dann doch zu teuer. Selbst die Anreise mit dem Sportflufgzeug (fly-in safari) macht solche Preise nicht wett.

z

Zebrastreifen

Anyway, Maun muss man als große Tankstelle (und Dusche!) akzeptieren, Permit für die Moremi holen und weiter geht’s. Anders als in Parks wie etwa Krüger oder Etosha gibt es in der Moremi keine touristischen Trampelpfade und eingezäunte Camps. Unser Schlafplatz heißt unaussprechlich Xakanaxa. Am späten Nachmittag versenke ich den Geländewagen schlussendlich in einem Schlammloch, was den ehelichen Frieden, nun ja, … stört.

Isabella, nicht immer von meinen Plänen begeistert.

Isabella, nicht immer von meinen Plänen begeistert.

Nach vergeblichen Versuchen, mit eigener Kraft da raus zu kommen, hat sich der Landcruiser tief im Schlamm vergraben. Die Vorderräder stehen beinahe ohne Traktion in der Luft, die Hinterräder verschwinden komplett im Dreck. Es ist schwül, und auf uns rollt eine majestätische Gewitterwand zu. Zwei Ranger des Nationalparks kommen mir mit einem Traktor zu Hilfe, der aber den überschweren Toyota auch nicht heraus zu hieven vermag. Mit dem Wagenheber wird also das Auto angehoben und mit Spaten, Händen und Füßen wird mühsam der Schlamm abgegraben. Steine helfen dabei, eine Straße unter der Wasseroberfläche zu “bauen”. Als das weiße Monster wieder im Trockenen steht, bin ich von Mücken zerstochen, dreckig und schweißgebadet.

rr

Da wird man wohl graben müssen.

hhh

Es war nicht meine Schuld… Ein Zoom auf meinen Gesichtsausdruck ist sehenswert.

fff

The difference between an man and a boy is the cost of his toy.

Zwei Sekunden Spaß, drei Stunden Auto ausgraben. Nur ein ungeplantes Kind hat eine noch schlimmere Fun/Consequences-Ratio.

Da es zwischenzeitlich Nacht ist, essen wir nur schnell ein paar Spare Ribs vom Grill und verzichten, komplett überanstrengt, auf den Abwasch.

Die Ribs locken Besucher an, und so starren wir, aus dem Schlaf gerissen, in die Augenpaare zweier Hyänen direkt vor unserem Wagen. Die beiden Besucher verwüsten unsere Campingküche und verziehen sich samt Geschirr, das ich am nächsten Morgen – über ein fußballfeldgroßes Gebiet im Busch verstreut – wieder einsammle.

hy

Vom Essen angelockt: Fleckenhyäne verwüstet unser Camp.

bbb

… was am nächsten Morgen auch die Ameisen freut.

Der stylishe Luxus-Kontrast

Nach der Moremi hat’s Isabella und mir gereicht: Zu viel von Sperrdifferential und Campinggeschirr, eindeutig zu wenig von Spa und sparkling wine. Kurzum, wir fahren in einem Satz von der Moremi nach Windhoek – auch wenn es uns kein Tankwart oder Grenzbeamter glauben wollte.

ff

Via Iridium wird ein Tisch in der Heinitzburg reserviert…

ff

… wo 1.000km Trans-Kalahari später Austern serviert werden.

Windhoek – das ist die verschlafenste Hauptstadt dieser Welt. Mit dem (nur wirklich hier sympathischen!) Zauber einer deutschen Kleinstadt und dem Klima und Charme einer Wüstenfestung war Windhoek schon ein paar Mal Ausgangspunkt und Ziel spannender Reisen. In der Heinitzburg, einer namibischen Institution speisen wir hervorragend, im Hilton übernachten wir in der Dachgarten-Suite. Doch jetzt kam ja noch der Höhepunkt – die Hochzeit am schönsten Ende der Welt…

Eine Hochzeitsgesellschaft von rund 60 Personen, alle in Kapstadt zusammengefunden, um das Ja-Wort zweier wundervoller Freunde zu erleben. Segelcruise mit Sundwoner Drinks, Hochzeit am Strand, Villa mit Pool, Band, Sängerin, wahnsinnig-tolles Essen (wieder Austern!) und viele neue Freunde. Da unten mangelt es uns an nichts, und Isabella beginnt ihren “Ausstieg” zu planen. Wenn wir also mal ein paar Wochen nicht erreichbar sind, es ist sehr wahrscheinlich, dass wir dann in Kapstadt wohnen…

ll

Cruise vor Kapstadt: breezy sophisticated mit Sonnenbbrand. (C) Mona

hh

Überglückliche Gäste: beach formal. (C) Mona

g

Thomas und Dag – wir wünschen euch nur das Beste! (C) Mona

IT project management

Kommerzielle Software, Open Source oder Eigenentwicklung?

Mit meiner Studierendengruppe an der FH-Wien habe ich Vor- und Nachteile unterschiedlicher Lösungswege bei der Softwareauswahl diskutiert. Wohl wissend, dass es Mischmodelle gibt, haben wir zunächst drei Extremfälle herausgearbeitet:

  • Kommerzielle und gleichzeitig proprietäre Software – also im Idealfall ein Standardprodukt, welches das betriebliche Problem abdeckt. Es wird lizenziert, dazu gibt es Wartungsverträge, der Anbieter kümmert sich um Installation, Roll-Out und Betrieb.
  • Nicht-kommerzielle, freie Software – also im Idealfall ein Open Source Projekt samt aktiver Community, welche ebenso an dem Problem arbeitet. Das Unternehmen kümmert sich selbst um Installation, Roll-Out und Betrieb.
  • Eine in-house oder externe (Eigen-)Entwicklung – also eine Software, die erst geschrieben werden muss. Noch lange vor der Installation gibt es also ein Softwareprojekt mit Anforderungsanalyse, Umsetzung, Tests, usw.

Sinn der Diskussion war zu zeigen, dass es keine universell beste Lösung gibt. Vielmehr konnten wir fünf Ziel-Kriterien definieren, die in Konkurrenz zueinand stehen:

  • Investitionskosten
  • Folgekosten
  • Geschwindigkeit (Projektdurchlaufzeit)
  • Risikominimierung (Wie “sehr” darf dieses Projekt nicht schief gehen?)
  • Flexibilität (Anpassungsfähigkeit, Weiterentwicklungen)

Lege ich meinen Fokus etwa auf maximale Flexibilität, so werde ich bei der Eigenentwicklung landen. Denn hier stehen mir sämtliche Freiheitsgrade offen, das Ganze allerdings zum Preis der Geschwindigkeit.

randbedingungen

Das Software-Fünfeck.

Im konkreten Einzelfall sind uU einige Kriterien gut miteinand zu vereinbaren, in anderen Situationen widersprechen sie sich total. Die fünf Punkte werden allerdings bei der Zielsetzung von Softwareprojekten hilfreich sein.

Parallel zu diesen Zielkriterien konnten wir drei Randbedingungen herausarbeiten, die den Entscheidungsprozess begleiten. Auch hier gilt, dass die Punkte an die konkrete Situation angepasst werden. IT-Sicherheit wiegt für eine Bank wohl deutlich höher, als für einen Sportverein. Die Randbedingungen sind:

  • Sicherheit
  • Zufriedenheit (Usability)
  • Bestehendes Ökosystem (Passt dieses neue Stück Software in meine IT-Landschaft?)
ddd

Die Randbedingungen.

Wer Interesse an einer Checklist für die Auswahl konkreter Software-Produkte hat, dazu gab’s bereits einen Blog-Beitrag.

hacks

Terminals in Serienproduktion

Roald Amundsen schrieb beim Durchqueren der Nordwestpassage ins Tagebuch, das Schiff sei ein glückliches, weil jedes Crewmitglied einfach wisse, was gerade zu tun sei. Zwei Tage im Jänner 2013 segelte ich auf einem derart glücklichen Schiff, wo tausende Handgriffe am Ende ein wunderbares Ergebnis brachten – oder hat man als Softwareentwickler sonst einen Akkuschrauber in der Hand? Meinen Crewmitgliedern sei Dank!

test

Die Terminals gehen in Serie.

Einen kleinen Zusammenschnitt der beiden Arbeitstage gibt’s als Video (ordentliche Auflösung direkt bei YouTube):

Mehr zum Thema: The Octopus has landed!, Terminal-Update, Service Terminal Plus

IT explained

Gutes Office, schlechtes Office

Ich schimpfe an dieser Stelle immer wieder einmal über Office-Dokumente, weil sie meist zwar leicht zu erstellen, beinahe immer aber schwer zu pflegen sind. Insbesonders dann, wenn

  • Daten oftmals aktualisiert werden müssen,
  • mehrere Personen diese Änderungen durchführen,
  • man Versionen vergleichen möchte oder
  • Daten aus anderen Systemen importiert werden könnten

zahlt es sich aus, nach Alternativen Ausschau zu halten.

Hier ein sehr schönes Beispiel von Sabine Hörmannsdorfer, die meinen Kurs an der FH Wien besucht hat. Einen sich schneller ändernden Datensatz, als das Beziehungschaos bei GZSZ kann man sich ohnehin nicht vorstellen. Ideal also, um Graphviz statt Powerpoint zur Hand zu nehmen.

Zunächst werden die Daten textuell definiert. Das hat den Vorteil, dass man dafür keine spezielle Software benötigt. So etwas kann man daher auch stressfrei kopieren, am Handy tippen oder Vorlagen aus dem Web klauen.

digraph G
{
	"Beziehungswirrwarr bei GZSZ" [shape=box, style=filled, color=darkorchid, fontcolor=white, fontname=verdana, fontsize=20.0]
	Philip;
	John;
	Ayla;
	Pia;
	Leon;
	Emily;
	Patrick;
	Jo;
	Dominik;
	Jasmin;
	Kurt;
	Katrin;
	Tayfun;
	Tuner;
	Zac;
	Vince;
	Tanja;
	Maren;
	Alexander;
	Lilly;
	"in einer Beziehung" [shape=box, style=filled, color=red]
	"verwandt" [shape=box, style=filled, color=forestgreen]
	"ex-Beziehung" [shape=box, style=filled, color=blue]
	"Sabine Hoermannsdorfer, PWOE 2013, Vertiefung IT-Systeme" [shape=none, fontcolor=gray20, fontsize=10.0];
	Ayla -> Philip [dir=both, color=red];
	Philip -> John [dir=both, color=forestgreen];
	Philip -> Emily [dir=both, color=forestgreen];
	John -> Pia [dir=both, color=red];
	Leon -> Pia [dir=both, color=red];
	John -> Emily [dir=both, color=forestgreen];
	Emily -> Patrick [dir=both, color=blue];
	Patrick -> Jasmin [dir=both, color=blue];
	Patrick -> Dominik [dir=both, color=forestgreen];
	Jasmin -> Dominik [dir=both, color=blue];
	Dominik -> Jo [dir=both, color=forestgreen];
	Jo -> Katrin [dir=both, color=blue];
	Jasmin -> Kurt [dir=both, color=red];
	Katrin -> Jasmin [dir=both, color=forestgreen];
	Katrin -> Kurt [dir=both, color=blue];
	Ayla -> Tayfun [dir=both, color=forestgreen];
	Zac -> Tanja [dir=both, color=blue];
	Vince -> Tanja [dir=both, color=blue];
	Lilly -> Tanja [dir=both, color=forestgreen];
	Maren -> Lilly [dir=both, color=forestgreen];
	Lilly -> Vince [dir=both, color=blue];
	Maren -> Tanja [dir=both, color=forestgreen];
	Maren -> Alexander [dir=both, color=red];
	Vince -> Leon [dir=both, color=forestgreen];
	Tuner -> Emily [dir=both, color=blue];
	Ayla -> Tayfun [dir=both, color=red];
	Kurt -> Tanja [dir=both, color=forestgreen];
	Alexander -> Katrin [dir=both, color=blue];
	Maren -> Kurt [dir=both, color=blue];
bgcolor=lightcoral //hintergrundfarbe ändern//
}

Läuft sogar unter Windows.

Die fertige *.dot-Datei wird anschließend mit dem Programm dot (.exe unter Windows) in ein Bild gerendert. Outputformat ist hier etwa PNG, es sind aber auch PDF und zahlreiche andere möglich.

dsfafg

Fertig ist der Output.

Der Output kann nach Belieben immer wieder aus der Textdatei erstellt werden. Änderungen sind so sehr schnell durchgeführt. Technisch und optisch ist so ziemlich alles möglich und sogar noch mehr.