Ist das Erlernen von C (oder C ++) eine Voraussetzung, um ein guter (exzellenter) Programmierer zu sein? [geschlossen]

25

Als ich anfing zu programmieren, konnten echte Programmierer Assembler im Schlaf schreiben. Jede ernsthafte Informatikausbildung würde ein hohes Maß an Schulung und Übung in der Programmierung mit Assembler beinhalten. Das hat sich seitdem geändert, bis ich sehe, dass die Abschlüsse in Informatik mit Montage, wenn überhaupt, für insgesamt zwei Wochen Arbeit nach vierjähriger Schulzeit auf einen Auftrag und ein Kapitel verwiesen werden.

Die C / C ++ - Programmierung scheint einen ähnlichen Weg eingeschlagen zu haben. Ich bin nicht länger überrascht, Universitätsabsolventen zu interviewen, die nicht mehr als zwei Wochen mit Programmieren in C ++ verbracht haben und irgendwo nur C in einem Buch gelesen haben. Während die schwerwiegendsten CS-Abschlüsse anscheinend immer noch das Erlernen einer oder beider Sprachen beinhalten, geht der Trend eindeutig zu weniger erzwungenem C / C ++ in der Schule.

Es ist eindeutig möglich, Karriere zu machen und gute Arbeit zu leisten, ohne jemals eine einzige Zeile C- oder C ++ - Code zu lesen oder zu schreiben.

Lohnt es sich angesichts all dessen, die beiden Sprachen zu lernen? Müssen sie überhaupt exzellent sein? (Über die offensichtlichen, nicht sprachspezifischen Ratschläge hinaus, wie "eine gute Auswahl von Sprachen ist wahrscheinlich wichtig für eine umfassende Ausbildung", und "es ist wahrscheinlich eine gute Idee, während der gesamten Karriere eines Programmierers immer wieder neue Sprachen auszuprobieren und zu lernen die grauen Zellen strecken ")

Blueberryfields
quelle
8
C ist in der heutigen Software-Infrastruktur allgegenwärtig. Wenn Sie es lernen, erhalten Sie definitiv ein tieferes Verständnis dafür, was in der von Ihnen geschriebenen Software tatsächlich vor sich geht. (Siehe programmers.stackexchange.com/questions/14744/… ).
Charles Salvia
Ich fand auch die Antworten hier relevant: programmers.stackexchange.com/questions/29109/...
blueberryfields
Tangential: Ein guter Programmierer ist mit verschiedenen Programmierparadigmen vertraut, dh er hat mehrere Sprachen gelernt (und verwendet).
Matthieu M.
Mehr Sprachen lernen kann nicht schaden.
Maxpm
4
Es gibt kein C / C ++. Es gibt nur C und C ++. Es handelt sich um sehr unterschiedliche Sprachen, und die Antwort ist wahrscheinlich sehr unterschiedlich, je nachdem, von welcher Sprache Sie sprechen.
Caleb

Antworten:

62

Joel Spolsky (ja, dieser Joel) argumentierte vor einiger Zeit, dass echte harte Programmierer wissen, wie man härtere Sprachen (wie C, C ++ und Lisp) und ihre Konstrukte (wie Zeiger und Funktionsmerkmale) verwendet, und dass höhere Sprachen normalerweise nicht "Schwer genug", um Ihre Kompetenz unter Beweis zu stellen.

Ich kann seinen Standpunkt verstehen, dass Leute, die C und C ++ kennen und tatsächlich gut darin sind, viel mehr darüber wissen, was unter der Haube vor sich geht, als Leute, die beispielsweise in Ruby (und nur in Ruby) programmieren . Ich würde sagen, dass dies so aussieht: Wenn Sie eine "harte" Sprache beherrschen, ist dies wahrscheinlich ein guter Beweis dafür, dass Sie programmieren können, während Sie strenge Auflagen einhalten oder komplexe Denkweisen beherrschen. Wenn Sie sich in einer höheren Sprache gut auskennen, können Sie zwar auch unter Einhaltung strenger Auflagen programmieren, aber es gibt keinen Beweis dafür.

Ich glaube nicht, dass das Erlernen von C oder C ++ Ihrem Gehirn schaden wird (manche Leute scheinen dies jedoch zu glauben). Eigentlich könnte es eine gute Idee sein, es nur zu lernen, um höhere Sprachen zu schätzen.

zneak
quelle
34

Ja, Kenntnisse in C (oder C ++) sind erforderlich, um (in unserer heutigen Zeit) ein hervorragender Programmierer zu sein.

Es ist nicht die Sprache selbst, es ist die Umwelt.

Programme laufen nicht im luftleeren Raum. Ein ausgezeichneter Programmierer kennt seine Umgebung, so wie ein guter Bildhauer sein Material kennt. Unsere aktuelle Programmierumgebung (Betriebssysteme, Compiler, Netzwerke usw.) basiert auf C / C ++.

Ausgezeichnete Programmierer schreiben effiziente Programme und debuggen sie in realen Situationen. Er muss die Umgebung kennen - und heutzutage muss er C / C ++ kennen.

Bearbeiten: Kann nicht widerstehen, Matrix-Referenz hinzuzufügen. Morpheus könnte fragen: Möchten Sie die Java-Pille einnehmen und weiterhin in einer komfortablen Welt leben, die von der virtuellen Maschine bereitgestellt wird? Oder nimmst du die C-Pille und siehst, wie tief das Kaninchenloch geht?

Maglob
quelle
9
+1 für die Matrix-Referenz, ich werde es für eine mögliche zukünftige Verwendung aufbewahren :-)
Konamiman
20

Ich muss auf einen anderen Joel-Artikel verweisen. In The Law of Leaky Abstractions bedeutet das Erlernen von Sprachen wie C, Lisp, C ++ und Sprachen, die das Speichermanagement beinhalten, auch das Erlernen einer Denkweise, die uns für den Rest unserer Karriere definiert.

Mein Professor in meiner Klasse für Datenstrukturen und Algorithmen, William Spears, erzählte einer Menge skeptischer Informatikstudenten, warum wir nicht die neuesten Tools gelernt haben. Die Studenten beklagten sich, dass sie sich nicht auf die "reale Welt" vorbereitet fühlten, weil wir kein Java lernten. Wir haben kein JavaScript gelernt. Es gab keine HTML-Klassen. Wir haben [[INSERT TECHNOLOGY HERE]] nicht gelernt.

Warum haben wir nicht die neuesten Werkzeuge gelernt? Laut unserem Professor ändert sich die Technologie so schnell, dass die Werkzeuge, die wir lernen, in 4 Jahren möglicherweise überholt sind. Nun, nach ein paar Jahren in der Branche muss ich sagen, dass ich seiner Einschätzung zustimme.

Der Zweck einer Informatikausbildung besteht darin, das Lernen zu erlernen. Das Herausfinden von Lösungen für viele Probleme in der Entwicklung erfordert oftmals die Fähigkeit, über den Tellerrand hinaus zu denken, was nur durch das Erlernen grundlegender, grundlegender, unter der Haube liegender Informatik möglich ist, die aus der Arbeit mit C, C ++ und Lisp resultiert.

Wenn diese Abstraktionen in der realen Welt undicht werden, ist ein Verständnis der Grundlagen das, was den Durchschnitt vom Besten unterscheidet.

jmort253
quelle
3
Ich muss etwas vermissen. Was hat Lisp mit Lerngrundlagen zu tun? Es ist die größte Abstraktionsinversion, die jemals erfunden wurde. Eines der ursprünglichen, grundlegenden Designziele war: "Stellen wir uns vor, wir wären nicht wirklich auf einer Turing-Maschine und sehen, wie sehr wir die Dinge dadurch vereinfachen können."
Mason Wheeler
6
@Mason: Wenn Sie Lisp lernen, lernen Sie in etwa nichts über Computer der realen Welt. Es wird Ihnen viel über die Theorie der Berechnung beibringen. In der rohen Informatik geht es um mehr als um rohe Computer.
David Thornley
2
@Mason Wheeler Learning Lisp stellt einige fortgeschrittene Konzepte, zB: Daten / Code sind austauschbar, Reflexion / selbstmodifizierenden Code und die Bedeutung Ihrer von Berücksichtigung Compiler / vm ein Teil Ihrer Endprodukt
blueberryfields
@blueberryfields: ... die alle von erfahreneren Programmierern bis zu dem einen oder anderen Grad als schädlich und / oder Sicherheitslücken eingestuft werden. Sehr schlechte Dinge, um Neulingen beizubringen.
Mason Wheeler
2
@Mason Ich verstehe den Kontext Ihres Kommentars nicht - hier geht es um exzellente Programmierer, nicht um Neulinge. Ich würde einen Programmierer, der diese Konzepte nicht genau versteht und sie angemessen (und regelmäßig) in seiner Arbeit anwendet, nicht als Experten betrachten.
blueberryfields
18

Lassen Sie es mich so sagen. Angenommen, Sie müssten jemanden einstellen, der C ++ - Arbeit leistet, und jemand bewirbt sich, der ein C ++ - Projekt am College durchgeführt hat, aber seit dem Abschluss nur in Java programmiert hat. Nehmen wir umgekehrt an, Sie müssten jemanden für eine Java-Arbeit einstellen, und jemand bewirbt sich, der ein Java-Projekt im College durchgeführt hat, aber seit dem Abschluss nur in C ++ programmiert hat.

Wen werden Sie bequemer einstellen? Ich würde den C ++ Typen argumentieren, da es viel einfacher ist, eine Sprache zum Sammeln von Müll zu verwenden, als sich von einer zu entfernen. Ebenso für andere Konzepte und andere Sprachen, wie den Übergang von kompilierter zu interpretierter oder von statischer zu dynamischer Typisierung. In fast jedem Feature-Vergleich, den Sie zwischen Sprachen durchführen können, hat C ++ das schwierige Ende, was das Programmieren zu einer schwierigen Angelegenheit macht, aber auch eine hervorragende Grundlage für die Beurteilung eines Programmierers.

Können Sie Karriere machen, ohne jemals C- oder C ++ - Code zu berühren? Klar, aber ich würde trotzdem niemanden einstellen wollen, der das nicht kann oder fürchtet.

Karl Bielefeldt
quelle
3
Unscheinbares Argument. Wenn ich Java-Arbeit erledigen müsste, würde ich jemanden mit Java-Erfahrung einstellen. Wenn ich C ++ arbeiten müsste, würde ich jemanden mit C ++ - Erfahrung einstellen. Wenn ich hatte einen Java - Mann für eine C ++ Position mietet , dann könnte ich etwas mehr Zeit damit verbringen , Interview ihn auf Zeiger und Speicherverwaltung und RAII quizzing; in ähnlicher Weise, wenn ich habe einen C ++ Typen für eine Java - Position mietet , dann würde ich über Bammel, Entwurfsmuster mehr Zeit im Interview verbringen zu fragen, Reflexion, usw. Weder Fähigkeiten mehr Intelligenz, nur Erfahrung zu erfordern scheint. Der größte Teil der Lernkurve befindet sich sowieso in den Bibliotheken.
Aaronaught
13

Nein, es ist nicht erforderlich, C oder C ++ zu lernen, um ein guter Programmierer zu sein, aber zu verstehen, würde helfen, einige grundlegende Konzepte wie Memory Management zu klären.

Rachel
quelle
7

Lohnt es sich, die beiden Sprachen zu lernen?

Es ist eindeutig möglich, Karriere zu machen und gute Arbeit zu leisten, ohne jemals eine einzige Zeile C- oder C ++ - Code zu lesen oder zu schreiben.

S.Lott
quelle
6

Kurz gesagt, nein, das sind sie nicht. Sie sind nützliche Sprachen zum Lernen, aber Sie können leicht ein ausgezeichneter Programmierer sein, ohne eine Zeile von C oder C ++ zu berühren. Die meisten hervorragenden Programmierer werden sie wahrscheinlich berührt haben, aber das ist auch der springende Punkt - in vielen Anwendungen werden sie heutzutage nicht annähernd so häufig wie .NET und Java verwendet, und daher ist ihre Notwendigkeit etwas gesunken.

Beachten Sie, dass ich nicht sage, dass sie es nicht wert sind, gelernt zu werden. Ich denke, sie sind beide wichtige Sprachen zum Lernen, besonders wenn Sie vorhaben, aus dem Programmieren eine Karriere zu machen. Aber können Sie ein anständiger Programmierer sein, ohne jemals etwas angerührt zu haben? Sicher.

berry120
quelle
5

Es hängt von Ihren Interessen ab.
Wenn Sie in der Systemprogrammierung mitarbeiten möchten, müssen Sie C / C ++ lernen, da dies die Standardsprachen von CS sind. Um sich mit Betriebssystemkonzepten, Compilern, Datenstrukturen, Speicherverwaltung usw. vertraut zu machen, müssen Sie C / C ++ kennen. Zusätzlich sind auf C / C ++ unzählige gute Texte, Bücher und Artikel verfügbar, die Ihre Programmierkenntnisse optimieren. Vor ein paar Tagen las ich in / * Programmers * / eine exzellente Antwort für Why C - weil es nah am Metal ist .
Umgekehrt, wenn Sie sich auf die Anwendungsprogrammierung beschränken möchten, müssen Sie sich nicht für C / C ++ entscheiden. Beginnen Sie direkt mit C # (.Net) / Java, und Sie erhalten einen guten Entwicklerjob. Aber wenn Sie Hardcore-Programmierung wirklich lieben, werden Sie sicher eines Tages C / C ++ lernen.

Ranger
quelle
Nah am Metall! Ich liebe diesen Kommentar.
Wajih
3

Es hängt ganz davon ab, in welcher Anwendungsdomäne Sie arbeiten möchten. Wenn Sie in der eingebetteten Landschaft spielen möchten, müssen Sie C oder C ++ kennen. C ++ ist wahrscheinlich auch die am häufigsten verwendete Sprache in der Spieleentwicklung. Wenn Sie an Webanwendungen arbeiten möchten, ist C oder C ++ möglicherweise nicht so wichtig. Es gibt keine Sprache, die das Prestige hat, als Präzedenzfall für die Definition eines guten Software-Ingenieurs bezeichnet zu werden.

Pemdas
quelle
3

C wurde "portably assembly" genannt, was sehr richtig ist. Es wurde entwickelt, um Unix prozessorübergreifend portabel zu machen und Code zu beschreiben, der dem Befehlssatz des zugrunde liegenden Prozessors sehr nahe kommt.

Wenn Sie feststellen, dass Sie in der Nähe der eigentlichen Hardware arbeiten möchten, sich in eingebetteter Software oder Gerätetreibern usw. befinden, führt kein Weg an C vorbei. Wenn Sie in den gängigsten Sprachen arbeiten möchten, sind Hochsprachen eine bessere Idee Viele der Features, die C mächtig machen, machen C auch gefährlich, so dass sie verringert oder einfach entfernt wurden.

Persönlich halte ich es für sehr wichtig, zu verstehen, was eventuell zum Ausführen Ihrer Programme erforderlich sein wird, da viele Entwurfsentscheidungen davon abhängen. Daher sollten Sie zumindest mit der Zuordnung von Code zum Assembly-Anweisungssatz und der tatsächlichen Funktionsweise vertraut sein Hardware. Was Sie für selbstverständlich halten, braucht Zeit und warum.

Daher würde ich zumindest vorschlagen, dass Sie sich C und einen fortgeschrittenen Zeiger-Arithmetikcode ansehen, damit Sie wissen, womit Sie sich nicht täglich befassen müssen.

user1249
quelle
1

C ist nützlich zu lernen, weil es nahe am Silizium liegt. C oder Assembler geben Ihnen ein gutes Gefühl dafür, was Computer können und wie sie es tun. Dies ist wahrscheinlich hilfreich, um zu verstehen, was möglich und was praktisch ist. Darüber hinaus gibt es eine Menge C-Code, an dem Sie interessiert sein könnten, und eine viel modernere Sprache verwendet einen Großteil ihrer Syntax und Semantik.

C ++ ist eine höhere Sprache, die einige sehr interessante Funktionen enthält. Es hat viele gute Verwendungen und ist eine mächtige Sprache. Auf der anderen Seite gibt es viele andere mächtige und nützliche Sprachen.

Daher empfehle ich dringend, etwas über die Vorgänge auf den unteren Ebenen zu lernen, und C ist eine hervorragende Methode, um sie zu lernen. Daher empfehle ich dringend, C ++ zu lernen. Wenn Sie es lernen, werden Sie Dinge lernen, aber es gibt andere Möglichkeiten, die meisten davon zu lernen. Wenn Sie bereits in einer Standardsprache arbeiten, gibt es bessere Sprachen, um neue Konzepte zu erlernen.

David Thornley
quelle
0

Dies hängt von der Art der Software ab, von der Sie glauben, dass Sie sie erstellen werden. Spiele werden oft in C / C ++ geschrieben, da es sich bei dem ausführbaren Code klassisch um eine optimierbare Sprache handelt. Was Sie codieren, ist in gewisser Weise nur das, was Sie erhalten.

Allerdings wurde C # auch zum Programmieren von Spielen verwendet. C # ist wahrscheinlich eine der besten Sprachen für die Entwicklung von Desktopanwendungen, zumindest auf der Windows-Plattform.

Neben Visual Studio ist C # fast die einzige Softwareentwicklungssprache, die ich verwende (mit Ausnahme von Sprachen wie SQL und PHP usw.), da es meiner Meinung nach in jeder Hinsicht absolut fantastisch ist .

Wenn Sie unter Windows entwickeln, empfehle ich dringend, neben allem anderen auch C # .NET zu lernen.

Ich glaube nicht, dass C ++ per se eine Voraussetzung ist, aber es ist schön, dass man über ein geringeres Wissen über Zeiger, Speicherverwaltung und andere Konzepte verfügt.

Nick Bedford
quelle
1
@ Nick: Die Computerwelt ist jenseits von Windows und C #.
Ranger
2
Daher sagte ich: "Wenn Sie unter Windows entwickeln" .
Nick Bedford
0

@ Nick Bedford stimmt mit der Domain überein, in der Sie arbeiten. Meine Software-Kollegen schreiben Gerätetreiber und eingebettete Software. C ist der Weg dorthin. Und denken Sie nicht an C ++ als zweite Sprache, sie haben enorme Überschneidungen.

Brian Carlton
quelle
3
Wenn Sie sich C ++ nicht als eine andere Sprache als C vorstellen, kennen Sie C ++ wirklich nicht gut. Das Arbeiten nur in der Überlappung ist möglich aber nicht ratsam.
David Thornley
Vielleicht übertreibe ich die Ähnlichkeit. Sie sind jedoch mehr die gleichen wie beispielsweise C und Perl.
Brian Carlton
0

Viele haben gesagt, dass C für das Speichermanagement gut zu lernen ist, und ich stimme zu. Meiner Meinung nach ist C zu lernen, dass es sehr gut ist, zu lernen, wie man ein Programm debuggt. Beim Schreiben von C kann eine Menge schief gehen, sodass Sie überlegen müssen, wie Sie Ihre Programme debuggen sollen. Ich verwende selten ein Debugging-Tool in meiner Programmierung (in C oder anderen Sprachen), nur weil C mir beigebracht hat, wie man integrierte Debugging-Dienstprogramme zu Programmen hinzufügt.

Ist das Erlernen von C / C ++ für eine Karriere erforderlich? Nein, aber ich habe auch viele Java-Entwickler gesehen, die nicht viel über Programmiergrundlagen wissen, weil sie nur Java gelernt haben. Gleiches gilt für Perl-Programmierer. Das Erlernen von mehr als einer Sprache sollte eine Voraussetzung für eine Karriere sein, unabhängig davon, ob C / C ++ eine dieser Sprachen ist oder nicht.

Arcege
quelle
+1 - Die Darstellung ähnlicher Konzepte in verschiedenen Sprachen hat mir geholfen, diese Konzepte besser zu verstehen und in einem völlig neuen Licht zu sehen.
jmort253
0

Am Anfang dachte ich, dass meine Universität in der Generation von Dennis M. Ritchie ist, weil ich C für 2 Semester aufgenommen habe, wenn es viele relativ neue Sprachen wie Java, Visual Basic und so weiter gibt. Aber Tatsache ist, oder zumindest glaube ich, dass C eine der besten Sprachen ist, die Ihnen helfen, die grundlegenden Konzepte der Programmierung zu verstehen.

Und über die Karriere ohne C (oder C ++) zu lernen - Ja, es ist möglich, aber C zu lernen wird Ihre Programmierkenntnisse demonstrieren.

Herr Programmierer
quelle
0

