3.3.2008

Google's MapReduce

Bei Joel on Software gibt es ein lesenswertes Tutorial über MapReduce - das ist der Name für den bei Google zuständigen Algorithmus, der in kürzester Zeit viel zu viele Treffer für eine Suchanfrage produziert.

Die Zentrale von Google beruht nicht auf einem patentierten Geheimnis, sondern auf Wissen, das in der public-domain verfügbar ist. Das gibt ein schönes Beispiel für den Unsinn von Softwarepatenten. Wenn es Patente für gewisse Basiskonzepte gäbe, wären Unternehmen wie Google und Apple nicht möglich (letzteres hat bekanntlich ebenfalls "bloß gestohlen" und aus Ideen der Xerox-Labs ein Geschäft gemacht).

Joel verbindet das Thema mit einer Attacke auf Java (was ich - nun ja: verstehe) und einem Lob auf prozedurale Sprachen (wo ich eher Bedenken habe). Ich bin der Meinung, daß C++ sehr wohl das kann, was Joel sehen will, und zwar wesentlich eleganter als mit der Übergabe von Pointern auf Funktionen.

Consider:

void map (void* array) {}
class Array { virtual void map () {} };

Beides funktioniert identisch:

Array array; map (array); Array array; array.map ();

Die objektorientierte Variante hat aber zwei Vorteile:

  • durch Subclassing kann man das Array weiter parametrisieren - das geht bei Übergabeparametern an Funktionen nur mit Tricks.
  • die map()-Funktion muß ich nicht als Pointer übergeben, sondern kann sie - via Inheritance - überschreiben.
  • Consider:

    class StringArray : Array { String strings; void map () {/*work with String*/} }; class IntArray : Array { Int ints; void map () {/*work with Int*/} };

    Noch eleganter kann man das ausdrücken, wenn man Interfaces bemüht:

    class XMap { virtual void run () = 0; }; class StringArray : Array, XMap { void run () {/* */} };

    Der Benutzer der Map-Funktion bekommt lediglich eine Referenz auf ein XMap-Objekt - was sich dahinter verbirgt, kann dann alles sein, z.B. das komplette Internet.

    (Kommentarfunktion z.Zt. deaktiviert.)