Freitag, 22. November 2013

Let it snow

Mein erster Versuch mit HTML 5 und JavaScript ist eine Neuimplementierung eines Programms, welches ich vor mehr als 10 Jahren in Pascal geschrieben habe. Damals noch mit BGI - heute mit Bildern (gestaltet von Alf Hedler).

Eine Interaktion mit dem Nutzer gibt es nicht. Man schaut einfach nur zu, wie dass Bild zuschneit.

Bitte meldet mir Fehler. Ich habe nich alle Browser durchgetestet.

Montag, 11. November 2013

Können auch Blogger Presserecht in Anspruch nehmen?

Diese Frage möchte Hadmut Danisch durch eine Klage klären lassen.

Donnerstag, 7. November 2013

Vorausschauend


"Kind, ich habe Dir doch gesagt, dass Du die Schere nicht auf dem Boden liegen lassen sollst. Wenn Dein kleines Geschwisterchen da rankommt, schneidet es sich noch die Finger ab."

"Das ist nicht schlimm, Papa."

"Wie bitte? Das soll nicht schlimm sein?"

"Der Kleber liegt auch auf dem Boden. Da kann es sich die Finger gleich wieder ankleben."

Dienstag, 8. Oktober 2013

Halle an der Saale (1990)

Zum gestrigen Geburtstag gab es auf Politplatschquatsch einige Bilder von Halle, als die Parkplatzsituation noch besser war.

Dienstag, 17. September 2013

"Wer die menschliche Gesellschaft will,..."


"muss die männliche überwinden." (SPD Grundsatzprogramm, S. 41)

Gut zu wissen, dass Männer nicht als Menschen angesehen werden. Entsprechend ist es verständlich, dass unsere Gesellschaft Gewalt gegen Männer toleriert und auch deren Tod nicht so wichtig nimmt.

Mittwoch, 4. September 2013

Studium: Geschafft


Gestern kam mein Abschlusszeugnis. Damit darf ich mich nun Bachelor of Science in Wirtschaftswissenschaften nennen. Vielen Dank an dieser Stelle an Steinchen und meine Mutter für das Korrekturlesen und kritisieren meiner Abschlussarbeit.

Donnerstag, 8. August 2013

Tiny House People

Mir gefällt so etwas. Das ist wie früher mit Transformers oder M.A.S.K.

Lego-style apartment transforms into infinite spaces

6 rooms into 1

Sonntag, 14. Juli 2013

Standards? Denkste!

Ich wollte ja in HTML 5 einsteigen, denn da, so meine Vorstellung, könnten Programme "überall [...] ausgeführt werden, wo ein HTML5-fähiger Browser existiert."

Ha!

Da geht's letztlich genauso weiter, wie es bei HTML 4 aufgehört hat. Da macht scheibar jeder Browser wieder sein eigenes Ding. Ich wollte nur mal schnell wissen, wie ich die Mauskoordinaten abfragen kann. Da habe ich jetzt schon wieder keine Lust mehr.

Donnerstag, 11. Juli 2013

Googleprofil

Jens Berger zeigt, wo man sehen kann, welches Bild sich Google von einem macht.

Mittwoch, 10. Juli 2013

Refactoring III: Gerüche und Methoden

Hier möchte ich noch zwei Quellen zum Thema verlinken:

Zum einen eine Liste der "Code-Gerüche" und zum anderen ein Katalog von Refactoring-Methoden.

Dienstag, 9. Juli 2013

HTML 5

Ich versuche mich in nächster Zeit etwas mit HTML 5 / JavaScript zu beschäftigen.

Grund: Programme können überall geschrieben werden, wo es einen Texteditor gibt und ausgeführt werden, wo ein HTML5-fähiger Browser existiert.

Hier einige Quellen, die ich zu dem Thema gefunden habe:

Allgemeine Tutorials:
w3schools.com
Mozilla Developer Network

Spielentwicklung:
HTML 5 GAME DEVELOPMENT
HTML5 Gamer

WebGL:
WebGL - 3D im Browser

Donnerstag, 4. Juli 2013

Themen gesucht

Ich suche noch Themen, vorzugsweise aus den Bereichen Softwareentwicklung, Ökonomie oder Ethik, die ich in diesem Blog verwursten kann und die auch auf das Interesse meiner Leser stoßen.

