Kann man Programmieren lernen?

Als Titel wollte ich erst Wie lernt man Programmieren? nehmen, wollte dann aber auch niemanden enttäuschen, der sich anhand des Titels eine konstruktive Antwort erwartet. Andererseits ist ja eh klar, dass jede Frage, die in einem Titel gestellt wird, mit Nein beantwortet werden kann. Entsprechend könnte ich den Beitrag an dieser Stelle auch beenden.

Tatsächlich bewegen mich diese Frage immer mal wieder, im Moment wieder mehr. Auslöser war ein Artikel, den ich irgendwo aufgeschnappt habe, oder besser nur die Überschrift, die auch als Frage formuliert war und ich mir deshalb das Lesen des Artikels sparen konnte: Programmieren als Schulfach?

Mit der Beantwortung bin ich mir wirklich unsicher: einerseits hatte ich Informatik in der Schule und dort wurden in den drei Jahren zwei Programmiersprachen gelehrt: Pascal und Logo. Andererseits habe ich beide Sprachen jeweils in der ersten Woche nach dem Schulstart durch Lesen der Bücher gelernt. Danach konnten mir die Lehrer in Sachen Programmieren nicht wirklich was beibringen.

Das war aber auch noch die Zeit, in der ein Mathematik und ein Chemie-/Erdkundelehrer den Informatikunterricht gemacht haben. Es war äußerst toll, damals schon mit Logo-Technik und selbstgebastelten Ampel-Steuerung herumzuprogrammieren. Man muss auch bedenken, dass das die Zeit von Apple IIgs in den Klassenzimmern war.

Ich wollte damit auch gar nicht die Schule kritisieren, als vielmehr hervorheben, dass nicht die Schule mich zum Programmieren gebracht hat, sondern meine eigene Neugierde. Ich weiß nicht, was aus mir geworden wäre, wenn ich den C-64 zu Weihnachten bekommen hätte, statt mir ein Vierteljahr später vom Kommuniongeld einen C-16 mit BASIC-Lernkurs zu kaufen. Beim C-16 war ich angewiesen, aus Zeitschriften Listings abzutippen, oder eben mit dem BASIC-Lernkurs selbst was auf die Beine zu stellen.

Das war alles sehr erbärmlich, ich hatte aber in den Jahren darauf noch sehr viel Zeit, mich weiter mit der Materie zu beschäftigen. Das Programmieren hat mich dabei nie losgelassen, auch wenn ich irgendwie nie wirklich etwas sinnvolles programmieren konnte/durfte/sollte. Das änderte sich erst, als ich für die Firma, in der meine Mutter arbeitete, in meiner Freizeit neben der Schule eine Verwaltung für Kundendaten programmiert habe. Ich glaube, das war damals in Turbo-Pascal auf meinem ersten PC, einem 286er.

Während des Studiums und den Nebenjobs dort wurde das ganze Wissen extrem vertieft. In den Vorlesungen in der Theorie und während der Nebenjobs und Uni-Praktika in der Praxis. Aber erst bei meinem ersten Job bei einer AdServer-Firma habe ich überhaupt mit der Webentwicklung angefangen. Damals noch ausschließlich im Backend und in C/C++.

Irgendwann wurde es dann PHP und nach vielen Jahren richtiges PHP mit Frameworks wie CakePHP und schließlich Symfony. Wenn wir nun vor der Aufgabe stehen, Junior-Webentwickler einzustellen, bin ich mir sehr unsicher, was ich erwarten soll und darf.

Es gibt viele, die schon mal irgendwas mit PHP gemacht haben, oder eben mit WordPress irgendwelche Sachen gebastelt haben. Mit Programmieren hat das aber selten was zu tun. Trotzdem sind die Ergebnisse weiter als alles, was ich zu Beginn meiner Programmiererkarriere auf die Beine gestellt habe. Irgendwie sind die Voraussetzungen ganz anders. Ich habe verschiedene Sortieralgorithmen implementiert und ihre Komplexität abgeschätzt. Datenstrukturen wie einfach- und doppelt-verkettete Listen implementiert und die Komplexität von Aktionen wie Löschen und Einfügen abgeschätzt. Und das alles möchte ich nicht missen!

