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 à:
- Quels concepts je devrais comprendre,
- Toutes les bonnes ressources pour bien les comprendre (car Wikipédia peut parfois être un peu dense et académique).
computer-science
Jon Artus
la source
la source
Réponses:
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:
la source
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.
la source
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:
la source
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 nécessaire pour CS:
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 .
la source
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.
la source
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.
la source
La matrice de compétences des programmeurs a couvert cela en détail, mais je vais en souligner quelques-uns:
la source
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.
la source
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 ).
la source
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
la source
Pour moi, j'ai beaucoup profité du cours suivant à l'université
Les choses que j'aurais aimé faire à l'université
la source
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.
la source
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.
la source
Encapsulation
En informatique, l'encapsulation consiste à cacher les mécanismes internes et les 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épendants des détails de la façon dont il le fait
la source
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 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.
la source
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!
la source
Quelques concepts du système d'exploitation
[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 ]
la source
Visez un couplage faible, une cohésion élevée .
(J'ai volé cette image du site Web lié ci-dessus)
la source
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.
la source
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 ...
la source
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
Conception OO
Structures de données et algorithmes (je ne me souviens plus 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/0130313580
Problèmes de NP
la source
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)
la source
Structure et interprétation des programmes informatiques . Si vous comprenez ce livre, tout le reste peut être construit facilement sur cette base. Si vous rencontrez des problèmes avec les concepts du livre, vous êtes peut-être un développeur de logiciels mais pas un informaticien.
la source
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).
la source
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.
la source
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)).
la source
Je dirais que ci-dessous sont les choses les plus importantes
Ensuite, allez à des éléments liés à une langue spécifique. J'espère que ceci est utile!!
la source
Je commencerais par la citation:
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 :)
la source
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.
la source
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.
la source