Außerdem möchte ich schon einmal vorwarnen, dass ich demnächst das Layout meines Blogs ändern werde. Sourcecodes werden in dem jetzigen nicht so ideal angezeigt.

Mittwoch, 3. Juli 2013

Refactoring II: Politik der kleinen Schritte


Bevor ich von Refactoring hörte, hieß die Antwort auf schlechte Wartbarkeit (Weiterentwicklung, Fehlerbereinigung) und Performanceprobleme von Softwarekomponenten Redesign: Es wurden Klassendiagramme und ggf. Aktivitätendiagramme des Ist-Zustands erstellt und auf diesem Abstraktionsniveau dann überlegt, wie das Zieldesign aussehen soll. Dann wurde versucht, diesen Entwurf mit einem mehr oder weniger großen Ruck in Sourcecode zu gießen.

Beim Refactoring bleiben wir auf dem Niveau des Sourcecodes; und wir machen kleine Schritte. Aber lassen wir die Theorie und schauen wir uns einfach mal ein Refactoring im Beispiel an.

Legen wir los! Vielleicht stoße ich bei der Lektüre einer mir fremden Quelldatei auf die folgende Methode:
public void Buy(String x)
{
   if ((Int32.Parse(x[0]) * 1
     + Int32.Parse(x[1]) * 2
     + Int32.Parse(x[2]) * 3
     + Int32.Parse(x[3]) * 4
     + Int32.Parse(x[4]) * 5
     + Int32.Parse(x[5]) * 6
     + Int32.Parse(x[6]) * 7
     + Int32.Parse(x[7]) * 8
     + Int32.Parse(x[8]) * 9
     + Int32.Parse(x[9]=='X'?"10":x[9].ToString()) * 10) % 11
     == 0)
   {
      string s;
      double p1 = AskForPrice(x, "Super Shop");
      double p2 = AskForPrice(x, "The Book Shop");
      double p3 = AskForPrice(x, "Your Shop");
      double p4 = AskForPrice(x, "No Name Shop");
      if (p1 <= p2 && p1 <= p3 && p1 <= p4)
      {
         s = "Super Shop";
      }
      else
      {
         if (p2 <= p1 && p2 <= p3 && p2 <= p4)
         {
            s = "The Book Shop";
         }
         else
         {
            if (p3 <= p1 && p3 <= p2 && p3 <= p4)
            {
               s = "Your Shop";
            }
            else
            {
               s = "No Name Shop";
            }
         }
      }
     
      SendBookOrder(x, s);
   }
   else
   {
      ShowErrorMessage("The ISBN " + x + " isn't valid.");
   }
}
Welche Gedanken kommen mir beim Lesen? Der Name ist "Buy" also kaufe ich mit der Methode etwas? Was? x? Was ist x? Mal schauen. Als erstes wird irgendetwas geprüft. Der String wird zerlegt und es wird was gerechnet? Naja, schau ich mir später genauer an. Was passiert denn, wenn die Bedingung erfüllt ist?

Ah, da wird die Funktion "AskForPrice" mehrmals aufgerufen. Vermutlich liefert mir diese Funktion einen Preis zurück. Ich prüfe mal die Dokumentation der Funktion "AskForPrice". (Wenn ich Glück habe, ist die Schnittstelle der Funktion "AskForPrice" gut dokumentiert. Wenn nicht, muss ich erst diese Funktion weiter untersuchen, damit ich weiß, was sie mir wirklich zurück liefert und was sie an Parametern verlangt.) Laut deren Doku liefert sie den Preis zurück und will als Parameter zum einen eine ISBN - ah, x ist also eine ISBN - und den Namen eines Geschäfts, dass nach den Preis gefragt wird.

