Was machen Informatiker (bzw. Softwareentwickler im Speziellen) eigentlich so?

InformatikerBannerFalls du die Frage in der Überschrift mit sowas wie „Öh, WLANs einrichten, Viren entfernen und Office-Kram machen, glaub ich.“ beantworten würdest und dich schonmal gewundert hast, warum manch Informatiker keine Lust hat, genau diese Sachen für dich zu tun, obwohl du ihn doch mit „Das ist doch das, was du gelernt hast und dir Spaß macht.“ motivieren wolltest, ist dieser Artikel wie für dich geschrieben. 😉

Informatiker haben von Computern nur so viel Ahnung wie Astrophysiker von Teleskopen, Tischler von Stichsägen, Köche von Backöfen, Biologen von Mikroskopen oder Mathematiker von Tafeln, Zirkeln, Papier und Bleistift. Es sind jeweils nur Werkzeuge, die zwar als Mittel zum Zweck dienen, mit denen man sich aber nicht notwendigerweise darüber hinaus beschäftigt.

Ursprünglich geht es in der Informatik nämlich um die Automatisierung der Verarbeitungen von Informationen und Berechnungen, und die Grundlagen dafür wurden schon lange bevor es elektronische Computer gab entwickelt.

Informatik ist zunächst wie die Mathematik eine Strukturwissenschaft. In der Praxis angewandt hilft sie oft dabei, langweilige Arbeit anzunehmen. Im mechanischem Umherschieben und Verrechnen von Daten sind Computer extrem schnell und zuverlässig, sodass viele Dinge in der Praxis ohne sie nicht möglich wären. Die Tatsache, dass Computer immer schneller werden, ist also Voraussetzung für die Umsetzung vieler Ideen.

ComputerhistoryEin Bit ist die kleinste Informationseinheit. Es kann nur die Werte 0 und 1 annehmen. Aus 8 Bits wird ein Byte zusammengesetzt, das eine Zahl repräsentiert. Buchstaben (und somit auch Wörter, Sätze, ganze Romane) werden ebenfalls intern als Zahlen dargestellt. Jedes Byte, dass beispielsweise beim Surfen über das Internet verschickt wird, könnte auch manuell per Brieftaubeneule auf Zetteln herumgeschickt werden, und alle weiteren Vorgänge könnten ebenfalls manuell durchgeführt werden. Man kann eine Turingmaschine auf diese Art bauen, es würde aber ziemlich lange dauern bis der hauseigene Zeichner einem die Website, die man sehen will, zusammengepinselt hätte. 😉

owl_internetAußerhalb der Forschung, also in der Anwendung, ist die Informatik nicht mehr so wissenschaftlich mathematisch rein. Als Softwareentwickler baut man Dinge, die irgendeinen Zweck erfüllen sollen. Unreinheit kann dabei durch abstruse Kundenwünsche, Deadlines, der Forderung nach Effizienz (Nutzen mit wenig Aufwand (auf Seite des Entwicklers und der Hardware!)) usw. entstehen. Manchmal weiß man gewisse Dinge auch einfach nicht sicher. Bei Schnittstellen zu closed source software muss man sich darauf verlassen, dass das Spezifizierte genau erfüllt wird. Man kann nicht alles selbst nachvollziehen, und wenn etwas fremdes fehlerhaft läuft, kann man nicht einfach reingucken, woran es liegt, und den Fehler beheben.

BlackboxAber unabhängig davon, ob die Software oder die Funktion, die man implementiert, mit fremder (freier oder unfreier) oder eigenen Software-Modulen zusammenarbeitet, hat man trotzdem meistens immer verschiedene Abstraktions-ebenen. Erst das macht es möglich, sehr komplexe Vorgänge zu überblicken. Wenn man gerade in einer dieser Ebenen denkt, muss man sich nicht darum kümmern, wie die Ebenen darunter, die man benutzt, funktionieren, solange sie das tun, was sie sollen. Teilweise werden die verschiedenen Ebenen sogar in unterschiedlichen Programmiersprachen realisiert.

Computerspiel_AbstraktionsebenenZusammen mit anderen Aspekten des zu lösenden Problems ergibt sich daraus übrigens, dass es nicht „die beste Programmiersprache“ gibt, sondern die Eignung einer solchen immer davon abhängt, was man mit ihr vor hat.

Doch unabhängig von Sprache und Ebene, in der man gerade denkt, lernt man schnell, dass wenn man etwas nur irgendwie ans Laufen bekommt ohne es verstanden zu haben, es einem meistens früher oder später um die Ohren fliegt. Auch wenn man Fehler versteht und drin lässt, weil man denkt, dass die entsprechende Situation eh nicht eintreten wird; also lieber direkt elegant (d.h. simpel) zuendedenken. 😉 Manchmal war etwas auch mal ordentlich, wurde dann oft geändert und braucht nun ein Redesign, da die Chance, dass es bei weiteren Änderungen in sich zusammenfällt, immer weiter steigt. Technologische Schulden zu machen muss nicht jeden mal die falsche Entscheidung sein. Man sollte sich ihrer aber zumindest bewusst sein.

