Article original : Teach Yourself Computer Science – Key CS Concepts You Should Know
Le développement logiciel peut sembler une course pour suivre les nouvelles technologies.
Il y a toujours un nouveau framework frontend à apprendre, ou une nouvelle base de données ou un langage qui est une variation d'un autre langage. C'est sans fin et on a l'impression de devoir toujours suivre.
Mais cela n'a pas à être ainsi.
Tout est construit à partir des fondamentaux
Si vous apprenez les fondamentaux, alors tout le reste deviendra plus facile.
Par exemple, si vous apprenez comment fonctionne le protocole TCP/IP, alors à partir de cela, vous pourrez facilement apprendre tous les autres protocoles qui sont construits par-dessus.
Vous avez essentiellement moins de terrain à couvrir. Plus vous connaissez de fondamentaux, moins vous aurez de mal à apprendre de nouvelles choses.
Je crois qu'il y a 10 sujets principaux qui, si vous les apprenez, vous donneront une base solide.
Pourquoi devriez-vous apprendre ces concepts clés ?
Apprendre les fondamentaux vous placera vraiment dans le top 5 % de tous les programmeurs.
Si nous regardons cela sous un angle différent, voici une excellente citation de Ras Bodik.
Ne soyez pas un programmeur de code standard. Au lieu de cela, construisez des outils pour les utilisateurs et d'autres programmeurs. Prenez note historique des industries du textile et de l'acier : voulez-vous construire des machines et des outils, ou voulez-vous faire fonctionner ces machines ?
Mais il y a un million de cours différents parmi lesquels choisir
Eh bien, ne cherchez pas plus loin.
Ci-dessous, j'ai compilé un ensemble de ressources utiles sur chaque sujet – avec quelques alternatives, bien sûr. Ainsi, vous pouvez vous concentrer sur l'apprentissage et non sur la recherche aveugle des meilleurs livres/vidéos/cours.
Quelques notes
Cet article est bien adapté pour les développeurs autodidactes ou les développeurs qui ne se sentent pas tout à fait à l'aise avec certains concepts d'informatique.
Si vous apprenez à programmer pour la première fois, je vous recommande la communauté r/learnprogramming sur Reddit.
Cet article a été fortement inspiré par Oz Nova et Myles Byrne qui ont créé le site teachyourselfcs.com. Si vous aimez cet article, n'hésitez pas à consulter et partager leur site.
Table des matières
- Programmation
- Architecture des ordinateurs
- Algorithmes et structures de données
- Mathématiques pour l'informatique
- Systèmes d'exploitation
- Réseaux informatiques
- Bases de données
- Langages et compilateurs
- Systèmes distribués
- Sécurité Web
- Conclusion
Programmation
Je ne parle pas de syntaxe ici. Mais vraiment de programmation ou de résolution de problèmes. Des choses comme l'abstraction, les fonctions en tant que données, la récursion, et les différents types de paradigmes de programmation (orienté objet, fonctionnel et déclaratif).
Le livre que je recommande pour apprendre la programmation est Structures et Interprétations des Programmes Informatiques (SICP) (Il est également connu sous le nom de livre du sorcier).
Le livre est gratuit et dispose d'un ensemble de conférences MIT. Mais les conférences MIT sont un peu difficiles à regarder en raison de la mauvaise qualité de l'époque (2005). Je recommande donc les conférences SICP de Brian Harvey (pour le cours 61A à Berkeley) à la place.
Pourquoi ce livre ?
Parce que ce livre se concentre sur le tableau d'ensemble.
Il ne se soucie pas du langage de programmation. Il utilise une variation de Lisp appelée Scheme. Scheme est très facile à apprendre (vous pouvez probablement l'apprendre en moins d'une heure), donc il vous permet de vous concentrer sur les idées et non sur la syntaxe.
Grâce à sa simplicité, il est possible d'examiner différents paradigmes de programmation. C'est une approche fonctionnelle en premier, mais vous pouvez implémenter votre propre OOP.
Scheme est un excellent langage pour l'enseignement car il éloigne l'attention du langage et la met sur les grandes idées.
Si vous êtes inquiet qu'il ne soit pas utilisé dans l'industrie, ce n'est pas grave – vous pouvez toujours apprendre un langage de programmation plus couramment utilisé après avoir saisi ces concepts de haut niveau.
Mais que faire si je ne veux vraiment pas apprendre Scheme ?
D'accord, vous pouvez suivre la nouvelle version du livre qui utilise Python. Le livre s'intitule Composing Programs. Il dispose également de son propre ensemble de conférences.
Mais je recommande fortement d'essayer au moins la version Scheme. C'est magique une fois que vous l'avez compris.
D'accord, je l'ai essayé mais c'est vraiment difficile
Oui, je comprends.
Certains d'entre vous trouveront SICP un peu trop difficile. Il n'est pas destiné aux programmeurs purement débutants.
Si c'est le cas, alors je recommande How to Design Programs (HTDP). Il utilise un langage très similaire à Scheme et est généralement plus lent. Vous pouvez utiliser ce livre et son cours sur edX.
Conseils pour l'étude
Ne lisez pas ces livres comme une histoire.
Ils ne sont pas destinés à être lus de couverture à couverture. Au lieu de cela, concentrez-vous sur les exercices. Vous n'avez pas à tous les faire, mais assurez-vous simplement de savoir comment résoudre la plupart d'entre eux.
Les conférences sont facultatives et ne sont nécessaires que si elles aident. C'est vraiment à vous de voir.
Ressources supplémentaires
- Rencontres virtuelles qui parlent de SICP
- Racket (IDE pour Scheme) (Consultez cette réponse StackOverFlow pour la configuration de Scheme)
Architecture des ordinateurs
Vous avez écrit du code et il s'exécute magiquement.
Comment cela fonctionne-t-il ? Eh bien, c'est ce que vous apprendrez avec l'architecture des ordinateurs. C'est de loin le sujet le plus négligé par la plupart des ingénieurs autodidactes.
En tant qu'ingénieurs, nous ne croyons pas à la magie. Nous devons démystifier la magie derrière les ordinateurs. Vous apprendrez également des choses utiles comme :
- Qu'est-ce que le cache L1, L2 ?
- Pourquoi Cyberpunk lag ?
Le livre que je recommande ici est Computer Systems: A Programmer's Perspective. Je recommande également un cours d'introduction qui couvrira les chapitres 1-6 du livre (qui a été réalisé par les auteurs du livre).
Mais il y a un piège
Ce livre n'est pas destiné à être lu de couverture à couverture. Il contient beaucoup de contenu, qui peut ne pas être présenté dans l'ordre optimal.
Je recommande donc de suivre le cours et de faire les travaux pratiques.
Que faire si je trouve cela trop difficile ?
Beaucoup de gens trouveront le contenu un peu lourd, donc pour vous y habituer, je recommande de faire ce qui suit :
- Lire Code: The Hidden Language of Computer Hardware and Software
- Lire ce manuel sur l'architecture logicielle
- Regarder les 4 vidéos de Exploring How Computers Work
- Regarder les 41 vidéos de Crash Course: Computer Science
- Suivre le cours NAnd2Tetris
- Apprendre un peu de C en lisant le livre : C Programming a Modern Approach
Une fois que vous avez terminé cela, vous pouvez revenir à Computer Systems: A Programmers Perspective.
Algorithmes et structures de données
Tout le monde veut travailler dans une entreprise FAANG, mais personne ne veut apprendre les algorithmes et les structures de données.
Néanmoins, je ne veux pas que vous appreniez cela juste à cause des entretiens techniques. Les algorithmes et les structures de données sont importants car ils aident à développer vos compétences en résolution de problèmes.
Il existe de nombreux excellents livres et cours sur les algorithmes et les structures de données, mais celui que je recommande est un livre intitulé The Algorithm Design Manual par Steven Skiena. Vous pouvez également consulter son cours ici.
N'oubliez pas de pratiquer
Les mêmes règles s'appliquent ici. Ne vous contentez pas d'apprendre les structures de données, mais créez-les dans le langage que vous voulez. Ne mémorisez pas simplement les algorithmes, mais implémentez-les et voyez où et comment vous pouvez les utiliser.
Un bon conseil est de résoudre quelques problèmes Leetcode tout en suivant le livre/cours.
Que faire si je trouve cela trop difficile ?
Si vous trouvez le matériel un peu lourd, alors je recommande les ressources suivantes :
- Lire le livre : Grokking Algorithms
- Lire le livre : How to Solve It: A New Aspect of Mathematical Method
En général, il existe de nombreux livres/cours différents qui enseignent les algorithmes et les structures de données – voici quelques autres excellentes ressources :
- Cours sur les algorithmes et les structures de données sur freeCodeCamp
- Algorithms Illuminated
- Cours d'algorithmes de Princeton
- Cours sur les algorithmes et les structures de données de ThePrimegeans
- Introduction aux algorithmes du MIT
Mathématiques pour l'informatique
Ne vous inquiétez pas, c'est une photo aléatoire de mathématiques trouvée ici
De nombreux nouveaux développeurs sautent cette étape.
Mais, écoutez-moi – l'informatique est essentiellement une branche des mathématiques. L'apprendre vous rendra meilleur développeur en aiguisant vos compétences en résolution de problèmes.
Le domaine le plus pertinent pour l'informatique est les mathématiques discrètes
Les mathématiques discrètes sont la branche des mathématiques qui traite des nombres dénombrables ou finis.
Les sujets en mathématiques discrètes sont nombreux, mais ceux qui sont pertinents pour l'informatique sont :
- Logique
- Combinatoire
- Probabilité discrète
- Théorie des ensembles
- Théorie des graphes
- Théorie des nombres
Comment étudier les mathématiques discrètes
Je suggérerais de commencer par un ensemble de notes de cours de László Lovász.
Les notes du professeur Lovász sont plus faciles à digérer que les textes formels et sont généralement amusantes. Il commence par un problème et le résout en utilisant les mathématiques discrètes.
Après cela, vous pouvez prendre un livre du MIT intitulé Mathematics for Computer Science. Le livre est accompagné de conférences vidéo qui sont librement disponibles.
Que faire si c'est trop difficile ?
Ne vous inquiétez pas – parfois, vous devez simplement accepter que vous ne comprendrez pas toujours tout de suite.
C'est normal.
Mais si vous avez l'impression de manquer certaines connaissances fondamentales, alors c'est une autre histoire. Les sujets préalables fondamentaux pour les mathématiques discrètes sont :
- Algèbre
- Géométrie
- Calcul
Il existe de nombreuses ressources gratuites, mais celles que je recommande sont :
Systèmes d'exploitation
Vous souvenez-vous quand je vous ai dit que nous, en tant que développeurs, voulons éliminer la magie de l'informatique ?
La même chose s'applique ici – les systèmes d'exploitation semblent être une sorte de boîte noire magique. Mais ils ne le sont pas – c'est juste beaucoup d'ingénierie astucieuse.
Si vous savez comment ces systèmes d'exploitation sont construits et fonctionnent, alors vous serez définitivement dans une ligue à part.
Il est quelque peu difficile de trouver de bonnes ressources en ligne pour les systèmes d'exploitation, mais le livre le plus recommandé est Operating Systems: Three Easy Pieces (OSTEP). Il n'y a pas de conférence vidéo officielle en ligne qui couvre entièrement le livre, mais j'ai trouvé cette playlist sur YouTube.
Prérequis recommandés
Je suggérerais d'apprendre d'abord l'architecture des ordinateurs et un peu de C avant de se lancer dans l'aventure des systèmes d'exploitation.
Ressources facultatives
Maintenant, je recommande de terminer OSTEP en premier, puis de consulter les autres ressources recommandées. Elles sont toutes facultatives.
- Vous voulez construire votre propre système Linux ? Consultez Linux from Scratch.
- Vous voulez une vue d'ensemble approfondie de Linux, MacOS et Windows ? Voici un manuel pour vous.
- Vous voulez construire votre propre système d'exploitation ? Consultez OSDEV
- Vous voulez construire vos propres sockets ? Consultez Beej's Guide to Network Programming
Réseaux informatiques
Depuis l'avènement de l'internet, les réseaux informatiques ont été l'un des sujets les plus importants pour les ingénieurs logiciels.
Si vous ne connaissez pas des choses comme IP, TCP, UDP, HTTP, TLS, DNS, SMTP, et ainsi de suite – alors vous devriez apprendre les réseaux informatiques (surtout si vous êtes un ingénieur backend).
Le livre recommandé ici est Computer Networking: A Top-Down Approach. Vous pouvez également consulter les conférences vidéo de l'auteur du livre lui-même.
Mais avant de commencer cela, je recommande de consulter ce cours accéléré vidéo sur les réseaux informatiques depuis une approche ascendante. Et voici un tutoriel utile qui couvre bien les bases.
Bases de données
Les bases de données sont quelque peu nouvelles – elles sont apparues dans les années 1970 et sont depuis devenues des parties intégrantes de nombreuses applications.
Je recommande vivement les cours ci-dessous du CMU Database Group. Ils sont tous librement disponibles sur YouTube. Je recommande de suivre au moins le premier.
De plus, voici une excellente collection de ressources pour vous aider à apprendre les bases de données SQL. Et voici un cours gratuit sur les bases de données NoSQL.
Langages et compilateurs
Vous savez peut-être coder dans un ou plusieurs langages de programmation.
Mais savez-vous comment en créer ou en concevoir un ? C'est ce que vous apprendrez en étudiant les langages de programmation et les compilateurs.
Le livre d'introduction recommandé s'intitule Crafting Interpreters.
Après cela, vous pouvez passer à Compilers: Principles, Techniques & Tools, également appelé "le livre du Dragon". Le livre couvre de nombreux sujets, je recommande donc vivement de suivre un cours avec lui. Celui que je recommande est de Alex Aiken sur edX.
Et voici un tutoriel utile pour débutants sur le fonctionnement du compilateur en programmation C.
Systèmes distribués
Si vous choisissez d'étudier un seul sujet de la liste, faites-en les systèmes distribués. C'est le graal pour les entreprises technologiques, et si vous voulez obtenir un emploi de développeur, vous devriez maîtriser les systèmes distribués.
Mon parcours recommandé pour apprendre le sujet est :
- Lire le livre : Understanding Distributed Systems
- Lire le livre : Designing Data Intensive Applications également connu sous le nom de "livre rouge"
- Pendant la lecture du "livre rouge", suivez son cours d'accompagnement MIT sur YouTube.
- Lire le livre : Software Architecture: The Hard Parts (Facultatif)
- Vous pouvez également consulter mon manuel sur les modèles de conception pour les systèmes distribués.
Sécurité Web
Il y a eu beaucoup de violations de sécurité au cours des 2-3 dernières années.
C'est devenu dangereux – et en tant qu'ingénieur logiciel, connaître quelques fondamentaux de la sécurité web vous donnera un avantage.
Le cours que je recommande en premier est CS253 Web Security by Stanford. Il donne un aperçu complet de la sécurité web. Attendez-vous donc à des sujets comme les vulnérabilités des applications web, l'injection, le déni de service, et bien d'autres.
Vous pouvez également passer en revue ces vulnérabilités courantes et apprendre à prévenir les attaques qui en tirent parti.
Plus tard, si vous le souhaitez, vous pourriez apprendre à pirater en utilisant pwn.college.
Conclusion
Apprendre tous ces sujets vous prendra un certain temps et nécessitera un effort constant. Mais si vous aimez ce que vous faites et que vous êtes intéressé par le sujet, cela devrait sembler un jeu et non une corvée.
Quels que soient les sujets que vous choisissez d'étudier. Le conseil le plus important que je puisse vous donner est...
Ne soyez pas un apprenant passif
Ne vous contentez pas de regarder des vidéos – faites également les exercices. Construisez les projets avec les tutoriels.
Ne vous contentez pas de lire des livres, mais engagez-vous dans le livre en posant des questions et en faisant vos propres recherches.
Vous voulez que l'information reste, pour ne pas l'oublier. Et pour la faire rester, vous devez vous engager activement dans le sujet.
J'espère sincèrement vous avoir encouragé à étudier certains de ces sujets. Comme toujours, je veux terminer en vous remerciant d'avoir lu cet article.
Je vous souhaite tout le meilleur.