Richtig Programmieren lernen Tipps

Alexis29

Ensign
Registriert
Feb. 2015
Beiträge
149
Hallo Leute, liebe Community,

ich bin ein Programmieranfänger, nun wie bringt man sich eine Programmiersprache bei so dass man die dann voll beherrschen kann?
Ich habe mir ein Buch über C# gekauft, man bearbeitet das Buch durch von den Themen den es gibt. Nun wie man macht weiter danach so dass man die Programmiersprache richtig lernt ?
Also man lernt was Variablen, Schleifen,Bedingungen sind, aber wie kombiniert man dass um seine eigene Programme zu programmieren?

Wie habt ihr eine Programmiersprache gelernt, so dass ihr sie beherrschen könntet?
Sozusagen wie habt ihr anfangen mit den Programmieren?
Und habt ihr ein paar Beispiele was man programmieren könnte?

Wenn etwas unklar ist nachfragen
Vielen dank fürs lesen des Beitrags und für eure Antworten im vorraus!
 
Zuletzt bearbeitet:
Programmieren lernt man indem man programmiert. So einfach ist das eigentlich.

Wenn du Grundlegendes zu einer Sprache kennst ist es schon mal der Anfang. Dann solltest du dir ein paar kleine Ziele setzen und diese umsetzen. Letztendlich ist die Programmiersprache erst der Anfang, als nächstes brauchst du einen Überblick über APIs die du zu Realisierung deiner Projekte brauchst oder für dich nützlich sind.

Der Rest kommt mit der Zeit.

Ist letztlich wie mit den Sprachen. Es hilft nicht Ein Wörterbuch auswendig zu lernen. Beherrschen tut man eine Sprache erst wenn man eine Zeit lang in dieser Sprache spricht.
 
Ich habe mit Python begonnen. Für mich selbst. Die Sprache ist ziemlich gefragt und ideal für den Einstieg. Ansonsten gibt es zig Tutorials im Netz und der Mensch lernt nunmal am besten, wenn er damit spielt. Also spiele mit der Sprache und entwickle etwas. Kleine Projekte, auch gerne aus Tutorials oder Kursen im Netz. Erweitere diese nach deiner Fantasie. Du kannst nichts falsches lernen.
 
Wenn du die Basis kennen gelernt hast (also was überhaupt Schleifen sind usw.), dann würde ich mit kleinen Spielereien anfangen, um sich immer weiter ran zu tasten. Ich habe erst mit C und später dann mit Java begonnen. Und die ersten Gehversuche waren eigentlich Kreisberechnungen oder den Mittelwert aus Zahlen berechnen, die der User über die Konsole eingibt. Dann ging es weiter mit einem kleinen Tool, wo der User eine Jahreszahl eingibt und als Ergebnis zurück bekommt ob das Jahr ein Schaltjahr ist oder nicht. Ich hänge mal meine ersten Versuche von vor einigen Jahren als Bilder hier an. Wenn man diese Sachen bastelt bekommt man einfach "Routine" und ein Verständnis dafür, wie die Grundlagen funktionieren. Und wenn man weiterhin Spaß daran hat, dann werden die Projekte auch automatisch größer und komplexer.

Ach und edit: Nicht auf mich einprügeln. Das waren damals meine ersten Gehversuche^^.
 

Anhänge

  • 5 Baum.PNG
    5 Baum.PNG
    36,6 KB · Aufrufe: 650
  • 1 (3).PNG
    1 (3).PNG
    14,2 KB · Aufrufe: 545
  • 1 (1).PNG
    1 (1).PNG
    16,3 KB · Aufrufe: 513
  • 1 (2).PNG
    1 (2).PNG
    13,5 KB · Aufrufe: 630
Ohne "persönliches Problem" lernst du nicht programmieren. Dh. such die ein einfaches und für dich nützliches C# Programm (vlt. irg ne Unity Engine Mod?) und versuche es zu verstehen und zu manipulieren. Wenn du die Grundzüge verstanden hast, programmiere deine eigene Mod. Aber wie gesagt, ohne Projekt bzw. Problem geht es nicht. Oder setzte dir selbst das Ziel, zB. ein Kassensystem in C# zu programmieren und fang einfach an.
 
Wurde ja schon gesagt: Programmieren, Programmieren und nochmals Programmieren.

Und genau deswegen sollte man sich kleine Ziele/Aufgaben setzen. Hier ist eine schöne Seite mit Programmieraufgaben.
 
Alexis29 schrieb:
Wie habt ihr eine Programmiersprache gelernt, so dass ihr sie beherrschen könntet?
Experimentiert. Und die wenigen Materialien (i.d.R. in Buchform) die es damals gab verschlungen.

Alexis29 schrieb:
Und habt ihr ein paar Beispiele was man programmieren könnte?
Hier klingt ja an, dass es gut ist ein konkretes Problem zu haben, was man lösen möchte.
Bei mir war es damals etwas anders. Ich fand es einfach cool, dass man so einer Rechenmaschine eine Befehlsfolge geben konnte, die sie dann ausführt. Und so nach und nach probierte ich halt verschiedene Sachen aus und freute mich, dass sie funktionierten.

Das ich dahin kam dann auch mir das Leben zu erleichtert, indem ich dann mir überlegte für XYZ wäre es praktisch ein Programm zu haben kam erst später. Nämlich nach dem ich begriff, was überhaupt möglich war. Vor allem auch realistischerweise möglich war. Denn fertige Programme gabs schon damals. Was generell möglich war, sah man also natürlich. Aber man sah auch, dass es (zumindest noch) nicht in der eigenen Reichweite lag, weil man bis dato halt im wesentlichen Kleinkram gemacht hatte.

Insofern stehe ich dem Tipp sich ein konkretes Projekt zu suchen, etwas zwiegespalten gegenüber. Man kann sich damit auch leicht überfordern und ist dann allenfalls frustriert, warum es nicht vorwärts geht.

Somit ist Interesse für mich einer der wichtigsten Punkte. Und dann stellen sich solche Fragen wie "Was könnte man programmieren" etc. auch eigentlich gar nicht.
 
Alexis29 schrieb:
Und habt ihr ein paar Beispiele was man programmieren könnte?

irgendwas, was dir das leben erleichtert, zumindest ist das der primaere verwendungszweck meiner programmierfaehigkeiten ausserhalb der arbeit: gibt es irgendwelche prozesse, die du taeglich oder zumindest regelmaessig am computer/im internet abarbeitest, die vermutlich automatisiert werden koennten?

ein paar zufaellige beispiele mit erlernbaren technologien:
  • ein bash-script, das SMART-daten der festplatten in meinem server ausliest und nach gefaehrlichen werten ausschau haelt => programm-output string parsing
  • ein bot fuer den twitch.tv chat (ich benutze das IRC interface, ginge aber z.b. auch per websocket) => sockets, irc, event/handler-based design, datenpersistenz
  • ein parser, der fuer gegebene amazon-produkte periodisch den preis checkt => html parsing, evtl. regex
  • eine library/programm, das auf deinen pushbullet-account nachrichten versendet, das von beliebigen anderen scripts o.ae. aufgerufen werden kann => umgang mit web-apis inklusive ihrer formate (json, xml), evtl. eigene programmatische apis entwerfen
  • ich baue aktuell einen magic mirror mit raspberry pi => scripte fuer umgang mit bewegungsmelder/gpio, monitor getimed abschalten, etc.

all das gibt es sicher auch in professionelleren varianten mit ausgekluegelterer konfiguration und leichter zu bedienen, aber fast immer hat man als programmierer verbesserungsideen fuer software, die nicht unbedingt allgemeintauglich/fuer den 0815-nutzer bedienbar sind.
 
Danke sehr für die vielen Antworten, und auch für die Links sind sehr intressant.
Wenn jemand noch andere Meinugen, Tipps hat her damit.
Sozusagen lernt man Programmieren mit Learny by doing ?
 
Python wurde nun ja schon mehrfach empfohlen, finde ich auch einen guten Start.

Ich empfehle immer gerne "Learn Python the hard way" von ZED A. SHAW. Das kann man kostenfrei online lesen oder für 29$ erwerben. Das ist kein tiefgründiges Fachbuch indem die Syntax auf formal korrekte Art und Weise erläutert wird, sondern sehr anwendungsbezogen. Das bedeutet, dass alle Kapitel anhand von Beispielen erläutert werden und dadurch ein hoher Praxisanteil gegeben ist.
 
Kauf dir einfach ein beliebiges Anfängerbuch mit der Sprache die du lernen willst.
Wenn du das Anfänger Buch durch hast, wirst du wissen wie es weiter geht - vermutlich mit einem Buch für Fortgeschrittene. Hör auf nach dem "Besten" Weg zum Lernen, oder der "Besten" Sprache zu suchen - das ist alles Blödsinn.

Lass dich nicht verwirren von Leuten die weiter sind als du. Du musst nur wissen was du momentan nicht weißt und dass sich dies ändern wird wenn du mal mit dem Buch angefangen hast ;)

Also mach es einfach. Buch abarbeiten, das Gelesene notieren und für jedes Kapitel am besten ein Programm umsetzen, mit den Dingen die du gelernt hast. Bilde dir nur nicht ein dass Lesen allein ausreicht, das hast du schneller vergessen als du glaubst.

Was du allerdings vor dem Lernen tun kannst, ist etwas zu recherchieren welche Programmiersprachen in Firmen oft Verwendung finden. Aktuell hast du mit der Kombo Java + JavaScript + HTML + CSS die besten Chancen möglichst schnell einen Job zu finden. C, C# und C++ sind schon sehr speziell, obwohl man da länger eine Firma suchen könnte, verdient man damit wohl das meiste Geld wenn es denn klappt.

C: Eine uralte Sprache, aber immer noch die schnellste von allen. Wird immer dann verwendet wenn die Programmgeschwindigkeit das oberste Gebot ist. Beispiel: PKW/Maschinensoftware, Betriebssysteme. Um sowas tun zu können wirst du ein Studium brauchen - mit anderen Worten, ohne Studium und passender Fachrichtung lieber die Finger davon lassen. Eins drauflegen kann man nur noch mit Assembler, also im Prinzip die Sprache eines Prozessors lernen um der CPU direkt zu sagen was sie tun soll. Andere Sprachen werden bei der Verwendung nochmals in CPU Sprache umgewandelt.

C++: Wesentlich freundlicher als C, auch sehr flott, aber meist an ein Betriebsystem gebunden. Findet daher meistens nur im Windows Bereich Verwendung, da Windows weit verbreitet ist. Es ist innerhalb dieses Bereichs super für jede Art von Programm, ob Office oder Spiel. Viele Unternehmen möchten aber dass ihre Software überall läuft und verwenden sie daher nicht. Für den Einsatz in Spielen musst du wohl auch studieren, da kommt dann noch zusätzlich Computergrafik und lauter Mathe/Logik Kram dazu.

C#: Ähnlich wie Java, aber es war ebenfalls lange Zeit auf Windows beschränkt. Auch wenn es nun überall laufen könnte, tut es dies nicht, weil Java sich über die Jahre verbreitet hat. Ein Unternehmen ist ein alter Esel, der auf keinem Fall irgendwelche Veränderungen will und niemals Java mit C# austauschen würde. Java war halt von Anfang an darauf ausgelegt überall zu laufen.

Java: Sehr verbreitet und recht einfach gehalten. Der Standard wenn das Programm überall laufen soll. Android Handy, PC, im Bankautomaten, Windows, Linux...Hat die größte Standardisierung im Code Style, so dass der Code bei verschiedenen Entwicklern meist sehr ähnlich ist. Man hat häufig immer nur wenige Möglichkeiten etwas zu tun, was ein effektives Arbeiten ermöglicht. C# z.B. möchte alles können und verwirrt damit, auch wenn es für erfahrene Entwickler cooler ist. Viele Entwickler entscheiden daher nicht wie Unternehmen. Entwickler wollen es cool haben, Unternehmen möchten es schnell und billig.

JavaScript: Der aktuelle Standard in Sachen Webentwicklung. Sie läuft im Browser des Benutzers und nicht auf irgendeinem Server. Meist benutzt man JS um auf irgendwelche Serverprogramme zuzugreifen die in PHP oder Java programmiert sind. Die Sprache ist sehr hässlich und zickt ständig, weil die Logik mit der sie entwickelt wurde von einem anderen Planeten stammt. Gibt daher viele "Sprachen" die nur dazu da sind um etwas schön zu programmieren, damit der schöne Code dann vom PC wieder in hässliches JavaScript umgewandelt wird. Ja, Websprachen sind ätzend, hier gibt es keine Standards, alles wie Kraut und rüben wo man sich die Sprachen und Tools immer wieder individuell zusammensuchen muss.
 
Zuletzt bearbeitet:
Ozzy83 schrieb:
C: Eine uralte Sprache, aber immer noch die schnellste von allen.
Naja. C ist eigentlich vor allem sehr hardwarenah. Das erlaubt es dann, sehr schnelle Programme zu schreiben. Aber alleine davon C zu verwenden wird natürlich kein Programm schnell.
Interessant ist aber, dass für numerische Berechnungen bevorzugt eine noch ältere Sprache, nämlich Fortran, eingesetzt wird.
Sogar von Intel gibts ein hochoptimierenen Fortran-Compiler.

Ozzy83 schrieb:
C++: Wesentlich freundlicher als C
Ein entschiedenes "kommt darauf an".
Du hast natürlich viele Abstraktionsmöglichkeiten. Dafür auch viele Stolperfallen.

Ozzy83 schrieb:
, auch sehr flott
Auch nicht wirklich langsamer als C.

Ozzy83 schrieb:
aber meist an ein Betriebsystem gebunden. Findet daher meistens nur im Windows Bereich Verwendung, da Windows weit verbreitet ist.
Ähm nein. Abhängigkeitsprobleme ergeben sich sowieso nur durch die benutzten Bibliotheken. Und Frameworks wie QT ermöglichen da schon plattformübergreifende Programmierung.

Ozzy83 schrieb:
Java: Sehr verbreitet und recht einfach gehalten. Der Standard wenn das Programm überall laufen soll. Android Handy, PC
Wobei man dazu sagen sollte, das Java bei Android unterscheidet sich schon von dem Java auf dem PC. Es ist also nicht so, dass Du Dein PC-Programm dann einfach auf nem Android-Handy laufen lassen kannst.


Ozzy83 schrieb:
JavaScript: Der aktuelle Standard in Sachen Webentwicklung. Sie läuft im Browser des Benutzers und nicht auf irgendeinem Server.
Das ist so nicht ganz richtig. Serverseitiges Javascript gibt es schon sehr lange. Und spätestens seit node.js ist es auch gar nicht mehr so unüblich.

Ozzy83 schrieb:
Die Sprache ist sehr hässlich und zickt ständig, weil die Logik mit der sie entwickelt wurde von einem anderen Planeten stammt.
Javascript ist zwar nicht schön, hat aber Vorbilder. Da sei hier mal Self genannt. Also Logik fremder Planet und so haut nicht ganz hin. Dazu ist der Ursprung zu irdisch. :-)

Ozzy83 schrieb:
Gibt daher viele "Sprachen" die nur dazu da sind um etwas schön zu programmieren, damit der schöne Code dann vom PC wieder in hässliches JavaScript umgewandelt wird.
TypeScript sei hier mal exemplarisch genannt.
 
Lerne C, nicht C++!

- Sprachen wie Java, C#, Javascript, Python und Co sind gut aber sie haben mehrere gemeinsame negative Aspekte (gerade wenn es ums lernen oder Performance geht):

