PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Fortschritt der Anwendungsentwicklung


blue
10.01.09, 03:03:45
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? ;) )

Ob3rst
10.01.09, 03:21:49
Du hast es ja selbst schon gesagt. Speziell die Computer-Technologie entwickelt sich so rasant, da wäre es JETZT schon fast ein Unding alles unterzubringen. Klar man kann sagen das das Studium dann halt einfach länger geht. Nur wo soll das enden?

Dein Beispiel mit dem Java 3.x
Sicherlich ist es von Vorteil zu wissen, wie sich das ganze überhaupt aufbaut (sry aber kenn mich mit Programmieren so gut wie gar nicht aus, deshalb schreib ichs einfach mal so wie ich denke^^). Doch macht es in 10 Jahren überhaupt noch einen Sinn das zu wissen?

Anderes Beispiel:
Damals arbeitete man noch im DOS, heutzutage kannst du nichtmal mehr die Console aufrufen. Wieso? Weil es veraltet ist und keiner es mehr braucht. Ok, hingt vll. etwas das Beispiel aber ich glaub man weiss, was ich meine.

Edith: Wenn ich deinen umfangreichen Beitrag jetzt überhaupt richtig verstanden hab und nicht völlig vorbei rede :-D

ze
10.01.09, 09:38:03
Ich finde das einen genialen Artikel, Blue.
Bei mir ist es so, dass ich das eben aus dem anderen Blickwinkel sehe. Ich habe zwar nie ernsthaft programmiert, aber hobbymässig in GW-Basic und Quickbasic schon komische spielen (mit ersten grafischen elementen - "DRAW") und auch mal Assembler probiert mit ein paar "Hallo Welt"-Type programmen :-)

Was einem sofort klar wird, ist dass das heute Zeugs sooo komplex ist, das könnte man nie im Leben mit dem einfachen Handwerkszeugs macchen von früher. Das wär wie so nen persischen Teppich von Hand knüpfen wo du 20 Jahr brauchst und es hinterher dein Lebenswerk war :)

Gleichzeitig ist es frustrierend, wie du oben schreibst. Es gibt auch innerhalb von Computern immer weniger "Universalgenies". Vor 200 Jahren gab es ja noch generelle Universalgenies was "Wissenschaft" angeht, egal ob Biologie, Physik, Medizin, Chemie. Die gibt es ja aufgrund der weiteren Spezialisierung auch nicht mehr.

Sehr interessantes Thema dass du da anreisst, freue mich auf weitere Beiträge!

gruss, ze :ze:

sk1ll3R
10.01.09, 11:11:11
Bin zwar noch kein richtiger Wissenschaftler, aber ich merke in der Chemie auch, dass es so viele unterschiedliche Sparten, Methoden, Wissensgebiete etc. gibt, dass es für einzelne Menschen schier unmöglich ist, diese komplette Wissenschaft zu verstehen und anwenden zu können. Daher wir man mit fortschreitender Zeit immer mehr "Fachidioten" vorfinden. Ich merke das teilweise auch an unseren Profs. Bei einigen Älteren merkt man, dass sie von (fast) allen Fachgebieten Ahnung haben und auch weniger stark zwischen diesen differenzieren, bei den Jüngeren hat man eher den Eindruck, sie kennen nur ihr Fachgebiet so richtig gut und in den anderen haben sie kaum mehr Wissen als ein "gewöhnlicher" Dipl.-Chem.
Allerdings glaube ich, dass man diese generelle Entwicklung nur schwer aufhalten kann, da Wissenschaften nunmal immer komplexer werden und es ohne Spezialisten heutzutage nicht mehr geht. Dass dabei aber wie in deinem Beispiel einfach essentielle Dinge unter den Tisch gekehrt werden, ist natürlich durchaus bedenklich.

