Programmierung beherrschen - kein Problem

  • Tutorial

Worum geht es in diesem Artikel?


Ein Versuch zu erklären, warum es schwierig ist, moderne Technologien zu studieren, wie man sie am einfachsten beherrscht und zum Experten wird.

Bild


Für wen ist dieser Artikel?


Um den Leser nicht zu enttäuschen, müssen Sie sofort entscheiden, für wen dieser Artikel bestimmt ist. Erstens kann dieser Artikel für Programmierer nützlich sein, die die Erstellung von Software selbstständig beherrschen möchten. Vielleicht ist es für Programmierlehrer nützlich. Gleichzeitig beschreibt sie eine Sichtweise, die sich von der Sichtweise von Fachleuten unterscheiden kann, die ihren Weg gefunden haben und über ein eigenes fundiertes Verständnis der Dinge verfügen.

Dieser Artikel ist auch mehr Forschung als dringende Ratschläge. In Anbetracht dessen kann es erforderlich sein, dass der Leser versucht, Probleme aus der Sicht des Autors anzusprechen. In direktem Zusammenhang mit der Schulung erscheint dieser Artikel unter produktionstechnischen Gesichtspunkten möglicherweise nutzlos und langweilig.

Vorwort


Obwohl die Informationstechnologie heutzutage sehr weit fortgeschritten ist, ist es nach wie vor schwierig, sie zu einem qualifizierten Fachmann zu entwickeln. Der Autor, der Trainer und Ausbilder ist, hat mehrere Versuche unternommen, seinen Schülern den bequemsten Weg zu bieten, um das Programmieren und verwandte Themen zu meistern. Dieser Artikel ist ein Versuch, ein einfaches strukturiertes Bild dieses Problems zu erstellen.

Der Autor versuchte, den Artikel so einfach wie möglich zu schreiben, die Grundprinzipien seiner Vision aufzuzeigen und Fachleuten auf allen Ebenen eine nützliche Strategie zur Selbstentwicklung anzubieten.

Der Autor begann von Anfang an, die C # -Sprache zu verwenden. Bis zu diesem Zeitpunkt hat der Autor umfangreiche Erfahrungen in der Arbeit mit einer Vielzahl von IT-Technologien gesammelt - Ausstattung, interne Funktionen des Betriebssystems, Assembler-Sprache, C ++, COM, WinApi, Netzwerke, Multithreading usw. ... sowie ihre neuen Versionen. Für Anfänger erfordert das Lernen jedoch auch, dass sie viele neue Technologien aus verschiedenen unbekannten Bereichen erlernen, was das Lernen zu einem langen und schwierigen Prozess macht.

Größte Schwierigkeit


Die größte Schwierigkeit bei der Untersuchung von Dingen besteht in einer Vielzahl unterschiedlicher Technologien sowie in Branchen, in denen diese Technologien angewendet werden können. Auch diese Zahl nimmt ständig zu (siehe die sogenannte "technologische Singularität").

Die Orientierung in einem solch komplexen Umfeld wird sehr schwierig. Einfache Regeln, Erklärungen und Strategien wären sehr hilfreich.

Mann, Werkzeug, Problem


Um viele wichtige Prozesse und Elemente des Trainingssystems zu verstehen, kann die Verbindung Man-Tool-Problem verwendet werden.

Zur Vereinfachung der Problemanalyse akzeptieren wir die folgenden Annahmen:
  • Der Mensch ist die Hauptfigur. Eine Person verwendet das Tool, um ein Problem zu lösen. Eine Person muss über die erforderlichen Fähigkeiten verfügen, um das Tool verwenden zu können.
  • Das Problem ist die Hauptaufgabe des Menschen - es erfordert eine Lösung;
  • Ein Werkzeug ist ein Mittel, um ein Problem zu lösen. Jedes Tool wurde entwickelt, um nur bestimmte Probleme zu lösen. Das heißt, es gibt kein Tool, das alle Probleme lösen kann. Eine Programmiersprache ist auch ein Werkzeug zur Lösung der Probleme beim Erstellen von Software.
  • Bei der Lösung des Problems interagiert der Mensch nicht direkt, sondern über das Tool (Es versteht sich, dass die Tools die Interaktion des Menschen mit dem Problem einfacher machen als die direkte Interaktion zwischen Mensch und Problem. Wenn ein solches Tool nicht vorhanden ist, sollte es erstellt werden).


