Welche Programmiersprache für Anfänger?

Du möchtest Programmieren lernen, vielleicht um eigene Handy-Apps oder Webseiten bauen zu können? Dann stellt sich unweigerlich die Frage, mit welcher Sprache du am besten beginnen solltest.

Der Grund, wieso es überhaupt verschiedene Sprachen gibt, ist, dass jede Sprache ihre eigenen Vor- und Nachteile hat und auch Geschmäcker oft verschieden sind.

Manche Sprachen sind schneller, andere sind lesbarer, andere sind einfacher zu lernen. Es ist daher eine berechtigte Frage, welche Sprache man als Anfänger zuerst lernen sollte.

Motivation ist alles

Zu allererst sei jedoch gesagt, dass die größte Gefahr beim Einstieg in die Softwareentwicklung nicht die Wahl der falschen Programmiersprache ist, sondern das Risiko, dass du die Motivation verlierst.

Denn Programmierern zu lernen ist alles andere als einfach. Es dauert Jahre, bis man sich wirklich zurechtfindet. Du musst also eine hohe Ausdauer zeigen und das ist meist dann der Fall, wenn du Spaß an der Sache hast.

Überlege dir also erstmal ein Ziel, von dem du ausgehst, dass es dich langfristig motivieren kann. Wenn du Spieleentwicklung spannend findest, solltest du logischerweise eine Sprache wählen, die dafür auch geeignet ist und für die eine Community existiert, sodass es auch Foren gibt, in denen du Fragen stellen kannst.

Auch das Ökosystem ist wichtig

Auch sehr bedeutsam ist, dass du beim Programmieren immer auch Code benutzen wirst, den andere geschrieben haben. Möchtest du beispielsweise eine JPG-Datei einlesen, kannst du davon ausgehen, dass schon jemand den entsprechenden Code geschrieben hat, den du verwenden kannst. Diese Codemodule werden als Bibliotheken oder Libraries bezeichnet.

Das Ökosystem spielt also eine wichtige Rolle bei der Wahl der Programmiersprache. Generell gilt: Umso bekannter die Sprache, umso mehr Libraries gibt es. Sollte es keine Library für dein Problem geben, musst du den entsprechenden Code selbst schreiben, was viel Arbeitszeit kostet.

Die Sprache muss zu den Aufgaben passen

Man kann sagen, dass je nach Aufgabe eine andere Sprache optimal sein kann. Schreibt man beispielsweise einen Webbrowser, dann ist Performance sehr wichtig und man würde dementsprechend eine schnelle Sprache wählen, auch wenn das Entwickeln dort etwas länger dauern würde.

Schreibt man hingegen ein Programm, welches einmal täglich verschiedene Preise von Amazon herunterladen und analysieren soll, dann ist die Performance vermutlich eher unbedeutend; man würde eine produktive Sprache wählen, mit der man möglichst schnell das Programm schreiben kann.

Die Wahl der Sprache hängt also stark davon ab, was du erreichen möchtest.

Konkrete Empfehlungen nach Einsatzzweck

Um dir ein wenig bei der Entscheidung zu helfen, listen wir dir hier einige Einsatzzwecke und die dazu passenden Sprachen auf:

2D-Spieleentwicklung

Einfache 2D-Spiele lassen sich in nahezu jeder Sprache relativ leicht entwickeln. Letzten Endes werden lediglich Bilder auf dem Bildschirm ausgegeben. Für einfache Spiele ist z. B. Javascript im Webbrowser eine gute Option.

Möchtest du aber spezielle Features, wie eine Physiksimulation, benutzen, dann ist die Nutzung einer Game-Engine wie Unity empfehlenswert. Denn dann kannst du per Knopfdruck jedem Objekt physikalische Eigenschaften zuweisen und musst nicht die ganzen Physikberechnungen selbst programmieren.

Empfehlungen:

  • einfache 2D-Spiele: Javascript im Webbrowser
  • komplexe 2D-Spiele: C# mit Unity

3D-Spieleentwicklung