* Sie verschleiern Code durch Abstraktion (Templates, Interfaces, Klassen, etc.)
* Sie zwingen dich in großem Maße abstrakt zu denken/programmieren
* Du hast weder Lese noch direkten Schreibzugriff auf deinen Speicher
* Man hat keinen direkten Zugriff auf Hardware-Instruktionen (Intrinsics, SIMD, etc.)
* Einbindung von Low-Level APIs wie z.b. OpenGL oder Direct3D erfordert immer einen Wrapper

- In C ist jeder Code von dir, da wird nichts verschleiert

- Vermeide am Anfang jegliche Art von Fremdbibliotheken!

- Visual Studio 2015 ist kostenlos und unterstützt C/C++ sowie die ganzen .NET-Sprachen und Bibliotheken, inkl. Refactoring (Umbenennen, Verschieben, Extrahieren, ...)

- Du lernst idealerweise wie CPUs ticken und wie mächtig Speichermanipulation ist

Es gibt unzählige Tutorials, Bücher aber ich würde die folgende Videos empfehlen:

How i program in C von Eskil Steenberg
Intro to C on Windows von Casey Muratori

Das würde ich jedem empfehlen, der programmieren lernen will. Später kann man immer noch gern auf C++, C#, Java, etc. umsteigen -> Vor allem ist der Umstieg viel viel einfacher.

Noch ein letzter Tip:
Speichermanagement kann ganz leicht gemeistert werden, habe keine Angst davor!
 
Zuletzt bearbeitet:
Finalspace schrieb:
Lerne C, nicht C++!

- Sprachen wie Java, C#, Javascript, Python und Co sind gut aber sie haben mehrere gemeinsame negative Aspekte (gerade wenn es ums lernen oder Performance geht):

* Sie verschleiern Code durch Abstraktion (Templates, Interfaces, Klassen, etc.)

Codeverschleierung ist in jeder Sprache möglich. Der Grad der Verschleierung ist überwiegend abhängig vom Können (bzw. Nichtkönnen) des Programmierers.

* Sie zwingen dich in großem Maße abstrakt zu denken/programmieren

Wie kommst du darauf? Diese Sprachen selbst zwingen dich zu sehr wenig.
Selbst wenn das so wäre, dann würde ich das langfristig eher als Vorteil sehen, was den Programmierstil angeht. Wer nicht ein wenig Abstraktionsvermögen entwickelt mutiert langfristig zu einer Spagetticodefabrik.

* Du hast weder Lese noch direkten Schreibzugriff auf deinen Speicher

Ohne lesenden/schreibenden Speicherzugriff gibt es sehr wenige sinnvolle Programme. Natürlich kann ich mit all diesen Sprachen lesend und schreiben auf den Speicher zugreifen.

Was du mit "direkt" vermutlich meinst ist für Anfänger und selbst für Fortgeschrittene irrelevant. Wenn du nicht gerade bestimmte Arten von Treiber schreibst, wirst du seltenst echten direkten Zugriff auf Speicher bekommen, selbst mit C nicht. Denn der direkte Speicherzugriff von Anwendungen wird durch vielerlei Schutzmechanismen in CPU und Betriebssystem gerade eben nicht gestattet - typischerweise lebt jedes Programm in seiner eigenen heilen Speicherwelt.


* Man hat keinen direkten Zugriff auf Hardware-Instruktionen (Intrinsics, SIMD, etc.)

Für Anfänger irrelevant.

* Einbindung von Low-Level APIs wie z.b. OpenGL oder Direct3D erfordert immer einen Wrapper

Für Anfänger irrelevant. Deine Low-Level-Beispiele sind hier schon sehr spezielle Themen mit denen ein Anfänger sehr lange nicht mit in Kontakt kommen wird.


- In C ist jeder Code von dir, da wird nichts verschleiert

In C ist nicht jeder Code von Dir. Spätestens wenn du IO machen willst wirst du entweder stdio oder etwas OS spezifisches nutzen und der Code ist dann nicht von Dir. In anderen Sprachen ist das auch nicht wesentlich anders, sobald man an Resourcen ranwill ist man auf das Betriebssystem und dessen API angewiesen.

Die Zeiten, wo wirklich jeder Code von einem selbst ist, sind schon lange vorbei und ich vermisse sie auch nicht wirklich.


- Vermeide am Anfang jegliche Art von Fremdbibliotheken!

Das kann man so stehen lassen, zumindest sollte den Kern eines Lernziels durch Fremdbibliotheken lösen lassen, weil sonst hat man nichts gelernt. Später ist es natürlich vollkommen in Ordnung, wenn man das Rad nicht ständig neu erfindet.

- Visual Studio 2015 ist kostenlos und unterstützt C/C++ sowie die ganzen .NET-Sprachen und Bibliotheken, inkl. Refactoring (Umbenennen, Verschieben, Extrahieren, ...)

Kein Argument. Es gibt für praktisch jede Programmiersprache sehr gute und kostenlose Entwicklungsumgebungen. Visual Studio gehört meiner Meinung nach nicht zur Krone der IDE-Schöpfung, um es vorsichtig auszudrücken.


- Du lernst idealerweise wie CPUs ticken und wie mächtig Speichermanipulation ist

Das ist grundsätzlich immer nützlich, aber für einen Anfänger zunächst nicht wichtig.
 
