Tag Archives: programmieren

IT architecture

Rethink reuse

Although I cannot share details of my current work except of fancy presentations there’s one general topic that keeps haunting me in a lot of discussions: The question of reusing code and components across platforms, target audiences, use cases, etc.

At first glance it looks like a brilliant idea: You build something once and use it several times for various use cases. Technicians love such a concepts because they’re motivated by complex problems; business people of course are fond of possible cost-reduction; IT architects love to draw boxes with arrows around them and usually feel big pain when comparable boxes appear twice in their diagrams.

The problem: Good ideas do not always work out. And what annoys me the most is the fact that software reuse seems to be an unchallenged goal, a mantra nobody dares to question. A lot of the obvious side-effects are rarely considered when going for reuse, such as:

  • growing complexity by serving additional requirements. This complexity exists in many areas, e.g. coding, testing, decision-making, etc.
  • operational issues by serving multiple target groups/stakeholders, e.g. when can you do a maintenance window?
  • losing advantages you’d have from very focused implementations, e.g. performance, optimized UX, etc.

The Space Shuttle: a terrible example of reuse

Let’s look at an example outside of my world of IT: The Space Shuttle – or better called the Space Transportation System (STS) – is an almost perfect case study where cost reduction and related benefits where promised from reusing components.

Just by looking at the picture below you can actually see (or at least imagine) all the parts which were only needed to fulfill reuse: wings with their heat shield, a tail, landing gear including unnecessarily heavy tyres, a fully functional cockpit for landing, solid liquid boosters (two rockets on the side) which fell down back into the ocean, etc.

As it turned out the Space Shuttle was limited in capacity, only reached low orbits, was more expensive and eventually killed more people than any other comparable space launch system. (A nice read on forbes.com)

Space Shuttle Launch
One of the most impressive vehicles ever built – and a total fail: The Space Transportation System.

Not being an expert on space travel let’s get back to IT. The example above just shows that there was tremendous overhead just to satisfy the requirement of reuse. As an architect I will in the future try to think twice and try to locate the space shuttle projects amongst my tasks. Reusing stuff is really cool, but only as long as it makes sense.

hacks

Die DIY-Ökonomie

Bislang war im Blog entweder von IT-Hacks oder von politisch-ökonomischen Themen zu lesen. Diesmal wage ich während einer Reise durch Japan die Synthese meiner beiden Interessen mit der – katastrophal erfolglosen – Simulation eines künstlichen Wirtschaftssystems…

Doch alles der Reihe nach: Simulationen sind ein enorm spannender Bereich der Informatik. Im Grunde geht es dabei darum, Ergebnisse weniger anhand bekannter Algorithmen zu errechnen, sondern das Verhalten von Lösungsteilen zu modellieren, um sich später das Gesamtergebnis einfach anzusehen.

Mit solchen Simulationen lässt sich etwa die Kreiszahl Pi berechnen, man kann voraussagen, ob die Wasserqualität eines Badesees hält, oder aber man simuliert einen Verkehrsstau oder einen Gebäudebrand.

Bestückt mit Wirtschaftsstudium und – wichtiger – langjähriger Erfahrung als Bürgermeister von SimCity und zahlreichen Siedler-Inseln, oder einfach mangels naturwissenschaftlicher Expertise, lag die Aufgabenstellung in meinem Fall jedenfalls am Tisch: Die Simulation einer künstlichen Marktwirtschaft bestehend aus Produzenten, Konsumenten, Einwohnern, Arbeitgebern, Produkten, Preisen und Steuern.

Die Wirtschaftsmodelle der Wuselspiele haben mit freien Märkten nichts zu tun. Im Screenshot: Widelands, ein Open Source Siedler-Klon.

Software-Agenten statt homo oeconomicus

Den Wirtschaftswissenschaften wird oft vorgeworfen, an den homo oeconomicus, also das rein rationale Verhalten der Akteure zu glauben. Dass es diesen homo oeconomicus nicht gibt, erkennt man beispielsweise daran, dass Kinos trotz Breitbandanschlüssen noch nicht komplett leer stehen, oder dass mein Fitnesscenter einen gut frequentierten Aufzug besitzt.

Auch im Reisegepäck dabei: Kahnemann, Langsames Denken, schnelles Denken, 2011. Lesenswertes Buch über die Irrationalität der Menschen, Buch bei Amazon.

Wie auch immer, Wirtschaftsprognosen sind gerade auch deshalb so schwierig, weil das Verhalten vieler Akteure komplett unterschiedlich abläuft und die Interaktionen unüberschaubar komplex sind. Ohne das Problem verstehen zu wollen, kann man jedenfalls versuchen, das Problem mit Rechenleistung zu erschlagen.

Meine Annahme: Warum nicht eine Vielzahl künstlicher, unterschiedlich agierender Agenten erschaffen und sie anschließend Wirtschaft spielen lassen. Dabei könnten etwa Konsumenten vorkommen, die sich bis auf ein Maximum verschulden, andere würden eisern sparen. Manche Produzenten wären schneller mit Investitionen, andere vorsichtiger.

