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.
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)
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)
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)
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)
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.
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.