Article original : What you learn in a 4 year Computer Science degree
Par Colin Smith
J'ai récemment écrit un article sur la nécessité d'un diplôme en informatique pour obtenir un emploi dans le domaine de la technologie. J'ai pensé qu'il serait utile de passer en revue mon relevé de notes. Discuter de ce que j'ai étudié aidera, je l'espère, les gens. Je veux que tout le monde puisse prendre la décision la plus éclairée possible lorsqu'il choisit son chemin pour poursuivre une carrière dans la technologie.
Avertissement : Ceci est écrit d'après mes souvenirs des cours et du point de vue d'un développeur mobile. Beaucoup des sujets de ces cours pourraient être spécialisés et transformés en une carrière. Ils sont donc tous importants pour quelqu'un dans le monde. J'écris de mon point de vue et de celui de quelqu'un qui a choisi la voie de développeur mobile.
_Le premier code que la plupart des gens finissent par écrire. Image par [Kleiner](https://commons.wikimedia.org/wiki/User:Kleiner" rel="noopener" target="blank" title="User:Kleiner).
Programmation I, II
C'était le cœur de tout ce que j'ai appris et ce qui m'a lancé dans la programmation. Ces étaient les cours où l'on apprenait à programmer. Avant de suivre ces cours, je n'avais presque jamais programmé. J'avais essayé de prendre de l'avance mais je n'avais pas progressé beaucoup plus loin que les boucles.
Ce cours a commencé par la création d'un fichier vide et sa compilation dans un IDE (j'ai utilisé Code::Blocks). Et nous avons travaillé jusqu'à la création de notre propre jeu de bataille basé sur du texte. En regardant le code que j'ai écrit, je suis gêné. J'ai fait beaucoup de chemin depuis. Voici le dépôt si vous voulez rire un peu (j'utilise uniquement un fichier main.cpp avec 1063 lignes de code).
Alors, qu'ai-je appris ici ? Je veux dire tout. Ces cours étaient incroyablement précieux et m'ont apporté au moins 70 % des connaissances dont j'avais besoin pour travailler professionnellement en tant que programmeur. J'ai appris les instructions conditionnelles, les boucles, la logique booléenne, la création de classes, la création de structures, la création d'interfaces, le polymorphisme, l'héritage et plus encore. Il y avait aussi une utilisation de certaines structures de données de base comme les tableaux et les vecteurs.
_L'un des nombreux sujets couverts dans les structures discrètes. Image par [Attribution-Share Alike 3.0 Unported](https://commons.wikimedia.org/w/index.php?title=User:Benji3.141&action=edit&redlink=1" rel="noopener" target="_blank" title="User:Benji3.141 (page does not exist)">Benji3.141 sous Creative Commons <a href="https://creativecommons.org/licenses/by-sa/3.0/deed.en" rel="noopener" target="blank" title=") license.
Structures discrètes en informatique
Ce cours a été ajouté au programme pour habituer les gens à la logique booléenne. Ce que nous avions maîtrisé dans les deux premières semaines du cours. Malheureusement pour nous, étudiants insoupçonnés, cela va assez loin dans le terrier du lapin. Voici quelques-uns des sujets abordés : « logique, ensembles et opérations sur les ensembles, méthodes de preuve, définitions récursives, combinatoire et théorie des graphes ».
Maintenant, ce sont toutes des choses utiles à savoir. Mais le problème est que les étudiants étaient encouragés à suivre ce cours tôt. Habituellement en même temps que la programmation I et II. Et ce sont des sujets avancés. Je luttais maintenant pour utiliser des méthodes mathématiques de preuve. Et je me souviens que j'avais vraiment du mal à l'époque. De plus, je viens de devoir chercher ce qu'est la combinatoire, donc je ne les utilise clairement pas beaucoup.
Le fait est que beaucoup des choses qu'ils enseignaient dans ce cours ne semblaient pas applicables à une carrière en informatique au moment où j'ai suivi le cours. Je sais maintenant que la logique, les ensembles et les opérations sur les ensembles, les définitions récursives et la théorie des graphes peuvent être utiles. Mais cela n'est vrai qu'avec le recul d'être programmeur depuis quelques années.
Ce que j'applique quotidiennement dans ma carrière actuelle, c'est la logique et peut-être les opérations sur les ensembles. Les définitions récursives et la théorie des graphes n'ont vraiment été utiles que pour les entretiens. Mais prenez cela avec des pincettes car je suis un développeur mobile. Un développeur back-end trouverait probablement la théorie des graphes très utile.
_La même chose implémentée avec deux structures de données différentes. Image par [Filosoficos](https://commons.wikimedia.org/w/index.php?title=User:Filosoficos&action=edit&redlink=1" rel="noopener" target="blank" title="User:Filosoficos (page does not exist)).
Structures de données
Ce cours était bon. Très bon. Les structures de données sont utilisées partout en programmation informatique et sont l'épine dorsale de la plupart du code que les gens écrivent. Elles nous permettent de stocker des données de manière utile pour les programmes que nous écrivons. La capacité à regarder les données et à savoir la meilleure façon de les stocker pour des performances en temps et en espace est une compétence très utile à avoir.
J'ai appris les tableaux, les piles, les listes chaînées, les listes doublement chaînées, les arbres, les graphes, les tas et toutes les différentes variantes de ces structures de données (comme les arbres auto-équilibrants). Ce cours ne m'a pas seulement aidé à comprendre les structures de données, mais il m'a aussi aidé à mieux organiser les données que je stockais.
Ce cours a été fait en C, ce qui l'a rendu encore plus intéressant. C peut être très capricieux mais aussi très puissant s'il est utilisé correctement. J'ai dû être très prudent avec la façon dont j'allouais et nettoyais la mémoire, ce qui était aussi très bon pour enseigner la gestion de la mémoire.
Il y avait tellement de choses utiles dans ce cours qu'il est difficile de toutes les couvrir. Je n'ai même pas mentionné le fait que c'est une composante clé des connaissances pour les entretiens dans le domaine de la technologie. Si vous êtes faible sur les structures de données, commencez à vous rafraîchir sur quelques bases car elles sont très importantes.
_Bon vieux parcours en largeur. Je ne peux pas compter le nombre de fois où l'algorithme m'a sauvé lors des entretiens. Image par [3.0 Unported](https://commons.wikimedia.org/w/index.php?title=User:Mre&action=edit&redlink=1" rel="noopener" target="_blank" title="User:Mre (page does not exist)">
Mre sous la Creative Commons Attribution-Share Alike <a href="https://creativecommons.org/licenses/by-sa/3.0/deed.en" rel="noopener" target="blank" title=") license.
Analyse des algorithmes
Ce cours était quelque peu utile. Les algorithmes sont utiles. Ils alimentent les meilleurs logiciels du monde et les rendent assez puissants pour rester pertinents dans le monde moderne. Mais ce cours avait quelques problèmes.
La partie la plus utile de cela était d'apprendre la notation Big O. La notation Big O vous permet d'évaluer le code et de comprendre comment il se comporterait en termes de temps et d'espace. En général, si vous mesurez les performances du code dans une entreprise, vous utiliserez un chronomètre pour suivre le temps entre les interactions. Cela vous permet de voir comment votre logiciel se comporte. Cela nécessite que vous écriviez du code et évaluiez les résultats par la suite.
La notation Big O vous permet de faire des évaluations des performances du code simplement en regardant le code. Je ne veux pas trop m'attarder sur cela, mais si vous ne connaissez pas la notation Big O, lisez cet article de blog.
Les algorithmes réels que nous avons passés en revue n'étaient pas aussi utiles. Tout ce dont je me souviens, c'est le problème du sac à dos et le problème du voyageur de commerce. J'ai aussi dû écrire du code pour ceux-ci en groupes, ce qui n'était pas génial car il y avait une personne dans mon groupe qui allait au-delà de ce qui était prévu pour lui. Cela signifiait que je finissais par écrire moins de code vers l'implémentation finale à chaque fois que je l'aurais aimé.
Une compréhension de base de ce que sont les algorithmes célèbres, leur but et comment ils sont implémentés peut être utile (principalement pour les entretiens). La notation Big O est la clé ici. Elle est très utile sur le travail et elle est aussi incroyablement utile pour les entretiens.
_La pile du développeur web. Image par [lakexyde](https://pixabay.com/en/users/lakexyde-2489063/" rel="noopener" target="blank" title=") sur Pixabay.
Développement Web
Ce cours avait le plus de compétences directement applicables à un emploi dans le domaine de la technologie. J'ai appris le HTML, le CSS, le JQuery, le JavaScript, le PHP et le JSON. J'ai appris comment une requête est envoyée depuis le front-end d'un site web vers le back-end, comment elle est traitée sur le back-end et ensuite renvoyée au front-end avec une réponse. J'ai appris comment créer une interface utilisateur et comment interagir avec une couche de données qui interagit ensuite avec le réseau.
À la fin du cours, j'avais construit mon propre site web et j'ai pris l'initiative d'apprendre Angular. J'ai utilisé Angular pour rendre mon site plus attrayant, ce qui m'a finalement permis d'obtenir mon premier stage. J'ai également acquis une bonne compréhension du fonctionnement d'un site web sous le capot.
Ces connaissances seules étaient excellentes, mais j'ai également appris comment prendre et apprendre un langage, un framework ou un format de données inconnu et travailler avec sur le vif. J'ai fait beaucoup de recherches sur ces sujets pour voir des exemples concrets. J'ai appris à utiliser la documentation et l'investigation en ligne pour mieux comprendre un concept que je devais appliquer directement dans un court laps de temps. C'est une compétence clé pour être un programmeur compétent.
_Schémas de base de données. Image par [mcmurryjulie](https://pixabay.com/en/users/mcmurryjulie-2375405/" rel="noopener" target="blank" title=") sur Pixabay.
Introduction aux bases de données
J'ai surtout appris le SQL dans ce cours. Je suis sûr que nous avons passé en revue d'autres concepts comme le sharding et le clustering, mais je ne m'en souviens pas. J'utilise parfois le SQL dans mon travail actuel pour exécuter des requêtes de données pour les événements que j'ai enregistrés. Le SQL sera soit intégral à votre travail, soit vous l'utiliserez à peine. Si vous en avez besoin, apprenez-le et devenez un expert. Si vous n'en avez pas besoin, ne vous en souciez pas trop.
_Scrum en un clin d'œil. Image par [4.0 Internationa](https://commons.wikimedia.org/w/index.php?title=User:Lakeworks&action=edit&redlink=1" rel="noopener" target="_blank" title="User:Lakeworks (page does not exist)">Lakeworks sous la Creative Commons Attribution-Share Alike <a href="https://creativecommons.org/licenses/by-sa/4.0/" rel="noopener" target="blank" title=")l license.
Génie logiciel I, II
Un autre cours dont je ne me souviens pas vraiment. Je crois que nous avons passé en revue un tas de concepts larges dans ce cours. Nous avons couvert les méthodes de gestion de projet Scrum et Waterfall. Nous avons passé en revue les tests et tous les différents types de tests qui existent. Nous avons couvert certains concepts d'utilisabilité et d'accessibilité. C'était vraiment un fourre-tout pour des concepts qui ne rentraient pas vraiment dans leurs propres cours.
En raison de la nature patchwork du cours, je n'ai pas vraiment intériorisé aucun des concepts trop bien. C'était bien d'avoir un aperçu de base des concepts couverts, mais j'aurais souhaité que plus de temps soit consacré aux sujets individuels importants tels que les tests.
_Différents types d'architecture informatique. Image par [Virtual_Loïc](https://en.wikipedia.org/wiki/User:Virtual_Lo%C3%AFc" rel="noopener" target="blank" title="User:Virtual Loïc).
Architecture des ordinateurs et langage d'assemblage
Je me souviens vivement de ce cours. Ce cours explique comment fonctionne un ordinateur. Comment les instructions machine sont envoyées et traitées par l'ordinateur. Nous avons également pu écrire du code en MASM, qui est un langage d'assemblage qui interagit de très près avec le code machine.
La plupart des langages de programmation que j'avais utilisés jusqu'à ce que je suive ce cours étaient des langages de haut niveau. Les langages de haut niveau tendent à être plus proches du langage humain que du code machine. Le MASM est très proche du code machine et je dirais qu'il est plus proche du langage machine que du langage humain.
La partie la plus importante de ce cours est de se faire une idée de ce qui arrive à votre code une fois qu'il est compilé. Comprendre les différentes unités logiques d'un ordinateur et comment votre code est géré par elles était très intéressant à apprendre.
Pour des raisons pratiques, je ne pense pas que ce cours ait été très pivot dans ma carrière technologique. Je n'ai pas utilisé beaucoup des connaissances que j'ai acquises dans ce cours jusqu'à présent dans ma carrière.
_Les systèmes d'exploitation nous permettent de faire notre travail. Image par [200degrees](https://pixabay.com/en/users/200degrees-2051452/" rel="noopener" target="blank" title=") sur Pixabay.
Systèmes d'exploitation
Je vais être honnête, j'ai vraiment du mal à me souvenir de ce que j'ai appris dans ce cours. La seule chose dont je me souviens, c'est la construction d'un programme de messagerie qui utilisait la programmation de sockets en C pour communiquer. J'ai également appris à ouvrir des fichiers et à manipuler des dossiers en utilisant des scripts.
Je veux être franc sur ce dont je me souviens de mon diplôme et le fait est que je ne me souviens pas de beaucoup de choses de ce cours. Je n'ai tout simplement pas utilisé beaucoup des connaissances acquises dans ma carrière actuelle.
_Les réseaux informatiques sont vraiment incroyables. Image par [Attribution 2.5 Generic](https://commons.wikimedia.org/w/index.php?title=Barrett_Lyon&action=edit&redlink=1" rel="noopener" target="_blank" title="Barrett Lyon (page does not exist)">The Opte Project disponible sous la Creative Commons <a href="https://creativecommons.org/licenses/by/2.5/deed.en" rel="noopener" target="blank" title=") license.
Introduction aux réseaux informatiques
Ce cours était très utile. Il a couvert le fonctionnement des réseaux informatiques. Cela incluait le passage en revue des protocoles réseau tels que HTTP, HTTPS, TCP, IP, FTP, IMAP, POP3, SSH et DNS. J'ai pu apprendre à quoi servait chacun de ces protocoles, comment ils étaient implémentés et j'ai acquis une compréhension de pourquoi ils avaient été créés.
Les protocoles réseau que j'ai mentionnés ci-dessus sont utilisés pour des fonctions critiques des logiciels modernes. Cela inclut la gestion des e-mails (POP3 & IMAP), l'envoi de requêtes réseau entre le client et le serveur (HTTP, HTTPS) et la gestion sécurisée des appareils via un réseau (SSH). Cela vous donne vraiment une compréhension de comment fonctionne Internet et de comment les appareils à travers le monde peuvent interagir les uns avec les autres.
Ce n'est pas seulement fascinant, mais cela peut être utile. J'ai utilisé les choses que j'ai apprises dans ce cours pour déboguer des problèmes que j'ai rencontrés lorsque j'avais des erreurs provenant du réseau. J'ai pu identifier les problèmes que je rencontrais et aider le développeur back-end avec lequel je travaillais à trouver le bug de leur côté.
_L'expérience utilisateur est un équilibre délicat entre de nombreuses parties. Image par [Attribution 4.0 International](https://commons.wikimedia.org/wiki/User:Borys_Kozielski" rel="noopener" target="_blank" title="User:Borys Kozielski">Borys Kozielski sous la Creative Commons <a href="https://creativecommons.org/licenses/by/4.0/deed.en" rel="noopener" target="blank" title=") license.
Introduction à l'ingénierie de l'utilisabilité
Ce cours couvrait comment créer une application intuitive mais aussi comment rendre une application ou un site web accessible. L'accessibilité fait référence à la création d'un logiciel utilisable par tous, y compris les personnes handicapées. Cela couvre des choses comme l'utilisation de la synthèse vocale et la conception de logiciels qui ne dépendent pas uniquement des éléments audio.
Les sujets couverts étaient utiles si vous n'aviez jamais entendu parler d'accessibilité auparavant. Cela vous faisait au moins considérer ces choses lorsque vous concevez un logiciel. Cela m'a également fait vraiment commencer à réfléchir à l'expérience utilisateur et à son importance pour un bon logiciel. Si personne n'utilise la fonctionnalité clé de votre application parce qu'elle est confuse, alors votre logiciel finira par perdre tous ses utilisateurs.
Bien que les connaissances étaient intéressantes, les implémentations spécifiques de la création d'un logiciel utilisable et accessible dépendent de la plateforme. Par exemple, Apple a son propre ensemble de directives d'interface utilisateur qui décrivent les principes de conception généraux et les détails spécifiques de la conception de logiciels qui s'exécuteront sur l'une des plateformes d'Apple.
En raison des informations spécifiques nécessaires par plateforme, je ne suis pas sûr que ce cours ait été incroyablement utile. C'était une bonne introduction, mais j'ai fini par devoir apprendre les directives d'interface d'Apple qui couvraient tous les sujets abordés dans ce cours.
_Tant d'applications. Il y a tant d'opportunités pour les développeurs mobiles. Photo par [Unsplash](https://unsplash.com/photos/xsGxhtAsfSA?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText" rel="noopener" target="_blank" title="">Rahul Chakraborty sur <a href="https://unsplash.com/search/photos/mobile?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText" rel="noopener" target="blank" title=").
Développement de logiciels mobiles et cloud
Je vais garder celui-ci court. J'étais déjà ingénieur mobile lorsque j'ai suivi ce cours. J'ai construit une application mobile médiocre en quelques heures afin de terminer mon diplôme le plus rapidement possible. À ce stade, j'avais déjà atteint mon objectif d'obtenir un emploi en tant qu'ingénieur logiciel, mais je devais simplement terminer mon diplôme en informatique puisque j'étais presque terminé. Mon cœur n'était pas à l'apprentissage à ce moment-là.
Même avec cela, je ne pense pas que ce cours ait été bien mené. Il était mal conçu. Ils encourageaient les gens à écrire du code pour une application Windows Phone pour ce cours, et la demande pour ces emplois est beaucoup plus faible que pour d'autres. Et je pense qu'il n'était encouragé que parce que l'environnement est plus facile à configurer et que le code peut être écrit en JavaScript et ressemble au développement web.
De plus, il était clair pour moi que la personne qui dirigeait le cours ne connaissait pas toutes les plateformes d'applications mobiles. Nous devions écrire une petite partie back-end, mais je ne voulais vraiment pas. J'ai fini par simuler une requête web en lisant plutôt depuis le disque et en retournant une réponse préenregistrée après quelques secondes. Cela a fonctionné parce que je devais seulement soumettre une démonstration et le code source. Et j'ai l'impression que la personne qui notait ne regardait que la démonstration.
Dans l'ensemble, le cours enseignait des technologies obsolètes et inutilisées, n'était pas correctement évalué et n'offrait pas beaucoup de guidance. Ce n'était pas un très bon cours.
_Une interface si belle et moderne. Qui ne serait pas ravi d'apprendre cette interface graphique Python après avoir travaillé en tant que développeur mobile ? /s. Image par [Creative Commons Attribution 2.0 Generic License](https://www.flickr.com/photos/syobosyobo/" rel="noopener" target="_blank" title="Go to jim212jim's photostream">jim212jim sous <a href="https://creativecommons.org/licenses/by/2.0/" rel="noopener" target="blank" title=").
Projet final de logiciel
En parlant de technologie obsolète, ce projet nous a demandé de construire une interface graphique pour accéder à une base de données en utilisant curses. Voici le projet complet si vous êtes intéressé. Nous n'avons pas eu le choix de notre projet final, il nous a été assigné. Et tout le monde devait faire le même projet. Il était également réalisé en groupes de 3, donc vous ne couvriez vraiment qu'une petite portion du projet. C'était un cours très mal organisé.
L'interaction avec l'enseignant était pratiquement inexistante. Je n'avais aucun intérêt pour le projet et ce que nous apprenions semblait absolument inutile. Pour créer un intérêt pour un sujet, il faut laisser aux gens une certaine liberté de choix dans ce qu'ils apprennent. Ne pas avoir le choix dans son projet final est simplement absurde. Ce projet est inutile pour la majorité des parcours professionnels et il n'a pas de sens de l'imposer aux gens.
Le cours aurait dû faire en sorte que chaque étudiant soumette une proposition avec des estimations approximatives pour un calendrier de fin de chaque sous-partie du projet. Cela accomplirait deux choses : faire en sorte que les gens commencent à pratiquer l'estimation du travail et permettre aux gens de travailler sur ce qui les intéresse. Le cours aurait été 100 fois meilleur de cette manière.
_Un autre GIF d'algorithme, parce qu'ils sont ingénieux. Parcours en profondeur pour équilibrer le parcours en largeur. Image par [3.0 Unported](https://commons.wikimedia.org/w/index.php?title=User:Mre&action=edit&redlink=1" rel="noopener" target="_blank" title="User:Mre (page does not exist)">Mre sous Creative Commons Attribution-Share Alike <a href="https://creativecommons.org/licenses/by-sa/3.0/deed.en" rel="noopener" target="blank" title=") License.
Réflexions finales
J'aurais pu ne pas suivre une grande partie des cours et être toujours l'ingénieur logiciel que je suis aujourd'hui. Mais je pense que manquer certains de ces cours pourrait laisser un énorme vide dans vos connaissances en tant que développeur. Les sujets que je pense que chaque ingénieur logiciel devrait connaître sont les Structures de données et les algorithmes.
Les autres cours dépendent du parcours professionnel que vous choisissez. Si vous décidez de vous lancer dans le développement embarqué, vous devriez apprendre l'architecture des ordinateurs. Si vous décidez de devenir ingénieur front-end, vous devriez apprendre les réseaux informatiques.
Le point clé à retenir ici est qu'un bon ingénieur est constamment en train d'apprendre. Si vous manquez de certaines connaissances que vous savez être utiles et applicables dans votre travail, alors allez suivre un cours pour acquérir ces connaissances. C'est ainsi que vous vous améliorez dans l'écriture de bon code. Apprenez toujours.
Avez-vous aimé ce que vous avez lu ? Consultez mes autres articles
Commencer une carrière dans la technologie à partir de rien.
Conseils pour votre premier entretien dans le domaine de la technologie.