Finalspace schrieb:
- Sprachen wie Java, C#, Javascript, Python und Co sind gut aber sie haben mehrere gemeinsame negative Aspekte (gerade wenn es ums lernen oder Performance geht):
Die "negativen" Aspekte kann man aber auch als Vorteil sehen. Denn eigentlich ist ja genau das was eine Hochsprache auszeichnet. Abstrahieren. Sich von der da drunter befindenen Maschine zu lösen. Auch C tut das, wenngleich da der Layer vielleicht dünner ist als in anderen Sprachen. Trotzdem könnte jemand mit Fug & Recht auch die Meinung haben: "Vergiss C. Mach Assembler!"

Was zeichnet gerade C aus?

Ein anderer Aspekt ist halt die Schwierigkeit ansich die sich daraus ergibt. Früher waren ja die BASIC-Programmierer, später dann die VBA-Programmierer immer ein wenig belächelt. Ob zu Recht oder zu Unrecht, dass sei mal an der Stelle ausgeklammert. Fakt ist aber, so begrenzt ihre Möglichkeiten und Fähigkeiten vielleicht auch waren, so konnten sie sich immerhin selbst helfen und für sich Probleme lösen.
Wärst Du den Leuten mit C gekommen, hätte vermutlich nie einer mit programmieren angefangen. Die hätten es nicht auf die Reihe bekommen und schnell das Handtuch geworfen.

Insofern würde ich aus meiner Sicht den einfacheren Sprachen nicht ihre Berechtigung absprechen. Vielleicht sogar im Gegenteil. Vielleicht ist es ja eher angebracht zunächst einmal lernen algorithmisch zu denken. Was Schleifen sind. Was Verzweigungen sind. Was Variablen sind. usw.
C hat einfach mehr Hindernisse. Schon ein einfaches scanf kann schnell mal in ein Segmentation fault enden.
Du hast also gleich ganz viele Kriegsschauplätze zu bearbeiten. Vielleicht sogar unnötig viele.

Klar ist das schaffbar. Die ältere Generation musste es auch so schaffen, weil es halt nicht viel anderes gab. Die Frage ist aber, obs der beste Weg ist.

Finalspace schrieb:
Ich weiß nicht, ob Videos wirklich das Optimum sind. Ganz nett ist es z.B. für Beschreibungen, wo es darauf ankommt, wo man klicken muss etc. Fürs Programmieren lernen, wo man ja vielleicht auch mal 2 Seiten zurückschauen will weil da irgendwie ne Erklärung war, die man jetzt erst begriffen hat wo es ums einsetzen geht ist mit nem Video echt Asche.

Finalspace schrieb:
Das würde ich jedem empfehlen, der programmieren lernen will. Später kann man immer noch gern auf C++, C#, Java, etc. umsteigen -> Vor allem ist der Umstieg viel viel einfacher.
Schwer zu sagen. Man baut sich nämlich auch Gewohnheiten auf, wo es einem schwer fällt die wieder fallen zu lassen. So viel es mir zu Anfang des OOP-Hypes schwer mich darauf einzulassen. Ich wusste auch gar nicht, was die alle von mir wollten. :-) Es hat seine Zeit gedauert. Später gabs dann funktionale Programmierung, wo man dann plötzlich wieder aus dem OOP-Gerüst raus musste.
Klar. Die ganzen Umstiege bringen einen weiter, so dass es vielleicht irgendwann einem leichter fällt weil man halt schon etliches Gesehen hat und sich zumindest Einiges wiederholt.

Aber ich würde nicht sagen, dass wenn man jetzt z.B. C kann, dass es dann einfach ist auf z.B. C# zu wechseln.

Finalspace schrieb:
Noch ein letzter Tip:
Speichermanagement kann ganz leicht gemeistert werden, habe keine Angst davor!
Ja. Kann man meistern. Die Frage ist (ist ja auch oben schon angeklungen), warum?
Du würdest ja vermutlich auch nicht auf die Idee kommen die Festplatte selbst zu organisieren und stattdessen die Zuteilung der Sektoren etc. dem Betriebssystem/Dateisystemtreiber zu überlassen. Warum sollte ich das bei RAM anders handhaben? Also wenn scho, denn scho. :-)
 
Banthor schrieb:
Codeverschleierung ist in jeder Sprache möglich. Der Grad der Verschleierung ist überwiegend abhängig vom Können (bzw. Nichtkönnen) des Programmierers.

Die Sprache C selbst versteckt nichts. Man ist nicht einmal gezwungen die C-Runtime Library zu verwenden!
Man kann selbst printf usw. selbst schreiben.

Außnahme:
Betriebssystem/Compiler Funktionen dir zur Verfügung gestellt werden (VirtualAlloc, CreateWindow, OutputDebugString, ReadFile etc.)

Eigene verschleierung zähl ich nicht hier, da dies jedem selbst überlassen ist.
Ich rede hier nur von den Sprachen und deren Standard-Bibliotheken!

Banthor schrieb:
Wie kommst du darauf? Diese Sprachen selbst zwingen dich zu sehr wenig.
Selbst wenn das so wäre, dann würde ich das langfristig eher als Vorteil sehen, was den Programmierstil angeht. Wer nicht ein wenig Abstraktionsvermögen entwickelt mutiert langfristig zu einer Spagetticodefabrik.

