Quels * sont * les concepts de programmation que je devrais maîtriser pour avoir une compréhension approfondie de mon métier (programmation)? [fermé]

13

Par ordre d'importance, s'il est possible de le faire et qu'il ne l'est pas, quels sont les fondements les plus importants pour savoir comment programmer. Algorithmes, itération, récursivité, etc.?

Notez que là où je mets, etc., c'est ma question. J'ai récemment lu un article sur Internet qui disait que 9 programmeurs sur 10 ne pouvaient pas haleter !

http://www.codinghorror.com/blog/2007/02/why-cant-programmers-program.html

Je veux avoir une connaissance approfondie de ce que j'essaie réellement d'accomplir lors de la programmation et une compréhension exhaustive des outils de base à ma disposition. En gros je veux pouvoir peindre avec toutes les couleurs du vent.

Kewigro
la source
3
Le billet de Jeff Atwood ne traite pas vraiment de connaissances approfondies en programmation ... Il s'agit de la réalité que beaucoup de gens manquent de connaissances fondamentales et fondamentales sur la programmation, et comment le manque de ces connaissances fondamentales les empêche de développer d'importantes compétences en programmation.
Robert Harvey
2
Je ne comprends pas pourquoi cette question a été close. C'est une question qui a été mise en vedette 5 fois et qui contient de nombreuses réponses utiles. C'est le genre d'informations que je veux trouver - simplement parce qu'il n'y a pas de réponse simple ne signifie pas que les informations ne sont pas de bonne valeur, peut-être programmers.stackexchange.com doit-il réévaluer ses critères de clôture des questions.
Rocklan
@LachlanB J'ai voté pour la réouverture ... a besoin de 4 votes de plus pour réussir
Michael Brown
Je pense que c'est une bonne question mais toute réponse raisonnable sera trop longue pour le format de ce site. Tout bon programme universitaire couvrira ces concepts, et le fait qu'un tel programme nécessite quelques années d'études et de pratiques dédiées, suivies d'années supplémentaires de travail sur des projets réels, devrait expliquer clairement pourquoi la réponse ne peut pas trouver sa place ici.
Giorgio

Réponses:

18

Cette liste est un début ... vous posez une grande question!

  • Comment clarifier et noter ce que les clients veulent («exigences»). C'est un art en soi. Si vous pouvez le faire, votre travail de programmation sera bien meilleur.
  • Comment estimer et planifier le projet. Les gens vous demanderont un devis, soyez prêt.
  • Comment réviser de manière constructive le code des autres.
  • Modèles de conception. C'est un gros problème. Mais ne les utilisez pas avec trop de zèle pour le plaisir.
  • Découvrez la différence entre un bug, un problème et des demandes de fonctionnalités
  • Restez à jour avec les frameworks / bibliothèques. Vous n'êtes pas obligé de les utiliser, mais vous devez savoir ce qu'ils font et leurs avantages / inconvénients. Si quelque chose semble trop difficile, il y a probablement (espérons-le) une manière beaucoup plus simple de faire les choses.
  • Comment documenter des algorithmes compliqués dans un organigramme ou tout simplement l'écrire en anglais. Ne vous attendez pas à ce que quelqu'un passe 2 jours à essayer de désosser votre code.
  • Comment organiser votre structure de code pour que tout le monde puisse la comprendre
  • Comment commenter votre code
  • Comment écrire des tests unitaires
  • Sachez ce qui se passe sous le capot. Par exemple, appeler un service Web - que fait-il réellement?
  • Comment abstraire la logique en classes.
  • Comment refactoriser le code
  • Apprenez l'essentiel de plusieurs langages de programmation. Vous seriez surpris de ce que vous pouvez apprendre d'autres domaines
  • Comment dire aux autres programmeurs quoi écrire.
  • Comment expliquer à la direction ce que vous faites et pourquoi.
  • Comme Peter l'a dit, comment déboguer. Je suis d'accord avec tout ce qu'il dit, les vrais programmeurs déboguent, pas seulement devinez.
  • Comment travailler avec des maniaques. Il y en a beaucoup là-bas.
  • Comment se faire des trucs. Toute la théorie du monde ne vous aidera pas si vous ne pouvez pas faire avancer les choses.