Um auf dein Beispiel zu kommen: leider kenne ich mich als Chemiker mit Info nicht so sehr aus. Wir haben allerdings zur Zeit eine Vorlesung, die sich "Prozedurale Programmierung" nennt. Hier lernen wir die Sprache C (nur C, nicht C++, C# etc.) und es ging wirklich vom Urschleim los und hat nach und nach sich zu einem kompletten Gerüst zusammengefügt. Wir haben auch die von dir angesprochenen Stichwörter wie String, Char.... und natürlich Zeiger, malloc(), free() etc. gelernt und wie man mit den Speicherzuweisungen sinnvoll umgeht.
Allerdings ist das eben eine Grundveranstaltung für Nebenfächler, die ansonsten mit Programmierung nicht viel am Hut haben und denen deshalb die basics nahe gebracht werden sollen. :rolleyes: Es kann durchaus sein, dass die Info-Studenten der kommenden Generationen von solchen vermeintlich einfachen, rudimentären Dingen überhaupt nichts mehr mitbekommen, weil es inzwischen viel mächtigere Sprachen gibt, die mehr Möglichkeiten bieten (auch wenn man im Endeffekt überhaupt nicht mehr weiß, was eigentlich hinter einzelnen Schlagwörtern steckt und der Rechenaufwand enorm steigt).
Ich glaube ehrlich gesagt aber nicht, dass man daran großartig was ändern kann, schließlich wird man heutzutage auch niemanden mehr überreden können, in Maschinencode zu programmieren. :-D

Zahl
10.01.09, 14:34:17
Das Problem ist immer, den richten Blickwinkel zu haben, welchen es wahrscheinlich nicht mal gibt.
Ich bin auch jemand, der lieber bescheid weiß, was unter der Haube passiert, darum habe ich mich schon intensiver mit C und C++ beschäftigt, mit einfachen Datenstrukturen, der Speicherverwaltung des Computers an sich, etc...
Nun ist es ja in den höheren Sprachen wie Java und C# so, dass vieles vereinfacht wird und schon vorgegeben ist, z.B. gibt es Vektoren, Listen, Collections, und Leute die direkt in diesen Sprachen eingestiegen sind, wissen oft nur, wie diese zu Benutzen sind, nicht aber, was wirklich passiert, wenn man dort Elemente einfügt oder entfernt.
So ist es mir im Studium schon ein paar mal so gegangen, dass sich jemand über ein extrem langsam laufendes C# oder Javaprogramm beschwert hat, und wenn man sich das dann angeguckt hat sah man, dass dort beispielweise irgend eine Liste o.ä. völlig ineffizient genutzt wurde, und man musste der entsprechenden Person erstmal erklären, was dort eigentlich noch alles im Verborgenen passiert, beispielweise wird zig mal die gleiche Berechnung ausgeführt, und durch eine kleine Umstrukturierung spart man mal eben 100000 Rechenoperationen pro Schleifendurchlauf mit dem gleichen Endergebnis.

Andererseits war es mit C++ Anfangs nicht anders. Auch dort wird schon viel abstrahiert im Vergleich zu C oder Assembler, wo sich vielleicht zu Zeiten des 75MHz Computers einige alteingesessene Programmierer die Hände überm Kopf zusammen geschlagen haben, wenn sie mal den Assemblercode gesehen haben, den C++ so generiert.
Z.B. verwendet der delete Befehl in C++ auch mehr oder weniger nur den free() Befehl aus C, mit einigem Kram drumrum, den man sicher bei direkter Verwendgun von free() besser umsetzen könnte. Heute macht es lediglich keinen Unterschied mehr, da wir 3GHz in unseren Rechnern haben.
Genau so wird es denke ich weiter gehen. C# eignet sich schon heute hervorragend für einige Aufgaben, und wenn wir in 5 Jahren irgend welche ineffizienten Programme auf 6GHz 8kern CPUs Laufen lassen mit 64GB Hauptspeicher, dann weint dem auch keiner mehr nach.
Die Frage ist immer, wo man sich im Jetzt plaziert.
So gibt es auch heute noch Leute, die nur auf C setzen und ab und zu mal C++, und alles was in einer VM läuft für Teufelswerk halten. Ich denke, man sollte sich einfach in der Mitte plazieren (wobei das wahrscheinlich auch schon wieder Definitionssache ist.)
Nicht jeden neuen Scheiß der gehyped wird sofort mitmachen, aber auch nicht noch 10 Jahre mit Windows 2000 rumgurken. Erstmal abwarten, bei etwas Solidem bleiben, aber das neue nicht aus den Augen verlieren. Es kann sich schließlich immernoch etablieren.
Ich bastel z.B. gerne in C++ rum, vor allem weils schnell ist. Für simple GUI Anwendungen setze ich immernoch auf VB6, es hat zwar nur sehr beschränkte OOP Möglichkeiten, aber die Anwendungen lassen sich schnell zusammen schustern, es gibt keine Overflows, und das Debuggen ist auch bequem. Für Anwendungen wo man viel Fertigzeug gebrauchen kann hält dann schonmal C# her, da wird man ja mit Klassen für alle möglichen und unmöglichen Einsatzgebiete nahezu erschlagen.

maphios
10.01.09, 18:44:15
Wie ze so schön gesagt hat, es gibt eben keine "Universalgenies" mehr. Die Menschen haben in allen Teilgebieten so viel Wissen angehäuft, dass sich das kein einzelner mehr merken kann. Daher muss man sich spezialisieren, wenn man heute irgendwo mitentwickeln will oder eben bei einem Thema voll durchsteigen möchte.

Ich finde man kann das im Fall von Computern mit dem Auto vergleichen.
Genauso selbstverständlich wie in jedem Haushalt ein PC vorhanden ist gibt es auch ein Auto.
Benutzen kann es eigentlich jeder und wer den Führerschein gemacht hat weiß auch wie man es bedient.
Was dann konkret passiert wenn ich das Gaspedal drücke oder die Kupplung, oder wie die Rädchen ineinander greifen wenn ich schalte, das weiß hingegen kaum einer. Es würde wohl auch die große Mehrheit überfordern, wenn sie die genauen Vorgänge alle wissen wollten die in einem Auto so vorgehen.

Nun gibt es auch wie im Computerbereich auch im Autobereich immer ein paar Cracks, die ein bisschen mehr drauf haben wie Otto Normalverbraucher.
Solche "Bastler" sind dann schonmal in der Lage einen kompletten Motor eines älteren Gefährtes zu zerlegen und wieder zusammenzubauen ohne den Überblick zu verlieren und auch ohne etwas kaputtzumachen.
Das ging eben mit den früheren, einfacher gestrickten Auto- oder Motorradmotoren, wenn man sich ein gewisses Fachwissen angeeignet hat.

Heutzutage ist es für einen einzelnen wohl unmöglich einen Motor eines modernen Neuwagens aus dem Auto zu bauen, ihn auseinanderzunehmen und wieder korrekt einzubauen. Die Technik ist einfach zu komplex geworden, es spielen zu viele Anwendungen mit hinein.
Auch bei den Autoherstellern baut ja ein ganzes Team von Leuten den Motor und nicht mehr ein einzelner.
Ich glaube auch nicht, dass eine einzelne Person dazu imstande wäre, weil einfach das Wissen das man dazu bräuchte zu viel geworden ist, als dass man es alleine schafft.

So ähnliche sehe ich das beim Programmieren auch, bloß dass das eben noch nicht so fortgeschritten ist wie in der Autobranche und es eben zur Zeit noch möglich ist ganz alleine quasi einen "Motor" zu bauen. Aber da sich auch die Computerbranche weiterentwickelt wird das vielleicht bald nicht mehr möglich sein. Dann kann man als einzelner vielleicht auch nicht mehr bis zum Grund "durchblicken".

Aber wie beim Auto steht eben der Nutzen im Vordergrund und wie Zahl schon gesagt hat, bei einem 3 GHz Prozessor ist es eben egal ob das jetzt eine Nanosekunde länger oder kürzer ist. Die Feinheiten verschwinden da einfach.

Das muss ja nicht heißen, dass auch das Wissen verschwindet, sondern, dass dieses Wissen vielleicht einfach schon nicht mehr die große Rolle spielt und durch neues ersetzt wird.

Zahl
10.01.09, 20:12:51
Korrekt, der Vergleich hinkt aber etwas. Einen Autofahrer vergleicht man mit einem Computerbenutzer, nicht mit einem Programmierer. Der Kfz Mechaniker wäre der treffende Vergleich. Und der muss sehr wohl bescheid wissen, was im Auto passiert, wenn man Gas gibt.
Ich weiß nun nicht wie es beim Auto ist, aber in der Informatik ist es teilweise auch etwas gefährlich, nicht bescheid zu wissen. So können Programmierer, die kein Hintergrundwissen haben, und sich ihre Anwendung quasi nur aus Frameworks zusammenbauen, auch leicht dabei Sicherheitslücken einbauen. Speziell im Bereich der Webanwendungen. Passiert immer mal wieder.
Auch aus diesem Grund will ich immer ein gewisses Maß an Einsicht in die Materialien haben, mit denen ich entwickel und die ich verwende.
Ein "du gibst einfach den Befehl ein und dann passiert das was du willst" macht mich verrückt. :-D

RypeL
19.01.09, 15:00:54
Ich denke die Komplexität der Informatik wird etwas übertrieben. In Wahrheit ist es eher so dass es in der Informatik nur sehr selten wirkliche Innovationen und bedeutende Veränderungen gibt. Computer funktionieren seit jeher nach dem gleichen Prinzip, dass ein gewisser Herr von Neumann 1946 erdacht hat.

Programmiersprachen, Betriebssysteme, Mikroprogramme, ... alle bauen auf dem gleichen Strukturen wie Listen, Stacks etc auf, die auch shcon ewig bekannt sind. Die einschneidentsten Veränderungen waren noch realativ einfach zu verstehende Dinge wie Multithreading, objektorientierte Programmierung oder asynchrone Kommunikation.

Die meisten Veränderungen wurden einfach durch schiere Rechenpower erzwungen. Und eine Sprache wie Java hat heutzutage für fast jede Aufgabe vorgefertigten Code den man verwenden kann um sich seine Anwendung zusammenzubauen, aber wenn man da mal hinterguckt dann ist das auch wieder nur zusammengeschusterter Kram aus den immer gleichen Grundbausteinen. Der Trend geht immer mehr in richtung vorgefertigter codebausteine, nicht weil die Codebausteine so komplizierte Prinzipien verwenden würden das man sie nicht verstehen könnte, sondern einfach deswegen weil die Anwendungen heute meist so groß sind, dass es ein zeitproblem und nicht wirtschaftlich ist alles selbst zu programmieren. Daher ist es in der Regel so dass Unternehmen heutzutage soweit es geht nurnoch ihr user interface und ihre "Geschäftlogik" selbst programmieren und ansonsten anpassbare Komponenten wie Frameworks/SAP verwenden.

Das früher viel mehr selbst programmiert wurde hängt denk ich auch damit zusammen, dass das einbinden vorgefertigten Codes durch die heutigen objektorientierten Programmiersprachen vereinfacht wurde und es früher mehr parallel exitierende Programmiersprachen gab. Heute wird der Markt von wenigen Sprachen, vorallem Java,C++,C#, dominiert.

Aber wie gesagt, ich denke es ist möglich noch alles zu verstehen wenn man die Grundlagen kennt und sich die Zeit nimmt vorgefertigten Code mal zu analysieren. Und ich denke das Informatiker auch in Zukunft so ausgebildet werden, dass sie vom grafischen GUI bis zum einzelnen Prozessorbefehl mal die ganze Kette durchgehen. Wir haben im Studium auch noch Assembler und Mikroprogramme durchgenommen und entwickelt, auch wenn man das später zb in der Funktion als Java Entwickler nichtmehr wirklich zu wissen braucht. Wenn man will kann man sich das aber angucken und auch verstehen. Es ist auch mal ganz interessant und spaßig mit auf dieser untersten Ebene nen paar Zahlen zu addieren und dann im Debugtool oderso zu sehen wie sich die entsprechende Stelle im Speicher ändert. Anfangs mag das interessant und faszinierend erscheinen aber wirklich spektakülär oder überraschend ist das was da psssiert eigentlich nicht. Es ist eigentlich nur anstrengend beim Asselblerprogrammieren, oder gar beim schreiben von Mikroprogrammen (noch eine Stufe unter Assembler, direktes arbeiten mit den einzelnen Befehlen die an den Prozessor gesendet werden), keine Speicherfehler zu produzieren und mit den wenigen grundlegenden Befehlen irgendnen gutes Programm hinzubekommen.

C/C++ Programme werden immernoch zunächst in Assembler übersetzt. Bei Java ist das etwas. So genau weiß ich im Moment auch nciht was im generierten Bytecode drinsteckt aber wenn man will kann man da auch genauer nachforschen und wird seine Programme in Form einer Aneinanderreihung von vielen einfacheren Befehlen vorfinden, die dann aber meist so lang sind das man dafür sehr viel zeit brauchen würde um es nachzuvollziehen.

Wer wirklich so viel Wert auf Kontrolle und effizienz legt sollte eh lieber C/C++ nehmen, wo man auch noch selbst Assembler Code in sein C Programm einbinden kann. (Man kann auch über Javas native-Interface Assembler in Java einbinden, allerdings weiß ich nciht genau ob die Befehle quasi 1zu1 in Javas Bytecode übersetzt werden, wahrscheinlich aber schon).

Wie Zeiger funktionieren braucht man in Java nicht zu wissen weil es da keine Zeiger gibt. Sondern nur Referenzen. Referenzen sind quasi ein Zeiger auf ein Objekt/Variable, während eine Zeiger ein Zeiger auf eine Speicherstelle ist. Das hört sich zunächst kompliziert an wenn man mal darüber nachdenkt ist das aber auch ein ziemlich simples Konzept. Vielfach verpönt unf gefürchtet und ein großes Gesprchsthema sind Zeiger immer deswegen weil man mit ihnen so gefährliche Sachen machen kann. Zeiger sind ein Mittel um irgendwohin ganz nach belieben irgendwas in den Speicher zu schreiben, ohna das das Programm oder der Prozessor das wirklich überprüfen würde ob da überhaupt noch Speicher frei ist oder ob da schon was steht oder ähnliche Konflikte auftreten. Das man dabei den Speicher nicht durcheinanderwirbelt darauf muss der Programmierer selbst achten und das geht oft genug schief, gerade bei größeren Programmen. Daher hat man in Java darauf verzichtet um diese Fehlerquelle auszuschließen und dadurch das entwickeln von Programmen eher zu beschleunigen und sicherer zu machen. Denn Zeiger können manchmal eine Aufgabe schnell und einfach lösen und da Programmierer oft von Natur aus faul sind ;) wird die einfachste Lösung oft ersmal genommen und später hat man dann den Salat wenn das Programm größer wird und man durch das debuggen von durch Zeigerfehlern viel zeit verliert. Außerdem ist es relativ schwer die Zeiger-Struktur die ein andere sich im Speicher aufgebaut hat nachzuvollziehen und zu überprüfen. Daher gibt es weitere, Fessel ähnliche, Veränderungen in Java im Vergleich zu zb C++ um den Programmierer quasi vor sich selbst zu schützen und durch leichter zu verstehende Programme Teamarbeit zu fördern.