Meine auf der Flugzeugserviette entworfene Ökonomie sieht jedenfalls so aus:

              -------------
              Markt
              -------------
              - Jobangebote
              - Löhne
              -------------
                  |
  -----------     |   -----------
  Arbeitgeber  ---+->  Einwohner
  -----------         -----------
      |                    ^
      |                    |
      v                    |
  -----------         -----------
   Produzent   <--+--  Konsument
  -----------     |   -----------
                  |
               ------------
               Markt
               ------------
               - Produkte
               - Preise 
               - Steuern
               ------------

Nach einer schlaflosen Nacht zwischen Minsk und Vladivostok und einem weiteren High-Speed Hack im Shinkansen von Tokio nach Kyoto ist sie also fertig – meine künstliche Wirtschaft mit hundert Einwohnern und sieben produzierenden Firmen, gegossen in ein paar Python-Module und einen Volkswirtschaftssimulator, der über zehn Jahre hinweg Bevölkerungszahlen, BIP, Privat- und Firmenvermögen sowie Jobs und Arbeitslosenrate misst. Einwohner suchen sich Jobs, verdienen Geld und geben es nach Lust und Laune wieder aus.

Meine Volkswirtschaft in Python gegossen. Links die Vermögens- und Arbeitsmarktstatistiken meiner Modellwelt.

Klingt vielleicht beeindruckend, ist es aber nicht: Statt Antworten eröffnen sich volkswirtschaftliche Lücken.

Woher kommt eigentlich das Wachstum?

Meine modellhafte Volkswirtschaft kann zwar nicht alle hundert Einwohner ernähren, aber nach ein paar Monaten hat der Großteil der Leute einen Job gefunden. Die Arbeitslosenrate sinkt – auch dank der Verhungerten – auf Null und dann passiert… nichts. Die Firmen verdienen genau das Geld, das sie wiederum den Arbeitenden auszahlen. Das BIP stagniert, woher käme denn auch das Wachstum?

Zahlreiche ökonomische Theorien beruhen auf der Ansicht, Wachstum entstünde zwangsweise durch Ausbeutung von Ressourcen. Ganz egal, ob nun damit etwa die Natur (Physiokratie), Arbeiter (Marxismus), deren Kombination in Übersee (Globalisierungskritik) oder das Sparvermögen des Mittelstands (“Draghismus“) gemeint sind. Das Gegenstück zu den diversen Ausbeutungstheorien bildet Schumpeters Theorie der wirtschaftlichen Entwicklung. Diese besagt, dass Wachstum aus neuen Ideen entsteht, aus der Zerstörung des Alten und Erschaffung des Neuen.

Nun ja, im angesprochenen Programm sind alle Optionen für Wachstum absent: Die Bevölkerung arbeitet bereits unter Vollauslastung, es gibt keine unentdeckten Bodenschätze und disruptive Innovation ist irgendwie schwer zu simulieren…

Weitere Stunden später, in denen ich meine Liliput-Ökonomie weiter parametrisiert und einen etwas intelligenteren Marktmechanismus (Preise und Löhne) implementiert habe, gebe ich schließlich entnervt auf. Wirtschaft ist wohl nicht zu simulieren, denn die Komplexität ist nicht abbildbar. Während bei technischen Aufgabenstellung oft das Prinzip Divide and Conquer zum Erfolg führt, ist das hier nicht machbar: Entweder es ist alles berücksichtigt (Lohnverhandlungen, Preisbildung, Investitionen der Unternehmen, Kundenpräferenzen für deren Produkte, Steuern, Subventionen, Arbeitslosenunterstützung, Unternehmensgründung durch einstige Konsumenten, Währungen, Zinsen, Staaten, Banken, usw.) oder die Simulation bleibt ein netter Zeitvertreib – was es allerdings wirklich gewesen ist.

Was ich dennoch gelernt habe

  1. Am Schlimmsten sind die Sparer unter meinen Einwohnern: Denn deren Konsumverzicht häuft unproduktives Kapital an.
  2. Mein in der Folge chronischer Hungersnöte eingeführtes Grundeinkommen hat die Modellwirtschaft nachhaltig stabilisiert. Zum Teil finanziert sich mein Staat über die Umsatzsteuer, ebenso findet aber eine massive Umverteilung vom Staat in Richtung Unternehmen statt. Der Staat mach also in jeder Modellvariante Schulden, damit Arbeitslose von Produzenten kaufen können. Folglich werde ich Arbeitslosenunterstützung künftig auch als Subvention für die Wirtschaft begreifen.
  3. Ein Käufermarkt, wo sämtliche Grundbedürfnisse der Menschen vielfach befriedigt sind, und Geld über massives Marketing nicht-lebensnotwendiger Produkte gemacht wird, wäre wohl gar nicht mehr zu simulieren.
  4. Im Urlaub sollte man keinen Notebook dabei haben.
hacks

Die Tetris-Maschine