J'ai répondu à une autre question dans le même sens (avec un contenu similaire) ici:

conseils, directives, points à retenir pour le rendu de code professionnel?

Rocklan
la source
1
+1: FAITES DES CHOSES! Il y a quelques années, j'ai publié une diatribe qui disait que c'était la caractéristique déterminante d'un ingénieur - ils accomplissent des tâches. Parfois, ce n'est pas joli, et parfois vous devrez revenir en arrière et le refaire, mais à la fin de la journée, ils font les choses!
Peter Rowell
@PeterRowell: vous pourriez trouver ceci une lecture intéressante: brandonsavage.net/when-to-write-bad-code
Marjan Venema
Malheureusement, la question n'est pas vraiment celle qui correspond à la philosophie Q&A et au format du site, mais cela ne minimise pas la valeur de votre réponse. Si vous souhaitez l'étendre et ajouter un peu d'explication pour chaque point, cela fera un excellent article de blog pour notre blog communautaire .
yannis
@MarjanVenema: Oui, je suis entièrement d'accord avec lui. Dans les années 80, j'ai été chargé d'écrire une spécification pour un nouvel éditeur, à approuver avant de commencer à coder. J'ai regardé ce fichu écran blanc pendant plus d'une semaine en essayant de comprendre comment décrire quelque chose que je ne comprenais pas. Mon manager a exprimé son mécontentement face à mon manque de progrès. Après un week-end de 3 jours, il avait un brouillon sur son bureau. Il a demandé ce qui s'était passé, et j'ai dit que j'avais écrit au rédacteur en chef le week-end, puis j'avais simplement écrit une spécification de ce que je travaillais. J'ai réécrit une partie du code, mais c'était principalement refactor / cleanup.
Peter Rowell
1
@YannisRizos - Je serais intéressé à écrire un blog à ce sujet. Souhaitez-vous m'envoyer un e-mail avec des directives ou dois-je simplement écrire quelque chose?
Rocklan
22

Sous la rubrique " etc. " se trouve quelque chose qui peut facilement prendre 50% ou plus de votre temps.

Apprenez à déboguer.

Cela signifie apprendre la méthode scientifique . Je veux vraiment l' apprendre. Et puis l'appliquer avec une brutale honnêteté . Apprenez à dire précisément ce que vous savez être vrai, ce que vous savez n'est pas vrai et ces choses que vous ne connaissez pas. Chaque fois que vous attribuez un article à la mauvaise catégorie, vous vous rendez la vie beaucoup plus difficile.

Apprenez à dire «je pense» au lieu de «je sais». Vous ne pouvez dire «je sais» que lorsque vous «pensez» que quelque chose est vrai (ou faux), puis vous le prouvez!

De nombreux bugs sont triviaux, mais ils peuvent être difficiles à voir car vous "savez" ce que le code devrait être ... sauf que ce n'est pas le cas. Trouvez un ami pour l'expliquer. Demandez-leur d'être un "idiot expert": quelqu'un qui ne connaît pas votre code, mais dont vous savez que vous ne pouvez pas faire sauter BS. Ne soyez pas surpris si au milieu d'une description que vous leur faites, vous vous arrêtez soudainement et dites: "et ainsi vous pouvez ... voir ... voir que ... sh * t. Merci."

Les bogues non triviaux nécessitent un arsenal de techniques. Un classique qui peut rapidement mettre en évidence la plupart des bogues non liés au timing est Wolf Fence en Alaska. Il y a un loup quelque part en Alaska; construire une clôture coupant l'État en deux. De quel côté est le loup? Coupez ce côté en deux. Faire mousser, rincer, répéter. Faire cela 20 fois à des endroits bien choisis dans le code réduit la zone où le bug (loup) peut être à 1/1048576. Tuez ce loup.