Ein eigenes 3D-Spiel dürfte für viele einer der großen Träume sein. Hierbei ist Folgendes zu bedenken: Die allermeisten großen Spiele werden nicht von Grund auf neu entwickelt, sondern basieren auf einer Game-Engine. Diese Game-Engine übernimmt vielfältige Aufgaben, wie das Laden von 3D-Modellen, Physikberechnung, Soundeffekte und vieles mehr.

Wenn du also eine fertige Engine verwendest, hast du mit den ganzen hardwarenahen Details quasi nichts zu tun. Du kannst dich also auf die eigentliche Spiellogik konzentrieren, also auf das, was dein Spiel ausmacht.

Wenn du jedoch mehr an den technischen Interna interessiert bist, kann es sinnvoll sein, keine fertige Engine zu benutzen, sondern das Spiel von Grund auf selbst zu entwickeln. Dies ist allerdings ein enormer Aufwand und nur zu empfehlen, wenn dich diese ganzen fundamentalen Details wirklich mehr interessieren, als die abstraktere Spiellogik.

Empfehlungen:

  • 3D-Spiele mit Fokus auf die Spiellogik: C# unter Verwendung der Unity Engine
  • 3D-Spiele von Grund auf entwickeln: C++ unter Verwendung der OpenGL API

Webseiten

Im einfachsten Fall ist eine Webseite eine HTML-Datei, die du in einem Texteditor erstellt und auf einen Server hochgeladen hast. Dieser Ansatz erlaubt jedoch keinerlei dynamische Funktionen, wie z. B. eine Kommentarfunktion, da die HTML-Datei selbst komplett statisch ist, also immer absolut gleich.

Um Webseiten interaktiver zu machen, ist es notwendig, auf dem Server ein Programm auszuführen, welches die HTML-Datei dynamisch erstellt, beispielsweise indem eine Datenbank nach Kommentaren abgefragt wird und diese dann in der HTML-Datei dargestellt werden.

Moderne Webseiten verfügen oftmals zusätzlich noch über Code, der nicht auf dem Server, sondern im Browser des Nutzers läuft. Dieser Code ist meist in Javascript geschrieben. Hiermit ist es dann z.B. möglich, Animationen auf der Seite anzuzeigen, oder auf die Kamera des Nutzers zuzugreifen.

Um also richtig gute Webseiten bauen zu können, musst du sowohl server- als auch clientseitige Entwicklung beherrschen. Für den Anfang ist es allerdings eher zu empfehlen, sich erstmal nur auf eine Seite zu konzentrieren und später dann den Rest zu lernen.

Empfehlungen für serverseitige Entwicklung:

Empfehlungen für clientseitige Entwicklung:

Windows-Programme

Die Entwicklung klassischer Windows-Programme hat in den letzten Jahren an Popularität verloren, während Webseiten und Handy-Apps massiv zulegten. Trotzdem ist dies ein interessantes Feld mit vielen ausgereiften Programmierbibliotheken.

Der beste Einstieg dürfte C# unter Verwendung von Visual Studio sein. Hier bekommst du einen Editor, in dem du grafisch deine Nutzeroberfläche zusammenbauen kannst. C# ist außerdem eine relativ leicht zu erlernende Sprache, die sehr weit verbreitet ist.

Eine Alternative ist C++ mit Qt, wobei du hier mit dem Qt Designer ebenfalls grafisch deine Nutzeroberfläche bauen kannst. Allerdings ist C++ deutlich schwerer als C# zu erlernen.

Empfehlungen:

  • C# mit Windows Forms (einfacher)
  • C++ mit Qt (schwieriger)

Machine Learning

Im Bereich der künstlichen Intelligenz ist Python aktuell die am meisten genutzte Sprache. Viele wichtige Frameworks wie TensorFlow oder PyTorch sind primär auf Python ausgelegt.

Handy-Apps

Bei Handy-Apps gibt es grundsätzlich die offiziell von den Plattformen empfohlenen Sprachen. Das wären bei Android Java und Kotlin, und bei iOS Objective-C und Swift.