jenga_fallingKlar ist Programmierung nicht jedermanns Sache, aber manchmal versteht man etwas erst wirklich wenn man es mal selbst gemacht hat. Falls du also wissen möchtest, wie soetwas praktisch ansatzweise aussieht, ist der folgende Abschnitt hoffentlich das Richtige für dich. Wir entwickeln zusammen ein Programm, dass das klassische Kinderspiel „Fizzbuzz„, anhand dessen Kinder Division üben können/sollen, (imperativ) umsetzt.
Es soll von 1 bis 100 hochgezählt werden, wobei alle Zahlen, die durch 3 teilbar sind, durch das Wort „Fizz“, alle durch 5 teilbare Zahlen durch „Buzz“ und Zahlen, die durch 3 und 5 teilbar sind, durch „FizzBuzz“ ersetzt werden:

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

Es gibt verschiedene Möglichkeiten, einen Algorithmus zu entwickeln, der solch eine Ausgabe erzeugt, einer davon sieht im Pseudo-Code wie folgt aus:

Zähler = 1
Solange der Zähler nicht größer als 100 ist, mache folgendes:
    Wenn der Zähler durch 3 und durch 5 teilbar ist:
        Schreibe "FizzBuzz".
    ansonsten:
        Wenn der Zähler durch 3 teilbar ist:
            Schreibe "Fizz".
        Wenn der Zähler durch 5 teilbar ist:
            Schreibe "Buzz".
        Wenn der Zähler weder durch 3 noch durch 5 teilbar ist:
            Schreibe den Wert des Zählers
    Schreibe ", "
    erhöhe Zähler um 1

Hier sieht man auch gut, wie wir nur auf unserer speziellen Abstraktions-Ebene bleiben.
Wie der Computer Zahlen intern repräsentiert, wie er feststellt, ob eine Zahl durch eine andere teilbar ist, und wie er Dinge auf dem Bildschirm ausgibt, interessiert uns momentan gar nicht. Wir benutzen diese Funktionen einfach.

Zur Veranschaulichung hier das ganze nochmal als Programmablaufplan (Den Zähler habe ich „Z“ genannt, der senkrechte Strich „|“ steht für „ist Teiler von“, das auf dem Kopf gelandete U „∩“ bedeutet „und“ und die rosa Rauten sind verzweigende „wenn->dann“-Abfragen.):
Fizzbuzz_ProgrammablaufplanIn einer echten Programmiersprache (hier Python) könnte das ganze dann so aussehen:

import sys
for i in range(1, 101):
    if i % 15 == 0:
        sys.stdout.write('FizzBuzz')
    elif i % 3 == 0:
        sys.stdout.write('Fizz')
    elif i % 5 == 0:
        sys.stdout.write('Buzz')
    else:
        sys.stdout.write(str(i))
    sys.stdout.write(', ')

In Echt würde man das Ganze eventuell allgemeingültiger machen (andere Teiler, andere Ersetzungswörter usw.), aber vom Grundprinzip her funktionieren auch größere Projekte ähnlich. Ein Teil der Kunst dabei ist es, komplexe Aufgaben in kleine einfachere Teilprobleme zu zerlegen. Um das gut zu können, lernt man verschiedene design patterns, Idiome usw.

Interessant an dieser Tätigkeit finde ich persönlich unter anderem, dass man trotz Wiederverwendung bereits bestehender Algorithmen doch immer wieder auf Probleme stößt, für die es so noch keine fertige Lösung gibt, und über die man erstmal wieder nachdenken muss, bis einem dann (manchmal aus heiterem Himmel, z.B. unter der Dusche) plötzlich eine Idee kommt.

Und auch wenn die Suche nach Fehlern manchmal frustrierend sein kann, kann das Gefühl, in Quellcode durch Logik eine komplexe Welt erschaffen zu haben, die sich genau so verhält, wie man sich das vorgestellt hatte, schon recht erfreulich sein. 🙂

hannibal_planZusätzlich mag ich, dass die Arbeit als Entwickler Kreativität bei der Lösungssuche erfordert, und viel Abwechslung bieten kann. Man programmiert ja nicht nur, sondern hat auch noch genug andere Dinge zu tun (siehe Softwaretechnik). Und selbst sehr gute, erfahrene und vielseitige (Software-)Entwickler können bei Weitem nicht alles schon kennen und sind in vielen Bereichen immer noch Anfänger. Außerdem besteht der Alltag in diesem Beruf aus weitaus mehr als der eigentlichen Programmierung, die ich hier hauptsächlich beschrieben habe. Ebenfalls viel Zeit verbringt man mit Planung, Analyse, Kommunikation und anderem Management-Kram.