Astuce: recherchez les ondes manuelles, physiques, mentales ou autres. Dès que vous (ou votre collègue) tressaillez / détournez / minimisez l'attention portée à une partie du code, devenez complètement enragé . Parce que la zone où vous connaissez le bug ne peut pas être, même si vous avez passé des heures / jours à chercher la chose d * mn et que vous ne le trouvez toujours pas ... c'est l'emplacement le plus probable pour le bug. Personne ne reçoit un «bye» , personne (y compris la machine, le système d'exploitation, le compilateur ou vous ) n'obtient une sorte de «respect dû». Il y a un bug. Période. Fin de phrase. Maintenant, allez tuer la chose d * mn.

Je ne connais aucune école qui enseigne le débogage comme un sujet à part entière. IMNSHO, c'est peut-être la preuve la plus flagrante qu'ils (universités / professeurs) ne vous apprennent pas à être programmeur, ils vous apprennent plutôt à être ... comme eux? Dur? Peut-être. Vrai? Forge ta propre opinion. Maintenant, prouve-le.

Peter Rowell
la source
Vous pouvez être intéressé par le Saff Squeeze , une technique décrite par Kent Beck qui utilise des tests et une refactorisation pour le débogage: Hit 'em High, Hit' em Low : Regression Testing et le Saff Squeeze de Kent Beck, Three Rivers Institute (Résumé: Pour isoler efficacement un défaut, commencer par un test au niveau du système et progressivement en ligne et élaguer jusqu'à ce que vous ayez le plus petit test possible qui démontre le défaut.) Cela ressemble beaucoup à votre Wolf Fence, en utilisant les tests et les capacités de refactoring des IDE.
Jörg W Mittag
1
Excellente réponse - tout le monde peut écrire du code, de vrais développeurs déboguer.
Rocklan
@ JörgWMittag: Je suis un grand fan des tests de régression automatisés. Je l'ai utilisé pour la première fois dans un projet de moteur de recherche au milieu des années 80, et j'ai été choqué (choqué!) Par ce qui allait tomber après ce qui semblait être un changement "mineur" à un morceau de code à l'air innocent. (Remarque: il s'agissait de 200 000+ SLOC de C, et les problèmes de gestion de la mémoire étaient le fléau de notre existence.)
Peter Rowell
3

Je crains que ce soit une question assez vaste à laquelle quiconque puisse répondre de manière concluante ou faisant autorité, d'autant plus que vous voulez une liste priorisée. Il y a beaucoup de programmeurs et ils travaillent sur des choses très différentes - bien sûr, les fondamentaux restent les mêmes, mais ce dont vous avez besoin pour rester actif dans votre mémoire peut être vraiment différent, et en effet, il y a beaucoup de tâches où vous pouvez rester jolie de haut niveau sans aller plus loin.

Il semble cependant que vous soyez vraiment préoccupé par la façon d'être un meilleur développeur, et pas seulement par un jack-of-one-trade. Je trouve cela admirable et je peux partager certaines des choses qui m'ont aidé à apprendre à programmer.

Presque toute la programmation se résume aux algorithmes et aux structures de données. À leur tour, ils sont des exemples de la question plus vaste - comment modéliser les choses et les processus du monde réel en une représentation telle qu'un ordinateur puisse comprendre. Si vous débutez, il peut être utile d'utiliser un langage de programmation de niveau supérieur (comme Java, Python, peu importe) pour vous familiariser avec la mise en œuvre de structures de données et d'algorithmes.