Der innerste Kern meiner Tätigkeit als Softwareentwickler ist die Erschaffung von Algorithmen. Dass das deutlich spannender sein kann als es klingt, will ich anhand eines aktuellen Projekts zeigen.

Beginnen wir mit einer Aufgabe: Gegeben ist die dargestellte Auslastung von vier Hörsälen. Es soll nun eine weitere Veranstaltung zwischen 13:00 und 14:00 (blau markiert) gebucht werden – welcher Raum ist nicht nur verfügbar, sondern auch optimal passend?

In welchem Raum soll der gewünschte Termin (13:00 bis 14:00) untergebracht werden?

Als Algorithmen werden in der Informatik Handlungsanweisungen zur Lösung eines Problems verstanden. Algorithmen können so etwa als Kochrezepte für Computerprogramme verstanden werden. Sie berechnen Manager-Boni, kümmern sich bei Word um die Rechtschreibkorrektur, twittern Aktienkurse oder – wie in meinem Fall – verhelfen der WU künftig zu einer optimierten Ausnutzung der Ressource Raum.

Algorithmisches Denken ist die Umkehrung von Schul-Mathematik. Beim Programmieren ist die Lösung bekannt, aber es gilt den Weg dorthin zu entdecken.

Das Teaching Center am Campus WU: Stählerner Schauplatz für Raumbuchungs-Tetris im XXL-Format. Mathias, 2012.

Jedenfalls: Bei unserem Re-Write der Raumverwaltung für den Campus WU sind wir mit einigen, höchst spannenden Anforderungen konfrontiert: Raumbuchungen sollen künftig automatisch und optimal durchgeführt werden, den Administratoren bleibt allerdings jedwede Flexibilität erhalten. Die Software kümmert sich dabei um Studien- wie Stundenpläne, um Verfügbarkeit der Lehrenden und “Extrawürschteln” ebenso, wie um Minimierung von Buchungslücken oder Reduktion unnötigen Reinigungsaufwands aufgrund zu vieler, “angepatzter” Hörsäle. Die Ressourcen sollen flexibel verfügbar sein (Stichwort dynamische Lagerhaltung), ein allzu häufiger Ortswechsel macht Studierende wie Lehrende aber wohl kaum glücklich.

Wir benötigen daher wieder einmal den “Do what I want“-Button:

       +-----------------+
       |                 |
       | DO WHAT I WANT  |
       |                 |
       +-----------------+
Button, der in jeder Software genau 
das tut, was der User will. 
(Grobkonzept)

Von der Idee zum Algorithmus

Die Aufgabenstellung lautet demnach:

  • Liefere für eine Serie von Terminen (z.B.: ein ganzes Semester) Buchungsvorschläge
  • innerhalb der angefragten Raumkategorie,
  • versuche dabei die gewünschten Zeiten zu erfüllen,
  • d.h. immer dieselbe Beginnzeit zu ermöglichen,
  • vermeide außerdem Raumwechsel,
  • aber vermeide noch viel mehr den Wechsel von Gebäuden.
  • Beachte, dass Buchungen nahtlos aufeinanderfolgen sollten.
  • Entstehen dennoch Lücken, so sind z.B.: 30 Minuten sehr schlecht, weil dieser Zeitraum sicher verloren ist,
  • 90 Minuten hingegen sind gar nicht so schlimm, weil ja noch etwas reinpassen könnte.
  • Bereits “angepatzte” Räume sind leeren vorzuziehen, weil dadurch der Reinigungsaufwand verkleinert wird.
ggg
Geistreiche Bilder vom Entstehungsprozess des Algorithmus. (…)

 

Die Grenzen der Berechenbarkeit

Ein naiver Lösungsansatz wäre nun, alle Möglichkeiten zu versuchen und die beste zu wählen. (Tatsächlich funktionieren viele Algorithmen nach diesem Prinzip.) In diesem Fall bekommen wir aber ein Problem mit der Dimension der Aufgabe:

Will etwa jemand an acht Montagen irgendwann zwischen 9:00 und 12:00 eine zweistündige Lehrveranstaltung abhalten, so ergeben sich (zu) viele Buchungsmöglichkeiten. Entlang eines 15-minütigen Rasters erhalten wir zunächst fünf mögliche Beginnzeiten (9:00, 9:15, 9:30, 9:45, 10:00). Diese fünf Beginnzeiten über rund 50 gleichwertige Seminarräume an acht Montagen ergeben acht mal fünf mal 50 – also zweitausend – Einzelmöglichkeiten. Die Berechnung der Kombinationsmöglichkeiten ergibt 15 Quintillionen [sic – 250hoch8 – eine 15 mit 18 Nullen]!

Wir reden allerdings nicht nur von einer Veranstaltung, sondern von knapp 4000 jährlich mit rund 35000 Einzelterminen – Tendenz Dank erweiterter Buchungsmöglichkeit für Mitarbeiter und Studierende stark steigend. Selbst wenn ein leistungsfähiger Rechner eine Milliarde Kombinationen pro Sekunde ausprobieren würde, wäre die erste Raumbuchung erst nach knapp 500 Jahren fertig…