Zum Thema "Ein neues BS wird doch kaum noch einer entwickeln können" kann man sich zb Googles neuen Browser Chrome angucken. Browser gibt es ja auch schon ein paar Tage und Chrome revolutioniert die bestehenden Browser in ein paar Aspekten. Die Aspekte und Ideen die Chrome dabei verwendet (zb ein eigener Thread für jeden Tab) sind aber auch nichts wirklich neues. Aber Chrome zeigt, das es durchaus noch möglich ist schon bestehendes Wissen zu neuen Ansätzen zu kombinieren. Oftmals sind das neue Kombinationen die früher noch nciht möglich waren weil die Rechner oder dass Inet dafür noch zu langsam waren.


Ok, also was ich so ungefähr sagen wollte ist, dass ich nicht finde das es so ist das die Informatik immer unverständlicher werden würde. Im Gegenteil, es verändert sich an den Konzepten fast nie was weil sich schon genügend schlaue Köpfe damit befasst haben und die Datenverarbeitung schon ziemlich durchgekaut. Schaut man sich verschiedene Programmiersprachen, Betriebssysteme und ähnliches an wird man vielfach immer wieder auf die gleichen Dinge in unterschiedlicher Ausführung und Kombination stoßen.

Aber versteht mich nciht falsch, ich sag nicht das das alles einfach und kalter Kaffee wäre und ich will auch absolut nicht behaupten das ich zb alles wüsste. Auch in der Informatik kann und muss man das ganze leben über lernen um ein umfassendes Wissen aufzubauen aber es bleibt denke ich nach wie vor machbar und ein Informatikstudium in 10 oder gar 20 Jahren wird sich wahrscheinlich nicht sonderlich viel von dem heutigen Informatikstudium unterscheiden, weil in der Grundlagenforschung auf dem Gebiet relativ wenig Bewegung ist. (Quantencomputing wär mal was wirklich neues aber davon sind wir wohl noch nen gutes Stück entfernt).

