web-dev-qa-db-fra.com

Quels concepts en informatique dois-je connaître?

Selon vous, quels concepts en informatique ont fait de vous un meilleur programmeur?

Mon diplôme était en génie mécanique, donc après avoir fini en tant que programmeur, je manque un peu de bases. Il y a quelques concepts CS standard que j'ai appris récemment qui m'ont donné une compréhension beaucoup plus profonde de ce que je fais, en particulier:

Fonctions linguistiques

  • Pointeurs et récursivité (merci Joel!)

Structures de données

  • Listes liées
  • Hashtables

Algorithmes

  • Bubble Sorts

De toute évidence, la liste est un peu courte pour le moment, j'espérais donc des suggestions sur:

  1. Quels concepts je dois comprendre,
  2. Toutes les bonnes ressources pour bien les comprendre (comme Wikipédia peut être un peu dense et académique parfois).
91
Jon Artus

Jetez un œil à cet article de blog de Steve Yegge (anciennement d'Amazon, maintenant chez Google):

Il donne quelques détails sur les cinq concepts les plus importants que les développeurs devraient être tenus de connaître:

  1. Programmation de base (y compris récursivité, E/S de fichiers, sortie formatée, boucles, etc.)
  2. Conception orientée objet (y compris les modèles de conception, etc.). Vous devriez être capable de produire des conceptions sensées OO ainsi que de comprendre les concepts.
  3. Scripting et regexes.
  4. Structures de données - listes, ensembles, tables de hachage, arbres, graphiques, etc. - ainsi que la notation Big O et la complexité algorithmique.
  5. Bits, octets et nombres binaires - comment les nombres sont représentés dans l'ordinateur et comment les manipuler.
59
jammycakes

Vous devez absolument comprendre la notation Big-O et les estimations Big-O des algorithmes - ce que c'est, comment il est utilisé, pourquoi il est important, comment vous comparez deux algorithmes compte tenu de leurs estimations Big-O, comment vous construisez des estimations Big-O pour les algorithmes simples.

35
sharptooth

Je trouve un peu drôle que vous recherchiez des sujets d'informatique , mais je trouve wikipedia trop académique: D

Quoi qu'il en soit, voici, sans ordre particulier:

30
Rik

Quelques concepts qui ont aidé à mon développement (intellect et code):

  • Lexing, Parsing, String matching, Regex
  • Mémorisation
    • encapsulation/cadrage/fermetures
    • mise en cache
  • Récursivité
  • Itérateurs/générateurs
  • Programmation fonctionnelle - l'incroyable John Hughes article m'a fait comprendre "pourquoi"

Ce sont des domaines entiers de mathématiques discrètes, mais une introduction sérieuse est requise pour CS:

  • Matrice/Algèbre linéaire
  • La théorie des graphes

Bien que les conférences et articles de Mark Jason-Dominus s'adressent souvent aux pirates de Perl, je pense que tout programmeur bénéficierait de sa présentation claire et de son vrai code, en particulier dans Perl d'ordre supérieur .

14
bubaker

Je vois plusieurs bons concepts CS identifiés mais peu de discussions sur les mathématiques.

Je vous suggère de regarder dans mathématiques discrètes. Il présente un large éventail de problèmes utiles, à commencer par les preuves logiques qui vous aident à écrire des conditions dans le code. La théorie des graphes et la combinatoire aident également à la résolution de problèmes complexes et à l'optimisation d'algorithmes.

Bien que nous soyons sur le sujet des mathématiques, l'algèbre linéaire est généralement une condition préalable pour les cours avancés d'infographie.

10
Berkshire

Je dirais que de nos jours une compréhension de la programmation orientée objet est un must, même si vous n’avez pas besoin de l’utiliser au jour le jour.

À partir de cela, je dirais également que la compréhension des modèles les plus courants peut également aider.

10
Jeremy French

Matrice de compétences des programmeurs a couvert cela en détail, mais je vais en souligner quelques-uns:

  • Structures de données
    • Structures de données avancées comme les arbres B, les tas binomiaux et fibonacci, les arbres AVL/Red Black, les arbres évasés, les listes de sauts, les essais, etc.
  • Algorithmes
    • Tree, Graph, simples algorithmes gourmands et diviser pour mieux régner, est capable de comprendre la pertinence des niveaux de cette matrice.
  • Programmation des systèmes
    • Comprend l'ensemble de la pile de programmation, le matériel (CPU + mémoire + cache + interruptions + microcode), le code binaire, l'assemblage, la liaison statique et dynamique, la compilation, l'interprétation, la compilation JIT, la collecte des ordures, le tas, la pile, l'adressage de la mémoire…
  • Contrôle de version du code source
    • Connaissance des systèmes VCS distribués. A essayé Bzr/Mercurial/Darcs/Git
  • Automatisation de la construction
    • Peut configurer un script pour construire le système et également la documentation, les installateurs, générer des notes de publication et étiqueter le code dans le contrôle de code source
  • Tests automatisés
    • Comprend et est capable de configurer des tests fonctionnels, de charge/performances et d'interface utilisateur automatisés
  • Décomposition du problème
    • Utilisation de structures de données et d'algorithmes appropriés et création d'un code générique/orienté objet qui résume les aspects du problème susceptibles d'être modifiés.
  • Décomposition des systèmes
    • Capable de visualiser et de concevoir des systèmes complexes avec plusieurs gammes de produits et intégrations avec des systèmes externes. Il devrait également être en mesure de concevoir des systèmes de soutien aux opérations tels que la surveillance, les rapports, les basculements, etc.
6
cgp

Je trouve très utiles les graphiques et certains algorithmes appliqués comme la profondeur d'abord, la recherche en profondeur, les chemins les plus courts, etc. L'orientation des objets est également un concept très courant.

5
Mork0075

Règle 1: le logiciel est la capture des connaissances. Le logiciel signifie quelque chose. Si vous n'êtes pas clair sur le sens, passez plus de temps à parler aux utilisateurs pour comprendre ce qu'ils font.

Les algorithmes et les structures de données sont les deux faces d'une même médaille. L'algorithme dépend de la structure des données, la structure des données dépend de l'algorithme.

Désapprendre le tri à bulles le plus rapidement possible. Sérieusement. Tous les langages modernes (Java, Python, etc.) ont des classes de collection qui implémentent un meilleur tri que le tri à bulles. Il n'y a absolument aucune circonstance dans laquelle vous devriez utiliser le tri à bulles pour quoi que ce soit. Vous devriez rechercher une classe de collection qui inclut une méthode de tri. Mieux, vous devriez rechercher un algorithme qui évite complètement le tri.

Vous devez apprendre plusieurs langues.

  • Langage de programmation (Java, Python, etc.)

  • Langage shell.

  • Langage de base de données (SQL)

  • Langages de présentation (HTML et CSS)

  • Autres langages de représentation des données (XML, JSON)

Vous devez apprendre plusieurs structures de données.

  • Séquences (listes, tuples, fichiers)

  • Hiérarchique (comme les documents XML et HTML, ainsi que le système de fichiers de base)

  • Relationnel (comme les bases de données et le système de fichiers avec des liens durs et souples ajoutés)

  • Cartes (ou index ou tableaux associatifs), y compris les cartes de hachage et les cartes d'arbre

  • Ensembles

Plus une analyse de complexité algorithmique. Parfois appelé "Big O". Pourquoi un tri à bulles est mauvais, c'est que c'est O ( n ^ 2) , où un tri rapide est O ( n log n ).

4
S.Lott

Pour moi, j'ai beaucoup appris du cours suivant à l'université

  • Gestion de projet
  • Interaction homme-machine (nous aide les geeks à créer des écrans plus conviviaux)
  • Conception de base de données (y compris le fonctionnement des bases de données, les journaux de transactions, le verrouillage, etc.)
  • Entreposage de données
  • Graphiques (OpenGL)
  • Algorithmes avancés
  • Structures de données

Choses que j'aurais aimé faire à l'université

  • Construction du compilateur
  • Modèles de conception
  • Théorie des automates
3
uriDium

Je pense qu'une bonne compréhension du fonctionnement d'un compilateur est bonne à savoir. Aho a le livre classique sur les concepts utilisés dans la création d'un compilateur. Le titre est Compilateurs: principes, techniques et outils. Son surnom est le Dragon Book. Afin de vraiment comprendre ce livre, vous devez avoir une compréhension des langages formels. Hopcroft a un bon livre à ce sujet - Introduction à la théorie des automates, aux langages et au calcul.

3
zooropa

[~ # ~] logique [~ # ~] - Je surestime simplement l'importance de la logique dans la programmation. Vous avez dit avoir fait du génie mécanique, vous devez donc savoir à quel point les mathématiques peuvent vous faciliter la vie.

Logique propositionnelle , Logique de premier ordre , Logique de second ordre : ce sont des outils très puissants. Probablement les choses les plus importantes (et les seules) que j'ai apprises à l'université. La logique est comme l'artillerie lourde d'un programmeur - beaucoup de problèmes très complexes (ainsi que les moins complexes) deviennent beaucoup plus simples une fois que vous les avez mis dans une forme logique organisée. C'est comme ce que l'algèbre linéaire est pour les ingénieurs mécaniques.

3
Tamas Czinege

Quelques concepts OS

 ( memory, IO, Scheduling, process\Threads, multithreading )

[un bon livre " Modern Operating Systems , 2nd Edition, Andrew S. Tanenbaum"]

Connaissance de base des réseaux informatiques

[un bon livre de Tanenbaum

Concepts OOPS

Autometa fini

Un langage de programmation (j'ai d'abord appris le C puis le C++)

Algorithmes (complexité temps/espace, tri, recherche, arbres, liste chaînée, pile, file d'attente)

[un bon livre Introduction aux algorithmes ]

2
aJ.

Beaucoup de bonnes réponses ont déjà été mentionnées ici, mais je voulais ajouter un sous-ensemble de ce qui est important, mais n'a pas été couvert jusqu'à présent.

Après 15 ans de développement de logiciels professionnels post-licence, je constate que j'utilise régulièrement certains des concepts suivants à l'école:

  • Général OO concepts et fonctionnalités modernes du langage de programmation (classes, masquage de données, etc.).
  • Mesures de performance d'algorithme (notation Big O). Lors de la conception d'un algorithme, effectuer une analyse Big O pour déterminer le coût de l'algorithme et rechercher des alternatives plus efficaces dans les zones de goulot d'étranglement.
  • Listes liées et autres structures de données complexes.
  • Tri rapide et différents concepts de tri.
  • Arbres et manipulation rapide des arbres.

Si votre langue/plate-forme ne prend pas en charge la récupération de place, l'allocation et le nettoyage de la mémoire sont essentiels et seraient ajoutés à la liste.

2
pearcewg
2
David Basarab

Eh bien, la boîte de vers est ouverte maintenant! :)
J'ai commencé en génie électrique.

Conception de la base de données relationnelle: Le suivi des données est comme Arnold dans "Kindergarden Cop".
Cela peut être un chaos total. Elle doit être contrôlée.
Comment conserver vos données, dans le moins d'endroits, avec le moins de doublons d'informations. Comment garder vos données légères et facilement accessibles. Comment contrôler la croissance et l'intégrité des données.

Conception de l'interface utilisateur (UI): Voici comment l'utilisateur doit accéder aux données dont nous gardons la trace.
La plupart des interfaces utilisateur sont conçues par des développeurs. Ainsi, la plupart des interfaces utilisateur, malheureusement, sont parallèles à la conception de la base de données. Les utilisateurs ne se soucient pas du tout de la conception des données. Ils veulent simplement ce qu'ils veulent. Ils veulent l'obtenir facilement. Cela nécessite généralement une grande séparation de la conception des données et de l'interface utilisateur. Apprenez à séparer le "génie" de vous du "sud-hospitalité" vous.

Programmation Orientée Objet: De nombreuses langues se résument à ce format.

Traitement parallèle - Multi-Threading: De nombreux processeurs rendent le travail rapide!
Les ordinateurs parallèles existent depuis des décennies. Ils sont sur nos bureaux depuis un certain temps maintenant. Avec le "cloud computing", le traitement parallèle massif est non seulement obligatoire mais également préférable. C'est incroyablement puissant! Il y a beaucoup de potentiel d'emploi pour les développeurs parallèles.

Comprendre les règles métier: Cela vous aide à faire une grande partie de votre logique, basée sur une table.
De nombreuses conditions IFblock peuvent se trouver dans des tables de règles métier. Pour changer la logique, changez simplement les informations dans un tableau. Peu/pas de recodage. Peu/pas de recompilation.

Les événements supervisent ... Les méthodes font le travail:
Gardez les choses séparées dans votre code. Cela permet aux autres d'effectuer plus facilement des mises à jour à l'avenir. Il est également quelque peu parallèle au framework Model/View/Controller (MVC).

P J

2
PJ

Efforcez-vous de faible couplage, forte cohésion.

low coupling, high cohesion

(J'ai volé cette image sur le site Web lié ci-dessus)

2
Joe Phillips

J'évote les mathématiques discrètes. L'informatique est l'abstraction. apprendre à penser comme un mathématicien est très utile.

Je voulais également ajouter à ce que S.Lott a dit sur les langues. Apprendre un tas de TYPES de langues est également important. Pas seulement compilé vs scripté. Mais fonctionnel (ML, LISP, Haskell) logique (Prolog) orienté objet (C++, Java, Smalltalk) impératif (C, Pascal, FORTRAN même).

Plus vous connaissez de paradigmes de programmation, plus il est facile de choisir de nouvelles langues lorsque la nouvelle langue arrive!

2
Brian Postow

Essayez de comprendre tous les niveaux de programmation. Du niveau le plus bas (assemblage) au niveau le plus élevé.

Prenons l'exemple de la récursivité, qui est une fonctionnalité simple :) Essayez d'apprendre l'assemblage et créez un programme qui utilisera la récursivité dans l'assemblage.

1
Chrys

C'est clairement une bonne compréhension de la programmation orientée objet, de bons principes directeurs comme Principes SOLIDES et en suivant des modèles et des pratiques établies.

Si vous regardez SOA, ou DDD, ils se rabattent tous finalement sur une certaine forme de concepts OOP.

Je vous recommande de vous procurer de bons OOP livres et alos choisissez un langage riche comme C # ou Java pour commencer)

OOP par Grady Booch

(PHP, Ruby les gars s'il vous plaît ne votez pas contre moi, je vous donne juste quelques exemples pour commencer, vous pouvez fournir vos propres réponses et suggestions ici))

1
Srikar Doddi

Algorithmes.

Apprendre à utiliser un langage de programmation de manière descendante est quelque chose que vous pouvez apprendre au fur et à mesure, mais il est pratiquement impossible d'inventer vous-même tous les algorithmes largement utilisés. Il faut au moins être conscient de ce qui peut et ne peut pas être fait avec quelques problèmes.

Par exemple, on ne peut tout simplement pas écrire certains programmes avec le tri à bulles et s'attendre à ce qu'il soit considéré comme bon, quelle que soit la finesse du code.

Pour résumer - jetez un œil à Introduction to Algorithms

Pas besoin de le maîtriser, sachez simplement ce qui se passe ...

1
Liran Orevi

En tant que récent diplômé d'un diplôme en informatique, je recommanderais ce qui suit:

1
CodeMonkey

Structure et interprétation des programmes informatiques . Si vous comprenez ce livre, tout le reste peut être construit facilement sur cette base. Si vous avez des problèmes avec les concepts du livre, vous pouvez être un développeur de logiciels mais pas un informaticien.

1
lambdabunny

Je ne vais pas vous dire de concepts spécifiques à étudier, mais je vous recommanderais plutôt de faire beaucoup de lecture légère sur un large éventail de sujets. Ne vous inquiétez pas d'avoir une compréhension approfondie de chaque sujet sur lequel vous lisez - à ce stade, il est plus important que vous puissiez reconnaître quel type du problème que vous regardez, afin que vous puissiez faire des études juste à temps lorsque vous y êtes réellement confronté. En d'autres termes, c'est correct si vous ne savez pas comment résoudre un problème de combinatoire, tant que vous en savez assez pour rechercher la "combinatoire" lorsque vous avez besoin de voir de combien de façons vous pouvez organiser un ensemble d'objets ou choisir un sous-ensemble .

Wikipédia est une très bonne ressource pour ce type de navigation à grande échelle, surtout si vous ne faites qu'effleurer pour commencer. Un encore meilleur, surtout si vous trouvez Wikipedia trop académique ou inaccessible, est le C2 wiki . (Il s'agit, assez intéressant, du wiki original inventé par Ward Cunningham).

1
John Hyland

Je pense qu'il est essentiel de comprendre la théorie de base du multi-threading, sans cela, il peut même être difficile de voir qu'il peut y avoir un problème, jusqu'à ce que vous déboguez sur un serveur en direct à 4 heures un dimanche matin.

Sémaphores, sections critiques et événements.

0
Jim T

Non, pas le tri à bulles, le tri rapide. C'est la chose big-O - le type de bulle fait la moyenne de O (n ^ 2), le tri rapide est O (n * log (n)).

0
GoatRider

Si vous allez enseigner le big-O, expliquez au moins qu'il décrit comment le temps d'un algorithme évolue avec des entrées plus grandes - cela ne signifie pas qu'un algorithme prendra moins de temps.
À titre d'exemple, la construction de pyramides est O (n), tandis que le tri des photographies est O (n ln n) au mieux. Il est donc plus rapide de construire une autre pyramide que de ranger vos photos de vacances.

Les élèves doivent avoir une idée de la durée d'une opération sur un registre, en cache, en mémoire principale, sur disque, sur le net. Beaucoup d'enseignés uniquement dans des langues de très haut niveau n'ont aucun concept.

(c'était un commentaire dont quelqu'un voulait discuter)

0
Martin Beckett

Tout sauf le type de bulle:

  • Tri par tas
  • Tri rapide

Et le plus important: la notation Big O pour que vous sachiez pourquoi vous devriez utiliser l'un d'eux au lieu d'un type Bubble.

0
Carra

Cycle de vie du développement logiciel - La collecte des exigences, la conception et l'analyse, la mise en œuvre, les tests, la séquence de support et de maintenance. Ceci avec des méthodologies telles que Waterfall et Agile où ces étapes sont mises en pratique est également une chose importante à apprendre.

0
JB King

Je dirais que ci-dessous sont les choses les plus importantes

  • Programmation orientée objet
  • Concepts de système d'exploitation
    • Processus et thread
    • Algorithmes de planification
  • Structure de données
    • Type de stockage et de collecte de données, types (liste chaînée, hachage, tableau, etc.)
    • Algorithmes de tri
    • Complexité des algorithmes

Ensuite, accédez à des éléments spécifiques à une langue. J'espère que ceci est utile!!

0
Mutant

Je commencerais par la citation:

"si le seul outil dont vous disposez est un marteau, vous traitez tout comme un clou". (Abraham Maslow)

Le principe le plus important, l'OMI, est de connaître de nombreux paradigmes de programmation et langages différents et de bien se renseigner sur les outils à votre disposition. Tout problème peut être résolu dans presque toutes les langues que vous choisissez, que ce soit un langage traditionnel complet avec son énorme bibliothèque par défaut ou un petit langage spécialisé comme AutoHotKey. Le premier travail du programmeur est de déterminer quoi utiliser en fonction de la spécification du problème. Certains concepts offrent une meilleure approche du sujet, quel que soit votre objectif principal - sophistication, obscurcissement, performances, portabilité, maintenance, petite taille de code ...

Sinon, vous finirez comme certains programmeurs qui essaient désespérément de faire quelque chose dans un langage qu'ils ont spécialisé, alors que le problème pourrait être trivial à résoudre dans différents contextes de programmation.

Ce conseil va de pair avec la tendance actuelle des projets multilingues (prenez par exemple les applications Web, qui peuvent impliquer plusieurs langues dans une seule application, comme C #, JS, CSS, XPath, SQL, XML, HMTL, RegExp ... et même différents paradigmes de programmation (par exemple, C # a introduit récemment certains concepts des paradigmes de programmation fonctionnelle, lambdas).

Donc, la chose de base est apprentissage constant, pour toujours :)

0
majkinetor

Je pense que D-Graphics est quelque chose que tout le monde devrait apprendre. Ou du moins comment utiliser correctement les vecteurs homogènes et les transformations matricielles.

Il peut être utile non seulement pour créer des applications 3D, mais également dans les domaines mécaniques comme la cinématique inverse sur les robots, le calcul des moments et beaucoup d'autres choses.

Je n'ai pas entièrement compris l'algèbre linéaire jusqu'à ce que j'aie lu les graphiques 3D, l'un des meilleurs cours que j'ai jamais pris même si notre professeur était mauvais.

0
TheDude

Étant donné que les machines avec plusieurs cœurs (CPU et GPU) deviennent la norme, je dirais d'inclure algorithmes distribués (de plusieurs threads à plusieurs machines). Il est essentiel de comprendre le traitement multithread et distribué. Désolé que le lien n'apporte pas vraiment beaucoup d'aide.

0
Erich Mirabal