Nabend,
ich studiere jetzt seit 2 Jahren angewandte Informatik. Man kann sich also vorstellen, dass ich mich fast durch und durch mit der Programmierung von Anwendungen beschäftige. Hierdurch habe ich eine Flexibilität gegenüber verschiedener Programmiersprachen entwickelt und allein durch das Studium habe ich verschiedene Sprachen kennen gelernt. Speziell beschäftige ich mich stark mit C/C++ sowie Java. Schließlich aber, gibt es etwas, was mich am Fortschritt des gesamten Themas - Der Anwendungsentwicklung - stört.
Vor nicht einmal 15 Jahren noch, hat man sich als Programmierer noch viele Gedanken machen müssen was für Speicherbereiche man mit welchem Daten beschreibt und auch ganz besonders: Zu welchem Zeitpunkt man auf diese nutzt. (Man stelle sich vor Prozess a lese einen Speicherbereich, während Prozess b diesen gerade beschreibt - Das Chaos sollte klar sein)
Da aber Hardware (Besonders Speicher) mittlerweile
relativ günstig geworden ist, steht dem Programmierer viel davon zur Verfügung. Desweiteren sorgen mittlerweile zuverlässige Betriebssysteme dafür, dass der Programmierer nicht seine eigenen oder auch andere Speicherbereiche überschreibt, wenn er gerade eine Variable nutzt.
Dennoch, man muss sich einfach vorstellen, man hat einen riesigen Speicherbereich, dieser wird komplett vom Betriebssystem verwaltet. (Hier ein Zwischenschub: Ein Betriebssystem ist nichts anderes als ein Emulator. Ein Betriebssystem emuliert ein einheitliches Rechnersystem, welches von den Hardwarekomponenten her völlig verschieden sein kann *bam*
[Abstraktion Nr.1]). Kommt ein Programmierer also auf die Idee einen Speicherbereich zu beschreiben der ihm nicht zugeteilt ist, gibt das Betriebssystem - In der Regel - einen Fehler aus. Will ich als Programmierer also Speicher zum ablegen einer Zahl haben, so bitte ich das Betriebssystem darum, mir einen Speicherbereich zur Verfügung zu stellen, den ich nutzen kann.
Sagen wir, ich ich will 1024 Bytes haben, beschreibe ich 1025 Bytes (Buffer Overflow @ Google.de

), müsste ich vom Betriebssystem eine Fehlermeldung bekommen - Bekomme ich aber nicht! Warum: Weil ich als Programmierer selbst dafür sorgen muss, dass ich ausschließlich meine Speicherbereiche beschreibe. Dies trifft aber nicht auf jede Programmiersprache zu (Typischerweise betrifft dies native Programmiersprachen wie Assembler, C/C++, ...). Nun gibt es andere Programmiersprachen, die solche Probleme erst gar nicht kennen. Diese sind mittlerweile stark etabliert und jeder kennt Sie. Beispiele wären das .NET Framework (VB.NET, C#, ...) oder auch Java. Die große Frage: Warum kennen solche Sprachen keine Buffer Overflows?
Die Antwort ist ganz einfach: Diese Sprache laufen in einer Virtuellen Maschine, welche in der Lage sind, gewisse Probleme abzufangen und weiter zu verarbeiten (*bam*
[Abstraktion Nr.2]). Jeder User merkt selbst, dass derartige Applikationen langsamer laufen bzw. einfach mehr Resourcen benötigen! Als Schlussfolgerung kann man also sagen: Umso mehr Abstraktionen, desto mehr Leistung/Resourcen werden vom System benötigt.
Aber das ist nicht das einzige! Umso mehr ich ein System abstrahiere, desto weniger bekommt der Enduser vom Ursystem zu sehen - Sich also wirklich in die Materie einarbeiten zu können und sie auch zu verstehen wird immer und immer schwieriger.
Nun aber war das dort oben lediglich eine Einführung in das, worum es mir eigentlich geht

Mein Problem an der ganzen Geschichte ist konkret, dass wir derzeit ein Seminar mit der Beschreibung "Fortgeschrittene Programmiertechniken" belegen müssen. In diesem Seminar lernen wir nichts anderes als Java. Eine Sprache, die weder Buffer Overflows, noch Zeiger kennt. Stattdessen pralt sie mit
Exceptions,
Interfaces,
Collections ... Ich stelle mir aber jedes Mal in der Vorlesung die Frage "Was hast das mit Fortgeschrittenen Programmiertechniken zu tun?". Ich mein, jemand, der als völliger Anfänger zu programmieren beginnt und sich für den Anfang für Java entscheidet, der wird
niemals herausfinden, was sich hinter einem Datentypen wie
String verbirgt! Derartiges wird mittlerweile so stark abstrahiert, dass der "Programmierer" (Extra in Anführungszeichen, da ich so etwas einfach nicht Programmierer nennen kann) von den eigentlich Schwierigkeiten des Programmierens gar nichts mehr mitbekommt!
Genauso belege ich derzeit einen Kurs der sich
Grafik- und Spieleprogrammierung nennt. Konkret muss ich dort mit einer Gruppe ein Spiel entwickeln und ich kümmere mich um die Engine. Man schaue sich allein mal die Hirarchie an die sich dahinter verbirgt (-> bedeutet 'wird genutzt von', | bedeutet 'oder'):
((Win32 API -> (DirectX API | OpenGL)) | (Unix -> X -> OpenGL)) ->
(Meine (Dx<Version> API) | (OpenGL)) ->
Engine ->
Spiel
All diese Schichten abstrahieren das gesamte System und derjenige, der dann irgendwann ein Spiel programmiert, bekommt nicht einmal Ansatzweise etwas davon mit, wie man überhaupt die DirextX/OpenGL API nutzt. Schließlich befindet sich dieser in der letzten Schicht (Spiel).
Schlimm finde ich einfach, dass ich exakt in die Generation geboren wurde, die sich mit APIs abfinden muss. Neue Standarts zu setzen ist für die heutige Programmierergeneration wirklich schwierig.
Klar, vor 15 Jahren musste man sich auch mit gewissen Dokumenten rumschlagen, aber diese waren einfach nicht so stark abstrahiert, wie sie es heute sind. Heute findet man Programmiersprachen die dem Programmierer
komfort bieten, die den Programmierer
unterstützen - Was natürlich auch nicht schlecht ist! Diese sind auch super dokumentiert, man findet Beschreibungen warum der Programmierer eine gewisse Funktion an welcher Stelle nutzen muss, aber worum es überhaupt geht, ist dem Programmierer an der Stelle meist nicht klar, da es einfach zu stark abstrahiert ist! Ich mein, ich denke, dass ich Java verstehe, aber auch nur deswegen weil ich gelernt habe was virtuelle Methoden und Zeiger/Referenzen sind (die Java erst gar nicht vorsieht).
(Fiktion) Man stelle sich jemanden vor, der in zehn Jahren anfängt Programmieren zu lernen .. dieser würde sicher mit eine Sprache wie Java3.x beginnen. Würde dieser angewandte Informatik studieren wollen, was genau würde er dort lernen? Würde man diesen Studenten ins ungewisse in die Welt von Java oder .NET schmeißen und es dabei belassen? Würde man ihm überhaupt die Basics der Programmierung (Zeiger etc.) beibringen? Würde man ihm - um ihm auf den gesamten Stand bringen zu können - die Regelstudienzeit vergrößern? ...
Man muss schon echt sagen, gerade die Computertechnologie ist sehr schnelllebig. Einige Programmiersprachen sterben, andere leben immer und immer weiter. Ich werde mich nach meinem Studium ganz sicher noch an weitere Sprachen gewöhnen müssen.
Man merkt jedoch, dass alles irgendwie immer und immer abstrakter wird, was wirklich hinter der gesamten Sache steckt interessiert den meisten Entwickler nicht mehr, sie wollen nur noch effiezient und schnell ihre Arbeit fertig kriegen - Und genau da kommt bei mir der Punkt an dem ich sage: "Nein! Ich will wissen was ich hier mache, ich will wissen wie effizient meine Daten abgespeichert werden". Klar, heutzutage implementiert man keinen Red-Black-Tree mehr, man nutzt die STL oder Collections! (Was natürlich in der BS Entwicklung anders aussieht, aber wer entwickelt im 21. Jahrhundert noch sein eigenes BS?

)