In den Aufgaben eines Webentwicklers wird aber wohl niemand mehr in die Verlegenheit kommen, einen Sortieralgorithmus selbst zu implementieren, oder sich Gedanken darüber machen zu müssen, wie denn nun genau das Array in der Sprache implementiert wurde, die man gerade nutzt.

Andererseits stelle ich auch bei Leuten, die sich schon mehrere Jahre mit Webentwicklung herumschlagen, fest, dass einige grundlegende Funktionalitäten gar nicht richtig verstanden wurden. Wobei nicht verstanden wahrscheinlich zu harsch ist – sie mussten sich einfach bislang noch nicht damit beschäftigen, da die Werkzeuge, die sie benutzen, die Thematik so weit abstrahieren, dass die Grundlagen komplett versteckt werden.

Ein von mir beliebtes Beispiel sind dabei Cookies: wie werden sie gesetzt und gelesen. Was genau passiert da? Da wird bei vielen schnell klar, dass selbst das Konzept von Request und Response noch gar nicht wirklich verinnerlicht wurde. In den meisten Fällen ist das auch tatsächlich gar nicht notwendig, aber wenn plötzlich „seltsame“ Dinge passieren, oder ein Feature Teste, ob ein User Cookies erlaubt nach mehreren Iterationen des Codes einfach nicht einwandfrei funktionieren will, dann sind die Grundlagen gefragt.

Wie aber bringt man so etwas bei? Ich habe schon häufig mit dem Gedanken gespielt, einen „Programmierkurs“ zu veröffentlichen. Es scheitert in erster Linie daran, dass ich nicht weiß, wie man einerseits genügend Wissen vermittelt und andererseits schnell Fortschritte aufweisen kann, damit es für die Schüler nicht zu langweilig wird.

Fängt man erst einmal nur mit PHP an und begnügt sich wochenlang mit einer Ausgabe in der Konsole? (Und nein, ich will jetzt keine Diskussion anfangen, welche Sprache für Anfänger die geeignetste ist.) Oder fängt man mit einem Framework wie Symfony an und zeigt parallel wie man mit Datenbanken arbeitet und zeigt die ersten Schritte in HTML, sowie HTTP, weil man ja direkt Ergebnisse im Browser sehen möchte?

Beides hat irgendwie seine Berechtigung: ich hätte Bauchschmerzen, jemanden nur Symfony beizubringen, ohne ihm/ihr beizubringen, was da genau in der Datenbank passiert und was der ganze Code bewirkt, der dort benutzt wird.

Allerdings hat es heutzutage ein PHP-Profi schwer, wenn er nicht auch weiß, wie Frameworks funktionieren und wie man damit recht schnell Webanwendungen erstellt. Ein reiner PHP-Profi wird wahrscheinlich erst einmal sein eigenes Framework implementieren – was aber wahrscheinlich genau der richtige Ansatz ist!

Genauso, wie man auf der Kunstakademie auch erst einmal lernen muss, wie man perspektivisch zeichnet und wie man Licht und Schatten richtig einsetzt, bevor man sich dann irgendwann mit abstrakter Kunst beschäftigt, genauso kann man die Vorteile eines PHP-Frameworks erst zu schätzen lernen, wenn man selbst an eigenen HTML-Seiten mit PHP-Code dazwischen verzweifelt ist.

Programmieren ist unglaublich komplex und auch wenn ich in den letzten 31 Jahren nicht jeden Tag oder jede Woche etwas dazu gelernt habe, dann aber doch mindestens jedes Jahr. Und diese Erfahrung können angehende Entwickler von heute gar nicht so schnell aufholen. Bei all den neuen Anforderungen müssen einfach irgendwelche Sachen auf der Strecke bleiben.