Komplexität von Problem und Werkzeug


Unterschiedliche Probleme haben unterschiedliche Problemlösungen. Ein Familienbudget im Auge zu behalten, ist eine viel einfachere Aufgabe als die Zustellung von Waren in der Stadt.

Um die Erklärung zu vereinfachen, können wir die Komplexität des Problems nur als die Komplexität seiner Lösung betrachten. Die Komplexität des Werkzeugs kann wiederum als die Komplexität seiner Verwendung durch den Menschen angesehen werden. Je einfacher das Tool ist, desto einfacher ist es für eine Person, es zu verwenden.

Verschiedene Tools können verwendet werden, um ein Problem zu lösen. Zur Vereinfachung der Verwendung können die Tools in Gruppen unterteilt werden:
  • Am nützlichsten ist die benutzerfreundliche Lösung komplexer Probleme.
  • Mittel - schwierig zu bedienen, komplexe Probleme zu lösen;
  • Nutzlos - Schwierig, einfache Probleme zu lösen.


Schwierigkeiten bei der Verwendung


Für eine Person ist die Benutzerfreundlichkeit des Werkzeugs am wichtigsten. Die Komplexität des Tools kann zu Verzögerungen, schlechten Ergebnissen und der Unfähigkeit führen, das Problem zu lösen. Es versteht sich von selbst, dass das Fehlen eines Werkzeugs der Grund für die völlige Unmöglichkeit sein kann, ein Problem zu lösen (Wir betrachten eine Lösung nicht ohne Werkzeug - dies ist bereits der Rang der einfachsten Probleme). Bei der Erstellung eines Werkzeugs ist daher das Hauptkriterium die Benutzerfreundlichkeit.

Die Komplexität von etwas für eine Person kann wie folgt klassifiziert werden:
  • Zu viele einfache Elemente. Diese einfachen Elemente sind sehr einfach und erfordern eine komplexe Zusammensetzung, um das Problem zu lösen. Low-Level-Sprachen wie Assembler oder MSIL sind Beispiele für Sprachen mit ähnlicher Komplexität. Diese Komplexität lässt sich am einfachsten in Hardware implementieren, da die Geräte eine große Anzahl relativ einfacher Aktionen ausführen können.
  • Eine kleine Anzahl von Elementen mit einer kleinen Anzahl von Eigenschaften. Dies ist die bequemste Stufe für den Menschen. Diesem Niveau können die Grundelemente der Hochsprachen zugeordnet werden;
  • Artikel mit zu vielen Eigenschaften. Werkzeuge mit dieser Komplexität sind für die Lösung eines schmalen Aufgabenspektrums konzipiert und müssen angepasst werden, wenn sich die Aufgabe geringfügig unterscheidet. Softwarepakete und Bibliotheken können dieser Komplexitätsstufe zugeordnet werden.


Low, High und Super-High Levels



Die Entwicklung der Programmiersprachen hat zu einer Erhöhung des Abstraktionsgrades der Programmiersprachen von der Hardwareplattform geführt:
  1. Low-Level-Sprachen - praktisch für die Implementierung von Geräten, aber schwierig für den Menschen aufgrund der großen Anzahl von Teams, die einfache Operationen ausführen;
  2. Hochsprachen - praktisch für das menschliche Verständnis, wodurch Sie Programme schneller entwickeln können. Es ist jedoch schwierig, diese Sprachen für die Ausführung von Hardware zu implementieren, was im Allgemeinen zu einem langsameren Code und einem höheren Ressourcenverbrauch führt.
  3. Very High-Level Programming Language (VHLL) - Programmiersprachen mit einem sehr hohen Abstraktionsgrad. Im Gegensatz zu höheren Programmiersprachen, in denen das Prinzip der Vorgehensweise beschrieben wird, wird in höheren Programmiersprachen nur das Prinzip der Vorgehensweise beschrieben.


Bei der normalen Entwicklung von Programmiersprachen entspricht ihr Level dem Abstraktionslevel von einem niedrigen Hardwarelevel. Mit zunehmender Abstraktion sollte die Komplexität der Nutzung nicht zunehmen. In Wirklichkeit kann das Verständnis jedoch kompliziert sein. Die Erhöhung der Abstraktionsebene ist fast immer mit der Schaffung großer Strukturen verbunden, die die Komplexität im Inneren verbergen und die Bedienung von außen vereinfachen.

Um jedoch negative Nebenwirkungen zu vermeiden, muss der Entwickler die interne Struktur der Strukturen kennen. Wenn Sie Sockets in einer Netzwerkanwendung verwenden, müssen Sie die entsprechenden Netzwerkprotokolle und Prinzipien des Netzwerkbetriebs kennen. Ohne ihr Verständnis ist es unwahrscheinlich, dass ein wirklich hochwertiges Produkt geschrieben wird. Das heißt, eine Erhöhung der Abstraktionsebene verbirgt lediglich die Komplexität im Inneren, beseitigt sie jedoch nicht.

Die Entwicklung der Programmiersprachen zeigt ihre ständige Verbesserung, aber über eine lange Entwicklungszeit hat sich ihr Verständnis nicht vereinfacht. An dieser Stelle ist auch zu erwähnen, dass sich die Bandbreite der von der IT gelösten Probleme erheblich erweitert hat und daher schwierig bleibt.

Diese Entwicklung ist kein einfacher Prozess. Einige Funktionen können jedoch zum Verständnis dieses Prozesses beitragen:
  • Die Weiterentwicklung der Hardware-Plattformen ermöglicht das Wachstum des gesamten IT-Sektors.
  • Die wachsenden Fähigkeiten des IT-Sektors ermöglichen den Einsatz dieser Technologien zur Lösung immer komplexer werdender Probleme.
  • Komplexe Probleme können nur mit Tools gelöst werden, die intern komplex, aber einfach zu bedienen sind. (Wenn das Werkzeug schwer zu bedienen ist - ist es nicht erforderlich);
  • Intern komplexe Tools sind schwieriger zu erstellen (als intern einfache).
  • Die Komplexität der Programmiersprachen spiegelt die Komplexität der Aufgaben wider.


Die Komplexität von Programmiersprachen


Die Komplexität moderner Programmiersprachen resultierte aus folgenden Hauptfaktoren:
  • Multithreading. Die Parallelität der Befehlsausführung nimmt ständig zu, was von einer zunehmenden Anzahl von Geräten unterstützt wird. Dies erfordert zusätzlichen Aufwand zum Synchronisieren von Threads und zum Verwenden von Ressourcen.
  • Komplexe Komponenten in Standardbibliotheken. Die Anzahl der in Standardbibliotheken eingebetteten Komponenten mit einer Vielzahl von Eigenschaften nimmt ständig zu. Kenntnisse darüber, wie diese Komponenten intern angeordnet sind, sind erforderlich, um negative Nebenwirkungen zu vermeiden.
  • Multi-Plattform-Unterstützung. Das Sortiment an Geräten und Plattformen, die das korrekte Verhalten des Programms auf möglichst vielen Geräten erfordern, wächst stetig. Dies gilt insbesondere für mobile Anwendungen.
  • Evolution. Eine bestimmte Programmiersprache wird durch die Entwicklung anderer Sprachen, die Entwicklung von Geräten und sogar durch den Handel beeinflusst (die neue Version ist ein neues Produkt, das auf dem Markt erhältlich ist).


Super Hochsprachen


Die beschriebenen Evolutionsprozesse von Programmiersprachen haben zur Entstehung großer Komponenten mit einer Vielzahl von Eigenschaften geführt. Die Entwicklung von High-Level-Sprachen basiert auf Low-Level-Sprachen (zum Beispiel wird die Kompilierung von einer High-Level-Sprache zu einer Low-Level-Sprache verwendet), indem kleine Komponenten (Befehle) in größere Strukturen integriert werden. Die beschriebenen Prozesse haben unter anderem eine Trägheit, die die Programmiersprache letztendlich von einer höheren Ebene - dem sogenannten Super-High - weiterbringt.

Wie bereits erwähnt, führt eine Erhöhung der Abstraktionsebene zum Auftreten großer Konstruktionen (Sprachelemente, Funktionen, Bibliotheken usw.), die die Komplexität der internen Implementierung verbergen. Um jedoch ein qualitativ hochwertiges Produkt zu erstellen, müssen die interne Implementierung, die Betriebszeit, der verbrauchte Speicher und andere Eigenschaften der verwendeten Strukturen bekannt sein. Dies führt zu einer Verschiebung der Komplexität, die für den Entwickler unangenehm ist (siehe folgende Abbildung).

Die Abbildung zeigt die zunehmende Komplexität bei einer Vielzahl einfacher Elemente oder Elementeigenschaften. Wie Sie sehen können, sind Aufgaben mit vielen einfachen Elementen, die einfachen Sprachen entsprechen, für die Computerausführung praktisch. Aufgaben mit Komponenten mit vielen Eigenschaften sind wiederum für einen einzelnen Entwickler schwierig, können jedoch von einer Gruppe von Entwicklern leichter gemeistert werden.

Bild


Strategie


Einstiegsniveau


Die einfachste Ebene zum Erlernen der Programmierung ist die Ebene, in der die Anzahl der Komponenten und die Eigenschaften dieser Komponenten für den Entwickler nachvollziehbar sind. Typischerweise spiegeln diese Komponenten einfache gängige Operationen wider - arithmetische Operationen, Verarbeiten von Textzeilen, Eingeben / Ausgeben einfacher Daten usw. Die meisten Bücher beginnen die Geschichte auf dieser Ebene.

In der Anfangsphase ist es am wichtigsten, die Frage zu verstehen: „Was kommt als Nächstes?“ Dies ist eine wichtige taktische Frage, mit der Sie Ihre Entwicklung vom aktuellen Punkt aus weiter verfolgen können. Die Frage "Was kommt als nächstes?" Kann in zwei wichtigen Fällen auftreten:
  • Der Entwickler ist mit dem Problem konfrontiert, das Thema oder die Methode falsch zu verstehen (das Problem, nicht weiterkommen zu können).
  • Der Entwickler sieht sich mit dem Problem konfrontiert, dass es eine große Anzahl von Themen gibt, die untersucht werden können (das Problem der Wahl).


Wenn der Entwickler an einem Thema feststeckt, muss er die Richtung (Vektor) des Lernens ändern - suchen Sie einen anderen Weg, um dieses Thema zu studieren, oder wählen Sie ein anderes Thema zum Studieren. Wenn der Entwickler mit dem Problem der Wahl konfrontiert ist, muss er nur eine Wahl treffen. Das heißt, Sie können nicht aufhören.

Nach dem Erlernen des Anfangslevels kann der Entwickler eine Auswahl für die weitere Entwicklung in zwei Hauptrichtungen treffen:
  • Low-Level-Programmierung;
  • High-Level-Programmierung.


Low-Level-Programmierung


Low-Level-Programmierung ist eine hardwarefreundliche Programmierung. Das Beherrschen der Systemprogrammierung erfordert das Erlernen von einfachen Sprachen und Plattformen. Die Komplexität des Lernens von einfachen Sprachen erfordert wiederum das Erlernen einer großen Anzahl kleiner einfacher Elemente und deren Organisation in einem Computersystem.

Low-Level-Programmierung ist eine spezielle Tendenz. Der Entwickler muss selbst entscheiden, dieser Richtung zu folgen. Dies ist auch eine Richtung, die derzeit nur selten von Entwicklern gewählt wird.

High Level-Programmierung


