Hallo Habr! Ich präsentiere Ihnen die Übersetzung des Artikels "
Ratschläge für Programmierstudenten ".
Es gibt viele Dinge, die ich gerne wissen würde, als ich meine Reise als Software-Student begann. Seitdem sind fast 10 Jahre vergangen, und leider kann ich meine Erfahrung und mein Wissen nicht mit meinem früheren "Ich" teilen, sondern nur mit meinen jüngeren Kollegen. Dieser Beitrag enthält einige nützliche Tipps, die ich gerne hören würde, als ich 18 Jahre alt war.
Entscheide, was du brauchst
Natürlich müssen Sie nicht mit formaler Logik oder
Kategorien vertraut sein, wenn Sie nur lernen möchten, wie Sie etwas Praktisches erstellen (z. B. eine Benutzeroberfläche) und genau das tun. Es gibt zwei Hauptpfade, die sich in Aufwand, Dauer und Ergebnis unterscheiden.
- Sie können schnell einen Bereich beherrschen - etwa in ein oder zwei Jahren. Sie werden nicht nutzlos sein, Sie werden etwas tun und Ihren Lebensunterhalt verdienen. Es gibt (zumindest vorerst) genügend Beschäftigungsmöglichkeiten, die nicht viel Flexibilität erfordern.
- Sie können ein etablierter Spezialist werden, der viel Zeit und Mühe für grundlegende Dinge aufgewendet hat. Dann können Sie sich anpassen, Karrierewege wechseln wird relativ einfach. Sie können maschinelles Lernen, dann eine formale Überprüfung, dann eine einfache Programmierung für den Handel durchführen oder zum Spieleentwickler gehen. Es braucht Zeit und Engagement - ich würde diesen Prozess für mindestens 6-8 Jahre bewerten.
Ich befürworte nachdrücklich den zweiten Weg, weil er universeller und interessanter ist und auf lange Sicht mehr bringt. Die Technologie ändert sich ständig, daher sollten Sie schnell auf neue Technologien umsteigen.
Mathe
Lerne Mathe, weil Mathe nützlich ist. Ich kann das nicht betonen. Wenn Sie beginnen, denken Sie möglicherweise, dass Sie keine lineare Algebra benötigen, da Sie sich mit Anwendungen nicht auskennen. Für nicht triviales maschinelles Lernen benötigen Sie es jedoch. Sie benötigen Statistiken und Glaubwürdigkeit. Sie benötigen Logik, Kombinatorik, Mengenlehre, alle Arten von diskreter Mathematik, Graphentheorie, Berechenbarkeitstheorie, formale Grammatiken, Lambda-Kalkül, formale Semantik, Topologie, Typentheorien, Zahlentheorie, Gruppen, Ringe, Felder, Kategorien.
Es entstehen ständig neue Technologien. Viele von ihnen basieren auf vorhandenen mathematischen Modellen. Wenn Sie die Grundlagen der Mathematik gut kennen, erhalten Sie sehr schöne Vorteile:
- Die Wahl zwischen neuen Technologien wird viel einfacher.
- Sie werden verstehen, wo neue Methoden angewendet werden sollten und wo nicht.
- Sie werden verstehen, warum Lösungen so sind, wie sie sind. Sie können sie dann ändern, um sie besser an den Kontext anzupassen.
Ich hatte zum Beispiel den Eindruck, dass nur wenige Menschen verstehen, warum Sie nicht immer die Methode der kleinsten Quadrate verwenden müssen, um zu bewerten, wie gut Ihre lineare Regression mit den Daten übereinstimmt. Dies ist erforderlich, wenn Fehler normal mit dem entsprechenden Durchschnittswert verteilt werden. Ist dies nicht der Fall, wenden Sie blind eine unzureichende Lösung an, ohne zu denken, dass ein Teil des Modells angepasst werden muss.
Lerne Mathe, um Mathe zu lernen. Das Schreiben von Beweisen macht Sie streng in 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 Klarheit des Denkens, die sich aus der Erstellung von Beweisen ergibt, ist wertvoll. Es wird Ihnen auch helfen, kurzen, präzisen Code zu schreiben.
Lernen Sie das Beste, verwenden Sie die besten Werkzeuge
Wählen Sie Ihre Muttersprache. Es sollte gut gestaltet sein, das heißt:
- Kohärenz.
- Kleiner Kern.
- Der Mangel an unnötiger Komplexität (zum Beispiel, wenn Sie eine „komplexe“ Sprache lernen, gibt es Dinge, die Sie nur wissen müssen oder an die Sie sich ständig erinnern müssen, sie bringen nichts Nützliches zum Lernen).
- Geringe Wahrscheinlichkeit, "sich in den Fuß zu schießen".
- Hohes Niveau, weil Programmieren die Lösung von Problemen und Problemen ist und keine Beherrschung in irgendeiner Sprache. Alle kleinen Funktionen Ihrer Lieblingssprache zu kennen, bedeutet nicht, perfekt zu programmieren.
Ich empfehle 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, sich von der scheinbaren Unbeliebtheit dieser Sprachen täuschen zu lassen. In der Welt des Programmierens bedeutet Popularität nicht Qualität.
Beginnen Sie nicht mit Python, ich bitte Sie! Es ist schlecht gestaltet, inkonsistent und lehrt Sie nicht striktes Denken. Sie müssen sich nicht an die „gute, normalerweise funktionierende“ Mentalität gewöhnen. Python hat seine Verwendung, aber nicht als Muttersprache.
Wenn Sie sich an minderwertige Sprachen und Tools von geringer Qualität sowie an Software von geringer Qualität und Lösungen
von geringer Qualität gewöhnen , werden
Sie diese unweigerlich in Ihrer eigenen Arbeit wiederholen . Seien Sie kritisch, stellen Sie Fragen, kritisieren Sie alles, suchen Sie nach Inkonsistenzen und Mängeln.
Stellen Sie sich zum Beispiel vor, Sie lernen eine neue Go-Sprache. Google "Go Sprache ist scheiße" und lesen Sie, warum die Leute es kritisieren. Einige Kommentare sind geringfügig, andere sind jedoch wirklich sinnvoll. Sie werden wahrscheinlich neues Wissen gewinnen, wenn Sie kritische Bemerkungen lesen, bewerten und dann feststellen, ob sie wichtig sind oder nur leere Wörter sind.
Denken Sie selbst
Ich unterrichte seit 2009 Programmieren (C und Assembler) für Studenten der ITMO-Universität in St. Petersburg. Viele Menschen haben Programmierprobleme und es gelingt ihnen nie, dies zu lernen, weil sie keinen Code erstellen. Wenn sie den Job bekommen, versuchen sie, eine vorhandene Lösung zu simulieren, indem sie möglicherweise einige Fragmente aus dem Stapelüberlauf nehmen und sie nach ihren Wünschen anpassen. Ok, hast du eine Lösung, was wird noch benötigt?
Sie müssen lernen, Code von Grund auf neu zu schreiben. Die Arten von Fähigkeiten, die dazu benötigt werden, unterscheiden sich so sehr von den Fähigkeiten, die durch Eingriffe in vorhandenen Code erworben wurden!
Programmieren heißt, eine bewusste Entscheidung zu treffen. Sie befinden sich in Status A (Sie haben Zugriff auf eine Reihe von Sprachfunktionen / -bibliotheken und wissen, wie Sie diese kombinieren 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? Das ist echte Programmierung,
Problemlösung .
Wenn Sie anfangen, Programme von Grund auf neu zu schreiben, wird es etwas schwierig, aber es ist absolut notwendig zu lernen, wie man Dinge von Grund auf neu erstellt. Um die Fähigkeiten zur Problemlösung zu verbessern, ist es wichtig, Algorithmen und Datenstrukturen zu untersuchen. Nehmen Sie ein gutes Buch und lösen Sie Olympiadenprobleme online. Ich empfehle Dasguptas Algorithmen für den Anfang, dann das klassische Cormen-Buch. All dies wird Ihnen eine ganz neue Welt eröffnen, das verspreche ich.
Ein zusätzlicher Teil des Softwareerstellungsprozesses ist die Entwicklung der Softwarearchitektur. Es ist unmöglich zu lernen, wie Sie Ihre Programme richtig strukturieren, ohne sie von 0 bis 100 zu erstellen.
Erweitern Sie Ihren Horizont
Programmieren Sie jeden Tag und führen Sie ständig Projekte von Drittanbietern durch. Dies ist eine sehr einfache (und meist genaue) Möglichkeit für mich als Lehrer zu verstehen, dass mein Schüler sehr wahrscheinlich Erfolg haben wird. Eine Frage: Was programmierst du in deiner Freizeit?
Ihre Lehrer haben einfach nicht genug Zeit, um über alles zu sprechen. Am Ende, nachdem Sie die Universität verlassen haben, müssen Sie selbstständig weiter studieren, bis Sie in den Ruhestand gehen. Wenn Sie eine Leidenschaft für das haben, was Sie tun, werden Sie zum Spaß verschiedene Arten von Software lernen, und dies gibt Ihnen viel mehr Erfahrung und Fähigkeiten 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, Rakecasting, erstellen Sie eine Art neuronale Netze, schreiben Sie eine einfache mobile Anwendung, schreiben Sie ein Programm für integrierte ..., du kannst dich selbst fortsetzen. Stellen 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 für einen Job bewerben, haben Probleme, triviale Dinge wie FizzBuzz zu schreiben. Wenn Sie bereits Projekte auf GitHub gehostet haben, ist der Arbeitgeber sicherer, dass Sie für ihn geeignet sind.
Testen Sie sich mit verschiedenen Tools und Sprachen. Wenn Ihnen jemand sagt, dass alle Sprachen ähnlich sind, ist dies entweder eine Vereinfachung oder ein Mangel an Erfahrung. Lassen Sie mich ein wenig erklären.
Ein Rechenmodell ist eine Menge, die aus grundlegenden Operationen und Möglichkeiten besteht, sie in der Reihenfolge zusammenzukleben, die zum Erstellen komplexer Algorithmen erforderlich ist. Einige Sprachen haben sehr ähnliche Rechenmodelle, andere variieren stark.
Die Programmierung ist viel mehr als das bekannte C / Python / Java / C ++ / C # / Go / Javascript, das auf denselben Prinzipien basiert: Imperativ, strukturell, ein bisschen mit OOP und syntaktischem Zucker, um andere Programmierstile zu simulieren. Die Welt der Programmierung ist riesig. Wie wäre es:
- Industrielle funktionale Programmiersprachen mit komplexen und durchdachten typischen Systemen (Haskell, Ocaml).
- Funktionssprachen mit abhängigen Typen, die nicht nur das Programmieren, sondern auch das Aufzeichnen von Beweisen ermöglichen (Coq, Agda, LEAN).
- Verkettete Sprachen (Forth).
- Logische Programmierung (Prolog, Refal).
- Finite-State-Maschinen (reguläre Ausdrücke, Promela).
- Stark erweiterbare Sprachen, mit denen Sie fast alle Syntaxkonstrukte wie Lisp, Forth, Camlp4 / 5, Rebol implementieren können.
- Domänenspezifische Sprachen (JetBrains MPS, XText).
Jedes neue Rechenmodell ist schwer zu verstehen, weil es eine neue Denkweise ist. Aber der Aufwand und die Zeit sind es wert.
Sei kontaktfreudig
Ich hatte großes Glück, einige erstaunliche Leute kennenzulernen. Meine Assistenten haben mir geholfen, meine Fähigkeiten zu verbessern, etwas Neues zu lernen und die Welt aus einer anderen Perspektive zu sehen. Sich selbst zu isolieren wird Ihnen auf lange Sicht nichts nützen: Sie brauchen andere Leute, die diskutieren müssen, 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 gegeben hat.
Halten Sie sich an leidenschaftliche, kluge Leute und versuchen Sie, von ihnen zu lernen. Sie werden überrascht sein, wie viel Sie während des Mittagessens mit Ihren Kameraden lernen können, die die Details ihrer Arbeit oder Forschung teilen möchten. Diese Vielfalt an Ideen ist einer der Hauptgründe, warum Unternehmen wie Google Ihnen kostenloses Essen anbieten.
Fragen Sie Leute, die besser in der Codeüberprüfung sind und ihren Code lesen. Wenn Sie die Arbeit eines anderen lernen, können Sie viel lernen. Mithilfe von Codeüberprüfungen lernen Sie, wie Sie Code noch besser schreiben. Dies ist vielleicht eine der effektivsten Möglichkeiten, um sehr, sehr schnell ein besserer Programmierer zu werden.
Schreiben Sie Tests
Es ist so wichtig, dass Sie hierfür einen separaten Artikel benötigen. Das Testen ist ein wesentlicher Bestandteil der Erstellung von Software, und selbst Leute wie ich, die an formal getesteter Software arbeiten (was bedeutet, dass sie mathematisch streng formalisierbar sein muss), schreiben Tests, obwohl Sie vielleicht denken, dass die durch die Beweise gegebenen Garantien viel sind stärker.
Ich hoffe, dies kann jemandem helfen, sich ein besseres Bild zu machen, schneller zu lernen und ein besserer Programmierer zu werden. Bei Fragen stehe ich Ihnen gerne zur Verfügung. Viel Glück