Mehr Abstraktion erhöht die Fehlerquote sowie die Wartbarkeit!

- Debugge den Tomcat Datenbank-Pool Stack, wenn der Pool in nen Deadlock kommt
- Schau dir die implementierung von Containerfunktionen aus der std::library an
- Schau dir die implementierung von Containerfunktionen in boost an
- Schau dir komplexe Javascript Frameworks an, wie z.b. angularJs, jQuery
- Schau dir den ogre3D source an

Und nein ich sage nicht, das diese Dinge vollkommen schlecht oder abgrundtief Böse sind.
Einige sind tatsächlich ganz brauchbar, andere dafür eher weniger.

Banthor schrieb:
Ohne lesenden/schreibenden Speicherzugriff gibt es sehr wenige sinnvolle Programme. Natürlich kann ich mit all diesen Sprachen lesend und schreiben auf den Speicher zugreifen.
Was du mit "direkt" vermutlich meinst ist für Anfänger und selbst für Fortgeschrittene irrelevant. Wenn du nicht gerade bestimmte Arten von Treiber schreibst, wirst du seltenst echten direkten Zugriff auf Speicher bekommen, selbst mit C nicht. Denn der direkte Speicherzugriff von Anwendungen wird durch vielerlei Schutzmechanismen in CPU und Betriebssystem gerade eben nicht gestattet - typischerweise lebt jedes Programm in seiner eigenen heilen Speicherwelt.

Nein du kannst in Java, C#, JavaScript usw. keinen Speicher direkt manipulieren.
Das ist komplett abstrahiert, über die jeweiligen Basistypen und Bibliotheken inkl. Sicherheitskonzepte damit es überhaupt nicht möglich wird.
Man hat keinen Plan was dahinter passiert, welche und wieviele CPU-Instruktionen werden verwendet, wieviel Speicher wird dafür verwendet usw.

In C ist es anderst, das ganze Sprachkonstrukt ist darauf ausgelegt -> Du erzeugst Speicher, manipulierst ihn und gibst ihn wieder frei.
Das macht auch übrigens jegliche Art von Anwendung die du schreibst oder ausführst, egal in welcher Sprache geschrieben -> Das ist das Fundament auf das alle aufbauen.

Banthor schrieb:
In C ist nicht jeder Code von Dir. Spätestens wenn du IO machen willst wirst du entweder stdio oder etwas OS spezifisches nutzen und der Code ist dann nicht von Dir. In anderen Sprachen ist das auch nicht wesentlich anders, sobald man an Resourcen ranwill ist man auf das Betriebssystem und dessen API angewiesen.

Die Zeiten, wo wirklich jeder Code von einem selbst ist, sind schon lange vorbei und ich vermisse sie auch nicht wirklich.

Ja was das Betriebssystem dir gibt, darauf hast du keinen Einfluß.
Das ist auch vollkommen legitim diese zu verwenden.

Banthor schrieb:
Das kann man so stehen lassen, zumindest sollte den Kern eines Lernziels durch Fremdbibliotheken lösen lassen, weil sonst hat man nichts gelernt. Später ist es natürlich vollkommen in Ordnung, wenn man das Rad nicht ständig neu erfindet.

Es gibt kein einziges Rad in der Softwareentwicklung, eher zusammengesetzte Quader die wie Räder zusammengesteckt/geklebt werden inkl. kleine und große Löcher, so dass kleine Steinchen dran hängen bleiben.
Wie sich diese Räder drehen ist mir heutzutage immernoch ein Rätsel.



andy_m4 schrieb:
Die "negativen" Aspekte kann man aber auch als Vorteil sehen. Denn eigentlich ist ja genau das was eine Hochsprache auszeichnet. Abstrahieren. Sich von der da drunter befindenen Maschine zu lösen. Auch C tut das, wenngleich da der Layer vielleicht dünner ist als in anderen Sprachen. Trotzdem könnte jemand mit Fug & Recht auch die Meinung haben: "Vergiss C. Mach Assembler!"

Was zeichnet gerade C aus?

Ein anderer Aspekt ist halt die Schwierigkeit ansich die sich daraus ergibt. Früher waren ja die BASIC-Programmierer, später dann die VBA-Programmierer immer ein wenig belächelt. Ob zu Recht oder zu Unrecht, dass sei mal an der Stelle ausgeklammert. Fakt ist aber, so begrenzt ihre Möglichkeiten und Fähigkeiten vielleicht auch waren, so konnten sie sich immerhin selbst helfen und für sich Probleme lösen.
Wärst Du den Leuten mit C gekommen, hätte vermutlich nie einer mit programmieren angefangen. Die hätten es nicht auf die Reihe bekommen und schnell das Handtuch geworfen.

Insofern würde ich aus meiner Sicht den einfacheren Sprachen nicht ihre Berechtigung absprechen. Vielleicht sogar im Gegenteil. Vielleicht ist es ja eher angebracht zunächst einmal lernen algorithmisch zu denken. Was Schleifen sind. Was Verzweigungen sind. Was Variablen sind. usw.
C hat einfach mehr Hindernisse. Schon ein einfaches scanf kann schnell mal in ein Segmentation fault enden.
Du hast also gleich ganz viele Kriegsschauplätze zu bearbeiten. Vielleicht sogar unnötig viele.

