Ich bin kein Programmierer, aber…: zum Meistern der Programmierung als Fertigkeit

In: Vorgehen
Scrollen

Programmieren1 ist weder meine Berufung noch mein Beruf, aber eine Fähigkeit, bei der ich mich regelmäßig bediene in meinem täglichen Leben als grundsätzliche Arbeit, um etwas anderes darauf aufzubauen—und ich würde so weit gehen und behaupten, dass es eine grundsätzliche Fähigkeit ist, von der die allermeisten Menschen profitieren würden.2

Wie mit jeder anderen Fähigkeit muss sie gepflegt werden um nicht irgendwann zu verschwinden, und in diesem besonderen Fall von Programmieren (zusammen mit anderen Dingen wie Statistik), da Algorithmen mehr und mehr unser Leben bestimmen, möchte ich nicht länger nur Fähigkeiten haben, die „ganz okay“ sind, um sie auf Probleme anzuwenden und sie zu lösen; ich habe vor, Algorithmen zu verstehen, zu definieren, und sie aus Vogelperspektive zu meistern anstelle sie nur vom Boden zu betrachten, mich aus dem operativen hin zum strategischen zu entwickeln, statt passiv aktiv zu sein, und vielleicht sogar irgendwann selbst ein Meister im Programmieren zu werden.

Nichtsdestotrotz habe ich kein Interesse daran, Programmieren zu meinem Beruf zu machen, sondern ein noch mächtigeres Werkzeug, dass mir zur Verfügung steht und mir dabei hilft, Dinge besser zu verstehen, zu analysieren, und zu abstrahieren, und mir die Fähigkeit gibt, Lösungen für Probleme zu finden, die nicht erst durch Algorithmen entstanden sind.

Mir wurde dabei klar, dass es nicht nur wichtig ist, mein bestehendes Wissen von Programmiersprachen, die ich mehr oder weniger kenne zu vertiefen (wie PHP und JavaScript), sondern aus meiner Komfortzone zu treten und eine völlig andere Sicht und neue Einsichten auf das Thema zu bekommen.3

Aus Neugier und Naivität habe ich ein wenig herumgesucht und angefangen mit Suchanfragen wie „what is a good programming language for artificial intelligence?“ (und anderen Suchanfragen, bei denen ich weiß, dass die Programmiersprachen, die ich nicht kenne, nicht sonderlich gut geeignet für sind), und mich so tiefer eingelesen. Ich habe Rosetta Code nach Beispielen durchsucht, die ich von „meinen“ Programmiersprachen kenne und für bestimmte Aufgaben nutze, wie URI-Encoding, um eine Idee davon zu bekommen, wie diese Aufgabe in anderen Programmiersprachen gelöst werden. (So bin ich auch auf fizz buzz gestoßen.)

So habe ich auch mehr über die umgekehrte polnische Notation gelernt, die einige Programmiersprachen nutzen, über den Lambda Calculus, und schließlich über funktionale Programmierung, mit Konzepten wie Monaden (und ich dabei lernte, dass Monaden ⟨nicht⟩ wie Burritos sind). Homoikonizität war auch interessant zu verstehen, so wie das Entscheidungsproblem, und auch Dinge aus meiner Studienzeit wie die Von-Neumann-Architektur kamen wieder auf (was mich an „Killing the Computer to Save It“ erinnerte). Dinge, die ich eigentlich schon kennen sollte, oder einfach vergessen habe.

Natürlich ist die beste Programmiersprache die, die hilft, den Job zu erledigen, welche die meiste Zeit die ist, mit der man selbst den Job zu erledigen. Da ich mir aber den Luxus gönne und mich mehr um das was als um das wie kümmere (was zufälligerweise auch der Unterschied zwischen deklarativer Programmierung und imperativer Programmierung ist), habe ich sorgfältig nach einer Programmiersprache gesucht, die diesen Zweck erfüllt, sondern auch einiges über mein tatsächliches Können aussagt.4

Denn schließlich, so bin ich mir sicher, hilft es, sowohl das wie als auch das was zu kennen, um Programmieren zu meistern: Das wie ist das, was mir dabei die meiste Zeit hilft, meine tägliche Routine zu bewältigen (mit erwähnten Möglichkeiten zur Verbesserung), aber es ist nicht was mir dabei neue und breitere Konzepte offenbart hat.

Schließlich bin ich durch meine Recherche bei Programmiersprachen gelandet wie Haskell, Erlang, und Clojure, mit häufigen Fragen von anderen „Suchenden“ wie „could someone comment on Haskell in comparison to Erlang, Clojure or Scala?“, oder „what should I learn next, Erlang or Clojure“, „Clojure vs. Scala“, „Clojure vs. Lua in speed“, „what can Lisp do that Lua can’t?“, die alle sehr subjektive Antworten sind aber in Summe ein gewisses Gemeinschaftsgefühl und das „wie“ in der jeweiligen Szene vermitteln, sowie die Probleme mit jeder Programmiersprache, und auch pseudo-strategische Diagramme wie „job trends: Scala, Clojure, Erlang, Haskell“, das ein wenig wie in die Kristallkugel blicken ist, und dennoch ein kleiner Indikator der quantitativen Anwendung in der „echten“ Welt sind.5

