Matières CS qu'un étudiant de premier cycle doit connaître [fermé]

34

Au collège, la théorie ne m'a jamais intéressé. Je ne l'ai jamais lu Malgré tous mes efforts, j'étais incapable de lire des choses et de ne pas savoir ce qui se passait réellement. Comme par exemple, dans mon cours sur la théorie des automates, mon professeur m'a dit tout ce qui pouvait être lié à son aspect mathématique, mais il n'a même pas mentionné une seule fois où il serait utilisé de manière pratique. C'est juste un exemple.

J'ai réussi à réussir mon collège et à faire un stage dans une entreprise également, où j'ai réalisé un projet et, heureusement, ils ne se sont pas souciés de mes notes, car elles étaient au-dessus de la moyenne.

Maintenant, je voudrais savoir quelles matières un élève CS doit absolument et positivement connaître. Sujets pouvant être pertinents dans l'industrie. C’est parce que j’ai un peu de temps libre et que cela me serait plus utile de bien les comprendre.

Quelles sont vos suggestions? Comme pour l'un, les algorithmes sont un sujet.

Karl
la source
3
Les expressions régulières sont basées sur la théorie des automates, et cela vous aidera si vous devez analyser quelque chose. J'ai fait et appris à l'école des choses qui se sont révélées hors de propos pour les emplois que j'ai occupés, mais cela en dit au moins autant sur ce sur quoi j'ai travaillé que sur ce que j'ai appris. Rien de ce que j'ai appris ne serait inutile sur le terrain en toutes circonstances.
David Thornley
2
Je déteste travailler avec votre type ... JK (en quelque sorte). Si j'étais vous, je prendrais d'abord le temps de passer en revue les choses que vous devriez savoir à l'école - de cette façon, vous ne ressembleriez pas à un idiot lors de votre prochaine entrevue. Après cela, j'apprendrais une quantité raisonnable de structures de données et d'algorithmes qui semblent pouvoir être utilisés dans un monde réel. Vous devez savoir où vous voulez être. Si vous êtes développeur de jeux, vous avez probablement besoin d'algèbre linéaire, de graphiques 3D, de géométrie informatique. En général, vous devez au minimum revoir les données, str, alg, base de données, système d'exploitation et compilateur, et continuer à apprendre.
Job
Il est difficile de nommer une application particulière pour la théorie des automates de la même manière qu'il est difficile de nommer une application particulière pour l'arithmétique. Une exagération, peut-être, mais pas autant. Les diagrammes d'état sont souvent utiles et leur manipulation dans le code est utile à plusieurs fins. Les arbres de décision (minimisés en digraphes) sont un exemple relativement récent pour moi, et j’ai même eu besoin d’utiliser des modèles d’état (sous forme canonique) comme clés dans des conteneurs. Si vous ne pouvez pas voir les applications dans les applications, pensez à ajouter une couche de génération de code indirectionnel.
Steve314
1
Vous obtenez beaucoup de bonnes réponses CS ci-dessous, mais je pense qu'en limitant votre question à celle-ci, il vous manque quelques-unes des choses les plus utiles que j'ai vues au cours des 15 dernières années depuis l'obtention de mon BSCS, ce qui a différencié les gens qui ont bien fonctionné dans le secteur: compétences en communication en petits groupes et travail d'équipe. Aussi bête que cela paraisse, dirigez-vous vers le département de parole / langage / théâtre et prenez un cours du type "communications en petit groupe" ou "direction / management d'équipes / de groupes". Même si vous n’avez pas l’intention de faire de la gestion, les compétences que vous allez acquérir vous feront de vous un meilleur ingénieur et membre de l’équipe.
Cabbey

Réponses:

41

Croyez-le ou non, la construction du compilateur a été l'une des choses qui ont été d'une importance capitale pour moi plus tard. Pas la version moderne namby-pamby utilisant Lex et Yacc, c'est pour les nuls.

Construction de compilateur REAL où vous écrivez votre propre scanner de symboles et votre propre analyseur syntaxique

C'est quelque chose que je pensais ne plus jamais utiliser. Mais au cours des 20 dernières années, ce cours a prouvé son poids en or 4 fois. Tous les processeurs de commandes que j'ai dû écrire, chaque analyseur de message entrant, chaque répartiteur d'utilisateur, chaque interpréteur de script, ont utilisé les principes de ce cours. Faites-le ainsi et la vie est douce, claire et simple. ET j’ai même donné toutes les informations à un collègue qui ne l’avait pas fait - il a dû écrire un compilateur pour une machine abstraite. Ce que je pourrais ajouter, a connu un succès commercial considérable.

Si je devais monter et remercier un conférencier universitaire dans une matière, ce serait bien. Sans cela, je me serais débrouillé mais mes solutions auraient été beaucoup plus laides.

(Et avant que quelqu'un ne saute à terre et dit "bon, vous auriez pu utiliser lex et le yacc ...", la réponse est peut-être - cela dépend beaucoup du système. Dans certains cas, les langages de programmation n'étaient pas C (par exemple, PL / M et Ada), dans certains cas, aucune plate-forme Lex ou Yacc n’était disponible pour la plate-forme. Connaître les bases signifie qu’une solution est à portée de main au lieu de se tordre la main pour essayer de trouver un moyen de plier un outil pour s’adapter au problème.)