Klar ist das schaffbar. Die ältere Generation musste es auch so schaffen, weil es halt nicht viel anderes gab. Die Frage ist aber, obs der beste Weg ist.

C hat auch seine Macken, aber weniger als andere Sprachen, da die Sprache viel zu einfach aufgebaut und daher verständlicher ist.
Allerdings mit Assembler wäre die Einstiegshürde viel zu Hoch, es dauert hier einfach zu lange bist du überhaupt mal was siehst.

Ich finde es gerade heutzutage sehr wichtig dass man die Kernkonzepte lernt und versteht, damit alles aufbauende viel verständlicher ist.
Viele heutzutage haben keinen Plan wie CPUs funktionieren: "Klasse X wirds schon richten, mir egal was dahinter steckt".

Wenn aber Klasse X mit all seinen Funktionsaufrufen sprunghaft 10 Sekunden anstatt 2 Sekunden brauch, dann kann es auf einmal schon relevant sein zu wissen was sich dahinter verbirgt: Wann und wieviele Reads werden gemacht, wieviele Takte werden benötigt etc.
Da wird dann schlichtweg nur der Algorythmus optimiert, parallelisiert und das wars -> Das Reicht dann für die meisten.
Warum das aber dann wirklich schneller oder langsamer ist, das wissen wirklich nur diejenigen die verstehen was CPUs machen, wie wichtig heutzutage Speicheroptimierte Strukturen sind.

Was sind Register, wozu sind Cachelines, was ist die typische Größe für eine Cacheline, was ist Alignment, wozu ist der L1/L2 Cache?
Wie löst man einen Cachemiss, Was macht mulps? Wozu ist compare and exchange? Wie ermittele ich die aktuelle CPU Zeit? - ohne OS-Funktionen zu verwenden?

andy_m4 schrieb:
Ich weiß nicht, ob Videos wirklich das Optimum sind. Ganz nett ist es z.B. für Beschreibungen, wo es darauf ankommt, wo man klicken muss etc. Fürs Programmieren lernen, wo man ja vielleicht auch mal 2 Seiten zurückschauen will weil da irgendwie ne Erklärung war, die man jetzt erst begriffen hat wo es ums einsetzen geht ist mit nem Video echt Asche.

Das ist bei jedem unterschiedlich, ich kann mit Bücher nur wenig Anfangen, da diese für mich max. als Nachschlagereferenz dienen und nicht um etwas zu lernen.
Videos sind tatsächlich ein gutes Medium um die Grundlagen zu lernen, sofern man sich das richtige Video rauspickt.

Ich kann jedem empfehlen mal das C Video von Eskil Steenberg anzuschauen -> Um mal über den eigenen Tellerrand hinauszusehen.

andy_m4 schrieb:
Aber ich würde nicht sagen, dass wenn man jetzt z.B. C kann, dass es dann einfach ist auf z.B. C# zu wechseln.

Eigentlich nicht, da man lediglich nur noch die Sprachunterschiede lernen muss:

- z.b. Das es kein wirkliches "Unsigned" in Java gibt
- Char in C# sowie in Java immer 16 bit sind anstatt 8 bit (Unicode / UTF16)
- Syntax ein wenig anderst, "begin" anstatt "{" oder keine Semicolons am ende der Anweisung, z.b. bei Basic/VB
- Typdeklarationen sind vielleicht anderst, "type : name" anstatt "name : type"
- Keine Klassen oder Funktionsdeklarationen oder Delphi (Java, C#, JavaScript etc.)
- Keine Vorwärtsdeklaration notwendig
- Operator oder Methodenüberladung
- Kein "malloc", dafür halt "new"
- Namespaces
- Der Einstiegspunkt in modernen Sprachen ist typischerweise static void main(string[] args) {} -> Außnahme Webservices
- Standard-Bibliotheken unterscheiden sich
- Bedingungen mal geklammert werden müsser und mal nicht
- usw.

andy_m4 schrieb:
Ja. Kann man meistern. Die Frage ist (ist ja auch oben schon angeklungen), warum?
Du würdest ja vermutlich auch nicht auf die Idee kommen die Festplatte selbst zu organisieren und stattdessen die Zuteilung der Sektoren etc. dem Betriebssystem/Dateisystemtreiber zu überlassen. Warum sollte ich das bei RAM anders handhaben? Also wenn scho, denn scho. :-)

Ganz Ehrlich? Wenn ich Zeit hätte würde ich das tun, zumindest einmal um all das zu verstehen was sich dahinter verbirgt.





Zu aller letzt:

