Was man im Studium nicht lernt…

…man aber trotzdem wissen sollte, wenn man Software entwickeln will.

Wenn ich mir so überlege, was in den letzten 6 Semestern Informatik-Studium so alles gelernt habe, dann ist das wohl ne ganze Menge. Trotz dem Klischee vom praxisfernen Uni-Absolventen wird da sehr viel Praxisrelevantes gelehrt. Nichtsdestotrotz gibt es einiges, was nicht oder nicht intensiv genug gelehrt wird und dennoch praxisrelevant ist.

Das ist nicht unbedingt ein Fehler des Lehrangebots (auch, wenn das ein oder andere problemlos integriert werden könnte), sondern unterstreicht einfach die Tatsache, dass das, was gelehrt wird, nicht alles ist. Es wird schlichtweg verlangt, dass man sich auch über die Lehrveranstaltungen hinaus Wissen aneignet. Wer das nicht tut, ist in gewissem Umfang wirklich ein praxisferner Theoretiker.

Hier mal eine Liste von dem, was mir so alles einfällt, was alles nicht gelehrt wird. Natürlich kann das von Uni zu Uni unterschiedlich sein und natürlich kann diese Liste auch nur das enthalten, was mir selbst bewusst ist. Also ohne Anspruch auf Vollständigkeit:

  • Richtig programmieren: Man lernt zwar alles Grundlegende, aber, wenn man übers Studium hinaus nicht programmiert, wird man kaum über das Stadium eines Anfängers hinauskommen. Man hat einfach noch nicht genug Anfängerfehler gemacht oder gesehen. Sehr hilfreich ist es hier übrigens, wenn man in nem Programmierforum oder ner Newsgroup aktiv ist. Durch Lesen und Beantworten von Fragen anderer lernt man unheimlich viel. Viel mehr als man vielleicht denkt, wenn man das noch nicht gemacht hat. Vor allem kriegt man die ganzen Anfängerfehler mit…
  • Weitere Prinzipien des OOD. Vieles wird hier gelehrt und „Low Coupling, High Cohesion“ gehört mit Sicherheit zum Wichtigsten, was man lernen kann. Trotzdem gibt es noch so einiges, was man hätte machen können:
    • Tell don’t ask
    • SOLID: LSP wurde behandelt, SRP und OCP nur angerissen.
    • Encapsulate the concept that varies: Der Wichtigste Satz aus dem GoF-Book
    • Program to an interface not to an implementation: Abstrakte Kopplung…
    • Prefer delegation over inheritance: Vererbung wird von Anfängern meiner Ansicht nach oftmals grundlegend überschätzt bzw. falsch genutzt.
    • GRASP
  • Bitmasken. Sind nicht sonderlich schwer, wurde im Studium aber nie behandelt.
  • Zeichensätze. ASCII sollte allen geläufig sein, aber das ist auch fast alles. Codepages, Unicode, etc. werden nicht behandelt.
  • Exceptions. Es wird gelehrt, was Exceptions so ungefähr sind, aber die, die Exceptions nur aus der Vorlesung kennen, haben hier wohl noch größere Lücken: Warm überhaupt Exceptions? Wann wirft man sie? Wann fängt man sie ab? Wie baut man eine Exception-Hierarchie richtig auf? Und sowas wie Exception-Safety kennen wohl eh nur die wenigsten.
  • Richtig kommentieren. Klar, man bekommt immer wieder gesagt, dass man seinen Code kommentieren soll, aber wie man das richtig macht, muss man sich selbst aneignen. Teilweise bekommt man einen der folgenden beiden Sätze zu hören:
    • „Guter Code dokumentiert sich selbst und macht Kommentare größtenteils überflüssig.“
    • „Bei richtiger Kommentierung sind etwa 50% Code und 50% Kommentar.“

    Beides hat einen wahren Kern; beides ist jedoch in letztendlicher Konsequenz falsch oder zumindest missverständlich. Richtiges Kommentieren muss man sich also selbst beibringen.

  • Pointer. Mit Referenztypen in Java haben wir ein bisschen was gemacht, aber richtige Pointer nie zu Gesicht bekommen.
  • Absolute und relative Pfade. Wann benutzt man welche? Nie gemacht.
  • Grundwissen Security. Es gibt im Master-Studium Vorlesungen über Security. Was da genau thematisiert wird, kann ich nicht sagen, weil ich die Vorlesungen noch nicht gehört hab und die Unterlagen nicht frei zugänglich sind. Tatsache ist aber wohl, dass, wenn man die Vorlesung nicht gehört hat und sich auch ansonsten nicht damit beschäftigt hat, man von MITM, XSS, SQL-Injection, etc. nichts weiß. Und dann kann es eben zu größeren Security-Unfällen kommen.
  • Debugging. Den Debugger bekommt man im Studium kaum zu Gesicht. Und dabei ist der doch eines der wichtigsten Tools beim Programmieren überhaupt. Wobei das natürlich nicht für alle Sprachen gilt, aber zumindest mal für viele.
  • RegEx. Ungemein praktisch die Dinger. Werden nur leider im Studium vernachlässigt. Dafür werden kontextfreie Grammatiken zwei oder drei Mal behandelt. Nun Chomsky-Hierarchie ist schön und gut – gehört ja auch zu den Grundlagen die jeder Informatiker zumindest in Ansätzen kennen sollte – beim Programmieren hilft die Theorie aber nur bedingt. Und in der Praxis kommen Reguläre Ausdrücke doch schon mal vor.
  • Konzepte (verteilter) Versionsverwaltungssysteme: Im Softwareentwicklungsprojekt haben wir SVN eingesetzt. Das ist aber auch (fast) alles, was wir von VCS gehört haben. Von Feature-Branches und Continuous Integration und so nem Zeug wird nichts erwähnt. Gerade bei verteilten Versionsverwaltungssystemen wie git oder Bazaar gibts da sehr interessante Möglichkeiten, wie man die einsetzen kann.