Rapidement
la source
6
+1 Compilers était l’un de mes cours préférés à l’université et est toujours utile. J'ai rarement utilisé le lex / yacc / bison, les principes fondamentaux sont beaucoup plus concrets.
Orbling le
Je suis totalement d'accord bien que pour une raison différente. Apprendre à écrire le générateur de code - même si j’utilisais Lex et Yacc - était ma première et meilleure immersion dans la programmation orientée objet.
Peter Turner le
Vous pouvez (et devez également savoir comment) écrire le générateur de code en clair, ou dans un autre langage non-OO. Ensuite, c’est une leçon pour écrire de très gros morceaux de code procédural et pour diviser la génération d’analyseur / scanner / code en phases sensibles et intelligibles.
Rapidement maintenant
+1 Compilers incorpore tellement de modèles et de principes qu'il vous permettra de voir la conception et le code sous un jour complètement différent après l'avoir fait.
Andrew T Finnell
2
"C’est quelque chose que je pensais ne plus jamais utiliser." Si j'avais un dollar pour chaque fois que je me disais ça quand j'étais plus jeune ....
Nick Spreitzer
37
  1. Structures de données / algorithmes en particulier graphiques. La quantité de situations du monde réel dans lesquelles j'ai réussi à utiliser des algorithmes liés aux graphes a été une surprise pour moi. Concentrez-vous sur la connaissance des caractéristiques du moment où une structure de données ou un algorithme est approprié. Pouvoir voir un problème et savoir utiliser une programmation dynamique / un algorithme glouton, par exemple, est important et peut vous faire gagner beaucoup de temps.

  2. Connaissance pratique de la complexité informatique. Vous n'avez pas besoin de savoir par vous-même quelle est la limite inférieure du type de base, mais savoir comment déterminer quelle est la durée d'exécution la plus défavorable de quelque chose que vous écrivez est important, en particulier pour les projets critiques en termes de performances.

  3. Concepts de système d'exploitation. Gestion de la mémoire, ordonnanceurs, etc. Chaque développeur doit avoir une bonne connaissance des systèmes d'exploitation, étant donné que le code que vous écrivez est en interaction constante avec lui.

  4. NetSec. J'ai rencontré très peu de développeurs qui comprennent parfaitement les problèmes de sécurité de base liés au développement (débordements de mémoire tampon, xss, SQLI, etc.). C'est vraiment un must si vous voulez réussir dans l'industrie. C'est génial si vous pouvez écrire la prochaine grande chose, mais vous n'aurez pas beaucoup d'utilisateurs si vous ne sécurisez pas leurs données.

  5. Paradigmes de programmation. Connaître les caractéristiques et les différences entre la programmation OO / fonctionnelle / procédurale. L’un des meilleurs cours de premier cycle que j’ai jamais eu a été d’écrire des interprètes simples pour 20 leçons de Fortan, Schéma, Prolog, etc. dans les langues mêmes. La simple exposition peut réellement vous aider à comprendre les concepts fondamentaux du développement logiciel.

Kurtis
la source
1
+1 La liste entière est à peu près nécessaire, (4) en particulier est d'une importance capitale à l'ère distribuée moderne.
Orbling
1
+1 sur les structures de données / graphiques. Le nombre de programmeurs que je connais qui ne sait pas utiliser correctement une table de hachage ou pourquoi une liste chaînée plutôt qu'un simple tableau dans certains cas me surprend tous les jours.
Machado
+1 pour les paradigmes de programmation. Une bonne compréhension des contrastes entre différents types de langues aide beaucoup.
apoorv020
19