blue
19.01.09, 17:48:31
Wie Zeiger funktionieren braucht man in Java nicht zu wissen weil es da keine Zeiger gibt. Sondern nur Referenzen. Referenzen sind quasi ein Zeiger auf ein Objekt/Variable, während eine Zeiger ein Zeiger auf eine Speicherstelle ist. Das hört sich zunächst kompliziert an wenn man mal darüber nachdenkt ist das aber auch ein ziemlich simples Konzept. Vielfach verpönt unf gefürchtet und ein großes Gesprchsthema sind Zeiger immer deswegen weil man mit ihnen so gefährliche Sachen machen kann. Zeiger sind ein Mittel um irgendwohin ganz nach belieben irgendwas in den Speicher zu schreiben, ohna das das Programm oder der Prozessor das wirklich überprüfen würde ob da überhaupt noch Speicher frei ist oder ob da schon was steht oder ähnliche Konflikte auftreten.

Mit Zeigern kann man heutzutage nichts mehr böses anstellen. Seit Linux 2.4. und Windows Vista besitzen die meisten User-Betriebssysteme effiziente Speicherschutzmechanismen. Sobald man auf Speicherstellen zugreift, die nicht zulässig sind, wird die Applikation mit einem Fehler gekillt.

Zum Thema "Ein neues BS wird doch kaum noch einer entwickeln können" kann man sich zb Googles neuen Browser Chrome angucken. Browser gibt es ja auch schon ein paar Tage und Chrome revolutioniert die bestehenden Browser in ein paar Aspekten. Die Aspekte und Ideen die Chrome dabei verwendet (zb ein eigener Thread für jeden Tab) sind aber auch nichts wirklich neues. Aber Chrome zeigt, das es durchaus noch möglich ist schon bestehendes Wissen zu neuen Ansätzen zu kombinieren. Oftmals sind das neue Kombinationen die früher noch nciht möglich waren weil die Rechner oder dass Inet dafür noch zu langsam waren.

