Conseils pour les étudiants programmeurs

Bonjour, Habr! Je vous présente la traduction de l'article " Conseils aux étudiants en programmation ".

Il y a beaucoup de choses que j'aimerais savoir quand j'ai commencé mon voyage en tant qu'étudiant en logiciel. Depuis, près de 10 ans se sont écoulés et, malheureusement, je ne peux pas partager mon expérience et mes connaissances avec mon passé "je", seulement avec mes jeunes collègues. Ce message contient quelques conseils utiles que j'aimerais entendre quand j'avais 18 ans.

Décidez de ce dont vous avez besoin


Bien sûr, vous n'avez pas besoin de vous familiariser avec la logique formelle ou les catégories si vous voulez simplement apprendre à créer quelque chose de pratique (disons, une interface) et faire exactement cela. Il existe deux voies principales qui diffèrent par l'effort, la durée et les résultats.

  • Vous pouvez rapidement maîtriser un domaine - disons en un ou deux ans. Vous ne serez pas inutile, vous ferez quelque chose et gagnerez votre vie. Il y a suffisamment de possibilités d'emploi (du moins pour l'instant) qui ne nécessitent pas beaucoup de flexibilité.
  • Vous pouvez devenir un spécialiste bien établi qui a consacré beaucoup de temps et d'efforts à des choses fondamentales. Ensuite, vous pouvez vous adapter, changer de carrière devient relativement facile. Vous pouvez faire un apprentissage automatique, puis une vérification formelle, puis une programmation de bas niveau pour le trading, ou aller au développement du jeu. Cela prend du temps et du dévouement - j'évaluerais ce processus depuis au moins 6-8 ans.

Je préconise fortement la deuxième voie, car elle est plus universelle, intéressante et apporte plus à long terme. La technologie est en constante évolution, vous voudrez donc passer rapidement aux nouvelles technologies.

Math


Apprenez les mathématiques parce que les mathématiques sont utiles. Je ne peux pas insister là-dessus. Lorsque vous commencez, vous pourriez penser que vous n'avez pas besoin d'algèbre linéaire car vous ne connaissez pas les applications. Cependant, pour tout apprentissage automatique non trivial, vous en aurez besoin. Vous avez besoin de statistiques et de crédibilité. Vous aurez besoin de logique, combinatoire, théorie des ensembles, toutes sortes de mathématiques discrètes, théorie des graphes, théorie de la calculabilité, grammaires formelles, calcul lambda, sémantique formelle, topologie, théories des types, théorie des nombres, groupes, anneaux, champs, catégories.

De nouvelles technologies émergent constamment. Beaucoup d'entre eux sont basés sur des modèles mathématiques existants. Si vous connaissez bien les mathématiques de base, vous obtenez de très bons avantages:

  • Le choix parmi les nouvelles technologies sera rendu beaucoup plus facile.
  • Vous comprendrez où de nouvelles méthodes doivent être appliquées et où elles ne le sont pas.
  • Vous comprendrez pourquoi les solutions sont ce qu'elles sont. Vous pouvez ensuite les modifier pour mieux les adapter au contexte.

Par exemple, j'ai eu l'impression que peu de gens comprennent pourquoi il n'est pas toujours nécessaire d'utiliser la méthode des moindres carrés pour évaluer dans quelle mesure votre régression linéaire correspond aux données. Cela est nécessaire lorsque les erreurs sont distribuées normalement avec la valeur moyenne correspondante. Si ce n'est pas le cas, vous appliquerez aveuglément une solution inadéquate sans même penser qu'une partie du modèle doit être réglée.

Apprenez les mathématiques pour apprendre la pensée mathématique. L'écriture de preuves vous rend strict dans vos actions. Vous penserez toujours à tous les chemins d'exécution possibles que votre programme peut exécuter afin de ne pas introduire d'erreurs et de problèmes de sécurité. La clarté de la pensée acquise à partir de la construction de preuves est précieuse. Il vous aidera également à écrire du code court et concis.

Apprenez le meilleur, utilisez les meilleurs outils