Deshalb sind die besten Programmierer solche, die die Demut mitbringen, dass sie nur an der Oberfläche kratzen. Ich kratze an vielen Stellen auch nur an der Oberfläche und lerne auch jetzt immer noch neue Sachen kennen, mit denen ich mich vorher noch nie beschäftigt hatte. Neben der Demut ist also auf jeden Fall auch noch Neugierde eine wichtige Eigenschaft. Den Rest kann man sich dann aneignen.

Alles in allem bin ich immer noch unsicher, ob man die Frage, ob man Programmieren lernen kann, mit Ja beantworten kann. Und ob es Sinn macht, das Fach in der Schule anzubieten. Vielleicht, um die wirklich demütigen und neugierigen potentiellen jungen Programmierer überhaupt mit der Materie vertraut zu machen. Ich glaube aber nicht, dass Programmieren so wichtig ist wie Mathematik, Lesen und Schreiben, oder Geschichte.

ownCloud – Deine eigene DropBox

Ich bin schon lange DropBox-Benutzer, aber andererseits auch kein Heavy-User. Ich nutzte es in erster Linie um meine 1Password-Dateien über verschiedene Rechner synchron zu halten. Ausserdem habe ich dann irgendwann ein paar Dokumente dort abgelegt, die mal wichtig sein könnten wenn ich gerade keinen Zugriff auf meinen Rechner oder mein iPhone habe.

6,25 GB Platz habe ich dort, von denen ich aktuell etwas weniger als 500 MB benutze. Irgendwann war ich mal an die Platzgrenze gestoßen und habe dann aufgeräumt und danach nicht wieder so richtig benutzt. Das direkte Teilen von Ordnern für andere Leute habe ich nie so recht verstanden. Die genaue Semantik der Ordner pub, public, Shared Folder und Photos ist mir bisher ebenfalls verschlossen geblieben. Das war auch ein Grund, warum ich in den DropBox-Einstellungen lange gesucht habe, bis ich die Sync-App davon überzeugen konnte mich nicht jedesmal zu nerven, sobald ich mein iPhone mit dem Rechner verbinde. Nein, ich will nicht alle meine Fotos zu DropBox übertragen. Ich habe keine Ahnung, was das genau für Folgen hat.

Also. Wofür nutzte ich DropBox dann? Für mich ist der Platz dort so etwas wie ein Backup. Nicht für wirklich wichtige Dinge wie private Schlüssel und ähnliches. Aber für Daten die ich archiviere, weil das wiederbeschaffen sonst zu zeitraubend wäre. Und natürlich auch um mal jemanden eine Datei zur Verfügung zu stellen. Mal eben schnell einen Link generieren und schon geht’s los. Finde ich super praktisch. Vorher habe ich die Daten auf meinen Server kopiert und dann den Link verschickt – kein sooooo großer Unterschied, aber eben doch den Tacken einfacher.

Und dann ist es einfach lästig, wenn es nicht funktioniert, weil plötzlich zu wenig Speicherplatz zur Verfügung steht. Nur wegen der paar Dutzend Videos die man auf dem Kurzurlaub gemacht hat und jetzt nicht mal so eben mit anderen teilen kann. Klar, ich hätte für mehr Speicherplatz zahlen können, aber ich zahle schon für meine Server und so viel mehr Bequemlichkeit bringt mir DropDox dann auch nicht.

Vor allem wo ich schon seit längerer Zeit wusste, dass es eine OpenSource-Alternative gibt: ownCloud.org

ownCloud bringt alles mit, was ich brauche: ein einfach zu installierender Server für eine LAMP-Umgebung, einen Sync-Client für den Mac und sogar eine iOS-App! Die Installation hat gestern Abend nur etwa 30 Minuten gedauert und seitdem ist der Drop-Box-Sync bei mir deaktiviert und ich nutze meine eigene Cloud!