Wenn ich Zeit dazu finde, werde ich mal zu dem ein oder anderen Punkt auf dieser Liste etwas bloggen und auch die Liste ggf. erweitern, wenn mir noch etwas einfällt.

Letztendlich fragt mich nur: Was sind meine Defizite? Was kenne ich (noch) nicht?

12 Kommentare


  1. An welcher Uni bist du denn?


  2. Hallo Christian,

    das ist ja schon irgendwie „witzig“. Ich bin jetzt gerade mit dem 3. Semester fertig und bei uns wurden die meisten Punkte deiner Liste schon behandelt. So Dinge wie Unicode sogar im 1. Semester.

    Gut, Security war eine Wahlveranstaltung, der Rest aber durchaus alles im Pflichtteil…


  3. Hallo Leo,

    ui das ist interessant. Wo studierst du?

    Was mich mal interessieren würde: Wie intensiv habt ihr das gemacht? Ich mein, OK, Bitmasken sind schnell behandelt und auch richtiges Kommentieren ist vergleichsweise schnell erklärt. Auf der anderen Seite ist es wohl ziemlich unmöglich den ersten Punkt „Richtig Programmieren“ vollständig im Studium abzuhandeln. Richtig Programmieren kann man nur, wenn man schonmal einige Zehntausend LOC hinter sich hat und das kann ne Vorlesung eben nicht leisten.

    Aber wie siehts mit Punkt 2 („Weitere Prinzipien des OOD“) aus? Ich mein, wir haben das behandelt. SA/SA-RT/SD bzw. UML und dazu auch n paar Beispielaufgaben. Aber habt ihr „tell don’t ask“ gemacht? GRASP? SOLID? Der Fokus lag zumindest bei uns erstmal auf den Notationen. Wie malt man die ganzen Diagramme. Wie liest man die, etc. Wir haben aber kaum darüber geredet, wie man *richtig* modelliert.

    Also sowas wie „hier hast du die Anforderungen und hier hast du zwei oder drei Designs. Sag mal, was davon die bessere Lösung ist und warum.“ Oder „Folgende Problemstellung: […]. Welche Design-Entscheidungen könnte man treffen? Entscheide dich für eine und begründe.“ Habt ihr sowas gemacht?

    mfg

    Christian

    P.S.: Gibt es etwas, von dem du sagen würdest, dass es im Studium „fehlt“?


  4. Hi,

    also zum ersten Punkt, da hast du natürlich Recht. Allerdings mussten wir auch schon ziemlich viel programmieren. Mehrere 1000 LOC haben sich da sicherlich schon angehäuft (beispielsweise jetzt im 3. Semester durch zwei größere Projektarbeiten).

    Die von dir angesprochenen Programmierparadigmen kamen meines Wissens bei uns auch noch nicht vor. Hier habe ich aber auch noch zwei Pflichtvorlesungen vor mir, die dieses Thema zum Inhalt haben.

    Zum Thema Modellierung: dies ist bei uns tatsächlich eine eigene Lehrveranstaltung über zwei Semester. Das komplette zweite Semester musste wir ein UML Projekt modellieren, mit insgesamt 3×40 Seiten Paper als Abgabe (Gruppenarbeit). Allerdings muss ich ganz ehrlich sagen, dass ich davon nicht sonderlich viel behalten habe – und als so richtig hilfreich konnte ich UML bis jetzt auch noch nicht kennen lernen.

    Ansonsten hatte ich auch noch eine LV Softwarearchitektur, wo es quasi ausschließlich um (interne) Softwarequalität (und insbesondere Designentscheidungen) ging. Auch dies anhand eines das komplette Semester umspannenden Programmierprojekts.

    Was in meinem Studium fehlt? Zeit 🙂 Grade die ganzen Projekte die sich so jedes Semester anhäufen fressen doch unglaublich. Ansonsten ist das eine gute Frage, so richtig habe ich mir darum noch nie Gedanken gemacht. Was definitv nur seeeehr stiefmütterlich behandelt wurde ist funktionale Programmierung… allerdings vermisse ich das uch nicht wirklich =) Aber sonst… hmm… muss ich erst nochmal drüber nachdenken 🙂


  5. Leo:
    Allerdings muss ich ganz ehrlich sagen, dass ich davon nicht sonderlich viel behalten habe – und als so richtig hilfreich konnte ich UML bis jetzt auch noch nicht kennen lernen.

    Also ich find UML sehr hilfreich. Mittlerweile mach ich für alles >= 1000 LOC erstmal n Modell. Ich finde das sehr wichtig und ich hab auch schon selbst erfahren, dass das enorm hilft. Grad letztens hab ich n Prog quasi komplett neu geschrieben (~1500 LOC Delphi-Code), weil das verändern des bisherigen Codes fast eben so lang gedauert hätte. Jetzt hab ich mich hingesetzt und n gescheiten Entwurf gemacht und ich bin zuversichtlich, dass die folgenden Erweiterungen und Änderungen ziemlich problemlos sein werden. Darüber wollt ich eigentlich auch mal bloggen…

    Ansonsten hatte ich auch noch eine LV Softwarearchitektur, wo es quasi ausschließlich um (interne) Softwarequalität (und insbesondere Designentscheidungen) ging. Auch dies anhand eines das komplette Semester umspannenden Programmierprojekts.

    Ich hab auch ne Vorlesung zur Softwarearchitektur gehört. Sehr interessant, aber die Vorlesung war trotzdem leider recht theoretisch. So ein dazugehöriges Projekt wär schön gewesen. Ich mein, wir haben unabhängig davon n Softwareentwicklungs-Projekt gemacht (und n weiteres steht im nächsten Semester an), aber das hätte – zumindest in Bezug auf Modellierung – besser sein können…

    mfg

    Christian

    P.S.: Uni oder FH? Vielleicht ist ja das der Unterschied…


  6. P.S.: Uni oder FH? Vielleicht ist ja das der Unterschied…

    Also ich studiere auch Uni… (HPI Potsdam)


  7. Uhui am HPI. Hab da schon viel Gutes drüber gehört.

    BTW: Ich hab gehört dort wird FMC gelehrt. Stimmt das? Ist das benutzbar?

    mfg

    Christian


  8. Ne, seit Wendt nicht mehr am HPI ist kommt das eigentlich nicht mehr so groß vor (also Zeitpunkt weis ich nicht sicher. Ich schätze dass es daran liegt). Vielleicht kommts ja auch erst noch aber ich wüsste jetzt nicht in welcher LV…

    FMC habe ich persönlich (zum bisher einzigen mal) zur Dokumentation eines jQuery-Projekts verwendet. Dort bot sich UML nicht so wirklich an. FMC scheint mir oft etwas „straightforwarder“ als UML zu sein (wenn man UML in der Gesamtheit und nicht nur die Klassendiagramme betrachtet). Ist imo definitiv benutzbar, wann genau kann ich dir allerdings auch noch nicht sagen 😀

    P.S.: du solltest dir wirklich ein E-Mail-Notification-Plugin holen für deine Comments =)


  9. P.S.: du solltest dir wirklich ein E-Mail-Notification-Plugin holen für deine Comments =)

    Danke für den Hinweis. Ich such mal eins…

    mfg

    Christian


  10. Ich hab mir grad mal Bazaar ein bisschen angesehen. Sehr interessant. Aber ich hab gemerkt, dass mir die Detailunterschiede zu git nicht ganz klar sind. Vielleicht schreib ich da mal was zusammen, wenn ich das mal genauer herausgefunden habe.

    Jedenfalls stehen VCS jetzt auch auf der Liste…

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert