Aaron Fischer Ingenieur, Vater, Heimwerker, Problemlöser

07 März, 2009

Programmierwettbewerb 2: Auswertung

TL;DR:

Zuerst einmal möchte ich mich in aller Form dafür entschuldigen, dass ich so lange nichts von mir hören lassen habe und - noch schlimmer - den Programmierwettbewerb noch nicht aufgelöst habe. Seit knapp zwei Monaten liegen nun schon die Abgaben auf meinem Desktop und ich habe mir geschworen, erst die Auswertung zu machen, bevor ich irgend etwas anderes schreibe. Ich tat mich so schwer dabei, weil die Einsendungen mich so überrascht haben und so vielseitig waren, dass ich mir lange Zeit Gedanken gemacht habe, wie ich diese tollen Arbeiten entsprechend würdigen und bewerten könnte.

Das Problem war, dass die Einsendungen so grundlegend verschieden waren, dass man sie fast nicht miteinander vergleichen konnte. In allen abgegebenen Projekten steckt zudem so viel Arbeit, Mühe und Detailverliebtheit, dass ich es kaum geschafft habe, einen zum Sieger zu erklären und die anderen leer ausgehen zu lassen. Aus diesem Grunde erhalten alle Teilnehmer für ihre tolle Abgabe ein Buch und der Sieger ein zusätzliches Dankeschön.

Gewinn

Ganz herzlich bedanken möchte ich mich natürlich bei allen, die mitgemacht haben. Das wären Andreas Maier, Florian Eitel, Ruben Müller und Uwe Klawitter. Ich hoffe, ihr habt jetzt nicht die Lust verloren, weil es so lange gedauert hat. Ich verspreche hiermit feierlich, dass die nächste Auswertung eines kommenden Programmierwettbewerbs schneller geht.

So, nun zu den Einsendungen: Ich habe versucht, die relevanten Punkte herauszuschreiben und den Code und die gesamte Anwendung nach den vier zuvor angegebenen Gesichtspunkten Features, Codedesign, Nutzung der Sprachfeatures und Usability zu bewerten. Wenn ich bei einem Punkt komplett falsch liege, würde ich mich sehr über einen Kommentar an der Seite freuen.

Ruben Müller

Sprache: ActionScript
Features: 1/5
Codedesign: 3/5
Nutzung der Sprachfeatures: 3/5
Usability: 4/5
(Download)

GUI

Features

Dadurch, dass der Chat-Client in ActionScript und Flash programmiert ist, läuft er auf jedem Rechner, der Flash installiert hat.

Positiv

Exzessive Nutzung vom Delegate-Pattern, um beim Datenempfang und beim Verbinden vom Socket auf die entsprechenden Methoden zu delegieren. Hier wurde strikt zwischen Darstellung und Logik getrennt.

Farbliche Markierung von Systemnachrichten, Benutzernamen und normalen Nachrichten.

Der Name: Macc: Most awesome chat Client :-)

Negativ

Wenig Dokumentation

Das Einfärben der Nachrichten funktioniert in manchen Fällen nicht richtig, wenn im Benutzernamen ein * vorkommt oder wenn die geschickte Nachricht in einem falschen Zeichensatz Nachrichten schickt.

Umlaute werden nur unter OSX dargestellt. Unter Linux gibt es Darstellungsprobleme. Unter Windows hab ich es nicht getestet.

Das Senden und Empfangen von Nachrichten findet in unterschiedlichen Klassen statt, hier hätte man die beiden Funktionalitäten unter einen Hut bringen können.

Geilste Stelle im Code

if (success) {
    Debug.trace( "macc.as :: Connection succeeded, yay for the cheeseburgers! :D", 3 );
}

Andreas Maier

Sprache: F#, WPS(XAML), C#
Features: 5/5
Codedesign: 5/5
Nutzung der Sprachfeatures: 5/5
Usability: 4/5
(Download)

GUI

Features

GUI und Kommunikationslogik sind hier komplett voneinander getrennt. Und nicht nur das, sie wurden auch in unterschiedlichen Programmiersprachen realisiert. Die GUI ist ein WPF-Anwendung mit C# und die restliche Logik wurde in F# geschrieben. Eine sehr interessante Kombination. Auch hier wurde die Trennung von GUI und Logik strikt eingehalten; Interfaces und Factories sorgten hier für die lose Kopplung.

Die GUI bietet alles, was man aus dem Server rausholen hätte können. Ein Chatfenster zeigt den Chat an, Nachrichten vom Server sind speziell markiert. Rechts befindet sich eine Userliste, die immer die aktuell im Chat befindlichen User anzeigt. Den Nicknamen kann man auch bequem über die GUI ändern.

Positiv

Verwendung meherer Sprachen in einem Projekt. Die Wahl der Sprache F# war äußerst mutig und hat sicher viel Zeit in Anspruch genommen. Dies hat sich aber ausgezahlt, der Code ist sehr schlank und auch wenn man F# nicht komplett verstanden hat, versteht man, was passiert.

Eine Schicke GUI mit tollen Extrafeatures

Es lag noch eine Dokumentation bei, die den Code und das Vorgehen beschreibt. Das hat mir sehr geholfen zu verstehen, wie was zusammenwirkt.

Negativ