Absolut kein Vergleich. Das wirklich interessante an einem Browser ist die Rendering Engine, die beim Chrome auf das Open-Source Projekt WebKit basiert. (Ebenso der Safari basiert darauf). Das einzig interessante am Chrome Browser ist der JavaScript Interpreter, der aber mittlerweile auch nicht mehr wirklich so revolutionär ist, da u.a. der Opera in manchen Bereichen sogar noch schneller ist.
Im Vergleich dazu darf man sich bei Betriebssystemen mit Hardware Interrupts, Speicher-, Prozessverwaltung, Speicherschutz, Modulen/Treibern, Netzwerken .. sogar der allgemeinen Architektur rumschlagen.


Ok, also was ich so ungefähr sagen wollte ist, dass ich nicht finde das es so ist das die Informatik immer unverständlicher werden würde. Im Gegenteil, es verändert sich an den Konzepten fast nie was weil sich schon genügend schlaue Köpfe damit befasst haben und die Datenverarbeitung schon ziemlich durchgekaut. Schaut man sich verschiedene Programmiersprachen, Betriebssysteme und ähnliches an wird man vielfach immer wieder auf die gleichen Dinge in unterschiedlicher Ausführung und Kombination stoßen.

Es geht nicht um die Konzepte, es geht einfach darum, dass man heutzutage nicht mehr auf dem ersten Blick sieht, was APIs oder gar Programmiersprachen (Stichwort Java, .NET) wirklich machen.
Man betrachte einfach mal den Datentypen 'String'. Unter C gibt es diesen Datentyp nicht einmal, man muss auf Character-Arrays zurückgreifen und wenn man nicht auf den 'String' verzichten will, der muss ihn sich selbst entwickeln. Dies ist aber erst gar nicht möglich ohne Zeiger und dynamischer Speicherallozierung.
Programmieren, wie man es aus C/C++ kennt, ist also in Java/.NET erst gar nicht mehr möglich. Man bekommt dort einfach irgendeine extrem umfangreiche API, die man nutzt. Was aber unter der Haube steckt - ist völlig undurchsichtig. Davon ab, ich will nicht sagen, dass programmieren mit Java nicht komfortabel ist! Aber wir haben bei uns welche im Semester, die eine Java Hashtable nutzen und nicht einmal wissen, was überhaupt eine Hashtable ist.

RypeL
19.01.09, 19:20:17
Naja im eigenen Prozessspeicher kann man mit Zeigern schon ordentlich unfug wie memory-leaks und vor allem unübersichtliche "verzeigerungen" erstellen. Man kann mit den Zeigern zumindest im eigenen Prozessraum beliebige Speicherstellen addressieren, wohingegen in Java nurnoch Referenzen auf Objekte möglich sind. Dadurch kann man auch seine Strings nichtmehr über Zeigerarithmetik wie in C verwalten, aber naja ich trauer den C Strings nicht nach. Ich hab einmal ein relativ großes C Programm geschrieben und das später nach Java portiert. In Java war das Programm viel kürzer und übersichtlicher.