Ebenso wie andere Wissenschaften und Ingenieursdisziplienen, durchdringt auch die Informatik sehr viele Bereiche, in denen sie nicht direkt offensichtlich ist. Du kannst ja einfach mal über den Artikel „Computer science“ aus der englischen Wikipedia drüberscrollen und nur die Bildchen angucken. Schon allein das sollte eine Vorstellung der Vielfalt vermitteln. Die einzelnen Zweige sind wechselseitig voneinander abhängig und entwickeln sich gemeinsam.

Unser Umgang mit Informationen, die Art der Fähigkeiten, die gefragt sind, und die generellen Möglichkeiten, die wir haben, haben sich unter anderem durch die Informatik in den letzten Jahrzehnten sehr stark verändert. Ich freue mich darauf, zu sehen, was in der nächsten Zeit für weitere neue Ideen entstehen, denn kaum eine Branche entwickelt sich so rasant, wie die IT. Und ich hoffe auch, dass ich weiterhin Spaß daran haben werde als Softwareentwickler meinen (wenn auch infinitesimal kleinen) Teil dazu beizutragen. 🙂

Glücklichsein und andere Lebenssinne

The_Answer_to_Life_the_Universe_and_EverythingLeben als solches (Stoffwechsel, Homöostase, Fortpflanzung usw.) hat an sich wohl eher keinen inhärenten Sinn, sondern läuft als emergenter Prozess einfach im Rahmen der Naturgesetze (physikalisch, chemisch, biologisch) ab. Sinn ist ja eh etwas, das erst wir denkenden Lebewesen in Handlungen und Existenzen hineininterpretieren. Auch wenn wir der Evolution gern ein Ziel wie die Hervorbringung immer „höherer/besserer“ (Obacht, hochgradig subjektiv) Lebensformen zusprechen möchten, passiert auch sie einfach so. Alles hat eine Ursache, aber diese muss kein Grund im teleologischen Sinn sein oder haben. Frösche sind beispielsweise nicht dafür da, um Spinnen zu fressen, damit wir Menschen nicht so sehr von ihnen belagert werden, es geschah einfach so, dass sie es tun. Den Sinn sprechen erst wir ihnen zu, da sie jemandem (in dem Fall uns) nutzen.

frog-wideDa wir aber manchmal darauf (be)stehen, dass auch wir nicht sinnlos sind, suchen wir uns manchmal (wenn auch unbewusst) einen Zweck (und andere Grundsätze, ethisch oder sonstwie) für uns aus. Die Angebote sind ja zahlreich. Ich vermische hier gleich sicherlich kurzfristiges Glücklichsein öfters mal mit langfristiger Erfüllung, da mir die Grenzen dazwischen fließend vorkommen, denn oft ist es ein Abwägen (oder eher Tauziehen?) ähnlich wie beim Marshmallow-Test.

Na gut, was sucht man sich denn nun zur Erfüllung so aus? Für verschiedene Leute sind es wahrscheinlich unterschiedliche (auch stark kulturell geprägte) Mischungen aus teilweise diesen (oft auch wieder überlappenden) Sachen:

surfing-teahupoo-tahiti

  • Hedonismus in vielen Formen, also Genuss von Sex, Essen, Unterhaltung, Berieselung, Nervenkitzel, Musik, mit Freunden abhängen usw.
  • Selbstverwirklichung, sei sie sportlicher, beruflicher, intellektueller, finanzieller oder sonstiger Art. Man kann einfach auf einen hohen sozialen Status hinarbeiten oder fleissig trainieren, um irgendwann so gut Surfen zu können, dass Teahupoo einen nicht zerlegen würde, oder um andere krasse Sachen drauf zu haben.
  • Spiritualität. Diese muss nicht religiös sein. Das naturalistische Verstehen der Welt könnte man in diese Kategorie einorden sowie Mitgefühl und Hilfe (bis hin zur Aufopferung) für andere (z.B. ihnen in Foren beim Erwerb der Grammatik zur Seite stehen ;-)) oder was auch immer.

Je nach Persönlichkeit sagen einem diesbezüglich dann wahrscheinlich auch andere Philosophen zu. Für den *S*J könnten gesellschaftliche Pflichterfüllung und Tugenden ähnlich wie bei Aristoteles und Konfizius passen. Als *S*P mag man eventuell Aristipp lieber, liest ihn aber nicht, weil man lieber Party machen geht, als *NF* sagt einem möglicherweise Budda mit seinem Altruismus eher zu und als *NT* gefällt Platon und seinen Wunsch, die Struktur der Welt zu verstehen, vielleicht besser.