Ich habe alles Mögliche versucht, das Programm zum Laufen zu bringen, doch ich bin kläglich gescheitert. Selbst im Windows-Pool konnte ich das Programm nicht compillieren bzw. ausführen. Vermutlich fehlten mir einfach die Kenntnisse zu Visual Studio und Windows. Da in der Aufgabenbeschreibung stand, dass das Programm Plattformunabhängig sein soll, muss ich hier bei der Usability einen Punkt abziehen.

Geilste Stelle im Code

fun dataEvArgs ->> 
  let dat = dataEvArgs.Data;
  if x.IsGetUsersMessage(dat) then
      (x.usersAvailableFunc.Invoke(dat.Split([|"\\n"|])
      // The pipeline operator rocks :-)!!
      |>> Seq.filter (fun element ->> element <<>> null 
                                 && element.Trim().Length >>= 2)
      |>> Seq.map (fun element ->> 
          (let mutable nickName = element.Trim().Substring(1, element.Trim().Length-1).Trim()
           while nickName.StartsWith("*") do
               nickName <- nickName.Substring(1, nickName.Length-1).Trim()
           new User(nickName)))
      |>> List.of_seq))
  else 
      ())

Florian Eitel

Sprache: Ruby, Bash
Features: 3/5
Codedesign: 5/5
Nutzung der Sprachfeatures: 5/5
Usability: 3/5
(Download)

GUI

Features

Florian ging einen komplett anderen Weg. Er reduzierte sein Programm auf das mindeste Minimum, in dem er Features des Linux-Systems nutzte. Inspiriert durch suckless.org kommuniziert der Client mit Named Pipes. Das Chat-Programm kontrolliert nur die Named Pipes in und out, die dann mit anderen Programmen oder einem simplen echo und tail beschrieben und ausgelesen werden können. Über Hooks kann dann auf Events reagiert werden.

Um die Kommunikation mit dem Server zu vereinfachen, lag ein kleines Shell-Skript bei, das alle Eingaben in die in-Pipe schreibt. Für die farbige Ausgabe wurde das Ruby gem term/ansicolor verwendet. Zudem konnte das System mit dmenu (aus dem dwm Windowmanager) betrieben werden.

Positiv

Die Einfachheit des Programms hat mich begeistert. Dadurch, dass simple Named Pipes verwendet wurden, wurde hier ebenfalls die Logik von der Darstellung getrennt.

Eine README beschrieb das komplette System und deren Aufbau, was sehr hilfreich war.

Negativ

Es gab keinerlei Möglichkeit, sich eine Benutzerliste anzuzeigen, was allerdings etwas umständlich gewesen wäre, dies auch mit Named Pipes zu lösen.

Die Benutzung des Programms erfordert einiges an Linux-Kenntnis, um es zum Laufen zu bringen.

Geilste Stelle im Code

def def_hook name, *aliases
# Workaround da define_method vor ruby 1.9 keine Blocks als Parameter unterstützt
eval_methods name, "
  def #{name}(&block)
    ( @#{name} ||= Array.new ) << block if block_given?
    return @#{name}
  end", aliases
end

Uwe Klawitter

Sprache: Java
Features: 1/5
Codedesign: 4/5
Nutzung der Sprachfeatures: 5/5
Usability: 4/5
(Download)

GUI

Features

Uwe ging den traditionellen Weg über Java. Trotz Java hat er es geschafft mit relativ wenig und übersichtlichem Code die Kernaufgaben zu erfüllen. Selbst der Code zur Swing-GUI ist anschaulich und übersichtlich. Im Code selbst wurden die Features von Java voll ausgeschöpft; eine Queue-Objekt sammelt alle Nachrichten zur weiterverarbeitung und der komplette Code kommt ohne Telnet-Wrapper o.ä. aus. Alles in allem macht der Code einen sehr stabilen Eindruck.

Positiv

java -jar AChat.jar und läuft :)

Übersichtlicher Code trotz Java.

Negativ

Leider biete die GUI nicht all zu viel Möglichkeiten. Hier hätte man noch einiges rausholen können. Beispielsweise eine Userliste oder einen Button zum Ändern des Benutzernamens. Deshalb hier auch ein Punkt Abzug bei Usability.

Geilste Stelle im Code

package cowabunga;

Aaron Fischer

Sprache: Ruby, (XML)
(Download)

Ich habe natürlich auch eine Referenzimplementierung in Ruby gemacht :-) Verwendet habe ich dazu libgnome2 und glade für die GUI.

GUI

Der Server

Der Server selbst - gegen den ihr alle programmiert habt - ist in Ruby geschrieben und nutzt den gserver (GenericServer) von Ruby. Wer ihn sich mal anschauen möchte, kann ihn hier herunterladen.

Bewertung

Wie schon anfangs geschrieben, ist es mir sehr schwer gefallen, einen Gewinner zu ermitteln, weil ich alle Einsendungen toll fand und sich die einzelnen Einsendungen sehr schwer direkt vergleichen lassen. Ich habe mich dazu entschlossen, euch zu entscheiden, wer den Hauptpreis bekommen soll. Gebt einfach am linken Rand eure Stimme ab (am besten noch mit einer kurzen Begründung). Natürlich bekommen alle, die mitgemacht haben ein Buch von mir. Schickt mir einfach eure Adresse per E-Mail.

Noch einmal vielen Dank fürs Mitmachen! Ich hoffe, es gibt wieder solch tolle Einsendungen bei kommenden Programmierwettbewerben. Mir hat es sehr viel Spaß gemacht, ich hoffe euch auch.