Tetris

Glücklicherweise gibt es Tetris! Ähnlich wie bei den von oben fallenden Steinen kommen auch die Buchungswünsche Schritt für Schritt herein. Jede Buchung muss auf die jeweils aktuelle Belegung Rücksicht nehmen, kümmert sich aber nicht um das, was noch kommt. Genauso wie bei Tetris ist es auch bei Raumbuchungen sinnvoll, Lücken bestmöglich zu füllen, oder doch für passgenaue Steine in naher Zukunft frei zu halten.

Tetris-Klon von Nintendo: Dr. Mario. Aufgrund unseres akademischen Kontexts an der WU die wohl bessere Analogie.

Die Matrix

Tetris-Analogie hin oder her, noch besteht das Problem der zu vielen Lösungen. Manchmal hilft es, die Aufgabenstellung in kleine Teile zu trennen, das Problem zu abstrahieren, sich typische Situationen aber vor allem auch Grenzfälle (corner cases) zu überlegen.

Eine Terminserie zu unterschiedlichen Beginnzeiten, in Gebäuden und darin enthaltenen Räumen entspricht einer vierdimensionalen Matrix, so einer Art Excel-Tabelle, wo in jeder Zelle nochmal eine Tabelle enthalten ist. (Keine Sorge, so etwas kann auch ich mir nicht wirklich vorstellen.)

Die Einträge in dieser Matrix sind jedenfalls:

  • pro Termin
  • pro Beginnzeit
  • pro Gebäude
  • jede verfügbare Raumnummer
  • mit Bewertung der Passgenauigkeit

Die Passgenauigkeit beträgt 1, wenn der Raum einfach frei ist, 0 wenn er gebucht ist. Sollte ein Termin nahtlos reinpassen, erhöht sich der Wert über 1, bleiben Lücken, so bekommt der Raum Strafabzüge. Die Datenstruktur sieht früher oder später so aus:

{Termin1: {'12:00': {Gebaeude1: {Raum1: 0.47250000000000003, Raum2: 1.6}}},
 Termin2: {'12:00': {Gebaeude2: {Raum5: 1},
               Gebaeude1: {Raum1: 1,
                           Raum2: 1,
                           Raum3: 1,
                           Raum4: 1}}},
 Termin3: {'12:00': {Gebaeude1: {Raum1: 2, Raum2: 2}}},
 Termin4: {'12:00': {Gebaeude2: {Raum5: 1},
               Gebaeude1: {Raum1: 2,
                           Raum2: 2,
                           Raum3: 1,
                           Raum4: 1}}},
 Termin5: {'12:00': {Gebaeude2: {Raum5: 1},
               Gebaeude1: {Raum1: 0.45,
                           Raum2: 0.3375,
                           Raum3: 1,
                           Raum4: 1}}},
 Termin6: {'12:00': {Gebaeude1: {Raum2: 0.45, Raum3: 1, Raum4: 1}}},
 Termin7: {'12:00': {Gebaeude2: {Raum5: 1},
               Gebaeude1: {Raum1: 1, Raum3: 1, Raum4: 1}}}}

Die optimale Buchung

Die beste Lösung findet man nun nicht durch stumpfsinniges Ausprobieren, sondern durch geschicktes Durchschreiten der Datenstruktur. Der Lösungsweg lautet:

FÜR jede Terminanfrage    
  FÜR jede Beginnzeit gereiht nach Häufigkeit terminunabhängig
    FÜR jedes Gebäude gereiht nach Häufigkeit in Beginnzeit
       FÜR jeden Raum gereiht nach Passgenauigkeit in Beginnzeit
         VERSUCHE zu buchen
         ODER gehe weiter

Die Lösung der eingangs gestellten Aufgabe lautet übrigens “Raum B”. Oder wenn Sie zufällig ein Algorithmus sind:

{1: {'12:00': {123456789: {66778801: 0.47250000000000003, 66778802: 1.6}}}}

Übrigens: Geschafft in 0.7 Sekunden anstatt von 500 Jahren.

tltr;

Raumbuchen ist wie Tetris-Spielen; Excel kennt zum Glück keine Tabellen in Zellen.

finance hacks

Python stock quote fetch

UPDATE

— 8< —

Nach den heldenhaften Ideen des ebenso heldenhaften Stefan twittert nun mein Portfolio wochentags um 15:00 die aktuelle Entwicklung: crashportfolio@twitter

— 8< —

Anfang der Woche habe ich mein fiktives Krisenportfolio gepostet – damit war’s plötzlich höchste Zeit, Kursentwicklungen aktuell zu halten. Zwei Stunden und ein paar Zeilen Python später ist nun alles automatisiert.

Natürlich ist die Verwaltung eines Portfolios etwas, was Yahoo!, Google und zig andere Dienste gratis anbieten. Außerdem sehe ich die Positionen ohnehin auf meinem Konto bei brokerjet, aber dennoch: Nichts macht so viel Spaß wie eine selbst gebastelte Lösung, nichts ist so flexibel verwendbar, und nichts geht abzüglich der anfänglichen Programmierzeit danach so schnell.

Erfassen

Zunächst war es wichtig, die fiktiven Investments strukturiert zu erfassen. Ich hasse zwar Tabellenkalkulation, aber CSV scheint dennoch ein brauchbares Austauschformat zu sein. Kurzum: Name, Einstiegskurs, Menge, Datum, sowie eine ID (=Symbol) und ein Pointer auf den jeweiligen data provider sind wichtig.

Commodity ETF,etf/RBS_Market_Access_Jim_Rogers_International_Commodity_Index_ETF,26.50,900,08.07.2012,finanzen.net
Altria,PHM7.F,28.51,300,08.07.2012,yahoo
BP,BPE5.DE,5.40,1400,08.07.2012,yahoo
Fuchs Petrolub,FPE.DE,40.80,180,08.07.2012,yahoo
Nestle,NESR.DE,48.64,150,08.07.2012,yahoo
Novo Nordisk,NOVA.DE,118.32,65,08.07.2012,yahoo
Pfizer,PFE.DE,18.21,400,08.07.2012,yahoo
Shoprite,HY7.F,15.64,480,08.07.2012,yahoo
Umicore,UMI.BR,35.32,200,08.07.2012,yahoo

Absaugen

Das CSV-File wird mittels Python eingelesen, die Klasse Paper wird pro Position instanziiert. Yahoo! bietet ein unerschöpfliches API für Aktienkurse, die Python-Library ystockquote macht das Ganze sehr einfach zu verwenden.

class Paper():
    """Any bond, etf or stock"""
    
    def __init__(self, data_provider, name, symbol, quant, purchase_price, date):
        
        self.data_provider = data_provider
            
        self.name = name
        self.symbol = symbol
        self.quant = int(quant)
        self.purchase_price = float(purchase_price)
        self.date = date
        
        self._price = None
    
    def __repr__(self):
        return "%20s %7.2f %7.2f %7.2f%% %5d" % (self.name, self.purchase_price, self.price, self.change, self.totalgain)
    
    @property
    def price(self):
        if not self._price:
            
            if self.data_provider == 'yahoo':
                self._price = float(ystockquote.get_price(self.symbol))
            elif self.data_provider == 'finanzen.net':
                self._price = FinanzenNetParser.get_price(self.symbol)
            else:
                raise NoDataProvider
        return self._price

    @property
    def change(self):
        return ((self.price / self.purchase_price ) - 1) * 100
    
    @property
    def totalgain(self):
        return self.change / 100.0 * (self.purchase_price * self.quant)

Für den Kurs des ETF benötige ich einen HTML-Parser, da Yahoo! dessen Kurs nicht anbietet. Mit BeautifulSoup habe ich einen neuen Lieblings-Parser ins Herz geschlossen – in Kürze war also der Kurs von finanzen.net eingebunden. (Python-Tipp: Webscraping with Python and beautifulsoup)

Natürlich muss ich das auch noch für die Goldmünzen und die Uhr machen, die sich ebenso in meinem Portfolio befinden.

class FinanzenNetParser():
         
    @classmethod
    def get_price(self, path):
        """Ok, tricky: price is the first th in a table.header_height"""
        
        url = 'http://www.finanzen.net/%s' % (path,)
        content = urllib2.urlopen(url).read()
        
        soup = BeautifulSoup(content)
        for table in  soup.find_all('table'):
        
            if table.get('class') == ['header_height']:
                return float(table.th.text.replace('EUR','').replace(',','.'))

Ausgeben

Der Output ist derzeit noch etwas mager, mit Jinja2 sind die Daten aber schnell in HTML gegossen und auf meinem Mobiltelefon verfügbar.

                name purchase current  change  total
       Commodity ETF   26.50   26.57    0.26%    62
              Altria   28.51   28.79    0.98%    84
                  BP    5.40    5.48    1.50%   113
      Fuchs Petrolub   40.80   40.65   -0.37%   -26
              Nestle   48.64   48.86    0.45%    32
        Novo Nordisk  118.32  120.15    1.55%   118
              Pfizer   18.21   18.52    1.67%   121
            Shoprite   15.64   15.89    1.62%   121
             Umicore   35.32   34.65   -1.91%  -134

 

ideas

Von Software-Qualität und Eisbergen

In Kürze gehen zwei unserer Anwendungen in Testbetrieb (gebloggt und nochmal gebloggt). Nach wochenlanger Entwicklungsarbeit naht nun der Moment, den ich so hasse: der Moment des ersten, überhasteten Feedbacks.

Ich will diesen Moment als Eisberg-Moment bezeichnen. Er findet da statt, wo Endbenutzer oder Auftraggeber erste Rückmeldungen zum Softwareprodukt liefern. Rückmeldungen, die lediglich die sichtbaren Merkmale der Software betreffen und somit den Großteil der Anstrengungen außer Acht lassen.