Verschiedene_Arten_Glueck_zu_empfindenNaja, tun wir mal einfach so, als würde man gerne glücklich sein. Wenn man es nicht ist, stolpert man eventuell über irgendwelche beratenden Bücher, die (überspitzt gesagt) mit „Du musst einfach nur …“ anfangen und mit sowas wie „… jeden Tag leben als wäre es dein letzter.“ weitermachen. Mal abgesehen davon, dass mein Morgen vermutlich ziemlich übel wäre wenn ich mein Heute nach dieser Devise gestalten würde (Wingsuit Basejumping anyone? :)), kommt dazu, dass solche Tipps gerne von Leuten gegeben werden, die selbst eh einfach schon ziemliche Dauergrinser sind. Damit will ich nicht ausschliessen, dass es nicht auch tatsächlich hilfreiche Techniken geben kann, sondern nur darauf hinaus, dass Glücklichsein genau wie viele andere Charakterzüge auch, unter anderem eine genetische Komponente hat. (Man kann nicht einfach abhaken, welche Punkte/Ebenen der Bedürfnispyramide bei einem Menschen erfüllt sind, und dadurch wissen, wie glücklich er sich fühlt.)

HerzSelbst so ein netter Ratschlag wie „Entscheide dich so, dass du es im Alter rückblickend nicht bereuen wirst.“, der meistens darauf abzielt, Chancen nicht zu verpassen sondern zu ergreifen, hat Schwächen, denn selbst innerhalb von 10 Jahren kann sich unser persönliches Wertesystem stark verändern, sodass wir dann praktisch wieder ein anderer Mensch sind, auch wenn wir in fast jedem Alter gerne meinen, dass unser jetziger Charakter schon vollendet sei.

Deshalb trage ich jetzt einfach ein paar Dinge, die mir bei meiner Recherche so über den Weg gelaufen sind, zusammen.

BaumUnser erlebendes Selbst und unser erinnerendes Selbst müssen sich nicht immer einig sein. Man erinnert sich manchmal nur an den besten oder den schlimmsten Teil einer Erfahrung bzw. das Ende, nicht aber an die Gesamtheit (vgl. Peak–end rule und Duration neglect). Die erinnerte Vergangenheit ist also nicht unbedingt ein perfekter Indikator dafür, was man mögen wird. Ebenso kann einen die vorausschauende Überlegung, was nun glücklich machen würde, in die Irre führen. Man überschätzt systematisch die Freude, die man aus neuem materiellem Besitz ziehen wird im Vergleich zu anderen Optionen, die sich für den gleichen Preis bieten würden. Einfachere Dinge, die man dafür mehr bewusst erlebt (Theaterbesuche, Musikunterricht, Zeit zum Spazieren) sind auf Dauer oft größere Glücksspender als teure Autos, die man sich in die Garage des teuren Hauses oder in den Stau stellt. Andersherum ist es jedoch genauso. Wir überschätzen auch die dauerhaften negativen Folgen, die eine dramatische Änderung auf unseren Gemütszustand haben könnte. Überraschenderweise sind Lottogewinner oft nach einigen Jahren wieder ähnlich zufrieden/unzufrieden wie zuvor (auch wenn sie ihr Geld nicht verplempert haben), und auch Menschen, die eine Querschnittslähnung erlitten, scheinen sich daran zu gewöhnen. Es sieht also so aus, als würden wir weniger vom absoluten Zustand, sondern eher von seinen Änderungen (erste zeitliche Ableitung) abhängen.

Abgesehen von den offensichtlichen Schwierigkeiten Glück zu messen, scheint es zumindest hilfreich zu sein, wenn der sozioökonomischen Unterschiede im persönlichen Umfeld nicht allzu groß ist, man das Gefühl von Kontrolle über sein Leben hat und sich für irgendwas nützlich vorkommt.

Necker_cube.svgAnsonsten sind viele Erlebnisse auch einfach sehr mehrdeutig interpretierbar, und ähnlich wie beim Necker cube liegt es am Betrachter, ob er das ganze nun positiv oder negativ sieht. Wir sind gar nicht mal so schlecht darin, im Nachhinein Glück in Erlebnisse reinzusynthetisieren.

Mal abgesehen von alle dem (um den Bogen zum Anfang wieder zu schliessen), hat die Natur nicht vorgesehen (sowas kann sie ja grundsätzlich nicht), dass wir zwangsläufig glücklich sein müssen, sein werden oder werden können. Auch gibt es schwerwiegendere Selektionskriterien als dieses. (Allerdings kann man es üben). Also: YOLO! ^_^

Happiness_Flussdiagramm