Detailwissen zahlt sich immernoch aus wenn man zb Gebrauch von Collections macht. Das wichtige sind ja eigentlich die Datenstrukturen und Algorithmen, nicht etwa die Unterschiede zwischen einem C und einem Java String. Und wer weiterhin lieber in C programmieren will kann immernoch gute Jobs im Bereich embedded Hardware finden, wo C sicherlich noch eine ganze Weile zum Einsatz kommen wird.

Zahl
19.01.09, 20:23:25
Ich muss allerdings mal anmelden, dass in unserem Studium noch kein bisschen Assembler gemacht wurde, C mal in Ansätzen. Von Daher kann man schon sagen, dass bei vielen ein großes schwarzes Loch unterhalb der Abstraktionsebene von Java oder C# existiert.
Und das ist eben nicht gut wie ich glaube, siehe oben von mir Aufgeführte Beispiele.

Ich mache zur Zeit ein Projekt aus dem Bereich Handlungsplanung, und unser Programm an dem wir arbeiten ist z.B auch in C++ geschrieben, einfach aus Performance- und Speichergründen. Man kommt da gerne schon mal in den GB Bereich mit dem Speicherverbrauch, mit Java wär man da sicher schon beim X-fachen ;)
Das ist so ein Bereich wo sich Java einfach nie durchsetzen wird, weil man immer Probleme hat, die nicht schnell genug lösbar sind...
Baut man hingegen ne GUI Anwendung die einfach auf allen Plattformen laufen soll, nimmt man Java, und es is egal, dass mal eben 80MB Speicher belegt sind dadurch.

@Blue: Getrennten Speicher gibts seit NT4.0 ;)

blue
19.01.09, 21:10:46
@Blue: Getrennten Speicher gibts seit NT4.0 ;)

Das meinte ich nicht ;)

Es geht halt um die Sicherheit bei der speicherverwaltung.
Bei Betriebssystemen (Im Linux Kernel schon seit längerer Zeit, bei Windows seit Version 6.0 [Vista]), werden Checksummen zum Prozessadressraum geführt und regelmäßig geprüft. So ist es schwieriger möglich den Adressraum mit Zeigern zu manipulieren.

RypeL
19.01.09, 22:18:46
Ob man Assembler macht oder nicht hängt sicher auch vom Studiengang ab. "angewandte Informatik" bei Blue heißt wohl eher kein Assembler. Weiß nichtmehr genau was du studierst Zahl aber bei uns wars quasi die normale "allgemeine Informatik"(also von allem ein bischen aber weniger Praxis) und da kam Assembler im dritten und vierten Semester im Bereich technischer Informatik dran. Im dritten Semester haben wir die theorie gemacht und im vierten Semester mussten wir dann einmal pro Woche einen Nachmittag Schaltungen und Mikrocontroller selbst auf dem Steckbrett zusammenstecken und die Assemblerprogramme für die Mikrocontroller schreiben. Wir mussten teilweise auch die Ansteuergleichungen aus Tabellen oder Zustandsautomaten ableiten, mit bestimmten Verfahren optimieren und dann umsetzen. Das war sone Art internes Uni-Praktikum und wir mussten die Aufagen an dem vorgesehenen Tag lösen oder uns einen Fehlerversuch anstreichen lassen von denen wir aber nur 2 am Ende des Semesters haben durften. Daher mussten wir auch manchmal unter Zeitdruck Assemblerprogramme noch bis in die Abendstunden debuggen. Denn die Programme waren in der Regel regel nicht einfach linear, sondern rekursiv mit verschiedenen Subprogrammen die nur über jmp-Befehle bzw gotos verbunden sind. Interessant ? Ja, keine Frage. Aber es war auch anstrengend und die meisten waren froh als das Semester rum war, denn die Vorbereitung der Versuche und das erarbeiten des Programmcodes hat verdammt viel zeit gefressen.

blue
19.01.09, 22:27:44
Ob man Assembler macht oder nicht hängt sicher auch vom Studiengang ab. "angewandte Informatik" bei Blue heißt wohl eher kein Assembler. Weiß nichtmehr genau was du studierst Zahl aber bei uns wars quasi die normale "allgemeine Informatik" und da kam Assembler im dritten und vierten Semester im Bereich technischer Informatik dran. Im dritten Semester haben wir die theorie gemacht und im vierten Semester mussten wir dann einmal pro Woche einen Nachmittag Schaltungen und Mikrocontroller selbst auf dem Steckbrett zusammenstecken und die Assemblerprogramme für die Mikrocontroller schreiben. Wir mussten teilweise auch die Ansteuergleichungen aus Tabellen oder Zustandsautomaten ableiten, mit bestimmten Verfahren optimieren und dann umsetzen. Das war sone Art internes Uni-Praktikum und wir mussten die Aufagen an dem vorgesehenen Tag lösen oder uns einen Fehlerversuch anstreichen lassen von denen wir aber nur 2 am Ende des Semesters haben durften. Daher mussten wir auch manchmal unter Zeitdruck Assemblerprogramme noch bis in die Abendstunden debuggen. Denn die Programme waren in der Regel regel nicht einfach linear, sondern rekursiv mit verschiedenen Subprogrammen die nur über jmp-Befehle bzw gotos verbunden sind. Interessant ? Ja, keine Frage. Aber es war auch anstrengend und die meisten waren froh als das Semester rum war, denn die Vorbereitung der Versuche und das erarbeiten des Programmcodes hat verdammt viel zeit gefressen.

