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
Structures de données
Algorithmes
De toute évidence, la liste est un peu courte pour le moment, j'espérais donc des suggestions sur:
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:
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.
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:
Quelques concepts qui ont aidé à mon développement (intellect et code):
Ce sont des domaines entiers de mathématiques discrètes, mais une introduction sérieuse est requise pour CS:
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 .
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.
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.
Matrice de compétences des programmeurs a couvert cela en détail, mais je vais en souligner quelques-uns:
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.
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 ).
Pour moi, j'ai beaucoup appris du cours suivant à l'université
Choses que j'aurais aimé faire à l'université
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.
[~ # ~] 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.
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 ]
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:
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.
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
Efforcez-vous de faible couplage, forte cohésion.
(J'ai volé cette image sur le site Web lié ci-dessus)
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!
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.
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)
(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))
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 ...
En tant que récent diplômé d'un diplôme en informatique, je recommanderais ce qui suit:
Comme mentionné dans divers articles Notation Big O
OO Design
Structures de données et algorithmes (je ne me souviens pas du titre exact du livre que j'ai utilisé sera mis à jour si je me souviens)
Systèmes d'exploitation http://www.Amazon.com/Modern-Operating-Systems-2nd-GOAL/dp/013031358
Problèmes NP
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.
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).
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.
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)).
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)
Tout sauf le type de bulle:
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.
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.
Je dirais que ci-dessous sont les choses les plus importantes
Ensuite, accédez à des éléments spécifiques à une langue. J'espère que ceci est utile!!
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 :)
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.
É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.