Auch wenn Usability-Leute behaupten, the interface is the product, dann ist das nur die halbe Wahrheit. Insbesondere über einen Bewertungszeitraum, der länger als fünf Minuten – in unserem konkreten Fall hoffentlich mehr als fünf Jahre – dauert, spielen ganz andere Faktoren die Hauptrolle:

  • Investitions- und Wartungskosten; die IT ist schließlich ohnehin personalintensiv.
  • Wartbarkeit
  • Security
  • Verfügbarkeit
  • Konsistenz/Integrität
  • usw. (…) Nur eben nicht Logos, Schriftarten und oder Ränder drumherum.

Kurzum, mein Kollege Dennis und ich haben den Eisberg auf einem Whiteboard verewigt. Unter der Oberfläche liegen die unbeachteten Merkmale von Software-Qualität. Auf der x-Achse haben wir die investierte Arbeitszeit aufgetragen; auf der y-Achse (zugegeben etwas sarkastisch) das Geld, das man mit den jeweiligen Services verdienen kann.

Qualitätsmerkmale von Software(-projekten) und was davon für Außenstehende sichtbar ist. Der "Eisberg-Moment", ein künftiger Management-Klassiker.

Der Eisberg-Moment ist übrigens das Gegenteil des black triangle moments.

Edit 1: Ich bin übrigens der Meinung, dass Feedback wichtig ist. Es sind nur diese ersten Rückmeldungen, die mich immer und immer wieder an den Rand der Verzweiflung treiben…

Edit 2: Passend zum Thema, dass Feedback qualitativ sehr unterschiedlich sein kann: TornadoGuard bei xkcd.

IT explained

Gestohlene GIS-Daten und was jeder tun sollte

Technik egal, gleich zum Musterbrief an die GIS springen.

Im “österreichischen Internet” geht es zurzeit ziemlich wild zu: SPÖ, FPÖ und zuletzt die Grünen wurden Opfer von Hack-Attacken, besonders großes Aufsehen erregte vor allem der Datendiebstahl bei der GIS.

Was ist da genau passiert?

Der Angriff bei der GIS lief über eine so genannte SQL-Injection. Wikipedia erklärt’s genauer, aber die Kurzversion lautet etwa so: Browser kommunzieren mit Webservern via URLs – jeder geklickte Link und jedes ausgefüllte Formular sind schließlich Webadressen, also URLs.

Wer sich die URL-Zeile des Browsers schon mal genauer angesehen hat, der erkennt alle Formen von Parametern. Onlineshops müssen beispielsweise wissen, welche Produkte sie anzeigen sollen. Im Onlineshop von biohelp etwa, geschieht dies über den Parameter id mit dem Wert 8:

http://www.biohelp.at/biohelp_h/index.php?option=com_content&task=view&id=8

Es lässt sich nun wohl leicht erraten, welche IDs es sonst noch so gibt… Das Austauschen von Paramtern wird URL-Manipulation genannt. Man kommt dann vielleicht auf Seiten(-kombinationen), die so nie gedacht waren – beispielsweise zum Erotikfilm in der Produktkategorie Priesterzubehör -, aber ein böser Cracker sind wir dadurch noch lange nicht.

Der Befehl id=8 landet irgendwann jedenfalls in einer Datenbank, wo das entsprechende Produkt gespeichert ist. Datenbanken werden mit SQL abgefragt. Auch ohne Datenbankkenntnisse ist wahrscheinlich klar, was hier geschieht:

SELECT name, preis
  FROM produktkatalog
 WHERE produkt_id = <URL:id>

Was wir soeben im Trockentraining gebastelt haben, nennt sich dynamische Webseite. In Abhängigkeit vom Wert id aus dem URL liefert die Datenbank unterschiedliche Ergebnisse. Und diese werden schließlich auf der Produktseite präsentiert.

Do it yourself SQL-Injection

Was ist nun bei der GIS passiert? Nun, der Wert wurde durch etwas ausgetauscht, was deutlich mehr als einen Datensatz liefert, 214.000 um genau zu sein. Man injiziert weitere Befehle in den URL, und daher kommt auch der Name SQL-Injection. Dies könnte etwa so funktionieren:

http://www.biohelp.at/biohelp_h/index.php?option=com_content&task=view&id=8 OR 1=1

Die Eingabe wird in der Datenbank zu:

SELECT name, preis
  FROM produktkatalog
 WHERE produkt_id = 8 OR 1 = 1

Und da 1 immer gleich 1 ist, kämen so alle Produkte der Datenbank retour. Man wäre nun sogar in der Lage, noch gefährlichere Kommandos einzuschleusen, die deutlich mehr Schaden anrichten würden usw.

Der  Gärtner meines Vertrauens (biohelp) ist jedenfalls gegen SQL-Injection abgesichert, und so sind es inzwischen alle halbwegs vertrauenswürdigen Websites – von hochsicheren online-banking Anwendungen bis hin zum Forum der örtlichen Schrebergartenvereinigung.

Die GIS allerdings, sah im Jahr 2007 (Neuentwicklung der Webseite) jedenfalls keinen Anlass, mehr als 200.000 Kundendaten gegen so ein Angriffsszenario zu schützen! Ansich wäre hier mein Artikel zu Ende gewesen, hätte ich gestern nicht nochmal zur Zeitung gegriffen:

Herr Menedetter, mir kommt das Kotzen

Man sollte sich das Interview der Presse mit Herrn Menedetter, Geschäftsführer der GIS, wirklich nicht auf nüchternen Magen zumuten. Hier die beiden Highlights:

“Wir haben die Daten nicht verloren, sie sind uns von einem kriminellen Hackernetzwerk gestohlen worden.”

“Wir (…) weisen darauf hin, genau auf Kontoauszüge zu achten. Der mündige Konsument muss auf seine persönlichen Daten achten.”

Diese Verlogenheit muss bestraft werden. Erstens ist das, was ich oben beschrieben habe kein hochkomplexer Angriff irgendwelcher Kriminellen, wie man sie aus Spionage-Filmen kennt. SQL-Injection auf Webseiten zu ermöglichen, ist grob fahrlässig! Aber anschließend auch noch auf die Mündigkeit der Konsumenten, die so wie ich die Produkte gar nicht kaufen wollen! – hinzuweisen, ist die Höhe.

Kurzum, das österreichische Datenschutzgesetz erlaubt nach §26 ein Auskunftsrecht. Zur Nachahmung wird ermutigt, es kostet eine Briefmarke:

Musterbrief an die GIS

GIS Gebühren Info Service GmbH
Operngasse 20 B 1040 Wien

Sehr geehrte Damen und Herren,

dem Interview der Tageszeitung Die Presse mit Ihrem GF Herrn Menedetter (29. Juli 2011) entnehme ich, dass seiner Darstellung nach, die GIS Opfer eines kriminellen Hackernetzwerks wurde und keinerlei Schuld am Datenverlust trägt. Herr Menedetter wörtlich: “Der mündige Konsument muss auf seine persönlichen Daten achten.”

Da meiner Ansicht nach die GIS gegen §14 Abs. 1 DSG 2000 (Datensicherheitsmanßnahmen nach technischer Möglichkeit und wirtschaftlicher Vertretbarkeit) verstoßen hat und ich mich als mündigen Konsumenten sehe, fordere ich Auskunft über die Ihnen vorliegenden persönlichen Daten zu meiner Person. Insbesondere will ich wissen, was die GIS über mich speichert, und woher Sie diese Daten beziehen. Weiters fordere ich Namen und Anschrift aller Dienstleister, die Sie zur Verarbeitung meiner Daten heranziehen.

Zum Nachweis meiner Identität liegt eine Kopie meines Führerscheins bei. Ich weise Sie höflich auf die lt. Gesetz achtwöchige Frist zur Beantwortung meines Begehrens hin.

Mit freundlichen Grüßen

Mag. Mathias Frey

meta

Was machen eigentlich Programmierer?

Vergangene Woche wurde ich wieder gefragt: “Mathias, was tust du eigentlich so als Programmierer?”

Ich finde es erstaunlich, dass in einer inzwischen durch und durch digitalisierten Welt nach wie vor wenig Außenstehende Ahnung davon haben, woraus die Arbeit eines Softwareentwicklers besteht. Dabei durchdringt die Softwarewelt die reale: Nachrichtenmeldungen sind voll mit Berichten über Software-Features wie Gesichtserkennung, Einkaufen via QR-Codes, Suchalgorithmen, Videotelefonie usw. Gleichzeitig ist die Anatomie dieser Systeme den meisten Menschen gänzlich unbekannt. Es herrscht flächendeckender IT-Analphabetismus.

Programmieren hat wirklich nichts mit Office-Software zu tun

Ein Grund der oben geschilderten Situation ist sicherlich, dass IT-Fähigkeiten meist auf Office-Kenntnisse beschränkt werden, und diese Fehleinschätzung zusätzlich mit fragwürdigen Zertifizierungen wie dem Europäischen Computer Führerschein (ECDL) institutionalisiert wird. Ich kann jedenfalls behaupten, dass ich tagelang produktiv arbeiten kann, ohne ein Office-Dokument geöffnet zu haben.

Ein Grund, warum Softwareentwickler Office-Dokumente dermaßen verabscheuen, ist womöglich folgender: In Word- oder Excel-Dateien liegen Informationen unstrukturiert vor, die Daten sind somit für eine effiziente Weiterverarbeitung verloren. Während sich Anwender meist zeitraubend um das Einfärben und Positionieren von Überschriftszeilen bemühen, geht es Entwicklern eher darum, wo Informationen gespeichert und wie sie (weiter-) verarbeitet werden.

“Kurzum, es ist eine sehr spannende Aufgabe ein Programm zu schreiben, dass hunderte Spreadsheets erzeugt und per Mail versendet. Es ist fürchterlich, auch nur eine einzige Excel-Datei selbst zu erstellen!”

Also was machen nun Programmierer genau?

Dank dem rasanten technischen Wandel besteht ein großer Teil meiner Arbeitszeit aus Weiterbildung.

