Quels concepts informatiques dois-je connaître? [fermé]


94

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 comme programmeur, je manque un peu de bases. Il y a quelques concepts standard de CS que j'ai appris récemment qui m'ont donné une compréhension beaucoup plus profonde de ce que je fais, en particulier:

Caractéristiques linguistiques

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

Structures de données

  • Listes liées
  • Hashtables

Algorithmes

  • Bulles tri

Évidemment, la liste est un peu courte pour le moment donc j'espérais des suggestions quant à:

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

5
Des sortes de bulles? Restez aussi loin d'eux que possible! Apprenez plutôt comment fonctionne le tri rapide / le tri en tas.
Carra

18
Oui, apprenez les bulles. Apprenez pourquoi c'est terrible. Apprenez le tri rapide, le tri par fusion et tout le reste, y compris leurs faiblesses individuelles. Mais ne les écrivez pas dans le code de production: appelez les fonctions de tri fournies par la plateforme sur laquelle vous vous trouvez.
Brian Ensink le

@Roger Pate - +1 pour vous, il faut savoir à quoi sert un algorithme ou une structure de données, et à quoi ça craint. Quicksort et Bubblesort ont les mêmes performances dans le pire des cas [O (n ^ 2)], mais pour des types d'entrée très différents, et Bubblesort a les meilleures performances de cas de O (n), où QS est toujours O (n log n). Bien sûr, si vous envisagez Bubblesort, vous voudrez peut-être opter pour le tri par insertion à la place.
Andre Artus

Réponses:


60

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

Il entre dans certains 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 la récursivité, les E / S de fichier, la sortie formatée, les boucles, etc.)
  2. Conception orientée objet (y compris les modèles de conception, etc.). Vous devriez être capable de produire des conceptions OO sensées ainsi que de comprendre les concepts.
  3. Script et expressions régulières.
  4. Structures de données - listes, ensembles, tables de hachage, arbres, graphiques, etc. - ainsi que notation Big O et complexité algorithmique.
  5. Bits, octets et nombres binaires - comment les nombres sont représentés dans l'ordinateur et comment les manipuler.

Beau lien. Un peu concentré sur le côté Unix, (manquant complètement .NET) mais toujours sympa.
Toon Krijthe le

Excellent lien - il y a beaucoup de choses sur lesquelles je peux travailler, j'aimerais juste qu'il y ait des liens vers de bonnes pages expliquant ces choses.
Jon Artus le

Le lien me sera très utile pour me vérifier et rattraper les fondamentaux. Merci ..
rpr

D'accord, excellent lien. Alors que la plupart des solutions possibles identifiées sont basées sur Unix, les concepts globaux impliqués sont très indépendants du langage / de la plate-forme. Pour la plupart des programmeurs, des choses comme la récursivité, l'écriture ADT comme les arbres et les opérations au niveau du bit sont assez rares, mais elles constituent une base importante.
Zach Burlingame le

4
Je suis d'accord avec tout sauf les regex. Ce sont un bon bonus, mais la plupart des choses sont des bases au niveau du sol, la base sur laquelle tout est construit ... les expressions régulières sont excellentes, mais je connais beaucoup de grands programmeurs qui ne les utilisent jamais et n'en ont jamais besoin.
Beska

35

Vous devez certainement comprendre les Big-O notation et les estimations Big-O des algorithmes - ce qu'elle 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.


1
Vous pouvez commencer par un article de Wikipédia auquel j'ai lié - c'est à la fois assez simple et mathématiquement correct.
Sharptooth le

3
Vous devez avoir une opinion assez basse des mathématiques avancées. J'ai compris cela lors de ma première année d'université, alors que je n'étais qu'à mi-chemin du calcul.
GoatRider le

1
N'oubliez pas le concept de NP et lorsqu'un problème y est contenu, un développeur qui essaie de coder un TSP (voyageur de commerce) dans chaque transaction de base de données dans un but de recherche ou une autre idiotie est un problème majeur =]
Ed James

2
Vous devez également savoir que le gros O ne vous dit pas quel algorithme prend le moins de temps. Quelque chose que la plupart des diplômés CS ne comprennent pas
Martin Beckett

3
C'est un peu le cas. Il vous indique lequel a le meilleur cas le plus défavorable, pas nécessairement lequel est «le plus rapide» car cela dépend de l'ensemble d'entrées.
Ed James le

30

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

Quoi qu'il en soit, voilà, sans ordre particulier:


2
+1 parce que vous avez mentionné les bases de données, souvent négligées dans ces types de listes, mais un concept très important que tout diplômé CS bien équilibré doit connaître.
Brian Ensink le

14

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

  • Lexing, analyse, correspondance de chaînes, expression régulière
  • Mémorisation
    • encapsulation / cadrage / fermetures
    • mise en cache
  • Récursion
  • Itérateurs / Générateurs
  • Programmation fonctionnelle - L'étonnant article de John Hughes m'a dit "pourquoi"

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

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

Bien que les conférences et les articles de Mark Jason-Dominus soient souvent destinés aux hackers de Perl, je pense que tout programmeur bénéficierait de sa présentation claire et de son vrai code, en particulier dans Higher Order Perl .


10

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 là, je dirais également que la compréhension des modèles les plus courants peut également aider.


10

Je vois plusieurs bons concepts CS identifiés mais on parle peu de mathématiques.

Je suggère que vous vous intéressiez aux mathématiques discrètes . Il présente un large éventail de problèmes utiles à commencer par des 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 des algorithmes.

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


1
Si je devais n'en choisir qu'un, ce serait des mathématiques discrètes. C'est à peu près CS 101. J'ai du mal à penser à un domaine ou un paradigme dans la programmation générale qui n'est pas touché d'une manière ou d'une autre par DM.
Andre Artus

6

La 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 telles que les arbres B, les tas binomiaux et fibonacci, les arbres AVL / Red Black, les arbres Splay, les listes de sauts, les essais, etc.
  • Algorithmes
    • Tree, Graph, simples algorithmes gourmands et diviser pour conquérir, est capable de comprendre la pertinence des niveaux de cette matrice.
  • Programmation des systèmes
    • Comprend toute 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, le garbage collection, le tas, la pile, l'adressage mémoire ...
  • Contrôle de version du code source
    • Connaissance des systèmes VCS distribués. A essayé Bzr / Mercurial / Darcs / Git
  • Construire l'automatisation
    • Peut configurer un script pour construire le système ainsi que la documentation, les installateurs, générer des notes de publication et baliser le code dans le contrôle de code source
  • Test automatisé
    • Comprend et est capable de configurer des tests fonctionnels, de charge / performance et d'interface utilisateur automatisés
  • Décomposition du problème
    • Utiliser des structures de données et des algorithmes appropriés et proposer un code générique / orienté objet qui encapsule les aspects du problème susceptibles de changer.
  • Décomposition des systèmes
    • Capable de visualiser et de concevoir des systèmes complexes avec plusieurs gammes de produits et des 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 pannes, etc.

5

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


4

Règle 1: le logiciel est la capture des connaissances . Le logiciel signifie quelque chose. Si vous n'êtes pas sûr de la signification, 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 aussi rapidement que 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 de 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 physiques et logiciels ajoutés)

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

  • Ensembles

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


Pour mémoire, je n'utiliserais jamais un tri à bulles! J'ai juste trouvé que l'apprentissage de son fonctionnement était une expérience intéressante et j'ai pensé qu'il y avait quelques autres algorithmes de ce type que les gens devraient comprendre suffisamment bien pour écrire dans la langue de leur choix.
Jon Artus le

Il existe d'innombrables algorithmes. La plupart sont mauvais. Certains d'entre eux sont bons. Bubble Sort est tout simplement mauvais. Achetez N'IMPORTE QUEL livre sur les algorithmes et passez à autre chose.
S.Lott le

Juste une petite sélection, mais Quicksort est le pire des cas O (n ^ 2). Je le souligne uniquement parce que je pense que comprendre pourquoi c'est vrai est un exercice éducatif précieux pour étudier les algorithmes fondamentaux.
Brian Ensink le

Pour le tri rapide, oui - un exercice important. Pour le tri à bulles, la seule chose à faire est de voir à quel point un algorithme est vraiment mauvais. Comprendre le cas typique et le pire des cas est important en général.
S.Lott le

4

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

Conception de base de données relationnelle: Garder une trace des données est comme Arnold dans "Kindergarden Cop".
Cela peut être un chaos total. Il doit être contrôlé.
Comment conserver vos données, dans le moins d'endroits, avec le moins de duplications 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): c'est ainsi que l'utilisateur doit accéder aux données dont nous gardons une 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. Habituellement, cela exige une grande séparation de la conception des données et de l'interface utilisateur. Apprenez à séparer le vous "d'ingénierie" de "l'hospitalité du sud" vous.

Programmation orientée objet: de nombreux langages se résument à ce format.

Traitement parallèle - Multi-Threading: de nombreux processeurs accélèrent le travail!
Les ordinateurs parallèles existent depuis des décennies. Ils sont sur nos ordinateurs depuis un certain temps maintenant. Avec l'événement du "cloud computing", un traitement parallèle massif est non seulement obligatoire mais également préférable. C'est incroyablement puissant! Il existe un grand 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 des tables.
De nombreuses conditions IFblock peuvent figurer dans des tables de règles métier. Pour changer la logique, changez simplement les informations dans une table. Peu / pas de recodage. Peu / pas de recompilation.

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

P J


3

Pour moi, j'ai beaucoup profité 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

Les choses que j'aurais aimé faire à l'université

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

3

LOGIQUE - Je surestime juste l'importance de la logique dans la programmation. Vous avez dit que vous aviez fait du génie mécanique, vous devez donc savoir à quel point les mathématiques peuvent vous faciliter la vie.

Logique propositionnelle , premier ordre logique , du second ordre logique : ce sont des outils très puissants. Probablement la chose la plus (et la seule) importante que j'ai apprise à 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 sous une forme organisée et logique. C'est comme ce qu'est l'algèbre linéaire pour les ingénieurs en mécanique.


3

Je pense qu'une bonne compréhension du fonctionnement d'un compilateur est bon à 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 langues formelles. Hopcroft a un bon livre à ce sujet - Introduction à la théorie des automates, aux langages et au calcul.



2

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:

  • Concepts généraux d'OO et fonctionnalités du langage de programmation moderne (classes, masquage de données, etc.).
  • Mesures de performance des algorithmes (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 langage / plateforme ne prend pas en charge le nettoyage de la mémoire, l'allocation et le nettoyage de la mémoire sont essentiels et seraient ajoutés à la liste.


2

Je vote pour les mathématiques discrètes. L'informatique est une 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 voire).

Plus vous connaissez de paradigmes de programmation, plus il est facile de choisir de nouveaux langages lorsque le nouveau langage chaud arrive!


2

Quelques concepts du système d'exploitation

 ( 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 appris le C d'abord puis le C ++)

Algorithmes (complexité temporelle / spatiale, tri, recherche, arborescences, liste chaînée, pile, file d'attente)

[un bon livre Introduction aux algorithmes ]


méta automatique? - sûrement "automates" selon la première édition.
Tom Duckering le

Oups! embourbé pour vérifier l'orthographe je suppose. Je vais le corriger. Merci.
aJ.


1

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

Prenons par exemple 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'assembly.


1

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 tous les algorithmes largement utilisés par vous-même .. Il faut vraiment 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 par bulles et s'attendre à ce qu'ils soient considérés comme bons, quelle que soit la finesse du code.

Pour résumer - jetez un œil à Introduction aux algorithmes

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



1

C'est clairement une bonne compréhension de la programmation orientée objet, de bons principes directeurs tels que les principes SOLID et le respect des modèles et pratiques établis.

Si vous regardez SOA ou DDD, ils retombent tous en fin de compte vers une forme de concepts POO.

Je vous recommande de vous procurer de bons livres de POO et de choisir également un langage riche comme C # ou Java pour commencer

POO par Grady Booch

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



1

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 que vous lisez - à ce stade, il est plus important que vous soyez capable de reconnaître le type de problème que vous examinez, afin que vous puissiez faire un peu juste- étudier à temps lorsque vous y êtes réellement confronté. En d'autres termes, ce n'est pas grave 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 .

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


0

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

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


0

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


0

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

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

Ensuite, allez à des éléments liés à une langue spécifique. J'espère que ceci est utile!!


0

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, IMO, est de connaître de nombreux paradigmes de programmation, de langages et de bien vous informer sur les outils à votre disposition. Tout problème peut être résolu dans presque toutes les langues de votre choix, qu'il s'agisse d'un langage grand public complet avec son énorme bibliothèque par défaut ou d'un petit langage spécialisé comme AutoHotKey. Le premier travail du programmeur est de déterminer ce qu'il faut 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 1 qu'ils se sont spécialisés, 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 pour les projets multilingues (prenez les applications web par exemple, qui peuvent impliquer plusieurs langages 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 récemment introduit des concepts issus de paradigmes de programmation fonctionnelle, lambdas).

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


0

Je pense que les graphismes 3D sont quelque chose que tout le monde devrait apprendre. Ou du moins comment utiliser correctement les vecteurs homogènes et les transformées matricielles.

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

Je ne comprenais pas complètement l'algèbre linéaire avant d'avoir lu le graphisme 3D, l'un des meilleurs cours que j'ai jamais suivis même si notre professeur était mauvais.


0

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.