Quels concepts informatiques dois-je connaître?

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

Mon diplôme en génie mécanique a fini comme programmeur, je manque un peu de bases. J’ai appris récemment quelques concepts standard de CS qui m’ont permis de mieux comprendre ce que je fais, en particulier:

Caractéristiques linguistiques

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

Structures de données

  • Listes liées
  • Hashtables

Algorithmes

  • Sels à bulles

Evidemment, la liste est un peu courte pour le moment alors j’espérais des suggestions pour:

  1. Quels concepts je devrais comprendre,
  2. Toute bonne ressource pour bien les comprendre (comme Wikipedia peut être un peu dense et académique parfois).

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

    • Les cinq questions essentielles de l’écran du téléphone

    Il décrit en détail les cinq concepts les plus importants que les développeurs doivent connaître:

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

    Vous devez certainement 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 comparer deux algorithmes compte tenu de leurs estimations Big-O, comment construire des estimations Big-O pour les algorithmes simples.

    Je trouve cela un peu drôle que vous cherchiez des matières en informatique , mais que vous trouviez que Wikipedia est trop académique: D

    En tout cas, voilà, sans ordre particulier:

    • Le modèle relationnel: Introduction aux systèmes de firebase database
    • Orientation object: Pensée Objet
    • Complexité et théorie des calculs (penser les machines et les automates de Turing): Introduction à la théorie du calcul
    • Un petit design de compilateur: Le Dragon Book , bien que cela puisse être un peu trop en profondeur pour vos besoins.
    • Concepts de système d’exploitation: systèmes d’exploitation modernes
    • Compétences sur les personnes: comment gagner des amis et influencer les gens
    • Travail d’équipe: Peopleware
    • Conception de l’interface utilisateur: les détenus dirigent l’asile

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

    • Lexing, parsing, correspondance de chaînes, expression régulière
    • Mémo
      • encapsulation / scoping / fermetures
      • mise en cache
    • Récursivité
    • Itérateurs / Générateurs
    • Programmation fonctionnelle – L’ article étonnant de John Hughes m’a amené à “pourquoi”

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

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

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

    Je dirais qu’aujourd’hui, une compréhension de la programmation orientée object est indispensable, même si vous n’avez pas besoin de l’utiliser au quotidien.

    À partir de cela, je dirais aussi que la compréhension des schémas les plus courants peut aussi aider.

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

    Je suggère que vous examiniez les mathématiques discrètes . Il a un large éventail de problèmes utiles en commençant par des preuves logiques qui vous aident à écrire des conditions dans le code. La théorie des graphes et la combinatoire aident également à résoudre les problèmes complexes et à optimiser les algorithmes.

    Alors que nous parlons de mathématiques, l’algèbre linéaire est généralement une condition préalable à l’avancement des cours de graphisme.

    Je trouve des graphiques et des algorithmes appliqués comme la profondeur en premier, la première recherche de souffle, les chemins les plus courts, etc. très utiles. L’orientation des objects est également un concept très commun.

    La Masortingce de compétences du programmeur a traité cela en détail, mais je vais en souligner quelques-unes:

    • Structures de données
      • Structures de données avancées telles que les B-trees, les tas binomiaux et fibonacci, les arbres AVL / Red Black, les arbres Splay, les listes Skip, les essais, etc.
    • Algorithmes
      • Tree, Graph, de simples algorithmes gourmands, diviseurs et conquérants, sont capables de comprendre la pertinence des niveaux de cette masortingce.
    • La programmation des systèmes
      • Comprend l’ensemble de la stack de programmation, matériel (CPU + Mémoire + Cache + Interruptions + microcode), code binary, assemblage, liens statiques et dynamics, compilation, interprétation, compilation JIT, récupération de place, stack, emstackment de mémoire…
    • Contrôle de version du code source
      • Connaissance des systèmes VCS dissortingbué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 marquer 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
    • Problème de décomposition
      • Utilisation de structures de données et d’algorithmes appropriés et offre du code générique / orienté object qui encapsule 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. De même, il devrait être possible de concevoir des systèmes d’assistance aux opérations tels que la surveillance, l’établissement de rapports, la gestion des défaillances, etc.

    Règle 1: Le logiciel est Knowledge Capture . Le logiciel signifie quelque chose. Si vous ne comprenez pas la signification, consacrez plus de temps aux utilisateurs pour comprendre ce qu’ils font.

    Algorithmes et structures de données sont les deux faces d’une même pièce. L’algorithme dépend de la structure des données, la structure des données dépend de l’algorithme.

    Désélectionner les bulles le plus rapidement possible. Sérieusement. Tous les langages modernes (Java, Python, etc.) ont des classes de collection qui implémentent un meilleur sorting que le sorting par bulles. Il n’y a absolument aucune circonstance dans laquelle vous devriez utiliser un sorting à bulles pour quelque chose. Vous devriez rechercher une classe de collection qui inclut une méthode de sorting. Mieux, vous devriez chercher un algorithme qui évite le sorting complet.

    Vous devez apprendre plusieurs langues.

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

    • Langage shell

    • Langage de firebase database (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 matériels et logiciels intégrés)

    • Cartes (ou index ou tableaux associatifs), y compris cartes de hachage et cartes d’arbres

    • Ensembles

    Plus une parsing de complexité algorithmique. Parfois appelé “Big O”. Pourquoi un sorting à bulles est mauvais, c’est que c’est O ( n ^ 2), où un sorting rapide est O ( n log n ).

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

    • Gestion de projet
    • Interaction entre ordinateurs (nous aide les geeks à créer des écrans plus conviviaux)
    • Conception de firebase database (y compris le fonctionnement des bases de données, les journaux de transactions, le locking, etc.)
    • Entreposage de données
    • Graphiques (OpenGL)
    • Algorithmes avancés
    • Structures de données

    Choses que j’aurais aimé avoir fait à l’université

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

    LOGIC – J’exalte l’importance de la logique dans la programmation. Vous avez dit que vous aviez fait de l’ingénierie mécanique, vous devez donc savoir combien les mathématiques peuvent vous faciliter la vie.

    Logique propositionnelle, logique du premier ordre, logique du second ordre : ce sont des outils très puissants. Probablement les choses les plus importantes (et les seules) que j’ai apsockets à 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 que algebra linéaire est pour les ingénieurs en mécanique.

    Je pense qu’il est bon de savoir comment fonctionne un compilateur. Aho a le livre classique sur les concepts utilisés dans la création d’un compilateur. Le titre est Comstackrs: Principes, techniques et outils. Son surnom est le Dragon Book. Pour bien 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 langues et au calcul.

    Encapsulation

    En informatique, l’encapsulation est le masquage des mécanismes internes et des structures de données d’un composant logiciel derrière une interface définie, de telle sorte que les utilisateurs du composant (autres logiciels) n’ont besoin que de savoir ce que fait le composant et ne peuvent pas se rendre dépendant des détails de la façon dont il le fait

    Beaucoup de bonnes réponses ont déjà été mentionnées, mais je voulais append un sous-ensemble de ce qui est important, mais qui n’a pas encore été couvert.

    Après 15 ans de développement logiciel professionnel post-baccalauréat, je trouve que certains des concepts suivants sont régulièrement utilisés à l’école:

    • Concepts OO généraux et fonctionnalités modernes du langage de programmation (classes, masquage des données, etc.).
    • Mésortingques de performance de l’algorithme (notation Big O). Lors de la conception d’un algorithme, effectuer une parsing Big O pour déterminer le coût de l’algorithme et examiner 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 sorting.
    • Arbres et manipulation rapide des arbres.

    Si votre langue / plate-forme ne prend pas en charge le nettoyage de la mémoire, l’allocation de mémoire et le nettoyage sont essentiels et seront ajoutés à la liste.

    Je soulève les mathématiques discrètes. L’informatique est l’abstraction. Apprendre à penser comme un mathématicien est très utile.

    Je voulais aussi append à ce que S.Lott a dit à propos des langues. Apprendre plusieurs types de langues est également important. Non seulement compilé vs scripting. Mais fonctionnel (ML, Lisp, Haskell) logique (Prolog) orienté object (C ++, Java, Smalltalk) impératif (C, Pascal, FORTRAN pair).

    Plus vous connaissez de paradigmes de programmation, plus il est facile de choisir de nouveaux langages lorsque la nouvelle langue chaude arrive!

    Quelques concepts de l’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 appris le C puis C ++)

    Algorithmes (complexité temps / espace, sorting, recherche, arborescence, liste chaînée, stack, queue)

    [un bon livre Introduction aux algorithmes ]

    Eh bien la boîte de Pandore est ouverte maintenant! 🙂
    J’ai commencé en génie élecsortingque.

    Conception de bases de données relationnelles: Garder une trace des données est comme Arnold dans “Kindergarden Cop”.
    Cela peut être le chaos total. Il doit être contrôlé.
    Comment conserver vos données dans le plus petit nombre d’emplacements, 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): il s’agit de la manière dont l’utilisateur doit accéder aux données que nous conservons.
    La plupart des interfaces utilisateur sont conçues par des développeurs. Ainsi, la plupart des interfaces utilisateur sont malheureusement parallèles à la conception de la firebase database. Les utilisateurs ne s’intéressent pas du tout à la conception des données. Ils veulent simplement ce qu’ils veulent. Ils veulent l’obtenir facilement. Habituellement, cela exige une grande séparation entre la conception des données et l’interface utilisateur. Apprenez à séparer le “génie” de vous de “l’hospitalité du sud”.

    Programmation orientée object: de nombreuses langues 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 de bureau depuis un certain temps maintenant. Avec le “cloud computing”, le parallel processing massif est non seulement obligatoire, mais également préférable. C’est incroyablement puissant! Il y a beaucoup de potentiel pour les développeurs parallèles.

    Comprendre les règles métier: Cela vous aide à développer votre logique, basée sur des tables.
    De nombreuses conditions IFblock peuvent s’asseoir dans les tables de règles métier. Pour modifier la logique, modifiez simplement les informations dans un tableau. Peu / pas de recodage. Peu / pas de recompilation.

    Événements superviser … Les méthodes font le travail:
    Gardez les choses séparées dans votre code. Il est plus facile pour les autres de faire des mises à jour dans le futur. Il est également quelque peu parallèle à la structure Model / View / Controller (MVC).

    P J

    S’efforcer de faible couplage, haute cohésion .

    faible couplage, haute cohésion http://soffr.miximages.com/computer-science/from_spaghetti_code_to_better_code.jpg

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

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

    Prenez la récursivité par exemple, qui est une fonctionnalité simple 🙂 Essayez d’apprendre l’assemblage et créez un programme qui utilisera la récursivité dans l’assemblage.

    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 les plus utilisés. Il faut au moins savoir 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 un sorting à bulles et s’attendre à ce qu’il soit considéré comme bon, même si le code est fin.

    Pour résumer – jetez un oeil à Introduction aux algorithmes

    Pas besoin de le maîsortingser, il suffit de savoir ce qui se passe …

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

    Il s’agit clairement d’une bonne compréhension de la programmation orientée object, de bons principes directeurs tels que les principes SOLID et des modèles et des pratiques établis.

    Si vous examinez SOA ou DDD, elles reposent toutes sur des concepts de POO.

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

    OOP de Grady Booch

    (PHP, les gars de ruby, s’il vous plaît, ne me vote pas, je ne fais que donner quelques exemples pour commencer, vous pouvez fournir vos propres réponses et suggestions ici)

    Structure et interprétation de programmes informatiques . Si vous comprenez ce livre, tout le rest 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.

    Je ne vais pas vous parler 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 souciez pas de bien comprendre chaque sujet que vous avez lu – à ce stade, il est plus important que vous soyez en mesure de reconnaître le type de problème que vous examinez afin étudier à temps quand vous êtes réellement confronté à cela. En d’autres termes, c’est correct si vous ne savez pas comment résoudre un problème de combinatoire, du moment que vous en savez assez pour rechercher la “combinatoire” lorsque vous devez voir combien de manières vous pouvez organiser un ensemble d’objects ou choisir un sous-ensemble .

    Wikipedia est une bonne ressource pour ce type de navigation de grande envergure, surtout si vous commencez simplement par parcourir. Encore mieux, surtout si vous trouvez que Wikipedia est trop académique ou inaccessible, c’est le wiki C2 . (Il est intéressant de noter que ce wiki original a été inventé par Ward Cunningham).

    Je pense qu’il est essentiel de comprendre la théorie de base du multithreading, sans laquelle il peut être difficile de voir qu’il peut y avoir un problème, jusqu’à ce que vous soyez en train de déboguer sur un serveur live à 4 heures le dimanche matin.

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

    Non, pas de sorting par bulles, de sorting rapide. C’est la moyenne des sortingeurs de big-O thing-bubble O (n ^ 2), le sorting rapide est O (n * log (n)).

    Je dirais ci-dessous sont les choses les plus importantes

    • Programmation orientée object
    • Concepts du système d’exploitation
      • Processus et fil
      • Algorithmes de planification
    • Structure de données
      • Type de stockage et de collecte de données, types (liste de liens, hachage, tableau, etc.)
      • Algorithmes de sorting
      • Complexité des algorithmes

    Ensuite, allez à des choses spécifiques liées à la langue. J’espère que ceci est utile!!

    Je commencerais par la citation:

    “Si le seul outil que vous avez est un marteau, vous traitez tout comme un clou”. (Abraham Maslow)

    Le principe le plus important, IMO, consiste à connaître de nombreux paradigmes de programmation, langages et à vous informer sur les outils à votre disposition. Tout problème peut être résolu dans presque toutes les langues que vous choisissez, qu’il s’agisse d’un langage courant 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 objective principal: sophistication, obscurcissement, performances, portabilité, maintenance, taille de code réduite…

    Sinon, vous finirez comme certains programmeurs qui tentent désespérément de faire quelque chose dans une langue qu’ils ont spécialisée, alors que le problème pourrait être sortingvial à résoudre dans un contexte de programmation différent.

    Ce conseil va de pair avec la tendance actuelle pour les projets multilingues (prendre des applications Web par exemple, 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 des concepts issus de paradigmes de functional programming, lambdas).

    Donc, l’essentiel est l’ apprentissage constant, pour toujours 🙂

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

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

    Je n’ai pas bien compris l’algèbre linéaire avant d’avoir lu des graphismes en 3D, l’un des meilleurs cours que j’ai suivi même si notre professeur était mauvais.

    Étant donné que les machines à plusieurs cœurs (à la fois CPU et GPU) deviennent la norme, je dirais que les algorithmes dissortingbués (de plusieurs threads à plusieurs machines) sont inclus. Il est essentiel de comprendre le traitement multi-thread et dissortingbué. Désolé, le lien ne vous aide pas vraiment.