Na dann benennen wir doch mal x in isbn und p1 bis p4 in price1 bis price4 um:
public void Buy(String isbn)
{
   if ((Int32.Parse(isbn[0].ToString()) * 1
     + Int32.Parse(isbn[1].ToString()) * 2
     + Int32.Parse(isbn[2].ToString()) * 3
     + Int32.Parse(isbn[3].ToString()) * 4
     + Int32.Parse(isbn[4].ToString()) * 5
     + Int32.Parse(isbn[5].ToString()) * 6
     + Int32.Parse(isbn[6].ToString()) * 7
     + Int32.Parse(isbn[7].ToString()) * 8
     + Int32.Parse(isbn[8].ToString()) * 9
     + Int32.Parse(isbn[9]=='X'?"10":isbn[9].ToString()) * 10) % 11
     == 0)
   {
      string s;
      double price1 = AskForPrice(isbn, "Super Shop");
      double price2 = AskForPrice(isbn, "The Book Shop");
      double price3 = AskForPrice(isbn, "Your Shop");
      double price4 = AskForPrice(isbn, "No Name Shop");
      if (price1 <= price2 && price1 <= price3 && price1 <= price4)
      {
         s = "Super Shop";
      }
      else
      {
         if (price2 <= price1 && price2 <= price3 && price2 <= price4)
         {
            s = "The Book Shop";
         }
         else
         {
            if (price3 <= price1 && price3 <= price2 && price3 <= price4)
            {
               s = "Your Shop";
            }
            else
            {
               s = "No Name Shop";
            }
         }
      }
     
      SendBookOrder(isbn, s);
   }
   else
   {
      ShowErrorMessage("The ISBN " + isbn + " isn't valid.");
   }
}

Als nächstes werden die Preise miteinander verglichen. Sieht so aus, als ob der niedrigste Preis ermittelt werden soll. Und dann wird anscheinend s jeweils auf den Namen des Geschäfts gesetzt, welches den niedrigsten Preis geliefert hat. Was wird mit s noch gemacht? Es geht in die Methode "SendBookOrder". Dokumentation der Methode prüfen! Ja richtig. Die will den Namen des Shops. Na dann benennen wir mal s in shopName um:
public void Buy(String isbn)
{
   if ((Int32.Parse(isbn[0].ToString()) * 1
     + Int32.Parse(isbn[1].ToString()) * 2
     + Int32.Parse(isbn[2].ToString()) * 3
     + Int32.Parse(isbn[3].ToString()) * 4
     + Int32.Parse(isbn[4].ToString()) * 5
     + Int32.Parse(isbn[5].ToString()) * 6
     + Int32.Parse(isbn[6].ToString()) * 7
     + Int32.Parse(isbn[7].ToString()) * 8
     + Int32.Parse(isbn[8].ToString()) * 9
     + Int32.Parse(isbn[9]=='X'?"10":isbn[9].ToString()) * 10) % 11
     == 0)
   {
      string shopName;
      double price1 = AskForPrice(isbn, "Super Shop");
      double price2 = AskForPrice(isbn, "The Book Shop");
      double price3 = AskForPrice(isbn, "Your Shop");
      double price4 = AskForPrice(isbn, "No Name Shop");
      if (price1 <= price2 && price1 <= price3 && price1 <= price4)
      {
         shopName = "Super Shop";
      }
      else
      {
         if (price2 <= price1 && price2 <= price3 && price2 <= price4)
         {
            shopName = "The Book Shop";
         }
         else
         {
            if (price3 <= price1 && price3 <= price2 && price3 <= price4)
            {
               shopName = "Your Shop";
            }
            else
            {
               shopName = "No Name Shop";
            }
         }
      }   
  
      SendBookOrder(isbn, shopName);
   }
   else
   {
      ShowErrorMessage("The ISBN " + isbn + " isn't valid.");
   }
}

Ok, jetzt weiß ich, glaube ich, was diese Methode so macht. Wenn die obige Bedingung fehlschlägt, wird ja auch eine Fehlermeldung ausgegeben, die... ok, die Bedingung oben prüft also, ob es sich um eine gültige ISBN handelt. Zeit, die Methode mal etwas zu verkleinern. Ich packe die Prüfbedingung in eine eigene Methode, mit dem schönen Namen "IsValidIsbn". Dann müsste gleich klar sein, was die macht:
public void Buy(String isbn)
{
   if (IsValidIsbn(isbn))
   {
      string shopName;
      double price1 = AskForPrice(isbn, "Super Shop");
      double price2 = AskForPrice(isbn, "The Book Shop");
      double price3 = AskForPrice(isbn, "Your Shop");
      double price4 = AskForPrice(isbn, "No Name Shop");
      if (price1 <= price2 && price1 <= price3 && price1 <= price4)
      {
         shopName = "Super Shop";
      }
      else
      {
         if (price2 <= price1 && price2 <= price3 && price2 <= price4)
         {
            shopName = "The Book Shop";
         }
         else
         {
            if (price3 <= price1 && price3 <= price2 && price3 <= price4)
            {
               shopName = "Your Shop";
            }
            else
            {
               shopName = "No Name Shop";
            }
         }
      }      

      SendBookOrder(isbn, shopName);
   }
   else
   {
      ShowErrorMessage("The ISBN " + isbn + " isn't valid.");
   }
}

