Labels

FizzBuzz (2) PHP (2) Quizzler (1)

Dienstag, 16. November 2010

Erste Kritik an FizzBuzz

Dass einige Bewerber die FizzBuzz-Aufgabe nicht lösen konnten, soll ab jetzt nicht weiter stören. Die Diskussion um Blödheit und Nichtblödheit von Absolventen überlasse ich liebend gern Spiegel-, Zeit- und Heise-Online.

Ab jetzt wird mit FizzBuzz gespielt! Fingerübungen für Programmierer! Wir Programmierer sind Spielkinder!

Mit der ersten Variante - ich gehe das nochmal durch - kommt man vielleicht durch ein Bewerbungsgespräch, aber an der Front hat so ein Code nichts zu suchen. Sowas kann man als Programmierer einfach nicht stehen lassen. Das Berufsethos fängt dann sonst zum Randalieren an.
$i=1;
while ($i<=100) {
So, die Schleife ist hier quasi in Stein gemeißelt. Sowas geht gar nicht. Warum soll sich ein Programmierer nicht für die FizzBuzz-Werte zwischen 306 und 983 interessieren dürfen? Das muss ich ändern!
$antwort = '';
$antwort.= (istTeilervon(3,$i)?'Fizz':'');
$antwort.= (istTeilervon(5,$i)?'Buzz':'');

Hier sehe ich gleich zwei Probleme:
- zum einen sind die Teiler auf drei und fünf festgelegt; warum soll das nicht auch mit vier und sieben funktionieren?
- zum anderen sind die Zahlen drei und fünf an die Worte Fizz und Buzz gekettet; das kann ich so auch nicht gebrauchen
Und, hey, warum eigentlich nur zwei Zahlen? Warum macht man nicht ein Fizz, Buzz, Tozz mit drei Zahlen? Oder ein Wulli, Rulli, Tulli, Zulli und Pulli mit fünf Teilern?

echo (empty($antwort)?$i:$antwort).' ';

Das ist besonders schön! PHP wurde für die Webentwicklung erfunden, aber dieses Skript kann man nicht in einen Webserver einbinden. Naja, man kann schon, aber es macht keinen Sinn. Der Webdesigner hat keinen Zugriff auf die Daten und kann sie so nicht per CSS (formatieren|verhübschen|verhunzen).
function istTeilervon($teiler, $cand) {
return ($cand % $teiler) == 0;
}
Im Bewerbungsprogramm werden die Parameter $cand und $teiler fest im Code verankert. Es kann also zu keinen Bereichsüberläufen oder Exceptions kommen. In der Realität müssen die Parameter aber abgesichert werden. Wenn $teiler gleich Null ist, dann steigt neben der Mathematik eben auch die PHP-Engine aus.

Es ist ja nicht so, dass die Welt händeringend auf ein korrektes FizzBuzz-Programm wartet. Aber der Programmierer, der Technokrat, das Berufsethos und der Blogger in mir sagen: "machs trotzdem"

Derart überstimmt werde ich also in den Folgeposts aus dem simplen FizzBuzz eine PHP-Library machen. Es geht bald weiter!

Sonntag, 14. November 2010

Das FizzBuzz-Problem

Einer der Mitbegründer von StackOverflow, Jeff Atwood, hat eine interessante erschreckende Entdeckung gemacht:
Bei ihm bewerben sich Programmierer, die nicht programmieren können! Hier ist der Originalartikel auf englisch dazu.

Er stellt den Bewerbern im Vorstellungsgespräch eine simple Programmieraufgabe und einige von ihnen scheitern daran.

Die Aufgabe ist wirklich simpel:

Schreiben Sie alle Zahlen von 1 bis 100 auf. Wenn eine Zahl durch drei teilbar ist, schreiben Sie statt der Zahl das Wort "Fizz". Wenn die Zahl dagegen durch fünf teilbar ist, schreiben Sie statt der Zahl das Wort "Buzz".
Sollte die Zahl sowohl durch drei als auch durch fünf teilbar sein, schreiben sie statt der Zahl das Wort "FizzBuzz".
Nutzen Sie eine Programmiersprache Ihrer Wahl.

Es gibt Leute, die keine Ahnung haben, wie sie die gestellte Aufgabe lösen sollen. Das ist soweit nicht schlimm. Schlimm wird es, wenn sich ausgerechnet solche Menschen um Programmiererstellen bewerben.

Aus (richtiger) Programmierersicht ist das eine simple Schleife mit ein paar Conditionals (nein, das hat nichts mit Frisuren zu tun; es sind einfach wenn/dann-Fragen). Eine Quick-and-Dirty-Lösung kann ein (richtiger) Programmierer innerhalb ein-zwei Minuten skizzieren. Ich zeige das mal am Beispiel PHP:
<?php

function istTeilervon($teiler, $cand) {
return ($cand % $teiler) == 0;
}

$i=1;
while ($i<=100) {
$antwort = '';
$antwort.= (istTeilervon(3,$i)?'Fizz':'');
$antwort.= (istTeilervon(5,$i)?'Buzz':'');
echo (empty($antwort)?$i:$antwort).' ';
++$i;
}

?>

Das war's! Mehr braucht man in Jeffs Vorstellungsgespräch nicht.
Das ist jetzt natürlich nur eine mögliche Lösung, und die hat auch ihre Schwächen. Aber für eine schnelles Q&D-Programm, das nicht in die Produktion soll, reicht es.

So sieht es dann aus, wenn man das Programm mit php fizzbuzz.php startet:

1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz 16 17 Fizz 19 Buzz Fizz 22 23 Fizz Buzz 26 Fizz 28 29 FizzBuzz 31 32 Fizz 34 Buzz Fizz 37 38 Fizz Buzz 41 Fizz 43 44 FizzBuzz 46 47 Fizz 49 Buzz Fizz 52 53 Fizz Buzz 56 Fizz 58 59 FizzBuzz 61 62 Fizz 64 Buzz Fizz 67 68 Fizz Buzz 71 Fizz 73 74 FizzBuzz 76 77 Fizz 79 Buzz Fizz 82 83 Fizz Buzz 86 Fizz 88 89 FizzBuzz 91 92 Fizz 94 Buzz Fizz 97 98 Fizz Buzz

Für Programmierer ist das also wirklich nicht schwierig. Aber warum scheitern manche Kandidaten an dieser Aufgabe? Sie haben schließlich in der Regel einen Bachelor in CS (Computer Science). Bemerkenswert ist auch, dass der Originalartikel 2007 geschrieben wurde, aber Jeff Atwood hat dieses Jahr (2010) nochmal nachgelegt: es hat sich nichts geändert. Es fliegen bei diesem Simpeltest immer noch Bewerber durch! Oder "Senior Programmer" brauchen mehr als zehn Minuten für die Lösung.

Damit liegt es nicht an einem extrem verdummten Jahrgang. In den Diskussionen findet man eher den Hinweis, das bei der Ausbildung das selbstständige Denken "wegtrainiert" wurde.
Atwood hat es hier also mit Leuten zu tun, die zwar auswendig gelernte "Best Practices" für memorierte Use Cases anbieten können, aber bei neuartigen, noch so simplen, Problemen ins Schleudern kommen. Es wurde ihnen abgewöhnt, ein eigenes Näschen für den Lösungsweg zu entwickeln.

Das ist nicht neu: sowas verbindet man hier in Deutschland gewöhnlicherweise mit den BWL-Absolventen. Die entsprechenden Sprüche findet man regelmäßig bei Heise- oder auch Spiegel-Online. Dass es auch die Guten trifft, also Naturwissenschaftler, Ingenieure und Informatiker, erklären die Foristen dann immer damit, dass alles der heiligen BWL untergeordnet wurde. Im Heiseforum habe ich dieses Beispiel auch gefunden. Es sollen also auch in Deutschland Bewerber an der FizzBuzz-Aufgabe gescheitert sein. Ich formuliere das jetzt bewusst vorsichtig, weil das Heise-Forum eine Trollhölle ist. Es kann auch sein, dass da irgendein Depp bloß irgendwas behauptet. Atwood dagegen ist eine glaubwürdige Quelle.

Ich glaube ja nicht, dass früher unbedingt alles besser war. Ich habe hier ein Buch von Neil Postman, "Der Verlust des Denkens", rumliegen, dass er in den 80ern geschrieben hat. Auch der nette Herr Kant wird mit seinem "Sapere Aude" und dem Vorwurf der selbstverschuldeten Unmündigkeit seinen Anlass gehabt haben. Früher liefen auch schon Leute rum, die Scripted Dokus auf RTL gekuckt hätten.

Das ist aber alles gar nicht mein Thema. Das hier ist ein technokratisches Programmiererblog, d.h. wir werden in den Folgeposts ein bisschen mit FizzBuzz spielen. Wird bestimmt lustig.

Was ist denn der Quizzler?

Vom Quizzler habt Ihr bestimmt noch nie was gehört, daher gebe ich euch mal eine kleine Kurzübersicht im FAQ-Stil.

Quizzler? Was soll das denn sein?

Quizzler ist mein OpenSource-Projekt, das ich derzeit in der Mangel habe. Es ist noch in einem frühen Stadium, abgesehen von diesem Post ist noch nichts veröffentlicht.

Vision von Quizzler

Auch wenn mich ein hanseatischer Alt-Kanzler jetzt zum Arzt schicken würde; es steckt tatsächlich eine Vision dahinter:

der Quizzler ist ein plattformunabhängiges Programmiererframework, mit dem einfach Multiple-Choice-Quizze erstellt werden können. Dabei achtet der Quizzler darauf, dass die Quizze zwischen den Plattformen ausgetauscht werden können. Das bedeutet jetzt, dass ein Quiz auf sagen wir einem PHP-Server über den Browser gespielt werden kann, es aber auch eine Android-App gibt, in die man dieses Quiz lädt.

An wen wendet sich der Quizzler?

Wie es der Name "Programmierframework" schon sagt hauptsächlich an Programmierer. Ich will zwar voll funktionierende Beispiele mit ausliefern, aber die Idee ist doch, dass Programmierer es für ihre Bedürfnisse weiter anpassen.

Gibt es das nicht schon?

Ja, Quizspiele gibt es in Hülle und Fülle, aber keines hat die Ausrichtung wie der Quizzler auf Sprach- und Plattformunabhängigkeit. Meistens sind sie dann auf eine Sprache wie PHP und eine Datenbank wie mySQL festgelegt. Die werden zwar auch vom Quizzler unterstützt, aber eben nicht ausschließlich.

Welche Lizenz wird verwendet?

Auf alle Fälle Opensource. Genaueres hängt auch ein bisschen von den Sprachen ab. Der Quizzler wird sich da einfach harmonisch einfügen.

Was ist die Rolle dieses Blogs?

Es beschreibt die Entwicklung des Quizzlers und ist damit ein begleitendes Programmierertutorial am lebenden Objekt.

Entsteht der Quizzler nach einer bestimmten Methode?

Um Gottes Willen nein!
Für das bei Scrum/XP geforderte Pair Programming bin ich einer zuwenig; für das V-Modell fehlt mir das Behördendenken.
Nein, nein, ich hangle mich von Teilprojekt zu Teilprojekt bis ich fertig bin.