Es besteht jedoch auch die Möglichkeit, sogenannte Cross-Platform-Frameworks zu verwenden, womit du nicht direkt für ein mobiles System programmierst, sondern für mehrere zugleich. Deine App läuft also unter Android und iOS, allerdings können kleinere Anpassungen für die jeweilige Plattform erforderlich sein.
Hierbei werden dann auch andere Sprachen verwendet. Bekannte Cross-Platform-Frameworks sind React Native (verwendet Javascript), Xamarin (C#) und Flutter (Dart).

Empfehlungen:

Handy-Games

Die Entwicklung von Handyspielen unterscheidet sich kaum von der Entwicklung von PC-Spielen. Die weiter oben genannten Empfehlungen für 2D und 3D-Entwicklung gelten also auch hier.

Schlusswort

Die Wahl der ersten Programmiersprache solltest du dir nicht zu schwer machen. Um Laufe der Zeit wirst du sowieso immer wieder neue Sprachen erlernen müssen. Und je mehr Erfahrung du hast, desto leichter fällt dies.

Also leg einfach los und wechsle die Sprache später, falls notwendig. Am wichtigsten ist, dass du langfristig am Ball bleibst. Auch wenn man am Anfang sehr langsam voran kommt, wird man nach einigen Jahren erstaunliches leisten können.

Deep Learning: Die besten Bücher und Kurse

Deep Learning ist in den letzten Jahren immer stärker in den öffentlichen Fokus gerückt. Erfolge wie AlphaGo zeigen, dass moderne Verfahren in der Lage sind, auch hochkomplexe Spiele wie Go besser als ein Mensch zu spielen.

Es handelt sich bei Deep Learning um das Verwenden eines neuronalen Netzes mit mehreren Ebenen, so dass das System eine Abstraktionshierarchie erlernen kann. Deep Learning konnte sich in Forschung und Praxis als sehr effektive Allzweckwaffe darstellen, beispielsweise zur Objekterkennung in Bildern oder Übersetzung von Texten.

Was liegt also näher, als sich in die Thematik einzuarbeiten, z. B. um diese Methode im Arbeitsalltag einzusetzen oder um sich ein passives Einkommen mit Apps aufzubauen, die Deep Learning verwenden?

Leider ist ein Großteil der verfügbaren Lernmaterialien sehr abstrakt und mathematisch ausgerichtet, was gerade Programmierer abschreckt. Dabei stecken hinter Deep Learning eigentlich nur sehr einfache mathematische Prinzipien: Matrix-Multiplikation und die Kettenregel zur Ableitung.

In diesem Beitrag möchten wir dir also einsteigerfreundliche Materialien zum Thema Deep Learning präsentieren. Eine gewisse Programmiererfahrung (idealerweise in Python) ist allerdings Voraussetzung.

Kurs: fast.ai

fast.ai ist ein von Jeremy Howard und Rachel Thomas entworfener Kurs zum Thema Deep Learning, der extrem praxisbezogen unterrichtet wird. Sprich: Es wird von Anfang an Code geschrieben und mathematische Notation auf ein Minimum reduziert.

Hinzu kommt die Tatsache, dass der Kurs nicht Bottom-Up, sondern Top-Down aufgebaut ist. Man beginnt also nicht mit linearer Algebra oder Ähnlichem, sondern ganz konkret mit einem System, welches an Hand von Fotos zwischen Hunden und Katzen unterscheiden soll.

Der Vorteil hierbei liegt auf der Hand: Es ist deutlich motivierender, wenn man ein praktisches Problem löst, als wenn man sich erst wochenlang mit mathematischen Formeln beschäftigen muss.
Dieses Grundlagenwissen ist natürlich langfristig notwendig und wird auch später im Kurs Schritt-für-Schritt erklärt, aber der Zuschauer wird damit eben nicht direkt zu Beginn erschlagen.

Der Kurs deckt alle wichtigen Themenbereiche ab: Bilder erkennen, Texte übersetzen, Arbeit mit strukturierten Daten. Hinzu kommen viele praktische Tipps, die von anderen Kursen oft vernachlässigt werden.

Sehr hilfreich ist auch das zugehörige fast.ai Forum, in dem Fragen zum Kurs gestellt werden können.

Der fast.ai Kurs ist unsere Top-Empfehlung, um sich in Deep Learning einzuarbeiten.

Kurs: deeplearning.ai

Der deeplearning.ai Kurs wird unterrichtet von Andrew Ng, einem führenden Forscher im Bereich Künstliche Intelligenz.

Im Gegensatz zu fast.ai ist dieser Kurs eher Bottom-Up aufgebaut, es werden also erst die Grundlagen der neuronalen Netze fundiert erklärt und dann Schritt für Schritt um komplexere Konzepte ergänzt.

Wir halten deeplearning.ai insbesondere als Ergänzung zu fast.ai für sinnvoll, da es oftmals hilfreich ist, die Konzepte aus zwei verschiedenen Blickwinkeln präsentiert zu bekommen.

Buch: Deep Learning with Python

Das Buch Deep Learning with Python stammt von Francois Chollet, dem Autor des bekannten Deep Learning-Frameworks Keras, welches auf Tensorflow basiert, aber eine einfachere Programmierschnittstelle anbietet.

Es handelt sich hierbei um ein sehr praktisch orientiertes Buch, in dem auf mathematische Notation verzichtet wird und die Konzepte stattdessen mit Code-Beispielen erklärt werden.

Sehr positiv anzumerken ist, dass der Autor viele Tipps gibt, die in der Praxis hilfreich sind, aber in akademischen Kreisen oft nicht wirklich gelehrt werden, z.B. die Effektivität von Transfer Learning, wobei ein neuronalen Netzes auf einem Datensatz trainiert, dann aber mit einem anderen Datensatz verfeinert und letztlich verwendet wird.

Auch fortgeschrittene Themen vermisst man nicht: Das Buch endet mit einer Abhandlung des generativen Deep Learnings. Auch interessant sind die Ansichten des Autors zur Zukunft von Deep Learning.

Wir halten dies für das aktuell beste Einsteigerbuch zum Thema Deep Learning.

Buch: Hands-On Machine Learning with Scikit-Learn and TensorFlow

Das Buch Hands-On Machine Learning with Scikit-Learn and TensorFlow ist kein reines Deep Learning-Buch, sondern widmet sich auch den eher klassischen Machine Learning-Methoden, wie z. B. Lineare Regression, Support Vector Machines und Decision Trees. Da diese Methoden generell nützlich sind, würden wir empfehlen, auch diesen Teil des Buches zu lesen.

Der zweite Teil des Buches legt den Fokus dann auf Deep Learning mit Tensorflow und arbeitet sich langsam über Convolutional Neural Networks, Recurrent Neural Networks, bis schließlich zu Reinforcement Learning durch.

Insbesondere die Verwendung von Tensorflow ist unserer Ansicht nach suboptimal, da z.B. PyTorch (welches im fast.ai Kurs verwendet wird) eleganteren Code erlaubt. Gerade für Einsteiger kann der zusätzlich notwendige Programmieraufwand durch Tensorflow verwirrend sein.

Positiv am Buch sind insbesondere auch die vielen grafischen Darstellungen, die zum Verständnis beitragen.

Buch: Deep Learning (Adaptive Computation and Machine Learning)

Das Buch Deep Learning (Adaptive Computation and Machine Learning) von Ian Goodfellow ist ein gutes Übersichtswerk.

Es ist für Einsteiger eher weniger empfehlenswert, da die Darstellung der Themen teilweise recht komplex ist. Aber es eignet sich gut als Nachschlagewerk, um individuelle Themenbereiche detaillierter zu verstehen.

Auch die Abhandlungen aktueller Forschungsthemen, wie Variational Autoencoders oder Generative Methods, machen das Buch für Interessierte attraktiv.

Natürlich deckt das Buch aber bei Weitem nicht alle aktuellen Forschungsthemen ab. Als Fortgeschrittener lässt es sich nicht vermeiden, die veröffentlichten Forschungsarbeiten selbst zu lesen.

Deep Learning Communities

Um über die neuesten Forschungsergebnisse informiert zu bleiben und sich mit anderen Nutzern auszutauschen, ist es naheliegend, nach einer Community zu suchen. Insbesondere auf der Plattform Reddit haben sich einige Machine-Learning Communities gebildet:

  • /r/MachineLearning/ – Ein sehr aktiver Subreddit, auf dem spannende aktuelle Forschungsarbeiten geposted werden. Der Fokus ist eher akademisch und für Einsteiger sehr anspruchsvoll. Trotzdem kann man hier gut sehen, was Stand der Forschung ist.
  • /r/learnmachinelearning/ – Ein einsteigerfreundlicher Subreddit, auf dem auch simple Fragen zu Machine Learning gerne gesehen sind.
  • /r/MachinesLearn/ – Ein praktisch orientierter Subreddit. Primäre Zielgruppe sind Personen, die Machine Learning im Berufsalltag verwenden.

Zwar handelt es sich hierbei strikt genommen nicht um Deep Learning Subreddits, sondern allgemeiner um Machine Learning, aber die meisten der dort diskutierten Verfahren basieren auf Deep Learning.

Fazit

Deep Learning ist ein wichtiges Verfahren, dessen Bedeutung weiter zunehmen wird. Die Möglichkeiten zur Anwendung sind extrem vielfältig. Gerade als Programmierer kann es sehr hilfreich sein, sich in diese Thematik einzuarbeiten, da es die Jobchancen in Zukunft massiv verbessern wird.

Wir hoffen, dass du mit unseren vorgestellten Materialien schnell den Einstieg finden kannst und wünschen viel Erfolg!

Flutter und React Native – die Zukunft der App-Entwicklung

Wer sich mit App-Entwicklung beschäftigt, steht schnell vor der Frage, ob man eine native App entwickelt oder ein Cross-Platform-Framework benutzt.

Lange Zeit war native Entwicklung die einzige Möglichkeit der App-Entwicklung. Bei der nativen Entwicklung nutzt man die offiziellen Programmierschnittstellen (API) von Android bzw. iOS. Man erhält also die maximale Kontrolle über das System und idealerweise auch die beste Performance.

Später kamen Cross-Platform-Frameworks wie Xamarin und Cordova hinzu. Diese Werkzeuge bieten ihre eigene API, die sie dann im Hintergrund in native Systemaufrufe umsetzen. So erhält der Entwickler die Möglichkeit, seinen Code auf mehreren Plattformen nutzen zu können.

Native App-Entwicklung ist der Horror

Zwar bietet native Entwicklung die maximale Kontrolle und theoretisch auch die größte Flexibilität; jedoch zeigt sich in der Praxis, dass die APIs und Architektur von Android oftmals suboptimal sind. Selbst einfachste Aufgaben, wie das Darstellen einer Liste, erfordern teils über 100 Zeilen Java-Code und nochmal 20 Zeilen XML. Ein nicht-triviales Projekt wächst schnell zu tausenden Zeilen heran. Es erklärt sich von selbst, dass ein solches Projekt nur schwer zu warten ist.

Hinzu kommen architekturelle Entscheidungen, die einfach nur frustrierend sind, wie zum Beispiel der hochkomplexe Activity und Fragment Lifecycle.

Zwar ist die iOS-API etwas angenehmer, aber auch hier ist man weit entfernt von einer optimalen Entwicklungserfahrung.

React Native

Facebook erschuf als Reaktion auf dieses Problem ein Framework namens React Native. Hiermit ist es möglich, Apps in einem extrem kompakten und deklarativen Stil zu entwickeln, ohne auf natives Look-And-Feel zu verzichten.

Die Entwicklung findet in JavaScript statt, wodurch Web-Entwicklern der Einstieg erleichtert wird und es außerdem möglich ist, bestehende JavaScript-Komponenten von einer Webanwendung zum größten Teil zu übernehmen.
Desweiteren bietet sich so die Möglichkeit sowohl die App, als auch den Server in der selben Programmiersprache zu schreiben und damit Daten einfach austauschen zu können.

Flutter

Google ließ es sich nicht nehmen, ebenfalls ein neues Framework zu entwerfen, das die App-Entwicklung vereinfachen soll: Flutter.

Im Gegensatz zu React Native nutzt Flutter nicht die nativen Widgets des Betriebssystems, sondern zeichnet sie selbst. Man versucht jedoch, die System-Widgets möglichst detailgetreu zu kopieren, so dass sich für den normalen Nutzer hier kein sichtbarer Unterschied ergibt.

Der Grund für diese Architektur liegt darin, dass Flutter somit das komplette Rendern übernimmt und das Betriebssystem umgehen kann. Hiermit ergibt sich eine exzellente Performance.

Flutter vs. React Native

React Native und Flutter überschneiden sich in vielen Punkten, so dass es schwer sein kann, sich zu entscheiden. Im Folgenden wollen wir die wichtigsten Unterschiede stichpunktartig darstellen:

  • Flutter ist besser für komplexe Animationen, da der gesamte Render-Vorgang in Flutter abläuft. React Native hingegen kann Animationen entweder in Javascript ausführen, wobei sie oft ruckelig wirken; oder in nativem Code, was aber mehr Aufwand ist.
  • Flutter nutzt Dart als Programmiersprache, React Native nutzt Javascript. Zusätzlich lässt sich React Native auch mit Typescript verwenden, was gerade bei größeren Projekten vorteilhaft ist.
    Wer bisher in Java, C# oder C++ gearbeitet hat, dürfte sich bei Dart wohlfühlen. Wer mit PHP, Python oder Ruby vertraut ist, wird JavaScript wahrscheinlich eher mögen.
  • React Native hat eine größere Community, die Widgets erstellt. Allerdings liefert Flutter von Haus aus gleich deutlich mehr Widgets mit.
  • React Native erlaubt das teilweise Wiederverwenden von Code aus Webprojekten, die auf React basieren.

Letztendlich ist es auch durchaus möglich, beide Frameworks zu erlernen. Auf konzeptioneller Ebene sind sie sich sehr ähnlich, so dass man mit bestehender React Native-Erfahrung sehr schnell den Einstieg in Flutter finden kann, oder umgekehrt.

Rückschlag durch Airbnb?

Vor kurzem verkündete das Startup Airbnb, dass sie in Zukunft auf React Native verzichten und wieder auf native Entwicklung setzen werden. Ist dies ein Argument gegen React Native?

Nein. Zuerst handelt es sich bei Airbnb um ein Projekt mit großem Entwicklerteam. Es geht ihnen also nicht darum, das beste Ergebnis mit möglichst wenig Aufwand zu erreichen, sondern darum, das generell beste Nutzererlebnis zu erschaffen, auch wenn es einen hohen Aufwand erfordert.

Außerdem sind die meisten der genannten Kritikpunkte keine fundamentalen Schwächen von React Native, sondern eher von dessen Neuheit. Es ist klar, dass React Native in den nächsten Jahren weiter verbessert werden wird und die meisten Schwächen ausgeräumt werden dürften.

Andere Cross-Platform-Frameworks

Wie anfangs erwähnt, gibt es noch weitere Cross-Platform-Frameworks: Xamarin, Cordova, Nativescript, etc.

Was React Native und Flutter hiervon abhebt, ist das Konzept des „Virtual DOM“: Traditionell ist man als Entwickler dafür verantwortlich, nach jeder Nutzer-Aktion zu entscheiden, welche grafischen Komponenten aktualisiert werden müssen.
Dies kann jedoch bei komplexen Apps sehr aufwändig werden und zieht Fehler magisch an. In React Native und Flutter jedoch entfällt dieser Aufwand. Als Entwickler legt man lediglich einmalig fest, wie aus dem Applikationszustand die grafische Oberfläche berechnet werden soll.
Ändert sich der Zustand, ermittelt React Native bzw. Flutter automatisch die notwendigen Änderungen an der Oberfläche.

Außerdem haben React Native und Flutter den Vorteil, dass sie von Großkonzernen gestützt sind, wobei dies auch für Xamarin gilt, welches von Microsoft betreut wird.

Fazit

React Native und Flutter werden die App-Entwicklung in den nächsten Jahren revolutionieren. Gerade wenn man sich ein passives Einkommen aufbauen will, geht es darum, mit möglichst wenig Aufwand eine möglichst gute App erstellen zu können.

Beide Frameworks sind noch sehr jung und dementsprechend gibt es wenige Bücher oder Lernmaterialien. Wir empfehlen dir, einfach mal in beiden Frameworks eine simple App zu bauen und zu schauen, welche Arbeitsweise dir mehr zusagt.