Bislang bin ich begeistert – nicht in dem Sinne, dass ich alle paar Minuten daran denke und sage „Cool!“, nein, eben weil ich nicht darüber nachdenken muss. Mit ein paar Features von ownCloud muss ich mich noch genauer auseinandersetzen. Denn der Service kann um weitere Apps erweitert werden und man kann auch selbst welche Schreiben. Apps für Kalendar und Kontakte sind schon dabei und auch eine Lesezeichenverwaltung, sowie ein bit.ly-Clone lassen sich schnell installieren. Mir selbst fällt gerade kein Anwendungsgebiet ein, aber da ownCloud auch Teams unterstützt, könnte ich mir gut vorstellen, dass es in dem Umfeld einige spannende Themen dafür gibt.

Übrigens gibt es auf der diesjährigen FrOSCon einen einstündigen Track von Björn Schießle. In seinem Blog hat er übrigens zuletzt ein Thema angeschnitten, dass mich als nächstes interessiert: ownCloud und Verschlüsselung.

Jeder der DropBox nutzt und zum Beispiel WordPress auf einem eigenen Server betreibt, sollte sich ownCloud mal anschauen.

Seltsamer Fehler nach Update von Doctrine

Beim Update von Blogscout.de habe ich gerade folgende Fehlermeldung erhalten:
Catchable Fatal Error: Object of class MEINE_KLASSE could'not be converted to string in PFAD/vendor/doctrine/dbal/lib/Doctrine/DBAL/Connection.php line 1211
Bei Google habe ich zu dieser Fehlermeldung nichts gefunden, nach einer Weile bin ich dann aber drauf gekommen, wo der Hase im Pfeffer lag.

So sah der Code aus, der letztendlich zum Fehler führte:

return $this->getEntityManager()
    ->createQuery(
        'SELECT a
         FROM BlogscoutMainBundle:Article a
         WHERE a.blog = :blog
         ORDER BY a.createdAt DESC'
    )
    ->setParameter('blog', $blog);

$blog ist eine Entität, die ich der Funktion übergebe und zwischen einem Article und einem Blog besteht eine Many-To-One-Relation. Bisher hat das so immer funktioniert, seit dem neusten Update erkennt Doctrine aber wohl nicht mehr, dass $blog eine Entität mit entsprechender Relation und Primary-Key ist.

Es kann sein, dass das nur ein vorübergehender Fehler ist (ich bin auf dem dev-Branch), folgendes brachte aber die Lösung:

->setParameter('blog', $blog->getId());

Vielleicht stösst der eine oder andere ja auch auf den Fehler und weiß erst einmal nicht, wie damit umzugehen ist.

Aufruf zu mehr Mitarbeit

Jeder Entwickler kennt Stackoverflow. Wer es noch nicht kennt, sollte es sich schleunigst anschauen. Aber eigentlich gibt es kaum eine Chance, bei Fragen zur Entwicklung an Stackoverflow vorbei zu kommen. Bei fast jeder Googlesuche zu entsprechenden Fragen tauchen Suchergebnisse von Stackoverflow (zurecht) ganz weit oben auf.

Bislang war ich ein passiver Nutzer: kein Benutzerprofil, keine Fragen, keine Antworten. Gestern Abend habe ich das mal geändert (stackoverflow.com/users/2096166/dirk-olbertz) und ich kann jedem nur empfehlen, es auch zu tun. Nicht nur helft ihr damit anderen, aber man lernt selbst sehr viel.

Zum Beispiel bei dieser Frage hier und meiner Antwort dazu: string position and substring get in php. Meine Antwort war soweit korrekt (ein Beispiel für preg_match_all), aber fast zeitgleich ging eine Antwort ein, die statt dessen DOMDocument nutzt. Ich kenne diese Methoden und nutze sie selbst, allerdings wäre ich nie auf die Idee gekommen, die Frage so zu beantworten. Obwohl sie die schönere war. Vielleicht war sie sogar für den Fragenden zu komplex, aber im Sinne eines guten PHP-Programmierers war meine Antwort maximal die zweite Wahl.

