+1 Les compilateurs ont été les plus difficiles et les plus gratifiants.
dietbuddha
3
C'était là-haut avec le plus de travail et une bonne préparation pour le codage grognement, mais je ne pense pas que ce soit si difficile. Peut-être plus difficile sans utiliser YACC ou les outils que nous avons utilisés, je ne sais pas.
Peter Turner
4
Les compilateurs ne sont vraiment difficiles que parce que la plupart des théories datent de périodes de contraintes matérielles incroyablement sévères et une grande partie de l'instruction formelle n'a pas avancé trop loin. Jetez un œil à Let's Build A Compiler pour voir à quel point l'écriture par le compilateur peut être facile si vous l'abordez sous un angle différent.
Mason Wheeler
1
@Martin York, en tant qu'écrivain de compilateur, je pense que la complexité de l'implémentation des compilateurs est surestimée sérieusement. En général, un compilateur est beaucoup plus simple qu'un interprète. Je soupçonne que c'est un Dragon Book et son genre est à blâmer, ils proposent les façons les plus compliquées de faire des choses simples et prêtent trop d'attention à l'étape la moins importante, à savoir l'analyse.
SK-logic
1
@Martin York, il existe des techniques pour maintenir un AST aussi simple et maintenable que possible, quelle que soit la complexité du langage source. Il existe également un certain nombre de techniques très simples mais puissantes pour garder chaque étape de la compilation triviale et isolée.
SK-logic
22
Conception et analyse d'algorithmes
Je pense que cette question dépend de l'enseignant que vous avez eu et de la façon dont cette matière a été organisée dans votre carrière.
L'analyse d'algorithmes peut être aussi difficile que quelqu'un le souhaite. Prenez en compte qu'il y a des problèmes non résolus, et pas seulement: des problèmes qui ne peuvent pas être résolus.
Le fait est que vous pouvez avoir un problème, et si vous savez qu'il ne peut pas être résolu, c'est parfait. Et si vous ne le faites pas? Vous pouvez passer beaucoup de temps à essayer de démontrer qu'il est NP-Complete ou à trouver une solution temporelle polynomiale pour le résoudre.
Démontrer la complétude NP n'est pas facile. Oui, beaucoup de problèmes sont connus, mais le problème est de trouver les réductions pour démontrer que c'est NP-Complete. Et si vous passez beaucoup d'heures / jours / mois à essayer de le démontrer, et que cela peut être résolu en temps polynomial? :)
Il y a aussi d'autres sujets, comme les compilateurs , la théorie de groupe et les fonctions récursives primitives qui peuvent être aussi difficiles que le plan du sujet ou le professeur le veut;)
s / Analisis / Analyse ... sinon exactement ce que je pense ... fonctions récursives primitives, uargh !!
Felix Dombek
D'accord, je me suis embrouillé dans mon baccalauréat sans être confiant d'avoir jamais réussi à `` prouver '' quoi que ce soit (bien que mon cours d'algorithmes était beaucoup trop simple, à cause du professeur)
Peter Turner
Je vais vous montrer ces jours-ci à quel point les algorithmes peuvent être difficiles :)
Oscar Mederos
18
Reconnaissance de formes, c'est-à-dire intelligence artificielle. Cela fait référence à l'informatique intelligente ainsi qu'à d'autres outils de reconnaissance de formes tels que la reconnaissance optique de caractères, la voix au texte, l'identification faciale, etc.
Beaucoup des choses "sympas" que vous pouvez faire ou souhaiteriez faire avec les ordinateurs s'appuient sur ces algorithmes, et nous essayons de les perfectionner depuis des décennies sans grand succès.
C'est difficile parce que ce n'est pas quelque chose de déterministe. Développer une bonne reconnaissance de modèle d'IA nécessite une expérimentation pour chaque application pour laquelle vous souhaitez l'utiliser, pour vous assurer de choisir le bon algorithme, les bonnes fonctionnalités, etc ...
Ken Bloom
1
Je commence tout juste à gravir cette montagne particulière (reconnaissance des formes). C'est dur. BEAUCOUP de mathématiques. Grands, énormes tas de maths intimidants, me fixant, osant entrer.
David Poole
eh bien ... la reconnaissance de modèle peut également être considérée comme des statistiques appliquées, ce n'est pas seulement un problème dans la plage de CS
Je conviens que la théorie du calcul était difficile, mais c'était aussi l'un de mes sujets préférés. Certes, je faisais une double spécialisation en mathématiques ...
Poindexter
+1 J'ai aussi une double majoration. Je pourrais gérer une introduction à ce genre de choses, mais la version diplômée ... content que je l'ai laissé tomber!
Job
c'était dur, nous n'en savons pas tellement que ça n'a pas beaucoup d'importance.
Afficher le nom le
10
Il n'y a que deux problèmes difficiles en informatique: l'invalidation du cache et le nommage. - Phil Karlton
Bien que de plus en plus populaire, Crypto n'est pas unique aux logiciels.
JBRWilkinson
La crypto n'est pas si difficile. Le problème est que la sécurité ne peut pas être testée facilement, donc vous ne remarquez vos erreurs que lorsque quelqu'un vous pirate. Mais le manque de testabilité s'applique à la plupart des formes de sécurité informatique, pas seulement à la cryptographie.
CodesInChaos
4
Systèmes d'exploitation, en particulier la partie qui a quelque chose à voir avec le filetage.
Et la raison n'est pas parce qu'il était si difficile de faire manger de la pizza à la fourchette par 5 philosophes. La raison en est que l'écriture de code multithread est en soi difficile et pas nécessairement facile à calculer pour l'esprit humain (au moins masculin - selon ma femme).
Laissez votre femme écrire le code multithread alors :)
3
N'oubliez pas qu'en matière de multithreading à mémoire partagée, l'ordinateur est un porc sournois qui est là pour vous attraper. Doublement ainsi lorsqu'il s'agit d'un processeur multicœur; un noyau peut vous distraire devant vos yeux là où vous regardez, et l'autre peut alors passer derrière vous et vous poignarder dans le dos.
Donal Fellows
3
Moi aussi, je vote pour Compiler Design. Surtout là où la partie DFA et NFA entre en jeu. Je ne suis pas aussi clair sur les problèmes NP et autres.
Ouais, j'aurais eu plus de mal avec les compilateurs si je n'avais pas pris la théorie du calcul en premier.
Peter Turner
Les DFA et NFA sont des aliments pour poulets. Attendez d'avoir à analyser LALR (1).
David Thornley
3
Théorie des files d'attente
Eh bien, techniquement, c'est une branche des mathématiques, mais elle est très pertinente en CS.
Presque tout dans CS est basé sur des files d'attente (visibles (évidentes) et invisibles (pas si évidentes ou implicites)).
Au début de CS, les files d'attente étaient évidentes.
Une file d'attente de programmes (chacun programme un jeu de cartes).
De nos jours, les files d'attente ne sont pas si évidentes. Internet par exemple: un réseau à commutation de paquets, mais les paquets forment des files d'attente et le routage des paquets est une forme de minimisation des files d'attente.
Non (Autant que (On pourrait (voir), Mais (Cela a été (connu)). Pour arriver)).
Martin York
3
Analyse numérique
Ce n'est pas trop difficile avec les problèmes de jouets qui vous sont donnés dans le cours, mais une fois que vous commencez à considérer de vrais problèmes, cela se transforme en corvée grave.
Interpréter les exigences du client lorsque le client ne sait pas vraiment ce qu'il veut. Ce n'est pas enseigné au collège et c'est l'une des compétences les plus essentielles à posséder.
Je ne suis pas sûr d'être d'accord avec celui-ci comme étant un concept informatique. Je ne vois pas non plus comment cela peut être résolu en utilisant la méthode scientifique.
jmort253
@ jmort253 - C'est vrai, mais l'informatique essaie (sans succès à mon avis) d'étudier ce domaine avec des méthodes formelles de conception et de validation.
mouviciel
Je suis d'accord n'est pas un concept "informatique" - mais quand j'ai commencé ma carrière, je n'étais pas conscient / inconscient du fait que les clients ne savent pas ce qu'ils veulent. Je pensais que TOUS les projets logiciels étaient livrés avec une sorte de document d'exigences formelles. Peut-être un sujet de conférence pour un cours de génie logiciel (peut-être que mon collège ne l'a pas couvert)?
Steven Striga
1
Personnellement, le mien était Formal Logic. C'était difficile de commencer, mais une fois que vous avez établi les règles et que vous avez réussi à jouer suffisamment avec, votre cerveau s'en vaLogic++; , ce qui en développement est une très bonne chose.
En guise de note complémentaire, je réponds directement à la question - ce n'était certainement pas le sujet le plus difficile lorsque j'ai obtenu mon diplôme, mais c'était probablement le sujet le plus difficile "applicable dans la vie réelle".
La logique formelle est quelque chose avec laquelle j'ai eu une relation amour / haine. J'ai aimé réfléchir à travers les concepts, mais je n'ai jamais pu comprendre comment cela m'aidait plus tard lorsque j'ai rencontré des problèmes du monde réel qui nécessitaient une réflexion logique.
jmort253
@ jmort253 - C'était vraiment la même chose pour moi. J'ai même eu du mal au point de penser que j'allais échouer, j'ai étudié si longtemps et durement jusqu'à ce qu'il clique enfin dans ma tête. Après cela, les avantages ont été incroyables.
Kyle Rozendo
1
Constructions du compilateur. Difficile mais doit comprendre les concepts derrière
Vous devriez voter pour la même réponse qui vous a été fournie, plutôt que de répéter la même réponse.
Abimaran Kugathasan
1
Conception du noyau n'importe qui? Eh bien, je ne sais pas vraiment comment cela se fait et quelles sont les fonctionnalités ciblées pour un système d'exploitation, mais pour moi, penser à la conception d'un noyau doit être une tâche intimidante.
Je pense aussi à la sécurité informatique ; Je ne sais pas vraiment ce qui rend un système dangereux, sauf bien sûr, les débordements de tampon évidents, les injections XSS et SQL.
Je ne suis pas sûr, mais il semble que certains algorithmes soient également dangereux; regardez le projet MetaSploit, il répertorie tous les types et types de violations de sécurité: vous pouvez voir qu'il existe de nombreuses façons dont un programme peut être défectueux.
Il existe de nombreux sujets délicats dans le domaine, mais mes choix pour une difficulté persistante sont ceux impliquant les propriétés du système global . Voici des exemples de ce sujet général:
Multi-threading sûr et sans blocage
Sécurité
Ce sont difficiles parce que vous recherchez quelque chose qui n'existe que lorsque tout est correct; vous avez besoin d'une propriété système globale et pourtant pratiquement tous les outils disponibles (et tous ceux qui s'adaptent aux problèmes réels de mon expérience) ne font vraiment que du raisonnement local. C'est le processus de passer du raisonnement sur les morceaux du programme à l'ensemble du shebang qui est difficile, en particulier parce qu'il est tout à fait possible d'avoir des morceaux qui sont tous corrects en eux-mêmes mais où il y a encore des bogues subtils parce que les composants sont mal organisés; les bogues peuvent être des caractéristiques émergentes indésirables…
Services d'information sur la gestion
Pendant ma période collégiale, j'avais un sujet de gestion par semestre, ce qui me rendait complètement fou.
Dure! les sujets comme Compiler Design , OS Design etc. sont difficiles mais ils sont vraiment intéressants et stimulants. J'ai vraiment gâché des sujets comme le système / les services d'information de gestion, etc., car ils sont pleins d'ennui et vous devez passer par beaucoup de théorie.
Plein d'ennui parce qu'ils parlent des subtilités conceptuelles de chaque système, tandis que la moitié des gens n'ont jamais écrit de système eux-mêmes (mais ils en ont sûrement utilisé une variété). En outre, les séminaires utilisent autant de mots chargés mais ne fournissent pas un exemple réel en anglais simple. Comme les systèmes d'aide à la décision ... ne pourriez-vous pas simplement déposer quelques captures d'écran des rapports Google Analytics, FML, juste pour mettre les étudiants sur la même page avant de vous lancer dans un orgasme intellectuel devant le public.
Filip Dupanović
0
Si vous travaillez en C / C ++, les pointeurs sont le concept le plus important à connaître. Mais d'une manière ou d'une autre, je ne l'ai jamais entièrement compris à l'université.
vraiment? Je veux dire, chaque personne est différente, mais je pense qu'il y a beaucoup (je veux dire, beaucoup ) de sujets plus difficiles que de simples pointeurs . Par exemple, Computer's Architecture , Assambler qui sont en quelque sorte liés à des pointeurs ;)
Oscar Mederos
Certes, mais vous trouverez la compréhension du référencement de la mémoire via les assembleurs beaucoup plus facile, car vous travaillez en fait avec des pointeurs bruts , tandis qu'en C / C ++, vous travaillez avec des références à des pointeurs, ce qui confond tout le monde, car l'abstraction n'est jamais parlée ouvertement sur.
Filip Dupanović
2
Ah assambler, le meilleur thé du programmeur
Matt Ellen
Le gars a posé des sujets difficiles mais importants, d'où des pointeurs.
Manoj R
@Matt: Vous venez de faire ma journée: D @Manoj R: Les pointeurs sont triviaux si vous les considérez simplement comme un accès au tableau. Ou l'accès à la baie est-il difficile?
back2dos
0
Conception et analyse d'algorithmes. Ce n'est pas tant qu'il est difficile de comprendre et d'analyser des algorithmes connus , c'est que la conception et l'analyse de nouveaux algorithmes pour des problèmes difficiles sont difficiles, et nécessitent une large compréhension de nombreux domaines et une pratique dans l'application de nombreuses techniques différentes.
Notation Z / méthodes formelles utilisées pour me faire mal au cerveau à l'université. Principalement parce que je détestais ça. Difficile est beaucoup plus facile lorsque vous aimez ce que vous faites et beaucoup plus difficile lorsque vous ne le faites pas.
J'aime vos réponses (et je n'ai pas oublié de les voter), comme le compilateur, le noyau, etc., mais la plupart des programmeurs n'ont jamais rencontré ces problèmes. Il y a un problème un peu plus facile, mais plus courant: concurrence - threads, verrouillage. Il est très facile d'écrire un programme qui produit des erreurs magiques, si nous faisons même un petit bogue dans l'architecture de concurrence.
Donc, je dis, ce n'est pas le problème le plus difficile en informatique, mais parce qu'il est couramment utilisé, il est dangereux.
C'est probablement parce que je me suis coupé les dents sur FORTRAN et APL, mais le passage des langages strictement procéduraux aux objets est une chose avec laquelle je me bats depuis des années. Cela n'aide pas que les soi-disant «experts» écrivent des articles et des didacticiels contradictoires sur ce que signifie être orienté objet et les meilleures / bonnes façons de construire des programmes orientés objet.
Réponses:
"Il y a 2 problèmes difficiles en informatique: les erreurs de mise en cache, de nommage et off-by-1"
la source
Honnêtement, la construction du compilateur!
la source
Conception et analyse d'algorithmes
Je pense que cette question dépend de l'enseignant que vous avez eu et de la façon dont cette matière a été organisée dans votre carrière.
L'analyse d'algorithmes peut être aussi difficile que quelqu'un le souhaite. Prenez en compte qu'il y a des problèmes non résolus, et pas seulement: des problèmes qui ne peuvent pas être résolus.
Le fait est que vous pouvez avoir un problème, et si vous savez qu'il ne peut pas être résolu, c'est parfait. Et si vous ne le faites pas? Vous pouvez passer beaucoup de temps à essayer de démontrer qu'il est NP-Complete ou à trouver une solution temporelle polynomiale pour le résoudre.
Démontrer la complétude NP n'est pas facile. Oui, beaucoup de problèmes sont connus, mais le problème est de trouver les réductions pour démontrer que c'est NP-Complete. Et si vous passez beaucoup d'heures / jours / mois à essayer de le démontrer, et que cela peut être résolu en temps polynomial? :)
Il y a aussi d'autres sujets, comme les compilateurs , la théorie de groupe et les fonctions récursives primitives qui peuvent être aussi difficiles que le plan du sujet ou le professeur le veut;)
la source
Reconnaissance de formes, c'est-à-dire intelligence artificielle. Cela fait référence à l'informatique intelligente ainsi qu'à d'autres outils de reconnaissance de formes tels que la reconnaissance optique de caractères, la voix au texte, l'identification faciale, etc.
Beaucoup des choses "sympas" que vous pouvez faire ou souhaiteriez faire avec les ordinateurs s'appuient sur ces algorithmes, et nous essayons de les perfectionner depuis des décennies sans grand succès.
la source
Mon choix est la théorie de la calculabilité
(Hmm ... peut-être que ce n'est pas si important, mais c'était sûr difficile)
la source
la source
théorie des catégories (mathématiques discrètes), mais ça vaut le coup
la source
Cryptographie
Si vous le faites un peu mal, cela pourrait coûter des millions à une entreprise.
la source
Systèmes d'exploitation, en particulier la partie qui a quelque chose à voir avec le filetage.
Et la raison n'est pas parce qu'il était si difficile de faire manger de la pizza à la fourchette par 5 philosophes. La raison en est que l'écriture de code multithread est en soi difficile et pas nécessairement facile à calculer pour l'esprit humain (au moins masculin - selon ma femme).
la source
Moi aussi, je vote pour Compiler Design. Surtout là où la partie DFA et NFA entre en jeu. Je ne suis pas aussi clair sur les problèmes NP et autres.
la source
Théorie des files d'attente
Eh bien, techniquement, c'est une branche des mathématiques, mais elle est très pertinente en CS.
Presque tout dans CS est basé sur des files d'attente (visibles (évidentes) et invisibles (pas si évidentes ou implicites)).
Au début de CS, les files d'attente étaient évidentes.
Une file d'attente de programmes (chacun programme un jeu de cartes).
De nos jours, les files d'attente ne sont pas si évidentes. Internet par exemple: un réseau à commutation de paquets, mais les paquets forment des files d'attente et le routage des paquets est une forme de minimisation des files d'attente.
la source
Analyse numérique
Ce n'est pas trop difficile avec les problèmes de jouets qui vous sont donnés dans le cours, mais une fois que vous commencez à considérer de vrais problèmes, cela se transforme en corvée grave.
la source
Interpréter les exigences du client lorsque le client ne sait pas vraiment ce qu'il veut. Ce n'est pas enseigné au collège et c'est l'une des compétences les plus essentielles à posséder.
la source
Personnellement, le mien était Formal Logic. C'était difficile de commencer, mais une fois que vous avez établi les règles et que vous avez réussi à jouer suffisamment avec, votre cerveau s'en va
Logic++;
, ce qui en développement est une très bonne chose.En guise de note complémentaire, je réponds directement à la question - ce n'était certainement pas le sujet le plus difficile lorsque j'ai obtenu mon diplôme, mais c'était probablement le sujet le plus difficile "applicable dans la vie réelle".
la source
Constructions du compilateur. Difficile mais doit comprendre les concepts derrière
la source
Conception du noyau n'importe qui? Eh bien, je ne sais pas vraiment comment cela se fait et quelles sont les fonctionnalités ciblées pour un système d'exploitation, mais pour moi, penser à la conception d'un noyau doit être une tâche intimidante.
Je pense aussi à la sécurité informatique ; Je ne sais pas vraiment ce qui rend un système dangereux, sauf bien sûr, les débordements de tampon évidents, les injections XSS et SQL.
Je ne suis pas sûr, mais il semble que certains algorithmes soient également dangereux; regardez le projet MetaSploit, il répertorie tous les types et types de violations de sécurité: vous pouvez voir qu'il existe de nombreuses façons dont un programme peut être défectueux.
la source
Il existe de nombreux sujets délicats dans le domaine, mais mes choix pour une difficulté persistante sont ceux impliquant les propriétés du système global . Voici des exemples de ce sujet général:
Ce sont difficiles parce que vous recherchez quelque chose qui n'existe que lorsque tout est correct; vous avez besoin d'une propriété système globale et pourtant pratiquement tous les outils disponibles (et tous ceux qui s'adaptent aux problèmes réels de mon expérience) ne font vraiment que du raisonnement local. C'est le processus de passer du raisonnement sur les morceaux du programme à l'ensemble du shebang qui est difficile, en particulier parce qu'il est tout à fait possible d'avoir des morceaux qui sont tous corrects en eux-mêmes mais où il y a encore des bogues subtils parce que les composants sont mal organisés; les bogues peuvent être des caractéristiques émergentes indésirables…
la source
Services d'information sur la gestion Pendant ma période collégiale, j'avais un sujet de gestion par semestre, ce qui me rendait complètement fou.
Dure! les sujets comme Compiler Design , OS Design etc. sont difficiles mais ils sont vraiment intéressants et stimulants. J'ai vraiment gâché des sujets comme le système / les services d'information de gestion, etc., car ils sont pleins d'ennui et vous devez passer par beaucoup de théorie.
la source
Si vous travaillez en C / C ++, les pointeurs sont le concept le plus important à connaître. Mais d'une manière ou d'une autre, je ne l'ai jamais entièrement compris à l'université.
la source
Conception et analyse d'algorithmes. Ce n'est pas tant qu'il est difficile de comprendre et d'analyser des algorithmes connus , c'est que la conception et l'analyse de nouveaux algorithmes pour des problèmes difficiles sont difficiles, et nécessitent une large compréhension de nombreux domaines et une pratique dans l'application de nombreuses techniques différentes.
la source
Programmation par contraintes. qui traite des problèmes combinatoires, des problèmes NP-complets.
la source
L'optimisation de l'algorithme est un sujet difficile.
la source
Mathématiques discrètes.
C'était difficile parce que les théories sont très peu reliées entre elles mais elles sont utilisées dans CS. Trop de mémorisation je suppose ...
Preuve par induction, Big O, récursion, division et conquête, Théorie des graphes, bla bla .. argh!
Pour moi, le compilateur était facile, car nous devions prendre la théorie des automates. ^^
la source
Notation Z / méthodes formelles utilisées pour me faire mal au cerveau à l'université. Principalement parce que je détestais ça. Difficile est beaucoup plus facile lorsque vous aimez ce que vous faites et beaucoup plus difficile lorsque vous ne le faites pas.
la source
J'aime vos réponses (et je n'ai pas oublié de les voter), comme le compilateur, le noyau, etc., mais la plupart des programmeurs n'ont jamais rencontré ces problèmes. Il y a un problème un peu plus facile, mais plus courant: concurrence - threads, verrouillage. Il est très facile d'écrire un programme qui produit des erreurs magiques, si nous faisons même un petit bogue dans l'architecture de concurrence.
Donc, je dis, ce n'est pas le problème le plus difficile en informatique, mais parce qu'il est couramment utilisé, il est dangereux.
la source
Programmation orientée objet
C'est probablement parce que je me suis coupé les dents sur FORTRAN et APL, mais le passage des langages strictement procéduraux aux objets est une chose avec laquelle je me bats depuis des années. Cela n'aide pas que les soi-disant «experts» écrivent des articles et des didacticiels contradictoires sur ce que signifie être orienté objet et les meilleures / bonnes façons de construire des programmes orientés objet.
la source