Naja, ich wurde mit Abitur und im Studium ein Semester lang mit Assembler gequält .. Falls ich mehr interesse daran habe, gibt es diverse Wahlpflichfächer, aber da habe ich mir für Grafik-Spieleprogrammierung und XML entschieden ;)


Man muss aber schon wohl sagen, dass Programmierer so etwas wie Assembler im High-Level Bereich nicht mehr nutzen. Stattdessen aber schlägt man sich mit APIs rum.

Ein weiteres Beispiel, wir lernen derzeit Java, statt GUI Anwendungen selbst zu schreiben, nutzen wir Ecplipse-Plugins und klicken uns die GUI zusammen. Theoretisch bekommen wir natürlich alles vermittelt, praktisch sieht das schon wieder anders aus.

Zahl
20.01.09, 00:27:56
Ich studiere auch normale Informatik. Bei uns isses aber zur Zeit so, dass überall auf modernen Kram gesetzt wird, um irgendwie mit der Zeit zu gehen. Wir hatten auch ein Semester lang ein Hardwarepraktikum, wo wir einen Roboter programmieren mussten der einen kleinen Microkontroller hatte.
Nun sah es so aus, dass die Dozenzen die Wahl zwischen Assembler, C oder einer abgespeckten Java VM hatten... Ratet mal was genommen wurde. :rolleyes:
Und es war nur zum Kotzen. Die VM die da drauf lief war völlig verbuggt, einige Befehle brachten das Teil sogar so zum abstürzen, dass wir es nicht mehr mit dem uns zur Verfügung gestellten USB Kabel flashen/resetten konnten, sondern zum Hiwi laufen mussten, der es dann über ein serielles Kabel richten konnte.
In dem Fall war die Verwendung von Java (hieß in dem Fall Javelin) meiner Meinung nach völliger Schwachsinn. Mit einer HL Sprache die in einer VM läuft sollte man niemals das System dermaßen schrotten können.
Insgesamt glaube ich, dass ich 10x mehr gelernt hätte, wenn wir dort C oder asm benutzt hätten.
Ähnlich sieht es in den anderen Fächern aus. Java hier, C# da..
Wer will schafft es hier problemlos ohne eine Sprache, die nicht in einer VM läuft, durchs Studium zu kommen.
Wie gesagt, ich bin nicht gegen die Verwendung dieser Sprachen, aber man sollte, wenn man ernsthafte Projekte später einmal umsetzt wissen, was eigentlich los ist.

RypeL
20.01.09, 00:47:01
Hm Eclipse Plugins an der Uni zu verwenden anstatt direkt Swing/AWT zu programmieren das find ich dann allerdings auch recht merkwürdig. Und Microkontroller mit mit ner VM orientierten Sprache zu programmieren hört sich für mich auch etwas unpassend an. Naja dafür weiß ich nicht allzuviel darüber wie eine VM funktioniert. Da habt ihr dann vielleicht Vorteile bei der Optimierung von Java Code, trotzdem wäre Assembler wohl sicher interessanter gewesen.

(Btw hier mal ein, nicht ganz ernstzunehmender Beitrag zum Thema "richtige Programmierer vs Müslifresser", der zeigt, dass das Thema auch schon früher die Gemüter erhitzte ;). Kennt ihr vielleicht schon aber passt halt grad so schön :> :
http://www.informatik.tu-cottbus.de/~fsi/alt/lektuere/realprogrammers.html (http://www.informatik.tu-cottbus.de/%7Efsi/alt/lektuere/realprogrammers.html))

steelworks
20.01.09, 14:15:40
Moin
Fange zwar gerade erst an, das Programmieren zu lernen, möchte aber trotzdem mal meinen Senf dazu geben^^
In der Schule (Klasse 11) soll uns wohl Java beigebracht werden. Dazu benutzen wir die Plattform BlueJ und die Bibliothek "Stifte und Mäuse(:king:)
Nun....wir kriegen jetzt Grundlagen wie Schleifen, Objekte, Funktionen usw. beigebracht.
Wir malen schöne Autos, die wir über den Bildschirm flitzen lassen und an der Wand abprallen.
Dazu benutzen wir Befehle wie:
hatStift.zeichneRechteck();
hatStift.bewege();
hatStift.runter();
usw.
.......HÄ?
Wenn ich mir das angucke, frage ich mich immer wieder, was das mit Programmieren zu tun hat. Schön und gut, wenn ich durch diese vorgefertigten Befehle ein Auto malen kann, aber das kann ich auch einfacher mit Paint machen.
Wir lernen zwar, wie Schleifen und Funktionen funktionieren, aber ohne diese Bibliothek an vorgefertigten Befehlen nützt uns dieses Wissen nicht, und im Berufsleben, da bin ich mir ziemlich sicher, is nichts mit "Stifte und Mäuse"
Also im Studium noch mal von vorne anfangen und kapieren, warum sich der Stift bewegt....
Warum zeichnet der Stift schwarz, wenn ich den Befehl "runter()" benutze?
Uns wird, der Meinung bin ich jedenfalls, weniger eine Programmiersprache beigebracht, als eine Arbeitsumgebung.
Aber wenn ich ne Ausbildung als Ingeneur mache, will ich auch lernen, wie die Maschienen, die ich baue funktionieren, und nicht, welche Tasten ich auf einer anderen Maschiene drücken muss, damit diese die eigendliche Maschiene fertigt.