Die Antwort für mich war ja. Sowohl C als auch C ++ waren Pflichtkurse in meinem CS-Studiengang, und ich bin der Überzeugung, dass ein CS-Abschluss oder ein verwandter Abschluss eine Mindestvoraussetzung ist, um ein "guter Programmierer" zu sein. Ein "guter Programmierer" zu sein bedeutet außerdem, die auftretenden Probleme rationalisieren zu können und zu verstehen, warum etwas nicht so funktioniert, wie man es erwarten könnte. Zu oft in meiner Karriere habe ich gesehen, wie Menschen von Problemen überrascht wurden und dachten, es würden übernatürliche Kräfte gegen sie arbeiten ... es ist lächerlich.

IMO, C zu kennen, zeigt die Fähigkeit, jede der imperativen Sprachen zu verstehen und Probleme mit einem der mächtigsten Werkzeuge zu lösen, die die Menschheit jemals erfunden hat.

sesteel
quelle
0

Ein gut gerundeter Programmierer hat mehrere Trickkisten im Ärmel, darunter:

1) Low-Level-Programmierung ... C mindestens. Eine Versammlung würde nicht schaden.

2) Funktionale Programmierung ... Eine reine Funktionssprache, kein Hybrid - hier funktioniert das Schema.

3) OOP ... Normalerweise würde ich Smalltalk sagen, aber ich denke, wir könnten jetzt mit Java arbeiten.

roter Schmutz
quelle
0

C ist die Mutter aller Programmiersprachen ... Expertenwissen in C ermöglicht es Ihnen, in kurzer Zeit jede andere Sprache wie Java zu beherrschen.

C ++ ist ein ganz anderes Ballspiel und das komplexeste unter allen.

bhasinusc
quelle
0

Es ist nicht erforderlich, C oder C ++ zu lernen, um ein guter (exzellenter) Programmierer zu sein. Es ist jedoch erforderlich, Assembly zu lernen, um ein guter (exzellenter) Programmierer zu sein. Hervorragende Programmierung bedeutet, Speicher, MHz, Bandbreite und Leistungsbeschränkungen zu optimieren und dann das beste Design und / oder die beste Implementierung für die jeweilige Aufgabe auszuwählen. Bei den Informatikern besteht die primäre Schwäche nach Jahrzehnten der Weiterentwicklung der Technologien immer noch darin, Daten optimal zu verwalten. Hierbei handelt es sich um eine Reihe von Fähigkeiten, die durch das Schreiben von Assembly vermittelt werden (beliebige Assemblys, z. B. ARM, MIPS, x86, Mikrocontroller, DSP oder sogar niedriger über Verilog / VHDL).

Jonathan Cline IEEE
quelle
0

Ich würde sagen, dass es keinen Sinn macht, eine bestimmte Sprache zu lernen, um ein guter Programmierer zu sein, wenn ich C, C ++, Assembly und Lisp beherrsche. Meine Erfahrung mit dem, was einen guten Programmierer ausmacht, ist, dass ich in der Lage bin, so zu denken, dass Probleme gelöst werden. Sprachen ermöglichen es Ihnen lediglich, Ihre Fähigkeiten zur Problemlösung auszudrücken. Zum Beispiel ermöglicht die Einfachheit von C das einfache Ausdrücken von Algorithmen, während Sie mit Lisp Probleme rekursiv lösen können. Eine Sprache macht Sie also nicht zum Programmierer. Sie müssen zuerst ein Problemlöser sein, bevor Sie ein guter Programmierer werden. Sprachen sind nur Werkzeuge, mit denen Sie Probleme lösen können.

ärgerlich_squid
quelle
-1

Es lohnt sich, C gut zu lernen, um ein solides Verständnis des Speichermanagements zu erlangen. Das Gleiche gilt für C ++, außer mit dem Ziel, Datenstrukturen zu lernen.

aqua
quelle
Es ist egal, in welcher Sprache man Datenstrukturen lernt.
kirk.burleson
Ich glaube, das liegt daran, dass in vielen anderen Sprachen Datenstrukturen verwendet werden, ohne zu wissen, wie sie im Speicher behandelt werden. C ++ (ohne Verwendung von STL) zwingt den Programmierer zu lernen, wie die Datenstrukturen auf niedriger Ebene behandelt werden.
Aqua
-1

Nein. Es gibt viele miese Programmierer, die C / C ++ - Code schreiben. Was Sie zu einem guten Programmierer macht, ist das Verständnis, wann und warum Sie etwas in C / C ++ schreiben müssen

Don
quelle