private bool IsValidIsbn(String isbn)
{
   return (Int32.Parse(isbn[0].ToString()) * 1
        + Int32.Parse(isbn[1].ToString()) * 2
        + Int32.Parse(isbn[2].ToString()) * 3
        + Int32.Parse(isbn[3].ToString()) * 4
        + Int32.Parse(isbn[4].ToString()) * 5
        + Int32.Parse(isbn[5].ToString()) * 6
        + Int32.Parse(isbn[6].ToString()) * 7
        + Int32.Parse(isbn[7].ToString()) * 8
        + Int32.Parse(isbn[8].ToString()) * 9
        + Int32.Parse(isbn[9]=='X'?"10":isbn[9].ToString()) * 10) % 11
        == 0);
}
Und auch der Teil, welcher den Namen des Shops zurück gibt, der den niedrigsten Preis hat, schreit danach in eine eigene Methode ausgegliedert zu werden. Tu ich ihm den Gefallen:
public void Buy(String isbn)
{
   if (IsValidIsbn(isbn))
   {
      string shopName = GetShopWithLowestPrice(isbn);
     
      SendBookOrder(isbn, shopName);
   }
   else
   {
      ShowErrorMessage("The ISBN " + isbn + " isn't valid.");
   }
}

private string GetShopWithLowestPrice(string isbn)
{
   string shopName;
   double price1 = AskForPrice(isbn, "Super Shop");
   double price2 = AskForPrice(isbn, "The Book Shop");
   double price3 = AskForPrice(isbn, "Your Shop");
   double price4 = AskForPrice(isbn, "No Name Shop");
   if (price1 <= price2 && price1 <= price3 && price1 <= price4)
   {
      shopName = "Super Shop";
   }
   else
   {
      if (price2 <= price1 && price2 <= price3 && price2 <= price4)
      {
         shopName = "The Book Shop";
      }
      else
      {
         if (price3 <= price1 && price3 <= price2 && price3 <= price4)
         {
            shopName = "Your Shop";
         }
         else
         {
            shopName = "No Name Shop";
         }
      }
   } 
   return shopName;
}

private bool IsValidIsbn(String isbn)
{
   return (Int32.Parse(isbn[0].ToString()) * 1
        + Int32.Parse(isbn[1].ToString()) * 2
        + Int32.Parse(isbn[2].ToString()) * 3
        + Int32.Parse(isbn[3].ToString()) * 4
        + Int32.Parse(isbn[4].ToString()) * 5
        + Int32.Parse(isbn[5].ToString()) * 6
        + Int32.Parse(isbn[6].ToString()) * 7
        + Int32.Parse(isbn[7].ToString()) * 8
        + Int32.Parse(isbn[8].ToString()) * 9
        + Int32.Parse(isbn[9]=='X'?"10":isbn[9].ToString()) * 10) % 11
        == 0);
}
Na jetzt sieht unsere "Buy" Methode doch schön übersichtlich aus. "Buy" scheint mir aber nicht der richtige Name zu sein. Ich glaube ich würde ihn in "OrderCheapestBook" ändern, und die Variable shopName brauche ich auch nicht mehr wirklich:
public void OrderCheapestBook(String isbn)
{
   if (IsValidIsbn(isbn))
   {
      SendBookOrder(isbn, GetShopWithLowestPrice(isbn));
   }
   else
   {
      ShowErrorMessage("The ISBN " + isbn + " isn't valid.");
   }
}
Wenden wir uns nun noch den ausgegliederten Methoden zu. Beginnen wir mit "GetShopWithLowestPrice". Alle Pfade setzen den shopName, welcher dann am Ende zurückgegeben wird. Die Rückgabe kann eigentlich auch jeweils sofort erfolgen. Dann spare ich mir die else-Zweige und die Variable shopName:
private string GetShopWithLowestPrice(string isbn)
{
   double price1 = AskForPrice(isbn, "Super Shop");
   double price2 = AskForPrice(isbn, "The Book Shop");
   double price3 = AskForPrice(isbn, "Your Shop");
   double price4 = AskForPrice(isbn, "No Name Shop");
   if (price1 <= price2 && price1 <= price3 && price1 <= price4)
   {
      return "Super Shop";
   }
   if (price2 <= price1 && price2 <= price3 && price2 <= price4)
   {
      return "The Book Shop";
   }
   if (price3 <= price1 && price3 <= price2 && price3 <= price4)
   {
      return "Your Shop";
   }
   return "No Name Shop";
}
Dennoch hat diese Funktion noch einen großen Makel. Sie sieht sehr stark danach aus, dass sie oft geändert werden könnte. Wenn sich der Name eines Geschäfts ändert, muss ich als Entwickler daran denken, dass dieser Name dann an zwei Stellen geändert werden muss. Riskant! Wenn ein neuer Shop hinzukommt, oder ein existierender entfernt wird, darf ich auch immer alle If-Bedingungen anpassen. Nein, das gefällt mir gar nicht.