Ich bringe mir nebenbei selbst C++ bei (mit Buch natürlich) und bemerke radikale Unterschiede in der Lehrmethode.
Anstatt gleich mithilfe unverständlicher Werkzeuge gleich grafischee Spielechen zu erzeugen, beginnt man hier, mir die elementaren Befehle der Sprache mittels DOS beizubringen..
Ich male keine Autos auf den Bildschirm.
Auch keine Häuser.
Alles Bereiche die mir beigebracht werden, seien es Schleifen, Funktionen oder Zeiger, werden nur mittels einer Textausgabe über DOS dargestellt.
Und doch bin ich stolzer, ein simples Zahlenratespiel zu programmieren, als ein grafisches Atorennen, dass ich nicht steuern kann, da ich die Logik hinter den Befehlen, die ich benutze verstehen kann.

Ein weiterer Punkt, der denke ich wichtig ist, wenn niemand mehr die Logik hinter der Programmiersprache versteht ist, dass die Entwicklung neuer Sprachen mit evntl mehr Möglichkeiten stehen bleiben wird. Kein Mensch wird mehr verstehen, wie Java, oder C# funktioniert, sondern nur noch, wie man die Sprache benutzt.
Wenn jeder nur noch wüsste, wie man ein Auto fährt (evntl, wie man die Teile zusammenbaut), aber nicht mehr wie die einzelnen Teile in Bezug zu einander stehen, wird die Entwicklung stehen bleiben, es werden keine neuen Modelle mehr entworfen, wir würden für immer auf dem heutigen Stand der Technologie stehen bleiben.

So...das ist meine Meinungg, was ihr davon haltet, ist euch überlassen:-D

maphios
20.01.09, 19:33:20
Ein weiterer Punkt, der denke ich wichtig ist, wenn niemand mehr die Logik hinter der Programmiersprache versteht ist, dass die Entwicklung neuer Sprachen mit evntl mehr Möglichkeiten stehen bleiben wird. Kein Mensch wird mehr verstehen, wie Java, oder C# funktioniert, sondern nur noch, wie man die Sprache benutzt.
Wenn jeder nur noch wüsste, wie man ein Auto fährt (evntl, wie man die Teile zusammenbaut), aber nicht mehr wie die einzelnen Teile in Bezug zu einander stehen, wird die Entwicklung stehen bleiben, es werden keine neuen Modelle mehr entworfen, wir würden für immer auf dem heutigen Stand der Technologie stehen bleiben.


Sehe ich nicht ganz so. Ich denke eher, wenn man einmal auf einem neuen Level ist, dann kann man auch vorherige Entwicklungsstufen erstmal "beiseite legen". Klingt jetzt vll etwas komisch, darum greif ich das Beispiel mit den Autos mal auf:

Heute wird ja in der Automobilbranche ja immer noch viel geforscht und neues entwickelt. Zur Zeit sind ja Energiesparkonzepte der neueste Schrei. Wenn man jetzt deiner Argumentation folgt, dann müsste ein heutiger Ingenieur, der einen neuartigen Motor entwickelt, über alle Maschinenen- und Motorentwicklungen der letzten 100 Jahre komplett im Bilde sein.
Er sollte also genauso einen 100 Jahre alten Daimlermotor bauen können wie einen 70er Jahre Ami-Antrieb.
Das alles zu können ist aber wohl ein Ding der Unmöglichkeit.
Ich denke es reicht, wenn der Ingenieur die Grundlagen von z.b. den 80er oder 90er Jahren kennt, die ihrerseits natürlich auf den alten Sachen aufbauen, aber eben nur die wichtigsten Ergebnisse aus der alten Zeit repräsentieren.
So überspringt er zwar 70 Jahre Automobilentwicklung, aber er ist eigentlich auf dem modernsten Stand und hat das grundlegende Wissen auch neue Sachen zu entwickeln.

Also meiner Meinung nach kann man nicht immer von 0 anfangen, wenn man neue Trends entwickeln und erforschen will. Man muss da auf die Ergebnisse von anderen und früheren Arbeiten zurückgreifen.
In der Mathematik hinterfragt man ja dann auch nicht nochmal die Rechenregeln wenn man eine neue Differentialgleichung lösen möchte.

Klar hast du auch Recht, dass man auf die Sachen auf die man zurückgreift vertrauen muss und da auch genügend im Bilde sein muss. Aber um dann mal den übernächsten Schritt zu machen braucht man eben auch die Leistung von anderen auf die man aufbauen kann.

Von daher glaube ich nicht, dass wir einfach auf dem heutigen Stand der Technik stehen bleiben würden, wenn wir nicht alles bis ins Hundertste von früher wissen.