High-Level-Programmierung - Programmierung, mit deren Hilfe normalerweise Software erstellt wird, die große Prozesse des menschlichen Lebens automatisiert. Es zielt darauf ab, angewandte Probleme zu lösen, ohne sich Gedanken über die Optimierung des Betriebs der Ausrüstung zu machen.

Solche Systeme verwenden Hochsprachen. Die Komplexität der Studie umfasst hier das Studium größerer (im Vergleich zu Low-Level-Programmierung) Sprachkomponenten und einer bestimmten Menge ihrer Eigenschaften. So sollten Entwickler beispielsweise die interne Struktur und Eigenschaften von Containern (Array, Stack, Hash-Tabelle, ...) kennen, um sie ohne negative Nebenwirkungen (hoher Speicherverbrauch, Verlangsamung usw.) zu verwenden.

Die Entwicklung von Hochsprachen führt zu einer Zunahme der "Größe" von Komponentenkomponenten und entsprechend der Anzahl ihrer Eigenschaften (sowohl extern als auch intern). Die Komplexität für den Entwickler nimmt sowohl zu, wenn diese Komponenten und ihre Eigenschaften untersucht werden müssen, als auch wenn das konstante Erscheinungsbild neuer Komponenten und Versionen überwacht werden muss.

Organisation


Die oben beschriebenen Probleme sind nicht unlösbar. Wenn Sie jedoch nicht die richtigen Maßnahmen ergreifen, können Sie zum Stillstand kommen. Viele Aktionen sind bekannt und klar. Anhand der obigen Beschreibung können Sie die Wirksamkeit und die Notwendigkeit dieser Maßnahmen nachvollziehen:
  • Spezialisierung. Da es unmöglich ist, alle Möglichkeiten einer modernen Programmiersprache, der verfügbaren Komponenten und Bibliotheken zu beherrschen, können Sie bei der Spezialisierung nur einen oder mehrere Bereiche (z. B. Desktop-Anwendungen, Netzwerkanwendungen, Funktionsbibliotheken usw.) auswählen und nur damit arbeiten.
  • Zusammenarbeit Viele Probleme von einem Entwickler zu lösen, ist aufgrund der Spezialisierung unmöglich (wie beschrieben, ist es für einen Spezialisten unmöglich, ein breites Spektrum an Technologien zu besitzen). So entsteht die nächste notwendige Aktion - die Zusammenarbeit mit Entwicklern, die andere Technologien besitzen.


Empfehlungen


Zusammenfassend können wir folgende wichtige Fakten hervorheben:
  • Für die Eigenentwicklung und das berufliche Wachstum sind Kenntnisse über die Richtung der gewünschten Entwicklung erforderlich - für übergeordnete (abstraktere) Programmiersprachen oder Aufgaben in der Nähe der Plattform / Ausrüstung (z. B. Systemprogrammierung oder Echtzeit-Systemprogrammierung).
  • Wenn Sie während des Studiums eines bestimmten Themas nicht weiterkommen, können Sie nicht aufhören. Sie müssen entweder die Art und Weise ändern, in der Sie dieses Thema studieren, oder ein anderes Thema beginnen und das aktuelle Thema auf bessere Zeiten verschieben.
  • Im Falle einer Wahl können Sie auch nicht aufhören - Sie müssen nur eine Wahl treffen. Und auf keinen Fall sollte man befürchten, dass so viele von ihnen nicht alle meistern können;
  • Das Ziel sollte nicht sein, eine breite Palette von Themen zu studieren, d. H. Sie müssen sich spezialisieren, indem Sie eine bestimmte Anzahl von Themen auswählen.
  • Selbst beim Beherrschen der Programmierung ist die Zusammenarbeit sehr wichtig. Sie sollten mit anderen Entwicklern kommunizieren und an Foren teilnehmen.


Und was am wichtigsten ist: Ohne die Liebe zum Programmieren und den Wunsch, hart zu arbeiten, um das Programmieren zu erlernen und professionell zu werden, werden Sie keinen Erfolg haben.

Jetzt auch beliebt: