Tipps für Programmierer

Hi, Habr! Ich präsentiere Ihnen die Übersetzung des Artikels " Ratschläge für Programmierende ".

Es gibt viele Dinge, die ich gerne wissen würde, als ich meine Reise als Studentenprogrammierer begann. Seitdem sind fast zehn Jahre vergangen, und ich kann meine Erfahrung und mein Wissen leider nicht mit meinem früheren Ich teilen, sondern nur mit meinen jüngeren Kollegen. Dieser Beitrag enthält einige nützliche Tipps, die ich mit 18 Jahren gerne hören würde.

Entscheide, was du brauchst


Natürlich müssen Sie nicht mit der formalen Logik oder den Kategorien vertraut sein, wenn Sie nur lernen möchten, wie Sie etwas Praktisches (z. B. eine Schnittstelle) erstellen und genau das tun. Es gibt zwei Hauptpfade, die sich in Aufwand, Dauer und Ergebnis unterscheiden.

  • Sie können schnell einen Bereich meistern - in einem oder zwei Jahren. Sie werden nicht nutzlos sein, Sie werden etwas tun und Ihren Lebensunterhalt verdienen. Es gibt genügend Beschäftigungsmöglichkeiten (zumindest für den Moment), die nicht viel Flexibilität erfordern.
  • Sie können ein bekannter Spezialist werden, der sich viel mit grundlegenden Dingen beschäftigt hat. Dann können Sie sich anpassen, der Karrierewechsel ist relativ einfach. Sie können sich an maschinellem Lernen beteiligen, dann eine formale Verifizierung durchführen, dann ein wenig Programmiersprache für den Handel oder zum Game-Entwickler wechseln. Es braucht Zeit und Hingabe - ich würde diesen Prozess mindestens 6-8 Jahre einschätzen.

Ich befürworte ausdrücklich einen zweiten Weg, weil er vielseitiger, interessanter ist und auf lange Sicht mehr bringt. Die Technologie ändert sich ständig, daher sollten Sie schnell zu neuen Technologien wechseln.

Mathematik


Mathematik lernen, weil Mathematik nützlich ist. Ich kann das nicht betonen. Wenn Sie anfangen, denken Sie vielleicht, dass Sie keine lineare Algebra benötigen, weil Sie nicht über Anwendungen Bescheid wissen. Für nicht-triviales maschinelles Lernen benötigen Sie es jedoch. Sie brauchen Statistiken und Wahrscheinlichkeit. Sie benötigen Logik, Kombinatorik, Mengenlehre, alle Arten von diskreter Mathematik, Graphentheorie, Berechenbarkeitstheorie, formale Grammatiken, Lambda-Kalkül, formale Semantik, Topologie, Typentheorie, Zahlentheorie, Gruppen, Ringe, Felder, Kategorien.

Neue Technologien entwickeln sich ständig. Viele von ihnen basieren auf vorhandenen mathematischen Modellen. Wenn Sie die Grundlagen der Mathematik gut kennen, erhalten Sie sehr gute Vorteile:

  • Die Wahl zwischen der neuen Technik wird dadurch wesentlich erleichtert
  • Sie werden verstehen, wo neue Methoden angewendet werden sollen und wo nicht.
  • Sie werden verstehen, warum Lösungen so sind, wie sie sind. Dann können Sie sie ändern, um den Kontext besser anzupassen.

Ich hatte zum Beispiel den Eindruck, dass nur wenige Menschen verstehen, warum Sie nicht immer die Methode der kleinsten Quadrate verwenden sollten, um zu beurteilen, wie gut Ihre lineare Regression zu den Daten passt. Dies ist erforderlich, wenn Fehler normalerweise mit einem entsprechenden Durchschnittswert verteilt werden. Ist dies nicht der Fall, wenden Sie blind eine unzulängliche Lösung an, ohne auch nur daran zu denken, dass ein Teil des Modells angepasst werden muss.

Mathematik lernen, um mathematisches Denken zu lernen. Das Schreiben von Beweisen macht Sie streng mit Ihren Handlungen. Sie werden immer über alle möglichen Ausführungspfade nachdenken, die Ihr Programm ausführen kann, um keine Fehler und Sicherheitsprobleme zu verursachen. Die durch das Erstellen von Beweisen gewonnene Klarheit des Denkens ist wertvoll. Es hilft Ihnen auch, kurzen, komprimierten Code zu schreiben.

Lernen Sie am besten, verwenden Sie die besten Werkzeuge.


Wählen Sie Ihre erste Sprache. Es sollte gut gestaltet sein, das heißt:

  • Konsistenz
  • Kleiner Kern.
  • Das Fehlen einer unnötigen Komplexität (zum Beispiel, wenn Sie eine "komplexe" Sprache lernen, gibt es Dinge, die Sie nur wissen sollten oder sich ständig merken sollten, sie bringen nichts Nützliches zum Lernen mit).
  • Kleine Chance, sich "in den Fuß zu schießen".
  • High-Level, weil das Programmieren die Lösung von Problemen und Problemen ist und nicht das Beherrschen einer Sprache. Die kleinen Funktionen Ihrer Lieblingssprache zu kennen, bedeutet nicht, perfekt in der Programmierung zu sein.