Eins vorweg: ich bevorzuge den Begriff Softwareentwickler, da ich deutlich weniger Zeit an der Tatstatur verbringe, als vermutlich angenommen wird. Meine Arbeit besteht zu großen Teilen aus Recherche und somit Lesen, Versuchen  nach dem Trial-and-Error-Prinzip anstatt zu detaillierter Planung, Kaffeetrinken, Anwender interviewen, Bugs rekonstruieren und fixen, Dokumentationen in Form von Wikis oder automatisierten Softwaretests schreiben und Besprechungen führen. Ich verbringe maximal 20% meiner Arbeitszeit mit tatsächlichem Programmieren am endgültigen Produkt. Bei wirklich produktiven Leuten ist der Anteil wahrscheinlich maximal doppelt so hoch.

Datenbanken, Programmiersprachen und Betriebssysteme

Wie oben erwähnt strukturieren Softwareentwickler die Welt der Daten und machen diese so zu wertvoll(er)en Informationen. Wer also auf seinem Desktop Dateien mit etwa folgenden Namen speichert, sollte sich schleunigst Gedanken über Datenbanken machen:

Urlaubsliste.xlsx
Urlaubsliste_neu.xlsx
Kopie von Urlaubsliste_neu.xlsx
Urlaubsliste_neu - 21. März 2011.xlsx
Urlaubsliste (Version Kontrolle MF).xlsx
Urlaubsliste - endgültig nicht bearbeiten!.xlsx

Ein zentraler Bestandteil eines Entwicklerdaseins sind die verwendeten Programmiersprachen. Je nach Anwendungsgebiet oder Erfahrung gibt es zahlreiche Optionen. In Entwicklerkreisen gleicht die Wahl der Programmiersprache dem Religionsbekenntnis. Ähnliches Bild auch auf Seiten der Betriebssysteme, nur ist hier die Auswahl deutlich geringer: Es gibt die Windows-Leute auf der einen Seite und Unix-Anwender auf der anderen. (Apples MacOS ist übrigens lediglich ein sehr hübsches Unix.)

Fazit: Sollte sich jemand fürs Programmieren interessieren, dann wird man ohnehin mit all den Begriffen schnell in Kontakt geraten. Vielmehr als konkrete Sprachen oder Systeme zählen ohnehin die Aufgabenstellungen. Motto: Such’ dir ein interessantes Problem und kämpf’ dich durch zur Lösung.

Versionskontrolle und Wissensmanagement

Softwareentwicklung ist stetige Wissensfindung als Produktionsprozess. Dabei ist der entstandene Source-Code die Dokumentation der erfolgten Arbeit. Umfangreiche Projekte bestehen aus hunderten von Dateien. Bugs lauern überall, Änderungen im File A haben meist unabsehbare Auswirkungen auf das Gesamtsystem. Bei Projekten mit mehreren Entwicklern steigt der Kommunikationsaufwand exponentiell, sehr schnell ist der Überblick verloren.

Die Lösung des Problems sind unter anderem Systeme zur Versionskontrolle, die das Projekt nicht auf Ebene von Dateien, sondern so genannten Revisionen organisieren. Mich wundert bis heute, warum diese Funktionalitäten nach wie vor nicht Einzug in die Bürowelt gefunden haben. Wenn überhaupt, dann sind sie allerdings extrem komplex aber gleichzeitig nutzlos umgesetzt.

Traumberuf Softwareentwickler

Das Schöne an der Softwareentwicklung ist letztlich, dass die vielfältigen Tätigkeiten nicht in eine kurze Erklärung passen. Jede Aufgabenstellung ist in gewisser Weise einzigartig.

Jeden Tag eine neues Projekt: die Nicht-Standardisierbarkeit der Aufgaben ist der einzige Standard.

Ich habe in zehn Jahren IT noch keinen Softwareentwickler getroffen, der nicht Spaß an seiner Arbeit gehabt hätte. Dennoch birgt die Arbeit großes Frustrationspotential.

Einerseits kann man schon mal tagelang auf drei Zeilen Code starren und absolut nicht verstehen, warum das Programm nicht so funktioniert, wie die Dokumentation sagt. Andererseits werden oft die größten Fortschritte nicht als solche anerkannt. Es gibt schlicht keinen Zusammenhang zwischen Programmieraufwand oder technischer Komplexität und Applaus der Benutzer. Situationen in denen die Benutzer schlicht nicht wissen (können) was eigentlich dahinter steckt, so genannte Black Triangles, sind sehr weit verbreitet.

Zum Abschluss: Softwareentwicklung ist für mich der spannendste Bürojob auf Erden. Ich schaffe tagtäglich meine eigene Welt aus Programmcode, der für mich wie Poesie wirkt. Woche für Woche lerne ich etwas Neues von Menschen, die ihre Arbeit im Internet frei zur Verfügung stellen.

Die einzige Limitation in der Welt der Bits und Bytes ist letzlich die Vorstellungskraft der Entwickler. Hoffentlich kann sich bald jemand eine vernünftige Alternative zu Office-Dokumenten vorstellen…