Und noch ein Beispiel, zu dem ich jetzt leider keinen Link habe, da ich meine Antwort nicht eingeschickt habe. Denn während ich meine Antwort formulierte, kam eine wesentlich bessere Antwort zu Frage rein. In der Frage ging es grob darum, dass jemand das letzte Element eines Arrays bekommen wollte (PHP). Er hatte sich etwas unglücklich ausgedrückt und dazu noch Beispielcode mit einer foreach-Schleife angegeben, so dass man eh nicht genau wusste, was man antworten soll. Ich hatte dann angefangen zwei Alternativen aufzuschreiben. Eine mit array_pop() und dann noch eine mit $element = $array[count($array)-1]; und den Anmerkungen, was die beiden Lösungen jeweils für Einschränkungen haben. Und dann kam die Antwort mit dem simplen Hinweis auf die Methode end(). Die kannte ich gar nicht und habe mich selbst immer mit meinen umständlichen Lösungen beholfen. Wieder was gelernt!

Insgesamt ist es nicht leicht Fragen zu beantworten. Oft sind die Fragen unvollständig und vage formuliert, oder man möchte eigentlich ganz davon abraten etwas so zu machen, wie es der Fragende gerade vorhat. Zum Beispiel bei den ersten Gehversuchen von PHP-Neulingen, die eine view.php und eine insert.php haben und fragen wie sie es vermeiden können, dass Leute die insert.php immer wieder aufrufen. Der möchte hier eine simple Antwort auf eine sehr komplexe Frage haben. Wie soll man so etwas beantworten?

Ich werde jetzt jedenfalls regelmäßig abends mal reinschauen, welche „Low-Hanging-Fruits“ ich beantworten kann. Und dann gibt es noch ein paar Fragen, für die Belohungen in Form von Erfahrungspunkten vergeben werden. Hier ist klar, dass es meist keine einfache Lösung gibt. Auch hier will ich mich mal öfter umschauen und mich mit einer Frage vielleicht auch länger beschäftigen.

Für alle Nicht-Entwickler gibt es das selbe Prinzip von Stackoverflow auch für dutzende andere Themengebiete: stackexchange.com/sites – einfach mal reinschauen. Vielleicht ist ja etwas für euch dabei. Für mich ist das nicht nur zum Helfen, sondern auch zum Lernen. Und damit soll man ja bekanntermaßen nie aufhören.

YouTube wird 8. Mein erster Kontakt war kurz nach der Geburt.

Also jedenfalls relativ kurz danach, nämlich am 15. Juni 2005 :) Denn wenn man sich die Geschichte von YouTube anschaut, stellt man fest, dass das erste Video erst im April 2005 online ging.

Etwa zur gleichen Zeit hatte ich mit meinem Projekt Taggling.com (Link zur WayBack-Machine) begonnen, sozusagen ein Tag-Aggregator. Und YouTube hatte zu dem Zeitpunkt noch keine Feeds zu Tags. Also schrieb ich die Jungs an und bekam im kürzester Zeit eine Antwort von Steve Chen. Ein paar E-Mails später gab es dann funktionierende Feeds zu einzelnen Tags von YouTube!

Mein Lieblingszitat aus den Mails von Steve ist übrigens das hier:

So I’m still a bit of a novice on the technical side of RSS. While I’ve been using RSS readers to get my news for over a year now, I haven’t done much on the publishing side.

Mein erstes YouTube-Video stammt vom 14. Juni 2005 und zeigt das Öffnen eines der Tore bei der Eröffnung von „The Gates“ von Christo:

Eine unglaublich schlechte Qualität, aber damals eine Sensation. Videos im Internet! Heute nicht mehr ohne vorzustellen.