Répondre aux exigences d'obtention du diplôme n'est pas nécessairement suffisant pour être le meilleur informaticien possible. Pour un programme d’études collégial typique, voici les dix principales choses à apprendre absolument:

  1. Notions élémentaires d'économie - Un cours d'introduction couvrant des sujets tels que les compléments et les substituts est essentiel pour travailler dans la grande économie, ou simplement pour la comprendre. Bien que le concept d'un produit Giffen Good ne vous aide pas nécessairement, connaître les externalités vous aidera. Cela pourrait également vous aider à comprendre que plus de situations gagnant-gagnant sont possibles.

  2. Comment rédiger une preuve - Tous les grands spécialistes de l'informatique doivent savoir rédiger une preuve. Et les mathématiques discrètes, même si elles font partie d’un petit-déjeuner bien équilibré, ne comptent pas. [L'induction n'est qu'une technique de preuve, et vous pouvez vous en tirer sans vraiment en savoir beaucoup sur les preuves.] Un cours d'algèbre ou d'analyse réelle est nécessaire pour vraiment écrire des preuves. Et par algèbre, j'entends la théorie des groupes ou l'algèbre abstraite, pas le cours que vous avez suivi au lycée. Pour un bénéfice total, prenez l'algèbre et l'analyse réelle dans le même terme.

    Pourquoi la preuve écrite est-elle essentielle? Parce que c'est de la programmation! Pensez au moment où vous avez appris à programmer: si une tâche nécessitait uneifet une boucle, vous pourriez ne pas avoir aucune intuition sur où les mettre en relation les uns avec les autres. Mais maintenant, la même tâche semblerait complètement naturelle. Écrire une preuve est très similaire. Vous apprenez une série d’astuces et, une fois que vous les avez apprises, les choses ont l’air très différentes.

  3. Comment écrire - Les compétences en communication écrite sont essentielles, que vous travailliez dans l'industrie ou dans le milieu universitaire. Il est préférable que vous trouviez un cours de mécanique et non un cours d'écriture traitant effectivement d'un sujet différent. Autrement dit, de nombreuses écoles tenteront de rendre les cours d’écriture plus pertinents ou plus intéressants en les abordant comme un sujet particulier. Essayez de choisir la version «ennuyeuse» du cours.

  4. Probabilités et statistiques - Il y a des choses que vous ne maîtriserez que correctement en suivant un cours. Avec les exigences majeures de CS (qui devraient vous donner des calculs discrets, des calculs à variable unique et à variables multiples, et de l'algèbre linéaire) et de l'algèbre et / ou de l'analyse réelle, la collecte de statistiques vous donnera probablement une mineure en mathématiques. L’apprentissage des statistiques peut vous aider à travailler avec d’autres scientifiques sur leurs projets.

  5. Le sujet d'actualité - Au cours des décennies précédentes, il pouvait s'agir de bases de données ou de programmation orientée objet. Aujourd'hui, il peut s'agir d'une programmation Web ou d'une architecture orientée services. Quelle que soit la mode actuelle, assurez-vous d'y suivre un cours. Si seulement pour voir ce que la mode est à propos.

  6. Le problème d'arrêt - La plupart des problèmes ne peuvent pas être résolus par des machines. C'est une idée assez profonde que notre culture a tellement bien absorbée qu'elle ne semble plus choquante. Il en va de même pour la radio, Goedel et la bombe atomique. Ce n'est qu'avec l'art postmoderne et la guerre froide que nous avons pu à nouveau faire face à ces concepts. Cependant, suivre un cours en théorie de la calculabilité peut vous sensibiliser à cette preuve étonnante.

  7. Programmation fonctionnelle pure - Vous n'entrerez probablement pas dans la programmation fonctionnelle pure, sauf si vous faites des recherches ou si vous travaillez pour quelques entreprises, mais sachant que cela vous aidera à devenir un meilleur programmeur. La raison en est que vous allez apprendre de nombreuses nouvelles formes d’abstraction et des concepts tels que les nombres et les continuations d’église, les monades et, bien sûr, la récursivité. Ces outils peuvent également être appliqués à votre prochain programme Java.

  8. P et NP - OK, celui-ci est déjà sur votre chemin critique, mais faites attention quand même. Vous voulez être sûr de pouvoir corriger quelqu'un qui appelle incorrectement NP «non polynomial». Comme si!

  9. Les sujets du cours que vous allez sûrement détester - Il peut s'agir d'un cours CS que vous trouvez trop bas niveau, trop théorique ou d'un cours non CS que vous trouvez trop inacceptable, trop dur ou trop ennuyeux. . Si un cours comme celui-ci semble être un problème pour vous et que vous vous retrouvez à expliquer aux autres pourquoi vous êtes si heureux de ne pas être obligé de suivre telle ou telle chose, cela devrait vous dire que vous en apprendrez beaucoup. en prenant le cours! Peut-être que vous n'apprendrez pas les matériaux du cours, mais vous en apprendrez plus sur vos propres limites et peut-être davantage sur les justifications que vous vous apportez. [Astuce: Ils sont généralement faibles.]

  10. Le cours non-CS que vous allez adorer - À la fin, vous devriez vous amuser. C’est le cours sur lequel vous obtiendrez probablement le moins, mais prenez quand même. Faites-le une fois. Si vous aimez beaucoup de cours, tant mieux, mais assurez-vous que cela ne vous empêche pas de couvrir le reste des cours de cette liste.

Mon approche a été pratique, basée sur des cours que vous pouvez réellement suivre. Et je me suis concentré sur les objectifs d'apprentissage susceptibles d'être appris. Remarque: cette réponse a été adaptée à partir d'un blog de la mienne sur Dix choses que chaque grand informaticien devrait apprendre .

Macneil
la source
Une explication du vote négatif serait utile. Je peux peut-être changer ma réponse et vous pourrez ensuite changer d’avis.
Macneil
Professeur, je ne voterais pas contre votre réponse, mais je vais contester une chose. Écriture de preuve: À ce jour, je ne peux toujours pas écrire de preuve discrète à moins que vous ne me demandiez de prouver qu'un nombre est impair ou pair. Je ne vois pas le lien entre cela et l'industrie. Peut-être que je manque l’aspect "Résolution des problèmes?". Je ne pourrais jamais envelopper mon cerveau autour de l'induction mathématique ou du lemme pompant. Je ne pense pas que cela me ralentisse.
Bryan Harrington
Écrire une preuve, c'est comme écrire un programme. Apprendre à prouver que a * 0 = 0, par exemple, est un peu comme le FizzBuzz des mathématiques (enfin, c’est peut-être un peu plus difficile). Cela peut sembler intimidant au début, mais vous maîtrisez vite les petits trucs, comme lors de l’apprentissage de la programmation. Les preuves peuvent avoir différentes structures qui peuvent vous aider à penser de manière récursive et structurelle. Comme je l'ai dit, un cours de mathématiques discret ne permet pas d'apprendre de vraies preuves. Vous avez besoin de la théorie des groupes ou d'une analyse réelle pour cela.
Macneil
Bien que la connaissance des compliments soit certainement utile, je pense que la connaissance des compléments est plus pertinente pour l’économie.
mardi
1
@ijw: En ce qui concerne l'économie pour les étudiants en CS, Joel a une bonne discussion à lire: joelonsoftware.com/articles/CollegeAdvice.html
Macneil
8

Après avoir parlé à quelques représentants de l'entreprise et à des amis qui ont eu de nombreuses interviews:

  • Bases de données
  • POO
  • Algorithmes
  • Structures de données

ont tendance à être des "incontournables" pour les nouveaux employés (ou, comme ils l'ont dit, des cours "hautement recommandés").

D'autres cours pouvant être utiles sont la sécurité informatique, l'assemblage et l'architecture des machines. Beaucoup de mes professeurs m'ont également recommandé un cours de compilateur. De plus, si vous avez le temps, je recommanderais vivement des cours de mathématiques tels que la théorie des graphes, les mathématiques discrètes et la combinatoire. Vous apprenez beaucoup de raisonnement dans ces cours que la plupart des cours CS négligent, mais qui s'avèrent très utiles pour écrire des programmes très complexes.

J'espère que ça t'as aidé!

K-RAN
la source
1
Je serais d'accord avec OOP et les structures de données.
apoorv020
4
Structures de données de base ... sooooooooooo important. Plus important, je pense, que la POO. Vous devez être capable de réfléchir à la manière de stocker et d’organiser les informations. Et si sur un système embarqué, la disposition en mémoire de vos structures de données est une affaire de vie ou de mort.
Rapidement maintenant
3
+1 pour les cours de mathématiques. Ils vous aident également à apprendre à suivre les grands problèmes / systèmes.
Michael K
1
Le réseautage est une bonne chose à faire également.
Keyo
OOP? Vous pouvez programmer en Haskell ou en C sans OOP ... Je vais vous expliquer que c'est largement utilisé, mais je ne pense pas que ce soit fondamental. L’exposition à divers paradigmes semble en revanche fort utile.
Matthieu M.
6

Cela dépend en grande partie de ce que vous envisagez de faire avec le diplôme. Il semble que la plupart des majors CS finissent par devenir des ingénieurs en logiciel. Dans cet esprit, je ne sais vraiment pas pourquoi davantage de personnes ne se spécialisent pas en génie logiciel. Je soupçonne qu'il n'y a pas assez de programmes de génie logiciel disponibles, en particulier dans les institutions publiques.

Je viens d'un fond intégré. Chaque personne avec laquelle je travaille avait un diplôme en EE ou en CE et c'est en partie parce que, lorsque les «vieux gars» étaient à l'université, il n'y avait pas beaucoup de programmes de CE disponibles. Il est donc assez évident que si vous souhaitez travailler dans le domaine intégré, un arrière-plan matériel est souhaitable.

Cependant, quel que soit le domaine dans lequel vous souhaitez travailler, je pense que chaque programmeur devrait suivre un cours de programmation en assemblage. Vous ne l'utiliserez peut-être jamais, mais il apprendra exactement ce qui se passe au niveau du processeur lors d'un appel de fonction, comment les interruptions sont traitées, comment la mémoire est structurée ou comment les différents modes d'adressage sont utilisés. Je crois que tout cela fera de vous un meilleur programmeur.

De plus, bien que cela ne soit peut-être pas évident, certains de ces sujets sont tous des sujets importants lors de l'examen des structures de données et des algorithmes pour une plate-forme spécifique.

Pemdas
la source
+1 car un diplôme en informatique vous donne une expérience dans un large éventail de sujets / technologies. Veillez simplement à faire attention au cours de conception de logiciels.
M. Ant
+1 Pour le montage, il est toujours sage de vraiment comprendre ce qui se passe au bas de la pile. Ce serait bien si tout le monde connaissait le matériel, mais pour beaucoup, ce serait un pas de trop.
Orbling le
5

Il y a 2 façons de répondre à votre question. Laisse-moi essayer les deux. La première consiste à envisager le marché du travail, les compétences en matière de codage, etc.

  1. Structure de données
  2. Analyse d'algorithme
  3. Programmation orientée objet
  4. Soit un cours spécifique en C ++ ou en Java
  5. Systèmes d'exploitation
  6. Design de l'interface utilisateur
  7. Programmation parallèle

La deuxième façon est de regarder les choses d'un point de vue un peu abstrait, et qui sait, peut aussi être un peu philosophique. La liste ci-dessous ne présente peut-être pas les compétences les plus en demande par le marché du travail, mais je suis presque certaine que, à la fin de ces cours, vous aurez une meilleure connaissance de l'art de développer des logiciels.

  1. Langage fini et théorie des automates
  2. Construction du compilateur
  3. La théorie des graphes
  4. Intelligence artificielle
Fanatic23
la source
Ne vous contentez pas d’énumérer un ensemble de cours qui, à votre avis, sont essentiels, mais donnez les raisons et les expériences qui ont dicté votre liste.
2

J'ajouterais également à la liste les pratiques en matière de génie logiciel ou de conception, bien que leur contenu soit généralement repris par les étudiants de l'industrie.

De plus, à mon avis (bien que ne possédant pas beaucoup d'expérience), les entreprises ne veulent pas vraiment de la plupart des choses théoriques enseignées dans des cours comme les bases de données, etc., elles veulent que les gens comprennent et puissent utiliser ces choses.

EDIT: En raison du vote négatif, j'ai envie d'expliquer ma réponse. Je suis un étudiant en informatique de dernière année et mon expérience est basée sur mon stage et mes entretiens d'embauche avec des entreprises leaders dans le domaine. D'après mon expérience, les utilisateurs sont rarement obligés d'utiliser des algorithmes complexes ou de coder des structures de données très complexes dans des entretiens ou dans des emplois.

Plus utile si vous pouvez créer et utiliser des bases de données, utiliser le contrôle de source, savoir comment déboguer correctement, savoir utiliser des modèles de conception, etc. Cependant, comme je l'ai dit, ces compétences sont généralement acquises dans l'industrie et ne sont pas couvertes dans les cours. Les pratiques de génie logiciel / conception impliquent généralement la construction d'un projet de taille moyenne, très utile pour l'apprentissage de toutes ces compétences.

apoorv020
la source
Veuillez fournir plus de détails sur vos expériences et sur les raisons pour lesquelles une personne devrait suivre ces cours.
@Mark: Pouvez-vous expliquer la raison derrière le vote négatif?
apoorv020
@ apoorv020 sans expliquer pourquoi vous recommandez des pratiques d'ingénierie logicielle ou de conception, votre réponse n'est pas utile. Votre édition n'explique toujours pas pourquoi vous les recommandez.
@ apoorv020 La seule valeur utilisable lors de la prise de pratiques d'ingénierie logicielle ou de conception est que vous construisez généralement un projet de taille moyenne (peu importe ce que cela signifie)? Qu'avez-vous appris personnellement en suivant ces cours?
C'est bon à savoir, mais ce ne sont pas des sujets CS.
Thomas Owens
2

Choses que j'ai apprises au collège et que j'utilise tous les jours:

  • Méthodologie de conception orientée objet
  • Modèles de conception
  • Expressions régulières
  • Algorithmes de base et analyse
  • Structures de données

J'aimerais avoir suivi un cours de base de données. (J'en ai assez appris depuis que j'ai obtenu mon diplôme, mais j'aimerais en savoir plus.) J'aimerais également apprendre le contrôle de version - il est omniprésent, extrêmement utile et a été complètement ignoré dans le programme de mon école.

J'ai dû prendre plusieurs cours de mathématiques. Je n'ai pas utilisé de calcul depuis mon diplôme. J'aimerais avoir suivi un cours de statistiques. (Encore une fois, j'en ai assez pour me débrouiller depuis l'obtention de mon diplôme, mais j'aimerais en savoir plus.)

Au-delà du département CS, suivez un cours d'écriture. De bonnes compétences en communication écrite sont essentielles au succès.

pwc
la source
+1 Surpris que les bases de données n'étaient pas obligatoires dans votre cours, elles étaient généralement considérées comme un composant essentiel.
Orbling
C'était. Je m'en suis tiré sur un détail technique et je le regrette.
Pwc
@Orbling: Souvent, les petits départements (par opposition à ceux des grandes écoles publiques) n'ont tout simplement pas assez de conférenciers pour traiter de tous les sujets principaux. Dans mon école, par exemple, les bases de données étaient une option.
Macneil
@ Macneil: Dans mon cours, le cours sur les bases de données primaires était une condition préalable (couvrant toutes les bases: modélisation ER, formes normales, SQL (pas seulement SQL de base, composé / imbriqué, etc.), placement d'index, etc.), cette dernière étant plus complexe. , les cours de base de données étaient au choix (je pense qu’il y en avait trois au total). Je n'ai jamais choisi de les suivre, car je pensais que c'était une matière que je pouvais assimiler de manière autonome plus facilement que d'autres cours qui me manqueraient. Je pense que j'ai pris avancé OU à la place.
Orbling
@pwc: Je parie, vous souvenez-vous pourquoi vous en êtes sortis plutôt que comment?
Orbling
2

Il existe de nombreux cours importants, selon la direction dans laquelle vous prévoyez d'aller. Cependant, en supposant que vous puissiez programmer, le cours le plus important doit être:

  • Structures de données et algorithmes

    Pratiquement tout en informatique revient à traiter des données en utilisant des algorithmes. Portez une attention particulière aux tableaux et aux tables de hachage, car ils sont de loin les structures de données les plus utiles couramment utilisées, mais les listes, les arbres et les graphiques (ainsi, les listes sont des types d'arbres restreints et les arbres sont de types restreints) vont être important aussi. De plus, la compréhension des algorithmes est essentielle pour produire un code qui ne soit pas terrible. (Sinon, vous ferez des choses terribles, comme utiliser un algorithme O ( n 3 ) où un O ( n log n ) sera appliqué.) Si votre diplôme de CS n’a pas de cours obligatoire DS + A, ce n'est pas CS. Ou génie logiciel. Ou même simplement la programmation.

À part cela, le cours que j'ai trouvé le plus utile au fil des ans dans plusieurs domaines a été:

  • Simultanéité

    La simultanéité comporte de nombreux aspects, mais je m'attendrais à une compréhension de la différence entre la mémoire partagée et la transmission de messages. J'aimerais aussi que les stratégies de verrouillage (mutex, sémaphores, etc.) et les transactions soient fortement couvertes.

    Ceci est essentiel pour comprendre la parallélisation, bien sûr, mais également pour tout ce qui est distribué (par exemple, l'écriture d'un service exposé à Internet, même s'il est mono-thread, car les clients seront de toute façon asynchrones). Je comprends que cela est également utile pour l’écriture de jeux (généralement multithread) et le travail avec des appareils intégrés.

En dehors de cela, je pense qu'il est dans l'intérêt de la plupart des étudiants de premier cycle que d'être exposés à autant d'idées différentes que possible. Beaucoup de langages de programmation et de paradigmes. Beaucoup de domaines d'application différents. Une quantité raisonnable de maths (encore une fois, parce que cela est souvent utile) et également une exposition à des facteurs humains et à la psychologie (car tout logiciel qui interagit avec les utilisateurs traite avec des gens). Après tout, vous ne savez jamais exactement ce que vous allez faire dans le futur. Planifier la flexibilité est donc une excellente stratégie de vie.

Donal Fellows
la source
1

Quand j'étais à la fac, il y avait pas mal de sujets pour lesquels je ne voyais aucune utilité dans ma vie réelle et parfois cette intuition a été prouvée juste (les méthodes formelles ne sont vraiment pratiques que pour des problèmes triviaux dans la plupart des cas) et d'autres fois a été totalement faux (la notation Big-O est très utile) donc je suppose que dans l’ensemble, mon plus jeune moi avait raison.

Si vous souhaitez vous préparer au monde réel, en plus des suggestions recommandées ci-dessus par @ K-Ran, je vous suggère de lire Code Complete et de l'utiliser comme base pour des recherches plus approfondies sur tous les sujets que vous trouvez difficiles ou que vous ne pensez pas avoir. suffisamment couvert.

glénatron
la source
J'ai parfois trouvé que les méthodes formelles étaient utiles, bien que visiblement seulement pour de petits composants. J'ai pensé à Dijkstra et al. en disant quelque chose comme "Si vous êtes un mathématicien parfait, vous pouvez être un bon programmeur."
David Thornley
Je suppose que si vous travaillez sur du code, la vie dépendra de vous, vous devez en avoir une solide connaissance. Mais pour le travail que j'ai effectué, cela n'a jamais été nécessaire. Si j'en avais besoin maintenant, je devrais y retourner et le réapprendre à partir de zéro ...
glenatron
Des éléments tels que Z ne sont réellement utilisés que pour les logiciels critiques dans les organisations où, comme vous le dites, des vies sont en danger. Cependant, je pense que leur apprentissage implique une prise de conscience beaucoup plus grande de la correction du code et donne de la profondeur à la spécification de tous types. Parfois, ce que vous apprenez n’est pas seulement une raison d’être, mais vous aide à vous assurer de ce qui est au-dessus.
Orbling
Pensez-y comme faisant de plus gros blocs de construction qui sont solides. Si vous avez prouvé que vos composants étaient corrects (et que vous les avez testés pour trouver les erreurs stupides que vous avez commises dans la conception et la preuve), vous avez moins de soucis à vous faire lors de l'écriture et du débogage.
David Thornley
1

Je pense que vous devriez étudier ce qui suit:

Système d'exploitation: - Même si vous n'en avez peut-être pas besoin pour travailler en tant que programmeur, il est utile de savoir comment fonctionne un système d'exploitation et ce qui est attendu d'un grad CS. Tout bon livre peut aider.

OOP: - Ceci est du pain et du beurre. Un indispensable. Livres si vous voulez demander: Votre premier livre devrait être: - Head OOAD, alors vous pouvez choisir le livre de Grady Booch et Ivar Jacobson

Structures de données et algorithmes: - Très important de développer la pensée logique et la mentalité.

Pour moi cela suffit. Ce n'est jamais trop tard. :)

Abhi
la source
1

En tant que personne qui interviewe régulièrement les candidats aux emplois de programmation et qui, après avoir été dans l'industrie pendant plus de 12 ans, se sent raisonnablement accomplie, je suggérerais ce qui suit:

  • Conception de bases de données et SQL: Il est étonnant de voir combien de programmeurs ne connaissent pas le SQL simple, et ceux qui ont de bonnes compétences en SQL sont inestimables. Être capable de concevoir une bonne base de données peut ne pas être utile dans une entreprise qui a une structure de base de données définie, pour les start-ups et les entreprises en mutation, c'est un MUST!
  • Modèles de conception. Ils vous aideront simplement à prendre de meilleures décisions pour un bon design
  • OOP: Ceci est généralement un pré-requis pour la plupart des cours, mais cela vous aidera.
  • Algorithmes: parce que si peu de gens savent ce qu'est la récursivité, encore moins de savoir quand cela pourrait leur éviter beaucoup de codage complexe
  • Structures de données: la plupart des langages modernes traitent ce problème pour vous, mais leur compréhension est la clé d'un bon design.

Ensuite, quelques travaux extrascolaires, lisez:

  • Livres de type de certification. Ils vous apprennent souvent le type de syntaxe et d'opérateurs sous les couvertures. Il est bien plus important de SAVOIR pourquoi vous faites quelque chose que de «parce que ça marche», ce qui est si banal.
Codemwnci
la source
1

C'EST DÉPENDU , il n'y a pas une seule bonne réponse à cette question.

Programmeur est un monde général pour identifier une personne qui écrit un logiciel.

Maintenant, il existe des logiciels de toutes sortes. Par exemple, en utilisant wikipedia comme source de généralisation, nous pouvons rencontrer 3 grandes généralisations :

  • programmation système
  • logiciel de programmation
  • logiciel d'application

Dans le premier programme de terrain , développez des pilotes de périphériques, des systèmes d’exploitation, des serveurs, pour pouvoir par exemple suivre un cours sur les systèmes d’exploitation.

mais qu'en est-il des logiciels de programmation ? Ici, comme l'a écrit Wikipédia, vous pouvez coder des compilateurs, des débogueurs, des interprètes, des lieurs, des éditeurs de texte. Un cours sur la théorie automatique, la théorie des langues, la langue et les compilateurs peut donc être utile.

On ne peut pas parler de logiciels d’application de toutes sortes:
- jeux vidéo: algèbre, physique, cours orientés objet?
- logiciel mathématique: cours de mathématiques?
- édition d'images: cours de mathématiques, de physique, d'algorithmes?
- automatisation industrielle: cours de mathématiques, de physique, d'algorithme, de robotique?
- logiciels médicaux: biologie, médecine, quoi d'autre cours?
- beaucoup de choses ici: beaucoup de cours ici.

Comme vous pouvez le constater, il y a bien sûr beaucoup de choses que vous pouvez suivre et qui deviendront utiles pour votre travail.

D'après mon expérience, je suis un logiciel d'ingénierie système et un logiciel d'application dans le domaine de la sécurité (vous voulez suivre un cours de sécurité?), À partir d'un peu d'expérience en programmation, les algorithmes et les systèmes distribués m'intéressent de plus en plus, et encore mal à l'aise dans la simplicité de l'application d'usage général que j'ai écrite (renifleur, système de détection d'intrusion de réseau, dissecteur de protocole et détecteur, etc.).

Comme vous l'avez appris en informatique théorique! Avez-vous parcouru ces cours? : P

Vous avez appris par exemple que tous les langages informatiques peuvent être intégrés dans un ensemble de fonctions mathématiques calculables. Par exemple, si votre expérience suit le même chemin, vous serez bientôt mal à l'aise dans ce petit ensemble de calcul et, comme moi, vous pourrez commencer à voir comment évolue le logiciel n’est pas aussi attrayant et étonnant, car le même modèle de conception revient (vous suivez des cours de modèle de conception?) et vous pouvez par exemple commencer à vous intéresser davantage à POURQUOI et COMMENT la langue peut être traduite en fonction mathématique et commencer à Apprenez que le langage informatique n’est pas si complexe! par exemple, vous pouvez bientôt être plus surpris de la personne et de la psychologie, vous pouvez obtenir plus d’intérêt et devenir un bon chef de projet! avez-vous suivi les cours sur le cycle de vie des logiciels?

Alors maintenant, quel est le cours MUST-HAVE dans votre carrière de CS?

Je suggère d’apprendre le plus possible dans tous les domaines, en particulier dans le domaine théorique, car dans le même domaine de travail, vous vous sentez vite ennuyé par le peu de complexité qui vous entoure et, en devenant travailleur à temps plein, vous avez vraiment moins de temps pour apprendre. comment les choses fonctionnent vraiment et beaucoup plus de temps pour voir comment les personnes ayant une forte connaissance théorique ont projeté des choses au travail et vous ont donné la possibilité de coder pour obtenir de la nourriture à la maison.

il y a un mauvais sens de la réalité en informatique. l'informaticien par exemple est parfois très éloigné du développeur de logiciels.

jetez un coup d'œil à l'explication de Wikipedia.

amusez-vous avec la vie :)

mes 2 cents.

désolé pour mon très mauvais anglais.

boos
la source
1

La première chose que les étudiants de CS devraient maîtriser est l'anglais.

Sans compréhension de l'anglais parlé et écrit, vous serez toujours désavantagé.

Il suffit de regarder la multitude de questions posées sur les sites Stack. Trop nombreux sont difficiles à déchiffrer. Certaines personnes utilisent un mélange de l33t et de textos (vous ne savez pas quel est le terme correct). D'autres font une déclaration et ajoutent simplement un point d'interrogation en manquant d'importantes petites pensées comme des verbes ou des adjectifs.

Si vous ne pouvez pas communiquer, vous ne pourrez pas vous faire comprendre beaucoup moins comprendre ce que les autres disent.

Tout le reste n'est que des détails. Si vous êtes capable de communiquer, si vous avez au moins une intelligence moyenne et que vous pouvez comprendre ce que vous lisez, vous pourrez également avoir une programmation de carrière réussie.

Pas moi
la source
1

J'aborde ce point de vue sous un angle légèrement différent en ce sens que je n'ai pas obtenu de diplôme en informatique, mais un diplôme en génie électronique (avec une mineure en commerce).

Sur cette base, je pense qu'une liste de choses que vous devez comprendre est relativement courte, car moi-même (et de nombreux autres diplômés en CS), je vis heureux, sans rien connaître de la conception d'un compilateur ou autre.

Ce que je dirais, j'ai compris ce que je trouve utile:

  • Conception de SGBDR - Les SGBDR reposent sur la plupart des systèmes et des sites et vous devez au moins comprendre les principes de base de ce qui se passe (j'ai appris cela au travail).
  • Conception d'interface utilisateur de base - tous les meilleurs programmeurs avec lesquels j'ai travaillé pourraient produire une application utilisable qui n'était pas si laide que ça. Sauf un, mais il est l'exception qui confirme la règle.
  • Certains programmes de base - et je veux dire de base. J'ai appris le C (pour le traitement de l'image et les systèmes intégrés), le langage d'assemblage (que j'avais oublié quelques semaines après avoir terminé le cours) et le Pascal (un cours d'informatique de base était standard pour tous les ingénieurs). En interviewant, je suis abasourdi par le fait que peu de diplômés en CS peuvent réellement programmer de la manière que les organisations commerciales jugeraient utile-
  • Logique - Je l'ai appris grâce à l'électronique numérique, aux mathématiciens grâce à la théorie, aux diplômes CS grâce à la programmation, mais peu importe la façon dont vous l'apprendre, vous devriez bien en saisir le sens.
  • Aptitudes à la communication - J'ai suivi quelques cours à l'université en dehors de mon diplôme actuel, de ma présentation et de mon assurance. Beaucoup de bon sens, mais il n'est jamais mauvais de se faire dire plusieurs fois des choses sensées.
  • Les bases de l'entreprise et de la comptabilité. Certains programmeurs agissent comme si cela importait peu mais, à mon sens, cela importe à quiconque travaille dans une entreprise - c'est comme ça que le jeu fonctionne et qu'il va contrôler votre vie alors pourquoi ne voudriez-vous pas au moins connaître les rudiments de comment et pourquoi les choses se passent?

Et si vous avez la possibilité de vous familiariser avec la gestion de projet, cela ne vous dérangera vraiment pas, mais l'enseignement y est très mal enseigné à l'université et vous en apprendrez un peu plus au travail rien qu'en travaillant sur des projets.

Jon Hopkins
la source
0

J'ajouterais également quelques cours de base en ressources humaines / psychologie à la liste.

Cela peut sembler un ajout étrange, mais une partie du travail professionnel consiste à apprendre à se vendre et à négocier. Entrer dans votre première «vraie» entrevue sans avoir une connaissance solide des motivations du drone RH est une recette pour un désastre et finira probablement avec le fait que l'étudiant se fasse avoir par un salaire dérisoire.

Connaissez votre ennemi pour pouvoir vous protéger.

Peter Bernier
la source
-1

1 ère année:

  1. POO de base dans un langage de haut niveau
  2. Structures de données

2e année:

  1. Compilateur, vous construisez un scratch simple formulaire
  2. Simultanéité

3ème année:

  1. Algorithme
  2. Système d'exploitation, vous ajoutez des fonctionnalités et des améliorations à un simple
  3. Langue formelle

4ème année:

  1. La mise en réseau
  2. Système distribué
  3. Interface utilisateur
  4. Compilateur avancé
  5. Système d'exploitation avancé
  6. Intelligence artificielle
  7. Infographie

Ces cours devraient fournir beaucoup de théorie et de pratique de codage.

Thierry Lam
la source
-2

C'est étrange que personne n'ait mentionné l'architecture informatique.

Sorantis
la source
Je pense que l'architecture informatique est importante pour savoir si vous voulez comprendre l'impact des caches de mémoire, des fautes de page, etc.
apoorv020