Das ganze ruft nach einer Liste. Hier trickse ich jetzt rum und greife einfach auf die inzwischen mächtigen Listenverarbeitungen der Standardbibliotheken zurück. In meinem Fall, die von .NET:
private string GetShopWithLowestPrice(string isbn)
{
   var shopNames = new[] {
         "Super Shop",
         "The Book Shop",
         "Your Shop",
         "No Name Shop"};
  
   return shopNames.OrderBy(name => AskForPrice(isbn, name)).First();
}
Jetzt sind Änderungen für diese Funktion kein Problem mehr. Nur die Liste muss angepasst werden. Jetzt eröffnet sich hier auch die Möglichkeit, dass die Namen aus einer Konfigurationsdatei geladen werden können. Das würde die Software viel flexibler machen. Aber wir sind jetzt nicht dabei, neue Funktionen umzusetzen. Refactoring hat uns jetzt aber die Möglichkeit gegeben (und aufgezeigt) dies leichter zu tun.

Gehen wir zur "IsValidIsbn" Funktion. Hier gefällt mir zuerst einmal nicht, dass die Behandlung der zehnten Stelle so aus der Reihe tanzt. Sonderfälle sind immer ärgerlich. Die ersten neun Stellen scheinen immer Ziffern zu sein, die konvertiert werden können. Nur die zehnte Stelle kann anscheinend auch ein "X" enthalten, welches dann als "10" behandelt werden muss. Mhh...mhh...
Nicht die zehnte Stelle ist der Sonderfall, sondern die ersten neun Stellen sind der Sonderfall für die allgemeinere Behandlung der zehnten Stelle. Also kann ich die ersten neun Stellen mit dem gleichen Algorithmus behandeln wie die zehnte Stelle.

Vorher extrahiere ich diesen Check mit dem anschließenden Parsen in eine extra Funktion:
private int ParseIsbnDigit(char digit)
{
   return Int32.Parse(digit == 'X' ? "10" : digit.ToString());
}
Diese Funktion wende ich jetzt auf alle Stellen an:
private bool IsValidIsbn(String isbn)
{
   return (
          ParseIsbnDigit(isbn[0]) * 1
        + ParseIsbnDigit(isbn[1]) * 2
        + ParseIsbnDigit(isbn[2]) * 3
        + ParseIsbnDigit(isbn[3]) * 4
        + ParseIsbnDigit(isbn[4]) * 5
        + ParseIsbnDigit(isbn[5]) * 6
        + ParseIsbnDigit(isbn[6]) * 7
        + ParseIsbnDigit(isbn[7]) * 8
        + ParseIsbnDigit(isbn[8]) * 9
        + ParseIsbnDigit(isbn[9]) * 10)
        % 11 == 0);
}
Ich höre schon wieder "Liste" rufen. Bitte:
private bool IsValidIsbn(String isbn)
{
   return isbn
      .Select((digit, index) => ParseIsbnDigit(digit) * (index + 1))
      .Sum() % 11 == 0;
}
Schauen wir uns das Endergebnis in der Gesamtsicht an:
public void OrderCheapestBook(String isbn)
{
   if (IsValidIsbn(isbn))
   {
      SendBookOrder(isbn, GetShopWithLowestPrice(isbn));
   }
   else
   {
      ShowErrorMessage("The ISBN " + isbn + " isn't valid.");
   }
}

private string GetShopWithLowestPrice(string isbn)
{
   var shopNames = new[] {
         "Super Shop",
         "The Book Shop",
         "Your Shop",
         "No Name Shop"};
  
   return shopNames.OrderBy(name => AskForPrice(isbn, name)).First();
}

private bool IsValidIsbn(String isbn)
{
   return isbn
      .Select((digit, index) => ParseIsbnDigit(digit) * (index + 1))
      .Sum() % 11 == 0;
}

private int ParseIsbnDigit(char digit)
{
   return Int32.Parse(digit == 'X' ? "10" : digit.ToString());
}
Ob diese Form nun verständlicher und leichter wartbar ist als die Ausgangsform, muss der Leser selbst beurteilen.

Noch einige Worte zum Schluss: Hätten Kommentare es nicht auch getan?

Ein unverständlicher Quelltext mit Kommentaren ist natürlich einem unverständlichen Quelltext ohne Kommentare vorzuziehen. Kommentare sind nicht das Übel, aber sie können ein Indikator dafür sein, dass der Quelltext so schlecht ist, dass er ohne Kommentare nicht zu verstehen ist. In diesem Fall sollte man so weit refaktorisieren, bis man die Kommentare nicht mehr benötigt.

Allgemein sollten Kommentare nicht erklären, was gemacht wird - das sollte der Quelltext tun. Kommentare sind jedoch wichtig, um zu dokumentieren warum etwas gemacht wurde. So würde es sich zum Beispiel anbieten, in die Methode "IsValidIsbn" ein Kommentar einzufügen, dass eine Referenz auf die ISBN-Spezifikation enthält, oder sonst wie erklärt, warum man so und nicht anders, die ISBN auf Gültigkeit prüft.

Montag, 1. Juli 2013

Freunde besser verstehen

>>Er hat wohl ebenfalls seine Leute<<, bemerkte Mumm verdrießlich.
>>Ja. Auch in dieser Stadt. Und ich habe Leute bei ihm. Man nennt dies Politik, Mumm. So etwas versuchen wir in der Regierung.<<
>>Hier bei uns? Leute die uns bespitzeln? Ich dachte, wir wären mit dem Niederen König befreundet!<<
>>Natürlich sind wir das. Und je mehr wir übereinander wissen, desto bessere Freunde sind wir. Warum sollten wir unsere Feine bespitzeln? Welchen Sinn hätte das?<<

Terry Pratchet, "Klonk!", 2008, S. 321

Samstag, 29. Juni 2013

Don't be evil

Nachdem ich nun mein von Google bereitgestelltes Blog mit Google+ verbunden habe, möchte ich noch auf einen Artikel von Hadmut Danisch hinweisen, in welchem er die These entwickelt, dass Google eine Scheinfirma der amerikanischen Geheimdienste sein könnte.

Freitag, 28. Juni 2013

Stromausfall

Als ich heute in den Nachrichten von einem mehrstündigen Stromausfall in Bad Nauheim hörte, wurde ich an einen Artikel auf Zettels Raum erinnert, der über eine Technikfolgenabschätzung an den Deutschen Bundestag mit dem Titel "Gefährdung und Verletzbarkeit moderner Gesellschaften am Beispiel eines großräumigen und langandauernden Ausfalls der Stromversorgung" berichtet.

Donnerstag, 27. Juni 2013

Informatik statt Ökonomie

Ich wurde gestern gefragt, warum ich denn in den letzten Tagen vermehrt über Programmierung schreibe und weniger über Wirtschaft und Politik.

Das hat zwei Gründe:

Zum einen würde ich mich gerne mal wieder auf anderen Programmiergebieten austoben. Vielleicht mal ein wenig Androidentwicklung oder 3D-Programmierung. Dem Wunsch, sich in anderen Technologien auszuprobieren, steht jedoch noch die Abwesenheit eines motivierenden Projekts im Wege.

Hat also jemand eine Idee für ein neues Spielkonzept oder eine nützliche Anwendung, die mich mitreisen kann?

Der zweite Grund ist, dass ich im Bereich der Ökonomie viele Fragen habe, aber niemanden, der sie mir beantwortet. Wo ich vor fünf Jahren noch dachte, "man hab ich 'ne Ahnung", weiß ich jetzt nichts mehr.

Deswegen stürz ich mich jetzt (bis zu meinem nächsten Rückfall), auf die Softwareentwicklung. Die Diskussionen dort sind ähnlich politisch (Welche Programmiersprache? Welcher Editor? Welches Technologiekonzept? Welches Design? Welches Projektmanagementverfahren? Welche Tools?), aber (oft) sachlicher.

Mittwoch, 26. Juni 2013

Architektur: Treppe verschmilzt mit Wand

Auf dem Campus der Uni Düsseldorf

Montag, 24. Juni 2013

Struktur von funktionalen Programmen

Die Struktur von objektorientierten Programmen kann ich ja mit den Strukturdiagrammen der UML (Klassendiagramm, Objektdiagramm usw.) darstellen.

Hat jemand eine Idee, wie man die Struktur von funktionalen Programmen bzw. OO/FO-Hypriden darstellen kann?

Prinzipiell könnte ich natürlich jede Funktion und jeden Lambda-Ausdruck als Funktion einer Klasse modellieren. Ich vermute jedoch, dass dies sehr unübersichtlich wird und evtl. steht ja durch das funktionale Paradigma eine ganz neue Visualisierung zur Verfügung, die ganz neue Erkenntnisse ermöglicht.

Samstag, 22. Juni 2013

Refactoring

Gibt es noch irgendeinen Programmierer, der noch nicht von Refactoring gehört hat? Diesen möchte ich vorschlagen, sich einmal damit zu beschäftigen. Gerne kann ich auch auf Wunsch den einen oder anderen Artikel dazu schreiben. Empfehlen möchte ich jedoch auch gerne das Buch, welches mir vor einigen Jahren die Konzepte des Refactorings auf unterhaltsame und kurzweilige Weise nahebrachte: Refactoring. Oder wie Sie das Design vorhandener Software verbessern.

Ok, als ich es gekauft habe war es noch günstiger als die aktuelle englische Ausgabe.


Freitag, 21. Juni 2013

Geplante Obsoleszenz

Ich verstehe die Idee hinter dem Begriff der geplanten Obsoleszenz nicht ganz.

Ihr zufolge baut ein Unternehmen gezielt Produkte, die nach kurzer Zeit kaputtgehen, damit der Kunde erneut bei diesem Unternehmen noch einmal das gleiche Produkt kauft. Es geht also nicht darum, einfach nur billige Produkte schlechter Qualität herzustellen, um einmalig und kurzfristig Gewinn einzufahren. Die Idee ist stattdessen, dass gezielt kurzlebige Produkte hergestellt werden - obwohl bei gleichen Kosten auch langlebige Produkte möglich wären - damit der Kunde erneut dieses Produkt kauft und somit langfristig den Absatz sichert.

Wenn die Kunden sich wirklich so verhalten, dann würde ich als Unternehmen das auch machen, denn dann scheint es das zu sein, was die Kunden wollen: Produkte die schnell kaputtgehen.

Seiten wie MURKS? NEIN DANKE! vermitteln jedoch ein anderes Verbraucherbild. Verbraucher aber, die eher lange Produktlebensdauern schätzen, würden der Idee der geplanten Obsoleszenz zuwiderlaufen.

Solche Verbraucher würden eben nicht erneut das gleiche Produkt bei derselben Firma kaufen, sondern das nächste Mal ein anderes Produkt bei einer anderen Firma. Langfristige Absatzsicherung sieht für mich anders aus.

Mittwoch, 8. Mai 2013

"Rettet unsere Söhne"

Für kurze Zeit kann man noch das Buch von Arne Hoffmann "Rettet unsere Söhne" kostenlos herunterladen.

Dienstag, 23. April 2013

Endlich wird mal das Gärtnern reguliert

Nur gut, dass wir den Staat - auch als übernationale EU - haben, die uns vor den bösen Marktkräften beschützt und beherzt alles vorschreibt und verbietet, damit wir nicht durch Vielfalt geschädigt werden. Was ist diesmal eigentlich die Begründung dafür?

Donnerstag, 4. April 2013

Ist der Markt im Gesundheitswesen schädlich?

Der Artikel "Bitter Pill: Why Medical Bills Are Killing Us" beschreibt die Verhältnisse im amerikanischen Gesundheitswesen. Dem Artikel nach scheinen Krankenhäuser bzw. Gesundheitsproduktanbieter allgemein natürliche Monopole zu sein, deren Preise nicht durch den Wettbewerb reguliert werden.

Weiß einer meiner Leser mehr über das amerikanische Gesundheitssystem und kann mir ggf. erklären, warum sich bei den erwirtschafteten Profiten keine Konkurrenten hinzugesellen, welche die Preise drücken könnten?

Mittwoch, 27. Februar 2013

Wie würden Sie entscheiden?


1. Fall:
Zwei Personen entwickeln eine Produktidee mit der sie nach zwei Jahren Produkterstellung einen einmaligen Umsatz von einer Million machen. Sie arbeiten beide gleichermaßen an der Erstellung des Produkts. Wie sollten die Einnahmen aufgeteilt werden?

2. Fall:
Die Produktidee hatte nur eine der beiden. Sie holt sich die zweite Person mit ins Boot, da nur beide zusammen das Produkt bauen können. Wie sollten die Einnahmen jetzt aufgeteilt werden?

3. Fall:
Eine der beiden möchte ihre Einnahmen nicht erst in zwei Jahren in einem Packet haben, sondern bereits jeden Monat der zwei Jahre eine feste Auszahlung bekommen. Wie hoch sollte diese Auszahlung sein?

4. Fall:
Fall 3 mit der Änderung, dass nun die Einnahme in zwei Jahren nicht mehr sicher ist. Der Kunde kann das erstellte Produkt abnehmen, oder auch nicht. Wie hoch sollten die monatlichen Auszahlungen an die eine Person nun sein?

5. Fall:
Ein Großteil der Zeit wird nur von einer der beiden an dem Produkt gearbeitet. Die andere Person verrichtet einen geringeren Arbeitsaufwand, jedoch kann diese Tätigkeit nur von dieser Person verrichtet werden und ist nicht zu ersetzten. Wie sollten die Einnahmen aufgeteilt werden?

6. Fall:
Würden Sie die Verteilung jeweils verändern, wenn sie erfahren, dass eine der beiden ein hohes Vermögen besitzt und die andere nicht?

Welche weiteren Kriterien würden Sie zur Änderung der Aufteilung bewegen?

Zettel

Das ihn von anderen Blogs positiv abhebende Zettels waren die gut recherchierten Artikel und die auf hohem Niveau geführten Diskussionen. Ein Nachruf auf den Blogger Zettel bei PPQ.

Montag, 7. Januar 2013

Kleinigkeiten


Dieser Blog ist momentan ziemlich verwaist. Ein paar Kleinigkeiten nehmen mich zur Zeit stärker in Anspruch.

Eine solche Kleinigkeit ist meine Bachelorarbeit, die ich bis spätestens 12. Februar abgegeben haben muss. Allerdings komme ich da überhaupt nicht voran, weswegen ich jetzt mal wieder einen Eintrag schreibe. Am 13. Februar kann ich dann hier berichten, wie ich durchgefallen bin. Bis dahin kann ich ja mal kurz das Thema vorstellen.

Es geht um den Einfluss der Identiät eines Menschen auf dessen wirtschaftliche Entscheidungen und auf die Entscheidungen anderer. Diese allgemeine Theorie versuche ich auf eine konkrete Studie in einem indischen Call-Center anzuwenden. Es gilt die Frage zu beantworten, wie die nationale Identität, die Berufsidentität und die Indentifizierung mit der Organisation die Kündigungsbereitschaft der Mitarbeiter beeinflussen. Dabei muss auch der Zusammenhang mit der Arbeitsleistung beachtet werden. Insbesonders die Varianz der Leistung scheint den jeweiligen Identitätseinfluss zu moderieren. Jetzt muss ich für die empirischen Daten ein theoretisches (mathematisches) Modell finden, dass diese Zusammenhänge erklären kann. Mal sehen wo es rumliegt.

Nun gut. Bis voraussichtlich Februar also.