À un certain moment, après avoir joué avec les structures de données et les algorithmes, vous pouvez commencer à vous poser cette question rongeante "mais comment pouvons-nous dire à l'ordinateur quoi faire, à l'ordinateur le faisant réellement?" Ensuite, vous pouvez voir comment un ordinateur calcule réellement - comment la mémoire et le processeur travaillent ensemble pour exécuter des instructions, comment les systèmes d'exploitation font l'abstraction du matériel afin que vous puissiez écrire un programme qui, par exemple, ouvre un fichier, sans coder à un niveau bas particulier interface de disque dur.

C'est probablement un bon point de départ - comment les algorithmes et les structures de données modélisent les problèmes du monde réel, et comment un ordinateur effectue réellement le calcul. Connaître ce dernier est très utile pour maîtriser les langages de niveau inférieur comme C, qui utilisent beaucoup moins de fumée et de miroirs que les langages OO et de script :)

RuslanD
la source
2

YAGNI : " Implémentez toujours les choses lorsque vous en avez réellement besoin, jamais quand vous prévoyez simplement que vous en avez besoin."

D'après mon expérience, il est courant pour les "programmeurs" de prévoir de nombreux cas à l'avenir et d'essayer "d'améliorer" le code en ajoutant des codes pour les anticiper! Dans la plupart des cas, le code qu'ils ont ajouté ne fera que gonfler le code et ajouter de la complexité au code.

Louis Rhys
la source
1

La chose la plus importante à savoir pour être programmeur est que l'écriture de code est une tâche, et une attitude de "col bleu" ouvrière envers la production de ce que vous êtes payé pour produire vous permettra d'aller plus loin que tout apprentissage ésotérique.

Apprenez à entrer dans la zone. J'entends par là l'état mental lorsque vous vous concentrez uniquement sur votre tâche et que vous pouvez commencer à garder beaucoup de choses dans votre tête et comment elles interagissent en même temps. Une fois que vous avez l'habitude d'entrer dans la zone à volonté, commencez à vous soucier du reste. Jusqu'à ce que vous puissiez marteler du code comme une sorte de code martelant quelque chose, le reste est pratiquement inutile.

ÉDITER:

Si vous n'y croyez pas et que vous m'avez déçu, je crois que vous ne savez pas si vous avez la détermination de le faire pendant 20 ans. Je sais que je le fais parce que je l'accepte. ;)

Nathan C. Tresch
la source
0

Une question récente, liée en quelque sorte à celle-ci, et Answer avait un lien vers ce blog qui traite du même problème sous un angle différent.

Le concept le plus important pour tout développeur est probablement "l'humilité" ... Une fois que vous acceptez, vous ne savez pas tout, vous êtes ouvert à l'exploration de solutions. La plupart des personnes qui écrivent des blogs sur la programmation sont dans le centile supérieur, et le problème est que beaucoup n'ont pas encore contrôlé leurs tendances narcissiques .... c'est pourquoi ils bloguent ..... Vous devez apprendre à identifier ces blogueurs et ignorer là-bas

Le blog lié n'est vraiment rien de plus qu'une diatribe - Dans chaque industrie se plaint que les récents diplômés sont inutiles sont communs, qu'il faut des années pour les rendre utiles et productifs. Le problème est peut-être que ces gourous autoproclamés attendent vraiment trop et ont oublié qu'une fois ils n'auraient pas pu résoudre FizzBuzz. Tout le monde ne peut pas être dans le 10e centile supérieur, par définition, la moitié des programmeurs sont en dessous de la moyenne ......

mattnz
la source
Je suis d'accord que les gens se déchaînent beaucoup, mais je pense que le point des articles que vous avez liés ci-dessus est que les personnes qui ne savaient pas comment résoudre FizzBuzz postulaient pour des emplois de programmation , ce qui est différent d'être simplement un débutant et d'avoir besoin de conclure votre tête autour de la programmation des idiomes. Je suis cependant d'accord avec vous sur le point de l'humilité, et beaucoup de gens semblent ne pas savoir ce que c'est.
RuslanD