Ihr diskutiert mit jemanden der über weit 20 Jahre schon programmiert, mit Basic und Delphi angefangen hat und
heute in vielen unterschiedlichen Sprachen programmiert (C#, C, C++, Java, JS, Python, PHP, Delphi), tagtäglich mit modernen Entwicklungsmuster zu tun hat und arbeitsbedingend laufend von einer Sprache zur anderen springen muss und beide Welten kennt: Low-Level sowie High-Level mit all ihren Entwicklungsmuster.

Ich schaue gern über den Tellerrand hinaus und tu ihn auch gern mal komplett auseinandernehmen oder neuerfinden.
 
Zuletzt bearbeitet:
Finalspace schrieb:
Zu aller letzt:

Ihr diskutiert mit jemanden der über weit 20 Jahre schon programmiert, mit Basic und Delphi angefangen hat und
heute in vielen unterschiedlichen Sprachen programmiert (C#, C, C++, Java, JS, Python, PHP, Delphi), tagtäglich mit modernen Entwicklungsmuster zu tun hat und arbeitsbedingend laufend von einer Sprache zur anderen springen muss und beide Welten kennt: Low-Level sowie High-Level mit all ihren Entwicklungsmuster.

Ich schaue gern über den Tellerrand hinaus und tu ihn auch gern mal komplett auseinandernehmen oder neuerfinden.


Ich erspare mir einfach mal eine Antwort auf die einzelnen Punkte und konzentriere mich einfach mal auf diesen Deinen letzten Punkt, denn dieser erklärt so einiges.

Du hältst Dich meiner Meinung nach für den Geilsten, weil du schon soooo lange der Pro bist.

Du wiederum diskutierst nun aber mit jemandem der seit über 33 Jahren programmiert/entwickelt. Ich beherrsche Assembler verschiedener CPU's der 80er und 90er. Ich bin mit einer Menge Hardware der Zeit "intim" geworden und kann sie direkt ohne Betriebssystem ansteuern. Ich glaube nicht nur zu wissen, wie es low level funktioniert, ich habe es alles selber schon gemacht. Eine Liste der Programmiersprachen erspare ich mir, sie beweist gar nichts.

Deine Achievements beeindrucken mich also überhaupt nicht. Im Gegenteil: Deine Antwort zum Thema Speicherzugriff lässt mich nur meinen Kopf schütteln. Glaubst du wirklich, dass deine C-Pointer zur Laufzeit echte physikalischen Adressen enthalten?

Machen mich meine Erfahrungen nun besser als Dich oder habe ich dadurch automatisch Recht? Wohl nicht und ich bin mir sicher, dass hier auch noch jemand mitliest der doppelt so geil ist, wie du und ich zusammen.

Darum geht es hier auch nicht.

Hier geht es darum, dass dieser Thread von einem Anfänger gestartet wurde, der nur ein paar Tipps zum Start in die Programmierwelt haben wollte. Und so einem Menschen zu sagen, dass er auf jeden Fall mit C anfangen muss ist Schwachsinn.
Du behaupteste, dass C die einzig sinnvolle Sprache zum Anfangen ist und argumentierst das mit einer Menge Technikdetails, die einen ->Anfänger<- nur verwirren und für ihn auf viele Jahre schlichtweg keine Relevanz haben.

Eine Cacheline ist nicht die erste Sorge eines Anfängers, sondern zunächst einmal die Herausforderung ein HelloWorld zu programmieren. Ein Fahranfänger muss auch nicht als erstes lernen, wie ein Doppelkupplungsgetriebe funktioniert. Für ihn zählen zunächst Lenkrad, Pedale, Schaltung, Spiegel und Licht. DAMIT fängt man an und so ist es auch beim Programmieren.

Sicherlich gibt es bessere und weniger gute Wege anzufangen, am wichtigsten ist es aber überhaupt anzufangen, nicht aufzugeben und bei Fragen eine Quelle für Hilfe zu haben, wie z.B. diese Forum.


Zuletzt fällt mir gerade auf:
In Deiner Signatur steht "-> Programmiert seit 1997". Das macht für mich 20 Jahre und nicht "weit über 20 Jahre".
 
Zum Kontrast mal die Meinung eines Anfängers (mir):

Ich habe mit C++ und Python gearbeitet. Wenn du wissen willst, was low-level passiert und du dich zukünftig intensiver mit programmieren auseinandersetzen willst, würde ich C++ empfehlen. Möchtest du vor allem ein paar schnelle Erfolge und ein wenig programmieren, ist Python besser.

Grund: In Python wird vieles implizit verwendet, wärend du in C++ fast alles angeben musst. Auch sonst nimmt dir Python sehr viel Arbeit ab.
Z.B. muss man in C++ beim initialisieren einer Variablen explizit den Typ angeben, Python schaut was am besten passen könnte. Bei C++ gibt es sehr viele Klammern, die ich sehr gut finde. Vor allem größeren Code strukturiert das mmn. Für ein paar Zeilen ist die Syntax von Python aber lesbarer. Ich denke die Punkte sind auch repräsentativ für low-/high-level-Sprachen.

Aber deine Frage war ja auch, wie man dann lernt: Ich habe das an der Uni lernen können und finde die Methode gut. Viele Profs stellen Skripte + Übungsaufgaben online, so etwas durchzugehen macht sicher Sinn.(Google findet sicher was) Hat den Vorteil dass man das gelernte gleich an den Übungsaufgaben anwenden konnte, ohne am Anfang total frustriert zu sein weil man tausend neue Sachen auf ein mal braucht.

Wenn damit die Grundlagen da sind kann man auch die Referenz verstehen wenn man eine neue Funktion braucht, ab da beginnt dann learning by doing.
 
Zuletzt bearbeitet:
Ich geh hier nicht weiter in diese Diskussion ein:
Es ist das gleiche als wenn man C++ vs C oder Java vs C# diskutiert -> "When you arguing you are losing"

Aber ich bleibe bei meinem Standpunkt: C ist großartig um programmieren zu lernen und darüber hinaus.
Wem das nicht passt, der nimmt irgendwas anderes wie z.b. Python oder Javascript.
 
Zurück
Oben