Um ein Gefühl vom Benutzen der jeweiligen Programmiersprachen zu bekommen, hatte ich diverse interaktive Tutorials abgeschlossen: Try Clojure, Try Haskell, oder Try Erlang, oder The.Lua.Tutorial, um ein paar zu nennen, was eine sehr gute Idee war—nur vom Lesen her hatte ich Clojure bevorzugt, aber nachdem ich die Sprachen testete, hatte Haskell diesen Platz eingenommen. Schließlich grenzte ich die Suche auf Haskell und Clojure ein, und setzte mich mit beiden näher auseinander.

„Why would someone learn Clojure?“6 war dafür eine gute Frage, wobei „why Clojure will win“ natürlich sehr stimmungsmachend ist, und was mir tatsächlich häufig begegnete. Suchen wie „clojure ai programming“ und andere weitere Fragen bescherten weitere Einsichten.

Mit Haskell auf der anderen Seite stach schon ein Artikel besonders hervor: „Meditations on Learning Haskell“, sehr interessant zu lesen, und das leicht intellektuelle und manchmal gar philosophische Image von Haskell verstärken.7

Und was ist’s nun für mich geworden?

Wenn ich bei Null anfangen und eine Programmiersprache lernen würde um Dinge erledigt zu bekommen, oder eine weitere Programmiersprache zu lernen neben denen, die ich kenne, oder eine einem Anfänger empfehlen sollte, dann wäre es wohl Clojure; die Community ist sehr stark angetrieben durch eine „Dinge erledigt bekommen“-Einstellung und dabei sehr offen. Da Clojure auf der JVM aufbaut und das Nutzen oft von Code in Java abhängt, hat es nicht nur etwas mehr Anforderung bei der Installation, sondern erfordert einen Einblick in Java. Weiter unten findest du ein paar Tips zur Installation von Clojure.

Für mich ist Haskell etwas komplett anderes. Nur schon durch das Abschließen des Tutorials war ich inspiriert für tägliche Programmieraufgaben (z.B. dem Nutzen von funktionaler Programmiersprache in PHP), den Funktionen ähnlichen mathematischer Funktionen, und die daraus resultierende Art zu Programmieren, zu denken, und Probleme anzugehen: Die Reise selbst dabei ist schon erfüllend. Weiter unten findest du ein paar Tips zur Installation von Haskell.

Natürlich bleibt die Frage, „warum nicht beide“—beides sind hervorragende Programmiersprachen. Irgendwann, ja—aber im Moment konzentriere ich mich auf Haskell.

Wenn es nur darum geht, überhaupt erstmal mit dem Programmieren anzufangen, fand ich CodeCombat gelungen unterhaltsam, und wenn man schone in paar Grundkenntnisse hat, dann ist Excercism recht viel versprechend.

Ein paar Dinge zu Clojure

Wahrscheinlich würde ich Clojure auf einem Mac einrichten, wobei man schnell auf Leiningen stößt. Da ich die Idee für einen E-Mail-Client habe, ist es schön zu wissen, dass andere Menschen bereits nach verwandten Dingen fragt haben, wie „how can I read my emails with Clojure?“ (was Dinge erwähnt wie Clojure-mail und postal), und sehr viel mehr Werkzeuge und Bibliotheken können in der Clojure Toolbox gefunden werden.

Auch Suchanfragen mit dem, was man gerne programmieren würde, in Kombination mit „Clojure“, ist ein guter Weg, um erste Eindrücke zu sammeln; man sollte sich dabei nur nicht überwältigt fühlen, denn wie bei jedem Lernen einer neuen Fähigkeit braucht es Zeit und Übung.

Besonders für Clojure fand ich diese Pakete für Sublime Text praktisch: BracketGuard, BracketHighlighter, und Enhanced Clojure.

Ein paar Dinge zu Haskell

Diese Einführung zum Lernen von Haskell ist lesenswert, oder wie man mit Haskell überhaupt anfängt, oder wenn man schon ein wenig programmieren kann, dann wie ein Problem in Haskell gelöst wird.

Die Installation von Haskell unter OS X ist einfacher als die von Clojure, und es gibt ein Paket für Sublime Text mit Namen SublimeHaskell. Speziell für Mathematiker sieht Kronos Haskell sehr interessant aus.

Vielleicht finde ich irgendwann die Zeit für ein Entwicklerblog für meine Abenteuer mit Haskell8, und wie passend—es gibt einen Generator für statische Webseiten, der in Haskell geschrieben ist: Hakyll.