Choisissez votre première langue. Il doit être bien conçu, c'est-à-dire avoir:

  • Cohérence.
  • Petit noyau.
  • Le manque de complexité inutile (par exemple, lors de l'apprentissage d'une langue «complexe», il y a des choses que vous avez juste besoin de savoir ou de vous rappeler constamment, elles n'apportent rien d'utile pour l'apprentissage).
  • Faible probabilité de "vous tirer une balle dans le pied".
  • Haut niveau, car la programmation est la solution des problèmes et des problèmes , et non la maîtrise dans n'importe quelle langue. Connaître toutes les petites fonctionnalités de votre langue préférée ne signifie pas être parfait en programmation.

Je recommande de choisir l'une des langues suivantes:

  • Schéma (il existe un excellent cours d'introduction classique "Structure et interprétation des programmes informatiques").
  • Smalltalk
  • Eiffel
  • ML

N'ayez pas peur d'être trompé par l'impopularité apparente de ces langages, dans le monde de la programmation, la popularité ne signifie pas la qualité.

Ne commencez pas avec Python, je vous en prie! Il est mal conçu, incohérent et ne vous enseigne pas une pensée stricte. Pas besoin de s'habituer à la mentalité de «bon, habituellement de travail». Python a ses utilisations, mais pas comme première langue.

Si vous vous habituez à des langues et des outils de mauvaise qualité, à des logiciels et à des solutions de mauvaise qualité, vous les répéterez inévitablement dans votre propre travail . Soyez critique, posez des questions, critiquez tout, recherchez les incohérences et les lacunes.

Par exemple, imaginez que vous apprenez une nouvelle langue Go. Google "Go language sucks" et lisez pourquoi les gens le critiquent. Certains commentaires seront mineurs, mais d'autres auront vraiment du sens. Vous allez probablement acquérir de nouvelles connaissances en lisant des remarques critiques, en les évaluant, puis en déterminant si elles sont importantes ou si ce ne sont que des mots vides.

Pensez par vous-même


J'enseigne la programmation (C et assembleur) depuis 2009 aux étudiants de l'Université ITMO de Saint-Pétersbourg. Beaucoup de gens ont des problèmes de programmation et ne réussissent jamais à l'apprendre car ils ne créent pas de code. Lorsqu'ils obtiennent le poste, ils essaient de simuler une solution existante, peut-être en prenant quelques fragments de Stack Overflow, en les personnalisant à leur guise. Ok, j'ai une solution, que faut-il d'autre?

Vous devez apprendre à écrire du code à partir de zéro. Les types de compétences nécessaires pour ce faire sont tellement différents des compétences acquises en interférant avec le code existant!

Programmer, c'est faire un choix conscient. Vous êtes dans l'état A (vous avez accès à un certain nombre de fonctions / bibliothèques de langage et vous savez comment les combiner); vous voulez obtenir l'état B (les constructions de langage sont combinées pour résoudre le problème). Comment construire un itinéraire de A à B? Maintenant, c'est de la vraie programmation, de la résolution de problèmes .

Lorsque vous commencez à écrire des programmes à partir de zéro, cela devient un peu difficile, mais il est absolument nécessaire d'apprendre à construire des choses à partir de zéro. Pour améliorer les compétences en résolution de problèmes, il est important d'étudier les algorithmes et les structures de données. Prenez un bon livre et résolvez les problèmes des olympiades en ligne. Je recommande les algorithmes de Dasgupta pour les débutants, puis le livre classique de Cormen. Tout cela vous ouvrira un tout nouveau monde, je vous le promets.

Une partie supplémentaire du processus de création de logiciels est le développement d'une architecture logicielle; il est impossible d'apprendre à structurer correctement vos programmes sans les créer de 0 à 100.

Élargissez vos horizons


Programmez tous les jours, faites des projets tiers tout le temps. C'est un moyen très simple (et surtout précis) pour moi en tant qu'enseignant de comprendre que mon élève est très susceptible de réussir. Une question: que programmez-vous pendant votre temps libre?

Vos professeurs n'ont tout simplement pas assez de temps pour parler de tout. En fin de compte, après avoir quitté l'université, vous devez continuer à étudier par vous-même jusqu'à votre retraite. Si vous êtes passionné par ce que vous faites, vous apprendrez différents types de logiciels pour le plaisir, et cela vous donnera beaucoup plus d'expérience et de compétences que vos pairs moins motivés.

Idéalement, vous devriez tout essayer: écrire votre propre compilateur, peut-être un système d'exploitation jouet, un serveur http, un moteur de base de données, des jeux, une refonte, créer une sorte de réseaux de neurones, écrire une application mobile simple, écrire un programme pour intégré ..., vous pouvez continuer vous-même. Mettez tous vos projets sur GitHub et soyez fier d'eux: votre futur employeur peut y jeter un œil. Utilisez ce portfolio à vos propres fins.

Il est bien connu que le recrutement d'un bon programmeur est extrêmement difficile. De nombreux programmeurs postulant pour un emploi ont du mal à écrire des choses triviales comme FizzBuzz. Si vous avez des projets existants hébergés sur GitHub, l'employeur sera plus confiant que vous lui convenez.

Testez-vous avec différents outils et langues. Si quelqu'un vous dit que toutes les langues sont similaires, c'est soit une simplification, soit un manque d'expérience. Je m'explique un peu.

Un modèle de calcul est un ensemble composé d'opérations de base et de moyens de les coller ensemble dans l'ordre nécessaire pour créer des algorithmes complexes. Certaines langues ont des modèles de calcul très similaires, et certaines varient considérablement.

La programmation est bien plus que le C / Python / Java / C ++ / C # / Go / Javascript bien connu, construit sur les mêmes principes: impératif, structurel, un peu avec OOP et sucre syntaxique pour simuler d'autres styles de programmation. Le monde de la programmation est ÉNORME. Que diriez-vous:

  • Langages de programmation fonctionnelle industrielle avec des systèmes typiques complexes et bien pensés (Haskell, Ocaml).
  • Langages fonctionnels avec des types dépendants qui permettent non seulement la programmation, mais aussi l'enregistrement des preuves (Coq, Agda, LEAN).
  • Langues concaténatives (Forth).
  • Programmation logique (Prolog, Refal).
  • Machines à états finis (expressions régulières, Promela).
  • Langages fortement extensibles qui vous permettent d'implémenter presque toutes les constructions de syntaxe, telles que Lisp, Forth, Camlp4 / 5, Rebol.
  • Langages spécifiques au domaine (JetBrains MPS, XText).

Chaque nouveau modèle de calcul est difficile à comprendre, car il s'agit d'une nouvelle façon de penser. Mais l'effort et le temps en valent la peine.

Soyez sociable


J'ai eu beaucoup de chance de rencontrer des gens incroyables. Mes assistants m'ont aidé à améliorer mes compétences, à apprendre quelque chose de nouveau, à voir le monde sous un angle différent. S'isoler ne vous fera pas de bien à long terme: vous avez besoin que d'autres personnes discutent pour comprendre ce qu'elles font, ce qu'elles pensent.
Si votre ami a lu un article intéressant et vous en a parlé, vous avez simplement économisé beaucoup de temps car il vous a donné des connaissances traitées et cristallisées.

Restez fidèle à des gens passionnés et intelligents et essayez d'apprendre d'eux. Vous serez surpris de tout ce que vous pourrez apprendre pendant le déjeuner avec vos camarades qui souhaitent partager les détails de leur travail ou de leurs recherches. Cette variété d'idées est l'une des principales raisons pour lesquelles des sociétés comme Google vous offrent de la nourriture gratuite.

Demandez aux personnes qui savent mieux réviser le code et lire leur code. En apprenant le travail de quelqu'un d'autre, vous pouvez en apprendre beaucoup. Les révisions de code vous aideront à apprendre à mieux écrire du code. C'est peut-être l'un des moyens les plus efficaces pour devenir un meilleur programmeur très, très rapidement.

Ecrire des tests


Il est si important que vous ayez besoin d'un article séparé pour cela. Les tests font partie intégrante de la création de logiciels, et même des gars comme moi qui travaillent sur des logiciels formellement testés (ce qui signifie qu'ils doivent être formellement mathématiquement rigoureusement formalisables) écrivent des tests, bien que vous puissiez penser que les garanties données par les preuves sont beaucoup plus fort.

J'espère que cela peut aider quelqu'un à avoir une meilleure image, à apprendre plus vite et à devenir un meilleur programmeur; Si vous avez des questions, je me ferai un plaisir de vous aider. Bonne chance

Source: https://habr.com/ru/post/fr425363/


All Articles