Ich empfehle Ihnen, eine der folgenden Sprachen zu wählen:

  • Schema (es gibt einen ausgezeichneten klassischen Einführungskurs "Struktur und Interpretation von Computerprogrammen").
  • Smalltalk
  • Eiffel
  • ML

Haben Sie keine Angst davor, von der scheinbaren Unbeliebtheit dieser Sprachen getäuscht zu werden: In der Programmierwelt bedeutet Beliebtheit nicht Qualität.

Beginnen Sie nicht mit Python, ich flehe Sie an! Es ist schlecht gestaltet, inkonsistent und lehrt Sie nicht, streng zu denken. Keine Notwendigkeit, sich an die "gut, normalerweise arbeitende" Mentalität zu gewöhnen. Python hat seine Verwendung, aber nicht als Muttersprache.

Wenn Sie sich an minderwertige Sprachen und minderwertige Tools, minderwertige Software und minderwertige Lösungen gewöhnen , werden Sie diese zwangsläufig in Ihrer eigenen Arbeit wiederholen . Seien Sie kritisch, stellen Sie Fragen, kritisieren Sie alles, suchen Sie nach Inkonsistenzen und Mängel.

Stellen Sie sich zum Beispiel vor, Sie lernen eine neue Sprache, Go. Googeln „Go Language Sucks“ und lesen Sie, warum die Leute es kritisieren. Einige Kommentare werden geringfügig sein, aber andere machen wirklich Sinn. Sie erhalten wahrscheinlich neues Wissen, indem Sie kritische Kommentare lesen, bewerten und dann feststellen, ob sie wichtig sind oder nur leere Wörter sind.

Denke selbst nach


Ich unterrichte seit 2009 an Studenten der ITMO University in St. Petersburg Programmierung (C und Assembler). Viele Leute haben Probleme mit der Programmierung und können es nicht lernen, weil sie keinen Code erstellen. Wenn sie einen Job bekommen, versuchen sie, eine bestehende Lösung zu imitieren, vielleicht nehmen sie einige Fragmente aus Stack Overflow und passen sie nach Belieben an. Nun, haben Sie eine Lösung, was brauchen Sie noch?

Sie müssen lernen, wie man Code von Grund auf schreibt. Die dafür benötigten Fertigkeiten unterscheiden sich so sehr von den Fertigkeiten, die durch Eingriffe in den vorhandenen Code erlangt werden!

Programmieren bedeutet, eine bewusste Entscheidung zu treffen. Sie befinden sich im Status A (Sie haben Zugriff auf eine Reihe von Sprachfunktionen / -bibliotheken und wissen, wie sie kombiniert werden können). Sie möchten den Status B erhalten (Sprachkonstrukte werden kombiniert, um das Problem zu lösen). Wie baut man eine Route von A nach B? Jetzt ist das echte Programmierung, Problemlösung .

Wenn Sie Programme von Grund auf neu schreiben, wird es ein bisschen hart, aber es ist absolut notwendig zu lernen, wie man Dinge von Grund auf neu erstellt. Um die Problemlösungsfähigkeiten zu verbessern, ist es wichtig, die Algorithmen und Datenstrukturen zu erlernen. Nehmen Sie ein gutes Buch und lösen Sie Olympiadenprobleme online. Ich empfehle Dasguptas Algorithmen als Erstes, dann das klassische Buch von Cormen. Das alles wird Ihnen eine völlig neue Welt eröffnen, das verspreche ich.

Ein zusätzlicher Teil des Softwareerstellungsprozesses ist die Entwicklung einer Softwarearchitektur. Es ist unmöglich zu lernen, wie Sie Ihre Programme richtig strukturieren, ohne sie von 0 bis 100 erstellen zu müssen.

Erweitern Sie Ihren Horizont


Programmieren Sie jeden Tag, führen Sie ständig Projekte von Drittanbietern durch. Dies ist eine sehr einfache (und meist genaue) Möglichkeit für mich als Lehrer, um zu verstehen, dass mein Schüler wahrscheinlich Erfolg haben wird. Eine Frage: Was programmieren Sie in Ihrer Freizeit?

Ihre Lehrer haben einfach nicht genug Zeit, um alles zu erzählen. Nachdem Sie die Universität verlassen haben, müssen Sie schließlich selbstständig weiter lernen, bis Sie in Rente gehen. Wenn Sie sich leidenschaftlich mit dem beschäftigen, was Sie tun, werden Sie verschiedene Arten von Software zum Spaß lernen, und dies wird Ihnen viel mehr Erfahrung und Fähigkeiten vermitteln als Ihre weniger motivierten Kollegen.

