Tumbleweed
Captain
- Registriert
- März 2008
- Beiträge
- 3.598
Häufig gestellte Fragen zum Thema
Programmieren
Programmieren
Um den ständig wiederkehrenden Fragen Herr zu werden, möge dieses FAQ in Zusammenarbeit der User wachsen und als Anlaufstelle für Neulinge im Bereich der Programmierung dienen. Diese Zusammenstellung erhebt keinen Anspruch auf Vollständigkeit und penible Korrektheit, auch wenn dies angestrebt wird. Viel mehr soll sie Stichworte liefern, die das eigene Suchen erleichtern.
Vor allem wird aber Wert auf Neutralität gelegt. Es soll niemand bekehrt werden bzw. niemandem vorgeschrieben werden, welche Sprache er zu lernen hat oder welche Entwicklungsumgebung er benutzen soll. Es handelt sich nur um Empfehlungen, die auf eigenen Erfahrungen und zahlreichen Threads hier im Board beruhen.
Man findet in vielen (unseriösen) Programmiererforen (nahezu religiös anmutende) Auseinandersetzungen, welche nun die beste Sprache sei. Nach Lesen dieses FAQs, sollte die Frage hoffentlich nicht mehr unter den Nägeln brennen.
Natürlich ist Kritik willkommen und Mitarbeit zu weiteren Themenbereichen im ausdrücklich erwünscht.
Eigentlich verstehen Maschinen nur ihre ganz eigene Sprache - die Maschinensprache, auch Binärcode genannt. Sie wird in der Regel mit Nullen und Einsen dargestellt, welche die kleinste Einheit darstellen - das so genannte Bit. Dabei steht eine Null für false/unwahr und eine Eins für true/wahr. Diese winzigen Bauteilen lassen sich verketten, sodass sie komplexere Informationen darstellen können.
Da diese Sprache für den Menschen nur sehr schwer verständlich ist, gibt es viele Programmiersprachen, jede mit ihrer eigenen Abstraktionsstufe. Man spricht dabei von low-level, wenn die Sprache sehr systemnah ist und high-level bzw. Hochsprachen, wenn man mit den Interna des Systems nur noch wenig zu tun hat, sondern nur noch ganz abstrakt die Logik des Programms formuliert.
Sehr systemnahe Sprachen sind die so genannten Assemblersprachen. Es gibt nur sehr wenige Programmierer, die sich tatsächlich auf dieser Abstraktionsebene bewegen. Diese Sprachen erfordern sehr umfangreiches Verständnis für die Funktionsweise der Maschine.
Der erste große Sprung führt dann hin zu Sprachen wie C, in denen man bereits leichter verständliche Befehle benutzt, so genannte keywords. Diese entstammen dem Englischen, weshalb man sich als angehender Programmierer früh damit abfinden sollte, viel mit englischen Wörtern und Texten konfrontiert zu werden.
Die nächste Stufe bilden die Sprachen, die als managed bezeichnet werden und auf virtuellen Maschinen ausgeführt werden. Bei diesen Sprachen wird der Programmierer nicht einmal mehr mit der Verwaltung des Speichers belastet. Ein garbage collector (GC) erledigt die automatische Speicherbereinigung. Das heißt nicht, dass man vor den gefürchteten Speicherlecks (memory leaks) gefeit ist, reduziert aber die Gefahr erheblich.
Stellt sich also abschließend die Frage - wie versteht die Maschine plötzlich so viele Sprachen, obwohl sie eigentlich nur 0 und 1 kennt? Es gibt Übersetzer! Diese kann man ganz grob in Compiler und Interpreter unterteilen. Wie so oft gibt es aber auch hier nicht nur Schwarz und Weiß, sondern etwas Grau dazwischen auch. So gibt es zwischen Compilern (auch Ahead-of-time-Compiler genannt), die vor Ausführung übersetzen und Interpretern, die gar nicht übersetzen, sondern einfach nur "vermitteln", auch noch Just-in-time-Compiler (JIT). Die Vorteile letzterer werden in dem Artikel gut beschrieben.
Da diese Sprache für den Menschen nur sehr schwer verständlich ist, gibt es viele Programmiersprachen, jede mit ihrer eigenen Abstraktionsstufe. Man spricht dabei von low-level, wenn die Sprache sehr systemnah ist und high-level bzw. Hochsprachen, wenn man mit den Interna des Systems nur noch wenig zu tun hat, sondern nur noch ganz abstrakt die Logik des Programms formuliert.
Sehr systemnahe Sprachen sind die so genannten Assemblersprachen. Es gibt nur sehr wenige Programmierer, die sich tatsächlich auf dieser Abstraktionsebene bewegen. Diese Sprachen erfordern sehr umfangreiches Verständnis für die Funktionsweise der Maschine.
Der erste große Sprung führt dann hin zu Sprachen wie C, in denen man bereits leichter verständliche Befehle benutzt, so genannte keywords. Diese entstammen dem Englischen, weshalb man sich als angehender Programmierer früh damit abfinden sollte, viel mit englischen Wörtern und Texten konfrontiert zu werden.
An C, in dem noch rein Prozedural programmiert wird, orientierten sich, zumindest syntaktisch, viele der modernen Hochsprachen.
Die weit verbreitete Sprache C++ ermöglicht (so wie auch Objective-C) als Obermenge von C die Objektorientierte Programmierung (OOP), ein sehr praxis-relevantes, modernes Programmierparadigma. OOP setzt, stark vereinfacht gesagt, auf Verkapselung und Wiederverwendbarkeit von Code. Dabei wird großer Wert darauf gelegt genau zu bestimmen welche Objekte miteinander interagieren können.
Verschiedene Sprachen bieten die Verwendung verschiedener Paradigmen an. Die eben genannten Sprachen C, C++ und Objective-C zählen zu den imperativen Sprachen. D.h. man beschreibt mit ihnen ganz konkret wie eine Berechnung ausgeführt wird.
Einen anderen Ansatz verfolgen Sprachen, welche die deklarative Programmierung erlauben. In jenen geht es darum zu beschreiben was berechnet werden soll. Mit diesem Paradigma kommt man vor allem während Studiengängen in Kontakt, die mit der Informatik verwandt sind. Ein praxisrelevantes Beispiel einer deklarativen Sprache ist SQL. Mit SQL beschreibt man, welche Daten man von einer Datenbank abfragen möchte. Wie diese Abfrage umgesetzt wird, bestimmt das Datenbankmanagementsystem (DBMS).
Die weit verbreitete Sprache C++ ermöglicht (so wie auch Objective-C) als Obermenge von C die Objektorientierte Programmierung (OOP), ein sehr praxis-relevantes, modernes Programmierparadigma. OOP setzt, stark vereinfacht gesagt, auf Verkapselung und Wiederverwendbarkeit von Code. Dabei wird großer Wert darauf gelegt genau zu bestimmen welche Objekte miteinander interagieren können.
Verschiedene Sprachen bieten die Verwendung verschiedener Paradigmen an. Die eben genannten Sprachen C, C++ und Objective-C zählen zu den imperativen Sprachen. D.h. man beschreibt mit ihnen ganz konkret wie eine Berechnung ausgeführt wird.
Einen anderen Ansatz verfolgen Sprachen, welche die deklarative Programmierung erlauben. In jenen geht es darum zu beschreiben was berechnet werden soll. Mit diesem Paradigma kommt man vor allem während Studiengängen in Kontakt, die mit der Informatik verwandt sind. Ein praxisrelevantes Beispiel einer deklarativen Sprache ist SQL. Mit SQL beschreibt man, welche Daten man von einer Datenbank abfragen möchte. Wie diese Abfrage umgesetzt wird, bestimmt das Datenbankmanagementsystem (DBMS).
Stellt sich also abschließend die Frage - wie versteht die Maschine plötzlich so viele Sprachen, obwohl sie eigentlich nur 0 und 1 kennt? Es gibt Übersetzer! Diese kann man ganz grob in Compiler und Interpreter unterteilen. Wie so oft gibt es aber auch hier nicht nur Schwarz und Weiß, sondern etwas Grau dazwischen auch. So gibt es zwischen Compilern (auch Ahead-of-time-Compiler genannt), die vor Ausführung übersetzen und Interpretern, die gar nicht übersetzen, sondern einfach nur "vermitteln", auch noch Just-in-time-Compiler (JIT). Die Vorteile letzterer werden in dem Artikel gut beschrieben.
Ist das etwa nicht das Gleiche? Zumindest verbindet man das im allgemeinen Verständnis so sehr miteinander, dass automatisch die Frage nach der Sprache aufkommt. Programmieren ist allerdings ein weites Feld und ein stark vereinfachter Begriff für das, was in der Regel damit gemeint ist.
Als Neuling auf dem Gebiet der Softwareentwicklung, muss man einige Konzepte verstehen, die für erfahrene Programmierer so selbstverständlich sind, dass sie, wenn sie versuchen einem Neuling das Programmieren zu erklären, völlig vergessen, welche Grundlagen dem Neuling fehlen, um alles verstehen zu können.
Analog dazu stellen sich einige unter einem Informatikstudium einen intensiven Programmierlehrgang vor. Dem ist aber nicht so. Programmiersprachen können als reines Handwerkszeug betrachtet werden, mit denen man mit Maschinen kommunizieren kann. Dabei ist es egal, ob es sich um einen konventionellen PC, ein Smartphone, einen kleinen Roboter oder einen Autopiloten in einem Flugzeug handelt.
Man sollte sich daher bevor man loslegt überlegen, was man eigentlich erreichen möchte und wie umfangreich man in die Materie einsteigen möchte. Es wird Anfängern vereinzelt nahegelegt besonders grundlegend und abstrakt einzusteigen. So wirbt z.B. unser Boardie asdfman eifrig mit SICP und empfiehlt auch gern Programmiersprachen, die alles andere als "mainstream" sind. Der Vollständigkeit halber nehme ich diesen Ansatz gern in dieses FAQ auf, gebe aber zu bedenken, dass einen Neuling bei einer solch grundlegenden Herangehensweise nicht unbedingt das erwartet, was er sich unter Programmieren vorstellt. Es wird vermutlich länger dauern, bis er zu den Ergebnissen gelangt, die seiner eigenen Vorstellung entsprachen, er wird allerdings dadurch seine Programmierlaufbahn auf einem äußerst soliden Fundament aufbauen und anderen Programmierern teilweise etwas voraus haben.
Als Neuling auf dem Gebiet der Softwareentwicklung, muss man einige Konzepte verstehen, die für erfahrene Programmierer so selbstverständlich sind, dass sie, wenn sie versuchen einem Neuling das Programmieren zu erklären, völlig vergessen, welche Grundlagen dem Neuling fehlen, um alles verstehen zu können.
Analog dazu stellen sich einige unter einem Informatikstudium einen intensiven Programmierlehrgang vor. Dem ist aber nicht so. Programmiersprachen können als reines Handwerkszeug betrachtet werden, mit denen man mit Maschinen kommunizieren kann. Dabei ist es egal, ob es sich um einen konventionellen PC, ein Smartphone, einen kleinen Roboter oder einen Autopiloten in einem Flugzeug handelt.
Man sollte sich daher bevor man loslegt überlegen, was man eigentlich erreichen möchte und wie umfangreich man in die Materie einsteigen möchte. Es wird Anfängern vereinzelt nahegelegt besonders grundlegend und abstrakt einzusteigen. So wirbt z.B. unser Boardie asdfman eifrig mit SICP und empfiehlt auch gern Programmiersprachen, die alles andere als "mainstream" sind. Der Vollständigkeit halber nehme ich diesen Ansatz gern in dieses FAQ auf, gebe aber zu bedenken, dass einen Neuling bei einer solch grundlegenden Herangehensweise nicht unbedingt das erwartet, was er sich unter Programmieren vorstellt. Es wird vermutlich länger dauern, bis er zu den Ergebnissen gelangt, die seiner eigenen Vorstellung entsprachen, er wird allerdings dadurch seine Programmierlaufbahn auf einem äußerst soliden Fundament aufbauen und anderen Programmierern teilweise etwas voraus haben.
Das dürfte mit Abstand die meist gestellte Frage des Programmieren-Boards sein. Die Antwort auf die zweite Teilfrage fällt leicht – es gibt keine beste Sprache. Alle Sprachen haben Eigenheiten, Vor- und Nachteile. Die Kriterien sind dabei zahlreich und müssen für jedes Vorhaben individuell abgewägt werden. Beispiele:
Einige Sprachen sind auch gar keine Programmiersprachen im eigentlichen Sinn, obwohl sie ebenfalls Schlüsselbegriffe (keywords) und teilweise auch gängige Konstrukte wie Schleifen, Datenstrukturen und Verzweigungen enthalten, die dem Benutzer bekannt sein müssen. Darunter fallen Beschreibungssprachen wie HTML, CSS und XML, Skriptsprachen wie PHP, Lua und Abfragesprachen wie SQL.
- Performance
- Portabilität/Zielplattform
- Fehleranfälligkeit bzw. Fehlertoleranz
- Komfort
- Lesbarkeit
- Wartbarkeit (Unit Testing, integrierte Möglichkeiten zur Dokumentation)
- Verfügbare Bibliotheken (bereits bestehender Code, der als Hilfsmittel dienen kann)
- Benötigte Hardwarenähe
- Kompaktheit des Codes vs. hoher Bedarf an „boilerplate code“
Einige Sprachen sind auch gar keine Programmiersprachen im eigentlichen Sinn, obwohl sie ebenfalls Schlüsselbegriffe (keywords) und teilweise auch gängige Konstrukte wie Schleifen, Datenstrukturen und Verzweigungen enthalten, die dem Benutzer bekannt sein müssen. Darunter fallen Beschreibungssprachen wie HTML, CSS und XML, Skriptsprachen wie PHP, Lua und Abfragesprachen wie SQL.
Wenn man eine simple Website erstellen möchte, dann reicht es völlig aus, sich mit HTML und CSS zu beschäftigen. In diesem Fall wird man mit Programmierung nicht in Berührung kommen, sondern man beschreibt nur, wie die Website strukturiert ist (HTML) und wie sie formatiert ist (CSS).
Möchte man die Website allerdings dynamischer gestalten, mit beweglichen Elementen oder anspruchsvollen Oberflächen mit Fenstern und Drag&Drop-Funktionalität, dann kommt man an JavaScript nicht vorbei. Möchte man abgesehen vom statischen Inhalt auch noch dynamische Inhalte bieten, dann heißen die wichtigsten Kandidaten PHP, JSP in Verbindung mit Servlets oder auch ASP.Net.
Möchte man die Website allerdings dynamischer gestalten, mit beweglichen Elementen oder anspruchsvollen Oberflächen mit Fenstern und Drag&Drop-Funktionalität, dann kommt man an JavaScript nicht vorbei. Möchte man abgesehen vom statischen Inhalt auch noch dynamische Inhalte bieten, dann heißen die wichtigsten Kandidaten PHP, JSP in Verbindung mit Servlets oder auch ASP.Net.
Möchte man Anwendungen (darunter fallen auch Spiele) entwickeln, die bestimmte Aufgaben auf der ausführenden Maschine erledigen, dann muss man sich für eine Programmiersprache entscheiden bzw. eine Skriptsprache wählen, für die auch ein Interpreter verfügbar ist, um den Code unabhängig von einem Webserver auszuführen.
Die wichtigsten Kriterien wurden bereits aufgezählt. Hinzu kommt noch die grundlegende Unterscheidung zwischen Sprachen, die vor Ausführung direkt in Maschinensprache übersetzt werden (unmanaged) und Sprachen, die nur in eine Art Zwischensprache, meist byte code genannt, übersetzt werden, die dann auf einer VM (virtual machine) ausgeführt wird.
Damit verbunden ist in der Regel auch der grundlegende Unterschied, dass bei managed code das Speichermanagement von der VM übernommen wird, während bei unmanaged code der Programmierer gezwungen ist, sich selbst darum zu kümmern. Da moderne VMs sehr optimiert sind (und immer weiter optimiert werden), werden die Geschwindigkeitsnachteile gegenüber manuellem Speichermanagement immer geringer und die geringere Fehleranfälligkeit des managed codes überwiegt.
Wikipedia bietet eine enorm umfangreiche Auflistung bekannter Programmiersprachen. Es folgt eine kleine Auswahl der etablierten Sprachen zur Anwendungsentwicklung, um die Wahl zu erleichtern:
Die endgültige Entscheidung zwischen diesen beiden Sprachen, soll hier nicht abgenommen werden. Diskussionen dazu enden im besten Falle mit der Erkenntnis, dass weder das eine noch das andere eine schlechte Wahl ist. In vielen Fällen entbrennt eher eine religiöse Auseinandersetzung fanatischer Anhänger der Sprachen. Davon sollte man sich aber nicht beeindrucken lassen, sondern einfach an den bereits genannten Kriterien festhalten. Wer gerne einen direkten Vergleich sehen möchte, dem sei dieser Artikel empfohlen, wobei auch dabei erwähnt sei, dass solche Vergleiche oft subjektiven Einflüssen unterliegen.
Die wichtigsten Kriterien wurden bereits aufgezählt. Hinzu kommt noch die grundlegende Unterscheidung zwischen Sprachen, die vor Ausführung direkt in Maschinensprache übersetzt werden (unmanaged) und Sprachen, die nur in eine Art Zwischensprache, meist byte code genannt, übersetzt werden, die dann auf einer VM (virtual machine) ausgeführt wird.
Damit verbunden ist in der Regel auch der grundlegende Unterschied, dass bei managed code das Speichermanagement von der VM übernommen wird, während bei unmanaged code der Programmierer gezwungen ist, sich selbst darum zu kümmern. Da moderne VMs sehr optimiert sind (und immer weiter optimiert werden), werden die Geschwindigkeitsnachteile gegenüber manuellem Speichermanagement immer geringer und die geringere Fehleranfälligkeit des managed codes überwiegt.
Wikipedia bietet eine enorm umfangreiche Auflistung bekannter Programmiersprachen. Es folgt eine kleine Auswahl der etablierten Sprachen zur Anwendungsentwicklung, um die Wahl zu erleichtern:
- C
- C++
- C#
- Java
Die endgültige Entscheidung zwischen diesen beiden Sprachen, soll hier nicht abgenommen werden. Diskussionen dazu enden im besten Falle mit der Erkenntnis, dass weder das eine noch das andere eine schlechte Wahl ist. In vielen Fällen entbrennt eher eine religiöse Auseinandersetzung fanatischer Anhänger der Sprachen. Davon sollte man sich aber nicht beeindrucken lassen, sondern einfach an den bereits genannten Kriterien festhalten. Wer gerne einen direkten Vergleich sehen möchte, dem sei dieser Artikel empfohlen, wobei auch dabei erwähnt sei, dass solche Vergleiche oft subjektiven Einflüssen unterliegen.
Mikro…was? Ja, abseits von der Software, die man täglich bewusst benutzt, gibt es noch mehr. Geräte aller Art wollen auch gesteuert werden. Dazu hat Verata folgenden Abschnitt verfasst. Vielen Dank dafür!
Welche Geräte kann ich programmieren?
Prinzipiell fast alle! Vom Radiowecker über das Auto bis hin zum Atomkraftwerk wird alles letztendlich von Chips gesteuert, die programmierbar sind. Diese sogenannten Microcontroller bringen in einem einfachen Chipgehäuse (5mm² aufwärts) bereits alles mit, was einen Computer ausmacht, also eine Befehlsverarbeitung, ein Rechenwerk, einen Hauptspeicher und einen Massenspeicher. Alles ist lediglich deutlich kleiner. Man muss sich also mit einem Massenspeicher von 1kb anfreunden. Da diese Controller keinerlei Ein- und Ausgabe haben, brauchen sie eine sogenannte Peripherieschaltung. Mit etwas Erfahrung kann man sich die selbst bauen. Für Anfänger finde ich vor allem die Arduino Boards empfehlenswert. Sie werden in einer eigenen Entwicklungsumgebung mit einem C Dialekt programmiert. Für den Arduino gibt es sogenannte Shields, die man auf die Hauptplatine stecken kann um die gewünschte Hardwarefunktionalität zu bekommen. Für Anfänger ist das zu empfehlen, weil es einem die Beschäftigung mit der Elektronik erspart. Wer mehr will, findet es hier.
Welche Geräte kann ich programmieren?
Prinzipiell fast alle! Vom Radiowecker über das Auto bis hin zum Atomkraftwerk wird alles letztendlich von Chips gesteuert, die programmierbar sind. Diese sogenannten Microcontroller bringen in einem einfachen Chipgehäuse (5mm² aufwärts) bereits alles mit, was einen Computer ausmacht, also eine Befehlsverarbeitung, ein Rechenwerk, einen Hauptspeicher und einen Massenspeicher. Alles ist lediglich deutlich kleiner. Man muss sich also mit einem Massenspeicher von 1kb anfreunden. Da diese Controller keinerlei Ein- und Ausgabe haben, brauchen sie eine sogenannte Peripherieschaltung. Mit etwas Erfahrung kann man sich die selbst bauen. Für Anfänger finde ich vor allem die Arduino Boards empfehlenswert. Sie werden in einer eigenen Entwicklungsumgebung mit einem C Dialekt programmiert. Für den Arduino gibt es sogenannte Shields, die man auf die Hauptplatine stecken kann um die gewünschte Hardwarefunktionalität zu bekommen. Für Anfänger ist das zu empfehlen, weil es einem die Beschäftigung mit der Elektronik erspart. Wer mehr will, findet es hier.
Nachdem man sich mit einigen Tutorials bzw. Büchern beschäftigt hat, gerät man oft in die unangenehme Situation nicht so recht zu wissen, was man mit dem erworbenen Wissen anfangen könnte.
Ein hier im Forum vorgestelltes Projekt befasst sich genau mit dieser Problematik. Wenn man voller Ideenlosigkeit steckt, dann ist diese Seite sicher einen Besuch wert und hoffentlich wird sie sich noch weiterentwickeln und wachsen.
Ein hier im Forum vorgestelltes Projekt befasst sich genau mit dieser Problematik. Wenn man voller Ideenlosigkeit steckt, dann ist diese Seite sicher einen Besuch wert und hoffentlich wird sie sich noch weiterentwickeln und wachsen.
Auch hier gibt es verschiedene Ansichten. Immer wieder liest und hört man, dass vor allem ältere Lehrer/Professoren dazu raten, nur mit einem simplen Editor zu arbeiten. Die Idee dahinter soll sein, dass der Anfänger gezwungen ist ganz genau darauf zu achten, was er da tippt. Auch das Kompilieren des Codes per Kommandozeile wird in diesem Fall nahegelegt. Dieser Ansatz ist zwar nachvollziehbar, hat allerdings auch Nachteile. Einige der Nachfragen hier im Programmieren-Board würden sich erübrigen, würde der Fragende eine bessere Entwicklungsumgebung benutzen.
Welche Alternative gibt es also? Die Antwort lautet – IDE (integrated development environment). Solche Entwicklungsumgebungen bieten in der Regel zumindest:
Es gibt sowohl IDEs, die mehrere Sprachen unterstützen, als auch solche, die sich nur auf eine bestimmte Sprache spezialisiert haben. Da in diesem FAQ C# und Java empfohlen werden, seien hier auch ein Paar entsprechende Kandidaten auf Seite der IDEs genannt:
Welche Alternative gibt es also? Die Antwort lautet – IDE (integrated development environment). Solche Entwicklungsumgebungen bieten in der Regel zumindest:
- syntax highlighting, also farbliche Unterscheidungen innerhalb des Codes
- integrierte Compiler-Anbindung, d.h. Kompilieren und Starten per Knopfdruck und Hinweise auf Fehler bereits während des Schreibens des Codes
- code assistance, wohinter sich eine automatische Vervollständigung von keywords und bekannten Methoden-/Variablennamen verbirgt
- einen debugger, der erlaubt, Code Schritt für Schritt abzuarbeiten und dem Entwickler dabei Einblick in den aktuellen Zustand des Programms gewährt. Ein unverzichtbares Werkzeug für effiziente Entwicklung
Es gibt sowohl IDEs, die mehrere Sprachen unterstützen, als auch solche, die sich nur auf eine bestimmte Sprache spezialisiert haben. Da in diesem FAQ C# und Java empfohlen werden, seien hier auch ein Paar entsprechende Kandidaten auf Seite der IDEs genannt:
- Eclipse (Java und andere) - kostenlos
- NetBeans (Java und andere) - kostenlos
- Microsoft Visual Studio (C# und andere) – Express Edition kostenlos
Es gibt im Programmieren-Board einen angepinnten Thread, in dem zahlreiche Links zusammengetragen wurden. Darauf sei an dieser Stelle verwiesen.
Immer langsam mit den jungen Pferden! Das wollen viele, die in das Programmieren-Board stolpern. Es ist durchaus sinnvoll sich Ziele zu setzen, aber die Programmierung von Spielen ist etwas für fortgeschrittene Programmierer, die bereits mit den wichtigsten Konzepten der Programmierung vertraut sind.
In der Tat kann man auch recht früh an kleinen, konsolenbasierten Spielen arbeiten. Man sollte sich allerdings von der Illusion lösen, innerhalb von wenigen Wochen seinen eigenen First-Person-Shooter zu programmieren. Wenn man erst einmal zumindest die Grundlagen erlernt hat, gibt es durchaus einige Möglichkeiten besonders schnell in die Spieleprogrammierung einzusteigen. Beispiele dafür sind (frei verfügbare Versionen von) Engines, in denen man nur noch die Spiellogik scripten muss. Sämtliche komplizierte Arbeit wird von solchen Engines (bzw. Frameworks) im Hintergrund erledigt.
Prominente Beispiele hierfür sind:
Abschließend sei nochmals darauf hingewiesen, dass eine solide Grundlage absolut erforderlich ist, um erfolgreich zu Programmieren, auch wenn es schwer ist, Geduld zum Erlernen aufzubringen. Besonders für Spiele ist die Verinnerlichung des Prinzips der Objektorientierten Programmierung (OOP) unabdingbar, um effizient entwickeln zu können.
In der Tat kann man auch recht früh an kleinen, konsolenbasierten Spielen arbeiten. Man sollte sich allerdings von der Illusion lösen, innerhalb von wenigen Wochen seinen eigenen First-Person-Shooter zu programmieren. Wenn man erst einmal zumindest die Grundlagen erlernt hat, gibt es durchaus einige Möglichkeiten besonders schnell in die Spieleprogrammierung einzusteigen. Beispiele dafür sind (frei verfügbare Versionen von) Engines, in denen man nur noch die Spiellogik scripten muss. Sämtliche komplizierte Arbeit wird von solchen Engines (bzw. Frameworks) im Hintergrund erledigt.
Prominente Beispiele hierfür sind:
- Unreal Engine 4 (C++/Blueprint)
- Unity (C#/UnityScript)
Abschließend sei nochmals darauf hingewiesen, dass eine solide Grundlage absolut erforderlich ist, um erfolgreich zu Programmieren, auch wenn es schwer ist, Geduld zum Erlernen aufzubringen. Besonders für Spiele ist die Verinnerlichung des Prinzips der Objektorientierten Programmierung (OOP) unabdingbar, um effizient entwickeln zu können.
Auch diese Frage taucht von Zeit zur Zeit mal wieder auf, vor allem im Zuge der Berichterstattung über großangelegte „Hackerangriffe“ in den Medien. Obwohl Hacker wohl in der Regel Erfahrung mit der Programmierung haben, ist dies keinesfalls zwingend notwendig und noch viel weniger erlaubt es den Umkehrschluss, Programmierer wären automatisch nur einen Katzensprung davon entfernt in fremde Systeme einbrechen zu können.
Hacker (bzw. Cracker) können sich einer Auswahl berüchtigter und im Netz verfügbarer Tools bedienen und sind damit nicht unbedingt gezwungen selbst Schadsoftware zu programmieren. Vor allem aber müssen Hacker sich mit den Feinheiten von Netzwerken und den dazugehörigen Protokollen auskennen und sie müssen in der Lage sein, ihre eigenen Spuren zu verwischen.
An dieser Stelle sei ausdrücklich davon abgeraten mit im Netz verfügbarer Schadsoftware herumzuspielen! Das Internet ist kein rechtsfreier Raum und Cyberkriminalität ist strafbar![1,2,3]
Hacker (bzw. Cracker) können sich einer Auswahl berüchtigter und im Netz verfügbarer Tools bedienen und sind damit nicht unbedingt gezwungen selbst Schadsoftware zu programmieren. Vor allem aber müssen Hacker sich mit den Feinheiten von Netzwerken und den dazugehörigen Protokollen auskennen und sie müssen in der Lage sein, ihre eigenen Spuren zu verwischen.
An dieser Stelle sei ausdrücklich davon abgeraten mit im Netz verfügbarer Schadsoftware herumzuspielen! Das Internet ist kein rechtsfreier Raum und Cyberkriminalität ist strafbar![1,2,3]
Und bevor es losgeht, eine kleine Ansammlung von guten Ratschlägen und Weisheiten, die es für alle Beteiligten angenehmer machen:
- Sauber arbeiten und Code kommentieren/dokumentieren
- dabei gilt es zu beschreiben warum ein Stück Quellcode tut, was es tut. Was es tut, erkennt jeder erfahrene Programmierer selbst
- Es standen schon viele Programmierer vor den gleichen Problemen wie du, daher findest du für die meisten konkreten Probleme auch schnell Lösungen. Solltest du tatsächlich keine Antwort finden, dann darfst du natürlich im Forum fragen, aber:
- Gib dir Mühe beim Beschreiben deines Problems (genaue Umstände, Fehlermeldungen, reproduzierbarer Fehler?)
- Lass ruhig deinen Wissensstand durchscheinen, kein falscher Stolz! Man weiß sonst nicht wie ausführlich man dir antworten muss.
- Erwarte nicht, dass andere dir dein Programm schreiben. Programmierer erwarten von anderen Programmierern ausreichende Eigeninitiative, bevor um Hilfe gebeten wird. Sei also auch mit Stichwörtern zufrieden, die dich auf den richtigen Weg bringen!
- Wenn du nicht genau weißt, wo der Fehler liegt in deinem Code, dann stelle so viel davon zur Verfügung, wie möglich. Das erleichtert den Helfern die Suche. Ganz wichtig ist: benutze
Code:
-Tags und formatiere deinen Code vernünftig! [/LIST] [/LIST] [/spoiler] [spoiler=Versionsverwaltung] Es empfiehlt sich bei größeren Projekten, sich mit [URL="http://de.wikipedia.org/wiki/Versionsverwaltung"]Versionsverwaltung[/URL] anzufreunden. Wenn man im Team programmiert umso mehr, aber auch als Einzelner macht man manchmal Fehler und hat den Code dann so sehr verändert, dass man nicht mehr zum letzten funktionierenden Stand zurückkehren kann. Man benötigt dazu: [LIST] [*]Einen Versionsverwaltungs-Client (es gibt in der Regel auch Clients mit GUI, nicht nur per Konsoleneingabe) [*]Für zentrale Systeme wie SVN, benötigt man ein so genanntes [I][URL="http://de.wikipedia.org/wiki/Repository"]Repository[/URL][/I]. Je nachdem welches System man verwendet, kann dies lokal angelegt sein oder aber online auf einem Server. Der Vorteil von Online-Repositories liegt natürlich in der Verfügbarkeit, auch wenn man an einem fremden Rechner arbeitet. Hat man keinen eigenen Server zur Verfügung, finden sich im Netz auch kostenlose Anbieter von Repositories. [*]Optional bietet sich eine Software an, die (u.a.) den Entwicklungsverlauf veranschaulicht, wie z.B. [URL="http://trac.edgewall.org/"]trac[/URL] oder [URL="http://www.redmine.org/"]redmine[/URL] [*]Anbieter von Versionsverwaltungs-Hosting (z.B. bitbucket, github, usw.) haben in der Regel auch eine visuelle Darstellung des Entwicklungsverlaufs [/LIST] Wie funktioniert also Versionsverwaltung prinzipiell? Es gibt zwei relevante Ansätze: [LIST] [*]zentrale Versionsverwaltung (z.B. [URL="http://de.wikipedia.org/wiki/Subversion_%28Software%29"]SVN[/URL]) [*]dezentrale Versionsverwaltung (z.B. [URL="http://de.wikipedia.org/wiki/Git"]Git[/URL]) [/LIST] Entscheidet man sich für ein zentrales System, gibt es also ein einziges Repository, eine Datenhalde, die jeden einzelnen Stand der darin enthaltenen Dateien speichert und auch nachträglich vergleichen und wiederherstellen kann. Handelt es sich bei den Dateien um Textdateien (also auch Quellcode-Dateien sämtlicher Programmiersprachen), dann kann die Versionsverwaltung Änderungen ineinander einpflegen ([I]mergen[/I]). Angenommen zwei Programmierer arbeiten an der gleichen Datei eines Repositorys. Wenn nun einer der Programmierer seine Arbeit abgeschlossen hat und seine Änderungen an das Repository übermitteln will ([I]commit[/I]), kann er das tun. Interessant wird es in dem Moment, wenn der zweite Programmierer die gleiche Datei übermittelt. Nun stellt das System fest, ob die Veränderungen kollidieren, also ob beide Programmierer an der gleichen Zeile des Codes Änderungen vorgenommen haben. Ist das der Fall, wird der Programmierer auf einen Konflikt hingewiesen, den er erst beheben muss, bevor er seine Version übermitteln kann. Er benutzt dazu die Update-Funktion seines Clients, um den letzten Stand der Datei vom Repository zu erhalten und in seine eigene Datei einpflegen zu lassen, soweit das möglich ist. Danach muss er nur noch die Stellen korrigieren, die Konflikte verursachten. An der Stelle sei angemerkt, dass es auch Versionsverwaltungssysteme gibt, die von vornherein die gleichzeitige Arbeit an der gleichen Datei verbieten. Wenn jemand eine Datei bearbeiten möchte, holt er sie sich vom Repository ([I]checkout[/I]), bzw. zumindest die Berechtigung nun als Einziger an dieser Datei arbeiten zu dürfen. [SIZE=3]P.S.: der hier genutzte Jargon entspricht eher SVN als Git.[/SIZE] [/spoiler]
Zuletzt bearbeitet:
(einige Links geupdatet, Swift für Xcode erwähnt, Update für Game Engines/Frameworks, neben trac redmine erwähnt)