Während sich gerade Programmiersprachen wie C #, Java usw. entwickeln, behaupten viele, dass sie eine Alternative zu Sprachen wie Assemblersprache und C / C ++ darstellen, mit denen Sie auf Computerhardware zugreifen und diese steuern können, da sich Programmierer konzentrieren sollten Verschwenden Sie keine Zeit mit dem Computer, um das Programm zum Laufen zu bringen. Da sich die Hardware ständig verbessert, ist der Leistungsunterschied zwischen C / C ++ und Java nicht signifikant, und große Spiele können möglicherweise in einer Sprache wie Java programmiert werden.
Das ist die allgemeine Idee, die ich kurz zusammenfasse, nachdem ich mich mit diesem Thema im Internet befasst habe. Glauben Sie, dass es in naher Zukunft Realität wird? Bedeutet das, dass alles, was wir über Dinge auf niedrigem Niveau lernen, für die Softwareindustrie nicht mehr praktikabel ist? Bedeutet das, dass Assemblersprache und C / C ++ nur für Elektrotechniker relevant werden, da sie die einzigen sind, die für ihre elektrischen Komponenten programmieren müssen?
Wie viel Lernen ist genug? Wenn wir zu viel lernen, werden wir uns irgendwann mehr an der Elektrotechnik orientieren, oder wenn wir zu viel Mathematik lernen, lernen wir vielleicht, Mathematiker zu werden, nicht Programmierer. Ich möchte nur wissen, ob das, was ich in Mathematik gelernt habe (ich habe einen Mathematikkurs besucht, in dem das Material behandelt wird, das diesem Buch ähnelt (sie verwendeten ein anderes Lehrbuch): Diskrete Mathematik und seine Anwendung), genauso nützlich ist wie unsere Programmierkenntnisse. Viele Matheübungen können die meisten von uns Stunden in Anspruch nehmen, und wenn Sie es ernst meinen, haben Sie weniger Zeit, um Programmieren zu lernen. In unserem Spielev-Forum gibt es sogar für Mathematik und Physik nur einen Abschnitt, der mit dem Programmieren vergleichbar ist.
Im Moment habe ich gerade angefangen, "Die Kunst der Computerprogrammierung" zu lesen. Mathe wird nur in ungefähr einem Viertel des Buches behandelt, aber die Übung ist für uns Nicht-Mathematiker schwierig. Sogar eine solche "elementare" Mathematik haben wir sie in unserer Karriere genauso oft benutzt? Einige Leute würden mir wahrscheinlich sagen, dass es Zeitverschwendung ist, das Buch TACOP zu lesen, und sie sollten wahrscheinlich Zeit mit etwas anderem verbringen, das praktischer ist, obwohl sich das Buch ausschließlich mit Programmieren befasst (etwas akademischer im Vergleich zu Büchern, die ähnliche Dinge erklären). Aber ich denke, der Autor hat viel Zeit und Mühe investiert, um es zu produzieren. Er kann sogar den gesamten Satz von 5 Büchern schreiben, während wir - das Publikum - nur die Aufgabe haben, ihn zu lesen. Warum nicht?
quelle
Antworten:
Interessante Frage. Ich bin ein langjähriger C ++ - Programmierer, der jetzt in C # arbeitet (mit etwas nicht verwaltetem C ++ für leistungskritische Arbeiten) und in der Vergangenheit gelegentlich Assembler-Code hinzufügen musste, normalerweise aus Leistungsgründen.
Einige Punkte bei der Vorbereitung einer Antwort auf die Frage:
Zum Zwecke Ihres Vergleichs schlage ich vor, dass der Hauptunterschied zwischen den von Ihnen erwähnten Sprachen C # und Java und der anderen Gruppe Assembly, C / C ++ darin besteht, dass die ersteren eine verwaltete Laufzeit verwenden, um die Garbage Collection bereitzustellen. Es gibt andere Unterschiede (z. B. binäre Portabilität, Framework-Größe und Portabilität), aber wenn Sie Leistungsunterschiede vergleichen, ist dies ein (der?) Hauptgrund.
Assembly, C und C ++ sind alles andere als "Low-Level". Ich denke, Sie sind richtig darin, Assembler- und C-Sprachen mit Hardware- / Firmware- / Treiberentwicklern in Verbindung zu bringen, aber C ++ wird in der Regel auf einer höheren Ebene verwendet und ist immer noch stark im Einsatz - obwohl C # / Java laut TIOBE dies eindeutig verhindern Index.
In der C ++ - Ebene würde ich Objective-C hinzufügen, da es C ++ ähnlicher ist als C # / Java. Abschließend möchte ich darauf hinweisen, dass diese Sprachen durch die Hinzufügung von shared_ptr <> und anderer automatischer Ressourcenverwaltungsfunktionen eine Unterstützung bieten, die der Garbage Collection nahe kommt.
OK - weiter zu Ihrer Hauptfrage: Müssen Softwareingenieure wirklich noch über Kenntnisse auf niedrigem Niveau verfügen?
Meine Antwort: Ja
Gründe dafür:
Gute Frage - aber ich sehe nicht, dass nicht verwaltete Sprachen in naher Zukunft verschwinden.
quelle
Wie in jeder technischen Disziplin gibt es viele Schritte zum Endprodukt, die alle wichtig sind, Fachwissen erfordern und wertvoll sind. Insbesondere in der Softwareentwicklung haben wir viele Abstraktionsebenen. Alle werden gebraucht und niemand kann ein Experte für alle sein.
Davon abgesehen benötigen wir mehr C # / Java / Ruby-Entwickler als Assemby / C-Entwickler. Für uns "übergeordnete" Entwickler ist es hilfreich, mehr darüber zu wissen, was "unter der Haube" passiert, und uns zu besseren Entwicklern zu machen. Aber viele andere Sachen auch . Als .NET-Entwickler zum Beispiel kann ich so viel lernen, was mich produktiver macht, dass das Erlernen unserer Zwischensprache (viel weniger C ++ / C / Assmebly), obwohl sehr hilfreich, oft in den Hintergrund treten muss.
quelle
Sie können heute als Programmierer Ihren Lebensunterhalt verdienen, ohne die einfachen Dinge zu kennen. Ich denke, es macht Sie zu einem besseren Programmierer, wenn Sie es wissen.
Das Aufrechterhalten eines hohen Kompetenzniveaus mit den Sachen auf niedrigem Niveau wird jedoch zunehmend weniger wichtig. Ich meine, ich habe seit 20 Jahren nichts mehr in der Montage gemacht und würde wahrscheinlich eine ernsthafte Auffrischung brauchen, bevor ich wieder produktiv werden könnte, aber die Gesamtkonzepte, wie die Dinge auf dieser Ebene funktionieren, sind immer noch Teil meines Bewusstseins und ich finde Es ist von Zeit zu Zeit hilfreich, auch wenn Sie in höheren Sprachen arbeiten.
quelle
Ich denke nicht, Kernel-Entwickler werden immer das Low-Level-Zeug brauchen. Es tut auch nicht weh zu verstehen, wie alles funktioniert. Wenn Sie im Grunde verstehen, was der Code, den Sie schreiben, tatsächlich tut, werden Sie lernen, besseren Code zu schreiben. Ich halte es für eine schreckliche Idee, das Low-Level-Zeug zu entfernen, da dieses abstrakte Denken manchmal nützlich ist, aber tatsächlich ein Hindernis sein kann, wenn Sie das Problem auf die beste Weise lösen wollen. Zum Beispiel ist es wichtig zu verstehen, dass Sie beim Verketten von Zeichenfolgen tatsächlich neue Zeichenfolgen erstellen. Wenn Sie jedoch nicht verstanden haben, wie Zeichenfolgen implementiert wurden, können Sie diese einfach verketten und die 5 Minuten warten, die Ihr Programm zum Ausführen benötigt. Dies ist ein ausgezeichneter Artikel zu Dingen wie diesem: http://www.joelonsoftware.com/articles/fog0000000319.html
quelle
Dies hängt davon ab, woran der Softwareentwickler tatsächlich arbeitet. Es ist möglich, eine produktive, glückliche und profitable Karriere zu haben, ohne jemals irgendetwas Niedriges zu berühren, aber das sind nicht alle Programmierjobs. Damit es Betriebssysteme und Compiler gibt, müssen Ingenieure an Betriebssystemen und Compilern arbeiten, und sie müssen C, C ++ und die Assemblersprache ihres Computers kennen.
Leistung kann auch wichtig sein. Mein aktueller Laptop ist ungefähr eine Million Mal leistungsstärker als mein erster Heimcomputer, und das Ausführen von Software kann noch einige Zeit in Anspruch nehmen. Ich kann immer noch Verzögerungen bei Videospielen bekommen. Natürlich sehen die Videospiele besser aus, da jedem von über einer Million Pixeln auf dem Bildschirm eine von Millionen Farben zugewiesen werden kann (im Gegensatz zu tausend Positionen für Schwarzweißzeichen, wobei einige der Zeichen für Grafiken verwendet werden ). Ich bezweifle, dass sich die Computerleistung in naher Zukunft noch einmal verzehnfachen wird, und wenn wir dies tun, wird sie voraussichtlich von immer komplexer werdender Software verwendet.
Während der Großteil der Unternehmenssoftware weiterhin in der schnellstmöglichen Produktion und im Freien geschrieben wird, was normalerweise nicht C ist, bleibt weiterhin viel Platz für C- und C ++ - Experten.
quelle
"Da sich die Hardware ständig verbessert, wird die Leistung zwischen C / C ++ und Java nicht signifikant sein, und Big Game kann möglicherweise in einer Sprache wie Java programmiert werden."
Ich glaube nicht, dass diese Aussage bald richtig sein wird. Der verwaltete Code weist immer einen Treffer auf, da die Überprüfungen hinter den Kulissen durchgeführt wurden. Es ist auch keine Frage der Hardware, die besser wird, da die Hardware besser wird, und auch die Apps, von denen erwartet wird, dass sie auf ihnen ausgeführt werden. Ein System, das in nativem Code geschrieben ist, muss über eine Schnittstelle zu verwaltetem Code verfügen. Theres ein Leistungstreffer, der beim Wechseln zwischen den beiden auftritt.
In der Regel benötigt jedoch nur ein kleiner Prozentsatz der Anwendungen diesen optimierten Code. Die meisten Branchenanwendungen können problemlos mit verwaltetem Code, .NET, Java usw. verwendet werden. Dies bedeutet jedoch nicht, dass die Anwendungen, für die dies erforderlich ist, den Wechsel in Kürze durchführen werden. Handgeschriebene Assemblierungen werden derzeit jedoch viel seltener verwendet, da die optimierenden C / C ++ - Compiler so gut sind. Es gab jedoch kürzlich ein Betriebssystem, das komplett in Assembly geschrieben wurde, so dass es noch einige gibt. Dies ist auch im Sicherheitsbereich sehr wichtig.
Ich würde jedoch sagen, um ein wirklich guter Entwickler zu sein, sollte man verstehen, was auf einem niedrigen Niveau vor sich geht. Es hilft bei der Behebung einiger schwieriger Probleme, insbesondere beim Aufrufen von nativem Code.
quelle
Ich denke, dass es für das Debuggen sehr hilfreich ist, einige Dinge auf niedriger Ebene zu kennen, wie zum Beispiel bei der Embedded-Programmierung. Das meiste davon wird jedoch mit C ausgeführt, wenn das Debuggen von Know-how-Assembly für diesen bestimmten Mikrocontroller äußerst nützlich ist.
quelle
Als Computer erfunden wurden, wussten nur wenige, wie man sie benutzt. Heutzutage verfügt fast jedes Haus in einem reichen Land über einen oder mehrere Computer, die von einer durchschnittlichen Person verwendet werden können. Viele gewöhnliche Menschen arbeiten täglich am Computer. Die durchschnittliche Person hat die Fähigkeit, einen Computer zu benutzen, aber wir brauchen noch Programmierer.
Ebenso muss der durchschnittliche Programmierer die Assemblersprache nicht kennen oder regelmäßig programmieren. Dies ist ebenso eine Voraussetzung für marktfähige Fähigkeiten wie ein Ausdruck dafür, wie weit wir in der Welt der Technologie gekommen sind. Unternehmen benötigen Computer, um Aufgaben zu automatisieren. Daher sind Programmierer, die in .NET / Java programmieren können, sehr gefragt.
Die Aufgaben, die automatisiert werden können, werden automatisiert. Nicht alle Aufgaben können automatisiert werden. Nicht jede Automatisierung ist perfekt. Ist also die Montage wichtig? Na sicher. Muss es ein "Programmierer" sein? Natürlich nicht.
quelle
Hmmm, ich genieße es, Dinge auf niedrigem Niveau zu lernen.
Vielleicht ist es nicht das genaueste Gleichnis, aber für mich ist es, als würde man die Machenschaften in einem Auto lernen. Ich kann nicht wissen, wie alle Teile gegeneinander arbeiten, aber es macht Spaß zu wissen, dass es einen Motor, eine Kurbelwelle, Zylinder, Differentiale, Kräne, Bremsen, Öl, Verbrennung, Kühlung und dann Reibung, Stress, Hitze, Kräfte gibt. Wissenschaft - Thermodynamik, Physik, Strömungsmechanik ...
Vielleicht nicht sehr nützlich (ich werde nicht in der Lage sein, ein Auto zu reparieren, wenn ich das alles weiß), sicher nicht professionell praktisch, aber naja, lustig. Kunst für die Kunst: la connaissance pour la connaissance.
quelle
Ich denke, eine nützliche Faustregel lautet: Je schneller es sein muss, desto niedriger muss das Level sein.
Daher sind Ihre grafikintensiven Ego-Shooter oder Ihr algorithmisches FX-Handelssystem immer noch relativ niedrig (C ++ usw.), da Geschwindigkeit der Schlüssel ist. Aber die Web-App, die pünktlich einen Verkaufsbericht ausspuckt? Verdammt, Sie könnten das in Sinclair BASIC schreiben, und es wäre immer noch akzeptabel.
quelle
Nicht alle Softwareentwicklungsjobs sind gleich . Die Leute, die an Betriebssystemen, Compilern, Frameworks, Gerätetreibern, eingebetteten Systemen und hochleistungsfähigem wissenschaftlichem Computing arbeiten, müssen sich mit "Low-Level-Kram" auskennen. Die Leute, die Access CRUD-Formulare oder PHP-Warenkörbe für Tante-Emma-Läden schreiben, vielleicht nicht so sehr. Was für eine Art von Software-Engineering möchten Sie durchführen, und möchten Sie es für den Rest Ihres Lebens tun?
Meiner Meinung nach müssen Sie mindestens eine Abstraktionsebene lernen, die unter derjenigen liegt, in der Sie normalerweise arbeiten. Wenn Sie in C / C ++ arbeiten, sollten Sie sich mit Maschinenarchitekturen und Baugruppen befassen. Wenn Sie in PHP arbeiten, sollten Sie HTTP und ein wenig C / C ++ oder Perl verstehen. Wenn Access Ihr Brot und Butter ist, sollten Sie eine RDB-Theorie kennen und vielleicht ein bisschen über COM oder .Net. Irgendwann in Ihrer Karriere werden Sie durch ein Problem auf einer niedrigeren Abstraktionsebene gestoppt, und Sie müssen in der Lage sein, zumindest ein wenig mit jemandem zu kommunizieren, der ein Experte auf diesem Gebiet ist. Kannst du ohne dieses Zeug auskommen? Sicher, aber die Planung, auf einem wettbewerbsintensiven Arbeitsmarkt durchzukommen, ist gefährlich.
quelle
Ich selbst arbeite weitgehend in C # .NET und habe mich immer von C, C ++ abgewandt. Ich habe kürzlich angefangen, einen Job zu suchen, und war überrascht, wie viele Jobs verfügbar sind und Erfahrung für C, C ++ erfordern. Ich dachte anfangs, dass C, C ++ veraltet ist, aber wenn man sich die verfügbaren Jobs ansieht, sieht es nicht so aus.
quelle
Alle von Ihnen aufgelisteten verwalteten Sprachen verfügen über in C / C ++ geschriebene Interpreter oder virtuelle Maschinen. Ohne diese beiden würden die meisten verwalteten oder interpretierten Sprachen nicht einmal existieren. Ich würde sagen, dass Sie ihren Wert unterschätzen.
quelle
Ich hasse wirklich die Vorstellung von "praktischem" Wissen . Alles, was Sie jemals lernen, ist gleichermaßen praktisch. Es spielt keine Rolle, ob Sie nicht auf einer Abstraktionsebene arbeiten, die der Hardware nahe kommt. Wenn Sie nur die Konzepte dieser Domäne kennen, ist dies immer hilfreich, um neues Wissen auf einer anderen Abstraktionsebene aufzubauen. Je mehr verwandte Konzepte Sie kennen, desto besser.
Für das, was ich normalerweise mache, ist C # eine sehr einfache Sprache, und ich betrachte sie als etwas, das einer Hardware sehr ähnlich ist. Trotzdem glaube ich, dass selbst meine rudimentären, verrosteten Kenntnisse der digitalen Elektronik, des CPU-Designs usw. für alles, was ich jemals tue, sehr nützlich sind.
quelle
Nein, die Mehrheit muss nicht. Das Üben von Techniken auf niedrigem Niveau gibt dem Entwickler zwar ein besseres Wissen darüber, was den gesamten Zyklus beeinflussen könnte, aber heutzutage könnte der Entwickler diese Zeit nutzen, um neuere Technologien zu studieren, die wiederum das Wissen über Dinge auf niedrigem Niveau erforderten, die entwickelt, aber nicht vertrauenswürdig waren auf.
quelle
Wenn Sie ein Wort "Ingenieur" verwenden, meinen Sie aus meiner Sicht, dass der Mann / die Frau derjenige ist, der die Dinge von Grund auf neu entwirft und baut. Das eigentliche Problem eines Software-Ingenieurs besteht darin, ein Problem zu lösen, aber welches Problem? Das ist eine große Frage.
Ein Entwickler unterscheidet sich in vielerlei Hinsicht von einem Ingenieur. Ein "Entwickler" ist eine Person, die normalerweise Dinge auf bereits vorhandenen Plattformen erstellt. Er entwickelt die vorhandenen Plattformen oder baut neue Plattformen, die von älteren geerbt wurden, unter Verwendung der Komponente des übergeordneten Systems.
Ein Entwickler denkt normalerweise aus geschäftlicher Sicht, er ist kein Wissenschaftler. :) Entwickler sind dem Benutzer des Systems näher, sie denken die Dinge aus der Perspektive des Benutzers und lösen daher Benutzerprobleme mithilfe von Technologie.
Ein Ingenieur ein kluger. Er ist ein Wissenschaftler, er löst ein sehr echtes Problem. Die meisten Probleme, die der Computer selbst hat, sind gekapselt. Ingenieure sind diejenigen, die ihre Studien hinter sich lassen, nachdem sie viel über vorhandene Systeme geforscht haben, und sich etwas Neues einfallen lassen, um das Problem zu lösen. Wenn die Lösung dies erfordert und ihr System eine neue Sprache benötigt, erfindet sie eine neue Sprache, weil das vorhandene System nicht dazu in der Lage ist Behebung dieses Problems. Ingenieure erstellten schließlich ein System, auf dem Entwickler ihr System aufbauen.
In der Tat muss ein Software-Ingenieur lernen und sich mit Sachen auf niedrigem Niveau auskennen ... :)
Während ein Entwickler, hängt es ganz von seinem Interesse ab. :)
quelle