Idealerweise sollten Sie alles ausprobieren: Schreiben Sie Ihren eigenen Compiler, vielleicht ein Spielzeug-Betriebssystem, einen http-Server, eine Datenbank-Engine, Spiele, Reykasting, erstellen Sie einige neuronale Netzwerke, schreiben Sie eine einfache mobile Anwendung, schreiben Sie ein Programm für Embedded ... Sie können fortfahren. Setzen Sie alle Ihre Projekte auf GitHub und seien Sie stolz darauf: Ihr zukünftiger Arbeitgeber kann sich das ansehen. Verwenden Sie dieses Portfolio für Ihre eigenen Zwecke.

Es ist bekannt, dass die Rekrutierung eines guten Programmierers äußerst schwierig ist. Viele Programmierer, die sich um Arbeit bewerben, haben Probleme beim Schreiben von Kleinigkeiten wie FizzBuzz. Wenn Sie bereits bestehende Projekte auf GitHub gehostet haben, ist der Arbeitgeber sicherer, dass Sie für ihn geeignet sind.

Fordern Sie sich mit verschiedenen Tools und Sprachen heraus.Wenn Ihnen jemand sagt, dass alle Sprachen ähnlich sind, ist dies entweder eine Vereinfachung oder ein Mangel an Erfahrung. Lass mich etwas erklären.

Ein Berechnungsmodell ist ein Satz, der aus grundlegenden Operationen und Möglichkeiten besteht, sie in der Reihenfolge zusammenzufügen, die zum Erstellen komplexer Algorithmen erforderlich ist. Einige Sprachen haben sehr ähnliche Berechnungsmodelle und manche unterscheiden sich stark.

Die Programmierung ist weit mehr als das bekannte C / Python / Java / C ++ / C # / Go / Javascript, das auf den gleichen Prinzipien aufbaut: Imperativ, strukturell, ein wenig mit OOP und syntaktischem Zucker, um andere Programmierstile zu simulieren. Die Programmierwelt ist RIESIG. Wie wäre es:

  • Industrielle funktionale Programmiersprachen mit komplexen und durchdachten typischen Systemen (Haskell, Ocaml).
  • Funktionale Sprachen mit abhängigen Typen, die nicht nur die Programmierung, sondern auch das Schreiben von Nachweisen ermöglichen (Coq, Agda, LEAN).
  • Verkettete Sprachen (Forth).
  • Logische Programmierung (Prolog, Refal).
  • Zustandsmaschinen (reguläre Ausdrücke, Promela).
  • Hochgradig erweiterbare Sprachen, die die Implementierung nahezu aller syntaktischen Konstruktionen ermöglichen, wie z. B. Lisp, Forth, Camlp4 / 5, Rebol.
  • Domänenspezifische Sprachen (JetBrains MPS, XText).

Jedes neue Berechnungsmodell ist schwer zu verstehen, weil es eine neue Denkweise ist. Aber die Zeit und Mühe sind es wert.

Seien Sie gesellig


Ich hatte großes Glück, einige tolle Leute kennenzulernen. Meine Assistenten halfen mir, meine Fähigkeiten zu verbessern, etwas Neues zu lernen und die Welt aus einem anderen Blickwinkel zu sehen. Sich selbst zu isolieren, wird auf lange Sicht nicht von Nutzen sein: Sie müssen andere Personen diskutieren, um zu verstehen, was sie tun, was sie denken.
Wenn Ihr Freund einen interessanten Artikel gelesen und Ihnen davon erzählt hat, haben Sie einfach viel Zeit gespart, weil er Ihnen verarbeitetes, kristallisiertes Wissen vermittelt hat.

Bleiben Sie bei leidenschaftlichen, intelligenten Menschen und versuchen Sie, von ihnen zu lernen.Sie werden überrascht sein, wie viel Sie beim Mittagessen mit Ihren Freunden erfahren können, die Details über ihre Arbeit oder Forschung mitteilen möchten. Diese Ideenvielfalt ist einer der Hauptgründe, warum Unternehmen wie Google Ihnen kostenlose Lebensmittel anbieten.

Fragen Sie Menschen, die die Codeüberprüfung besser verstehen, und lesen Sie ihren Code. Wenn Sie die Arbeit von jemandem studieren, können Sie viel lernen. Code-Reviews helfen Ihnen, das Schreiben von Code noch besser zu lernen. Dies ist wahrscheinlich einer der effektivsten Wege, ein sehr schneller Programmierer zu werden.

Schreiben Sie Tests


Es ist so wichtig, dass Sie einen separaten Artikel benötigen. Testen ist ein wesentlicher Bestandteil bei der Erstellung von Software, und selbst Leute wie ich, die mit formal bewährter Software arbeiten (was mathematisch streng formalisiert sein sollte), schreiben Tests, obwohl Sie denken, dass die durch die Beweise gegebenen Garantien viel sind stärker

Ich hoffe, dass dies jemandem helfen kann, ein vollständigeres Bild zu erhalten, schneller zu lernen und ein besserer Programmierer zu werden. Bei Fragen stehe ich Ihnen gerne zur Verfügung. Viel Glück!

Jetzt auch beliebt: