Ich hatte neulich ein Gespräch mit einem meiner Lehrer.
Wir diskutierten die Auswirkungen, die einfachere Skriptsprachen (wie Python oder Ruby) auf Junior-Programmierer haben.
Er argumentierte, dass Skriptsprachen schlampige Codierungstechniken erzeugen, weil Anfänger nicht verstehen, was "unter der Haube" vor sich geht. Er führte auch andere Beispiele an, wie Skriptsprachen den Programmierer häufig dazu veranlassen, Bedenken hinsichtlich Effizienz, Speicherverwaltung, Betriebskomplexität usw. zu vernachlässigen.
Ich argumentierte, dass niedrigere Programmiersprachen für manche Menschen zu viel sein könnten und sie aufgeben könnten, bevor sie eine Leidenschaft für das Programmieren entwickeln. Als ich anfing, meine erste Programmiersprache (C) zu lernen, bekam ich Zeiger und gab auf, weil die Konzepte zu schwer waren (zu meiner Verteidigung war ich erst 14 Jahre alt). Ohne Java wäre ich vielleicht kein Programmierer geworden! Wenn ich mit einer einfacheren Sprache angefangen und dann tief gegraben hätte, hätte ich nicht aufgegeben und ich hätte genauso viel gelernt, wie ich mit C angefangen habe.
Die Klasse endete, bevor beide Seiten vollständig erforscht waren.
Bis zu diesem Punkt habe ich gepredigt, dass Anfänger mit Skriptsprachen beginnen und dann tief graben sollten; aber nach dieser Diskussion begann ich mich zu fragen, ob dies ein Irrtum war.
Welchen Einfluss haben Skriptsprachen auf Junior-Programmierer?
Antworten:
Ich stimme dir nicht zu. Erstens befinden sich Skriptsprachen auf einer höheren Abstraktionsebene, und daran ist nichts auszusetzen. Am Anfang versucht man nur, die Prinzipien zu lernen. Eigentlich würde ich sagen, dass die Wahl einer niedrigeren Programmiersprache zu einer schlechten Codierung führen kann, da man sich mit einigen Details befassen muss, bevor man sie verstehen kann. Stattdessen kann man mit einer einfacheren Sprache von Anfang an sauberen und präzisen Code schreiben.
Zweitens gibt es in diesen Sprachen viel zu lernen. Zum Erlernen der Sprache würde ich sagen, dass C einfacher ist als Python. Man muss sich mit Zeigern auseinandersetzen oder sich um Zeichenketten kümmern, aber in Python gibt es noch viel mehr Konzepte zu lernen. Verständnis, Objektorientierung, Reflexion, magische Methoden, erstklassige Funktionen, Lambdas, Iteratoren und Generatoren, Metaklassen: all dies ist Teil der Sprache.
Ich denke, dass das Beginnen mit Python es ermöglicht, viel mehr über das Programmieren und eine sanftere Lernkurve zu lernen. Eine niedrigere Sprache hat möglicherweise weniger Abstraktionen - also weniger allgemeine Konzepte zum Lernen - und überfordert den Anfänger mit Details, auf die er verzichten möchte.
quelle
Es ist egal, wo Sie anfangen. Es ist wichtig, wohin du gehst, nachdem du angefangen hast.
BASIC ist vielleicht nicht die eleganteste Sprache auf dem Planeten, aber es umfasst die Grundlagen der prozeduralen Programmierung und das ist genug, um loszulegen.
Ich habe mit BASIC angefangen. Ich habe nicht bleiben dort.
quelle
Ihr Lehrer hat Recht, außer dass er annimmt, dass seine Konsequenzen schlimme Dinge sind.
Wenn Sie das Erlernen von Sprachen als reine akademische Aktivität betrachten, um zu lernen, wie Computer funktionieren, dann hat er Recht. Wenn Sie sie als einen Weg betrachten, Dinge zu erledigen, dann sind Sie richtig.
quelle
Ich denke, "Skriptsprache" ist ein schreckliches Wort, das extrem veraltet ist oder bestenfalls zu einer Klasse von domänenspezifischen Sprachen passt. Ihr Lehrer richtet einfach alles, worüber er offensichtlich nicht genug Verständnis hat, auf eine Achse des Bösen aus.
Eine vernünftige Unterscheidung ist die zwischen Hochsprachen und Niedrigsprachen oder zwischen statisch und dynamisch typisierten Sprachen, die wirklich orthogonal sind.
Assembler ist auf niedriger Ebene dynamisch typisiert (wenn es überhaupt Sinn macht, von Typen zu sprechen), C ist auf niedriger Ebene statisch typisiert, Ruby ist auf hoher Ebene dynamisch typisiert, Haskell ist auf hoher Ebene statisch typisiert. Java ist weder auf hoher noch auf niedriger Ebene statisch typisiert, C ++ ist sowohl auf hoher als auch auf niedriger Ebene statisch typisiert. Und so weiter.
Die Diskussion kann nur sein, welche Paradigmen für einen Einsteigerprogrammierer besser geeignet sind.
Ich bin ziemlich davon überzeugt, dass Low-Level-Programmierung wahrscheinlich keine ist. Es könnte schon in den frühen 90er Jahren gewesen sein, als man damit in angemessener Zeit tatsächlich interessante Ergebnisse erzielen konnte.
Aber das Programmieren wird von Leidenschaft angetrieben. Leidenschaft wird durch Belohnungen genährt. Anfänger sollten daher mit lohnenden Tools beginnen. Niedrigstufige Werkzeuge lohnen sich nicht mehr, da es eine Unmenge hochstufiger Werkzeuge gibt, mit denen Sie in einem Bruchteil der Zeit das gleiche Ergebnis erzielen.
Das menschliche Denken ist abstrakt. Wenn wir lernen, die Welt zu verstehen, tun wir dies durch sehr grobkörnige Abstraktionen und gehen bei Bedarf ins Detail.
Damit ein Kind seine Umwelt versteht, wird es nicht Mathematik, dann Physik, dann Chemie, dann Biologie, dann Geschichte, Soziologie und Philosophie unterrichtet. Du gibst ihm ein sehr einfaches Modell der Welt, um damit fertig zu werden und wirst, wenn er jung ist, endlos Fragen auf dich werfen und deine Autorität später komplett negieren.
So denken wir. Das menschliche Gehirn kann nur begrenzte Informationsmengen "Einheiten" verarbeiten, aber der Grad der Abstraktheit spielt bei der Quantisierung von Informationen nur eine geringe Rolle. Zum Beispiel: Das Lesen des Ausdrucks '34 * 75 'ist für uns einfacher als das Berechnen, während es für Computer umgekehrt ist. Ein Bündel schwarzer Pixel in einer verzerrten Linie zu erkennen (und damit zu abstrahieren), die dann als einzelne Ziffer erkannt (und damit wieder abstrahiert) werden kann, ist ein enormer Arbeitsaufwand.
Meine Großmutter versteht die Idee, eine Datei zu öffnen. Unter dieser Ebene hat sie jedoch kein Verständnis. Und ehrlich gesagt, wenn sie dies hätte lernen müssen, indem sie zuerst die internen Abläufe der Hardware und des Betriebssystems studiert hätte und was nicht, wäre sie nie dort angekommen.
Es gibt eine Menge Leute, die Dinge überkomplizieren, weil sie nie gelernt haben, in klaren, präzisen und dabei eleganten Lösungen zu denken, sondern sich zu viel Zeit mit austauschbaren Details auf niedriger Ebene und der Lösung von Problemen mit diesen zu beschäftigen. Menschen beizubringen, wie Computer zu denken, ist der schlechteste Ansatz für die Programmierung.
Der Wert der Programmierung liegt in der Lösung eines Problems. Das Ausdrücken als Code ist eher eine langweilige, mechanische Aufgabe und sollte einfach mit allen geeigneten Werkzeugen durchgeführt werden.
Oh, und mach dir keine Sorgen, dass du die Hinweise nicht verstanden hast. Ich hatte ungefähr das gleiche Problem im gleichen Alter. Das Problem ist hier auch die fehlende Abstraktion. In der Regel lernen Sie Zeiger aus einem C-Buch kennen, und während Sie Schwierigkeiten haben, sie zu verstehen, geht dies mit der Speicherzuweisung und damit mit dem Stapel- und Heapspeicher usw. einher. Das abstrakte Konzept hinter Zeigern ist Indirektion. Eine Variable, die einen Index für ein bestimmtes Array enthält, ist genau das (tatsächlich ist es in C dasselbe, wo das bestimmte Array Ihr Adressraum ist), und Sie benötigen hierfür keine Zeigerarithmetik.
Dies soll nur veranschaulichen, dass die Auswahl einer hohen Abstraktionsebene das Verständnis der Dinge erheblich erleichtert.
EDIT: und wenn es um das Tippen geht, bevorzuge ich statisch getippte Sprachen. Und ich denke, Programmierer für Einsteiger sollten das Konzept der Typen (das abstrakt ist) klar verstehen.
quelle
An Python ist nichts Einfaches. Schauen Sie sich Unicode und Meta-Programmierung an.
quelle
Ich sehe ein anderes, viel tieferes Problem.
Unityped-Sprachen zwingen nicht dazu, auf Typen zu achten, in Typen zu denken. Das ist schön und gut, solange ich kleine Skripte mit einigen Zeichenfolgen und Zahlen habe, die ohne es zu merken ineinander konvertiert werden. Aber der Tag wird kommen, an dem dies brechen wird. Plötzlich bricht das Programm ab, und bei jeder schnellen Fehlerbehebung bricht es erneut ab.
Oder der unerfahrene Möchtegern-Programmierer stellt fest, dass er eine Liste mit Listen anstelle einer Liste mit Tupeln benötigt, aber nicht die geringste Ahnung hat, wie dies zu tun ist, und stellt Fragen zum Stapelüberlauf, die zeigen, dass es absolut hilflos ist.
quelle
Ich behaupte immer noch, dass formaler Unterricht und Mentoring ein viel größerer Faktor als die Sprachwahl für die Codequalität von Anfängern ist. Wenn ich jedoch eine Muttersprache für Anfänger wählen müsste, würde ich Python für Autodidakten und C ++ für den College-Unterricht wählen.
Der Grund dafür ist, dass Sie mit formalen Anweisungen mit kleinen, trivialen Programmen beginnen können, um eine starke theoretische Grundlage zu legen, bevor Sie etwas Nützliches tun müssen. Ich denke, diese Reihenfolge ist ideal, wenn Sie sich die Zeit leisten können, und C ++ gibt Ihnen eine Menge Hilfe bei Compilerfehlern und Segmentierungsfehlern zwischen den Vorlesungen, um Sie zu informieren, wenn Sie die Grundlagen nicht verstehen.
Einige dieser Grundlagen sind einfach schwer zu erlernen, wenn Sie Autodidakt sind, bis Sie einige Erfahrungen gesammelt haben. Außerdem müssen Sie in der Regel so schnell wie möglich etwas Nützliches herstellen und können bei Bedarf die theoretischen Grundlagen erlangen, obwohl Sie das Risiko eingehen, bei diesem Ansatz nie mehr als das Nötigste zu lernen. Deshalb empfehle ich in diesem Fall eine Sprache wie Python.
quelle
Wir haben es im College anders herum gesehen und ich denke, es ist nützlich. * Wir fingen auf dem niedrigen Niveau an. Zeiger, Speicherverwaltung, Zeichen-Arrays ... Also ja, wir haben mit C begonnen. Dasselbe gilt für Algorithmen: Zuerst eine verknüpfte Liste, eine Hash-Tabelle, einen Baum implementieren ... und dann nur die Standardbibliotheken verwenden.
Danach sind wir zu mächtigeren Sprachen wie Java, C # oder Perl aufgestiegen. Aber mit dem Vorteil zu wissen, was unter dem Gurt vorgeht.
Während dies funktioniert, denke ich, ist es auch in Ordnung, von Skriptsprachen zu einer niedrigeren Sprache zu wechseln. Wenn Sie sowohl eine höhere als auch eine niedrigere Sprache beherrschen, können Sie sicher sein, dass Sie die Sprache auf hoher Ebene problemlos verwenden können und trotzdem wissen, was gerade vor sich geht. Die Reihenfolge, in der Sie sie lernen, ist weniger wichtig.
quelle
Skriptsprachen machen Programmierer nicht schlampig. Mangelnde Klarheit im Verständnis der Problemdomäne (z. B. des Geschäfts, dem das Programm dient) führt zu Schlamperei.
Wie das alte Sprichwort sagt : „Sie können COBOL in einer beliebigen Sprache schreiben.“, Obwohl ich das vermuten , wenn jeder Datentyp gleich aussieht , dann wird es schwieriger , zu sehen , was die wesentlichen Aspekte des Programms sind, ein wichtiges Merkmal der Cobol- isierung.
quelle
Foo
oderBar
oder etwas ganz anderes ist, solange du.frobnicate()
es so oder so kannst . Ohne explizite Schnittstellen.Ich würde behaupten , dass Skriptsprachen haben schlampig Techniken fördern. (Beachten Sie, dass dies nicht bedeutet, dass die Sprachen schlecht sind, sondern dass es schwierig ist, große Codebasen in diesen Sprachen zu verwalten.) Ich denke jedoch, dass dies andere Gründe hat als die anderen Antworten hier.
Ich denke, um eine Sprache zu verwenden, muss ein Programmierer ein grundlegendes Verständnis der Programmierung als Ganzes haben. Sie werden nirgendwo effektiv sein, wenn sie Konzepte wie Vektoren, Bäume und Hash-Tabellen nicht verstehen. Sie müssen diese Dinge nicht unbedingt umsetzen können, aber sie müssen ihre Eigenschaften kennen.
Wo ich denke, dass die Schlamperei ins Spiel kommt, ist nicht das Programmieren, sondern das Erstellen wiederverwendbarer Komponenten. Für diese Sprachen müssen Sie keine guten Schnittstellen zwischen Codeeinheiten oder die Mechanismen definieren, mit denen Bibliotheken Einschränkungen für ihre Clients erzwingen. Es ist nicht unmöglich, gute wiederverwendbare Komponenten in solchen Sprachen herzustellen, es ist nur viel schwieriger.
Die Skriptsprachen sind für Anfänger von Interesse, da sie es ihnen ermöglichen, mehr "einmalige" Aufgaben in kürzerer Zeit zu erledigen. Wenn dieselben Programmierer jedoch mit der Wartungsprogrammierung beginnen, haben sie häufig schnell Probleme mit diesen Sprachen.
Ich sage nicht, dass Skriptsprachen schlecht sind - bei weitem nicht. Sie machen es jedoch schwierig, enorme Codebasen (mehrere Millionen Zeilen) zu verwalten (was einer der Gründe ist, warum Sie keine solchen Codebasen in Skriptsprachen finden). Wenn Sie relativ kleine oder einmalige Lösungen benötigen, können Sie viel mehr in weniger Zeit und weniger Code erreichen (und weniger Code ist fast immer besser).
Denken Sie nur daran, dass kein Werkzeug für jeden Job das Beste ist. Wählen Sie das für die Situation am besten geeignete Werkzeug. Das gilt für Programmiersprachen genauso wie für jedes Werkzeug.
quelle
Ich bin bei Ihrem Lehrer, aber auch bei @Singletoned, wenn er sagt, Ihr Lehrer geht davon aus, dass die Konsequenzen (z. B. keine Kenntnis der Leistung) schlecht sind.
Ich denke, mit C anzufangen ist besser als mit Skriptsprachen anzufangen. Als Lehrer würde ich mich auf die ganze Sache mit der von Neumann-Architektur konzentrieren (ALU, Register, Speicher, I / O-Ports, ...), direkt zu den Zeigern übergehen (es tut mir leid, es ist wirklich ein Schlüsselkonzept [nicht veröffentlichen] Referenzen (dh Zeiger) in VM-Sprachen sind eine Hauptquelle für Speicherverluste]), treffen Sie einige Datenstrukturen (Baum, verknüpfte Liste, Hash-Tabelle 1 ) und ... stoßen Sie eine Abstraktionsebene in etwas anderes (OO, funktionale Programmierung, etwas - starke statische Typisierung Regeln , yo \ m /, so dass keine "Skriptsprachen"> :().
1 Hmm, vielleicht stimme ich schließlich mit Ihrem Lehrer in Bezug auf die Leistung überein.
quelle
Ich denke, das Beste ist, mit einer modularen Sprache zu beginnen und dann zu komplizierteren Dingen überzugehen. In meinen Tagen begannen wir mit Pascal und COBOL und versuchten zu verstehen, was Subroutinen, Kontrollflussvariablen usw. bedeuten. Erst als ich mit Pascal vertraut war, hatte ich den Wunsch, auf Sprachen wie C / C ++ umzusteigen und all die anderen Techniken zu erlernen, die eher eine Erweiterung für den Junior-Programmierer darstellen.
quelle
Sie haben beide recht.
Skriptsprachen erschweren es auf jeden Fall unerfahrenen Entwicklern, zu verstehen, was wirklich vor sich geht. (So auch Datenbanken, Frameworks und Bibliotheken. Oh, und Browser, Server, Netzwerke und Dateisysteme.) Wenn ich jüngere Entwickler interviewe, bin ich oft verblüfft, wie wenig sie wissen, wie Computer tatsächlich funktionieren und wie anfällig sie für Fracht sind -Kultprogrammierung.
Andererseits ist die Nummer eins, nach der ich in Interviews suche, nicht das perfekte Verständnis, sondern dass sie es lieben, Dinge zu machen. Als ich anfing, war ein Computer, auf dem alles möglich war, ziemlich beeindruckend, und so schienen mir meine kleinen Dinge mit Apple Basic und 6502 Assembler wirklich großartig. Aber heutzutage machen Computer eine Menge erstaunlicher Dinge. Ich denke, es ist in Ordnung, wenn die Leute auf einem ziemlich hohen Niveau anfangen, wenn es das ist, was sie brauchen, um süchtig zu werden.
Grundsätzlich denke ich, dass es in Ordnung ist, am flachen Ende des Pools zu beginnen, solange man sich irgendwann in tieferes Wasser stürzt.
quelle
Erstens würde ich definitiv mit einer Sprache höheren Abstraktionsniveaus beginnen. Zur Zeit würde ich Python empfehlen. Der wichtigste Grund für die Auswahl einer Skriptsprache als erste Sprache ist, dass Sie auf einfache Weise etwas zusammenstellen können, das funktioniert. Wie Joe in seiner Frage erwähnt, ist das Wichtigste, wenn man Programmierer wird, dass man die Motivation hat, weiterzumachen und tiefer zu graben. Diese Motivation wird gewonnen, wenn Sie in der Lage sind, funktionierende und nützliche Software zu erstellen.
Neben den Punkten, bei denen es darum geht, die Abstraktion (hohe Ebene) und die zugrunde liegende Implementierung (niedrige Ebene) zu verstehen, fehlt ein dritter Punkt. Um heutzutage ein guter Programmierer zu sein, müssen Sie auf jeden Fall beide der beiden oben genannten Punkte beherrschen. Darüber hinaus ist es für Ihre Kompetenz entscheidend, dass Sie sich ständig mit neuen Technologien und Standpunkten auseinandersetzen. Unabhängig davon, von welcher Abstraktionsebene Sie ausgehen, müssen Sie sich ständig verbessern und Ihre aktuellen Methoden in Frage stellen.
Es sollte von Anfang an klargestellt werden, dass Programmiersprachen lediglich Werkzeuge sind, um die Arbeit zu erledigen. Es ist sehr wichtig, das richtige Werkzeug für eine bestimmte Aufgabe auszuwählen. Ich denke, dass für einen Anfänger-Programmierer eine Skriptsprache auf hohem Niveau hilfreich ist, um diesen Punkt hervorzuheben. Eine höhere Sprache bietet eine breitere Perspektive und motiviert den Programmierer, sich eingehender mit dem Thema auseinanderzusetzen.
quelle