Apprendre moi-même, en tant que physicien, à devenir un meilleur programmeur [fermé]

17

J'ai toujours aimé la physique, et j'ai toujours aimé le codage, donc quand j'ai reçu l'offre pour un poste de doctorat en physique numérique (les détails ne sont pas pertinents, c'est surtout la programmation parallèle pour un cluster) dans une université, c'était un non -brainer pour moi.

Cependant, comme la plupart des physiciens, je suis autodidacte. Je n'ai pas de connaissances générales sur la façon de coder d'une manière orientée objet, ni sur le nom de cet algorithme spécifique qui optimise la recherche dans un arbre kD.

Étant donné que tout mon travail jusqu'à présent a été davantage axé sur la physique et les résultats scientifiques, j'ai sans aucun doute de mauvaises habitudes - d'autant plus que mon codage est le mien, et pas vraiment le travail d'équipe. J'ai surtout utilisé C car il est très simple et "ce que vous écrivez est ce que vous obtenez" - pas besoin d'abstractions fantaisistes. Cependant, je suis récemment passé au C ++ depuis que j'aimerais en savoir plus sur la puissance fournie avec l'abstraction, et c'est assez similaire au C (au niveau de la syntaxe au moins).

Comment puis-je m'apprendre à coder d'une manière bonne et abstraite comme un diplômé en informatique?

Je sais que mon code est efficace, mais je veux qu'il soit également élégant et lisible. Gardez à l'esprit que je n'ai pas le temps de lire plusieurs tomes de 1000 pages sur la programmation abstraite. Je dois consacrer du temps à des recherches réelles liées à la physique (mon superviseur se moquerait de moi s'il savait que je passais du temps à réfléchir à la façon de programmer avec élégance). Comment puis-je évaluer si mon travail est également bon du point de vue d'un programmeur?

user787267
la source
12
Une question: comment savez-vous que votre code est efficace?
Matsemann
J'ai vu beaucoup de gens dire non au C ++ comme premier langage OO. J'apprends Java et j'ai trouvé les didacticiels vidéo de Mark Dexter iciJ'apprends eclipsetutorial.sourceforge.net/totalbeginner.html , ils sont assez bons et vous apprendront de manière TDD. Consultez également Head First Java, il est assez bon pour couvrir Java de manière OO.
Garv
4
@DeveloperDon, le calcul était un élément central de la physique avant même qu'il n'y ait des ordinateurs électroniques. Les calculs ont été effectués à la main ou sur des calculatrices mécaniques. Depuis la seconde guerre mondiale, les physiciens sont profondément impliqués dans les logiciels. Si vous calculez le retour d'une comète, simulez la production de neutrons dans une réaction en chaîne nucléaire ou analysez des gigaoctets de données à la recherche de signes du boson de Higgs, vous devez faire beaucoup de calculs. En 1974, la première moitié de mon laboratoire de physique de première année était consacrée à l'enseignement du FORTRAN.
Charles E. Grant
1
@DeveloperDon Lorsque les physiciens du CERN, par exemple, obtiennent des données, ils obtiennent des données de millions de collisions de particules. Vous avez besoin d'un ordinateur pour gérer cette quantité d'informations. Considérez également un domaine comme la physique du solide où vous essayez de comprendre les propriétés macroscopiques d'un matériau à partir des interactions microscopiques des atomes. Dans un tel système, un seul électron ressent la répulsion / attraction de milliards de noyaux et d'électrons - et pour décrire un tel système avec précision, vous avez besoin d'un ordinateur rapide et d'algorithmes efficaces (et de bonnes approximations des équations fondamentales).
user787267
1
Peut-être devriez-vous changer votre langage de C / C ++ en Python pour avoir plus de temps? Python est souvent utilisé par les scientifiques , il existe des modules comme NumPy - package pour le calcul scientifique avec Python ou SciPy . Si vous avez besoin de la vitesse de C / C ++ en Python puis utilisez Cython , cela vous permet d'utiliser des types et des structures C / C ++ afin d'obtenir une vitesse similaire à C / C ++, il est également facile de l'intégrer avec les bibliothèques C / C ++ existantes en utilisant Cython.
Czarek Tomczak

Réponses:

20

Gardez à l'esprit que je n'ai pas le temps de lire plusieurs tomes de 1000 pages sur la programmation abstraite.

Alors, demandez-vous à quelqu'un de vous donner une liste de contrôle en cinq étapes qui fera de vous un programmeur qualifié? Ça ne va pas arriver !

Comme pour toute autre discipline, si vous voulez vous perfectionner en programmation, vous devez consacrer du temps et des efforts à vous entraîner et à étudier. Vous apprenez à écrire du code clair et élégant en écrivant beaucoup de code et en lisant attentivement le code des autres. Certains de ces tomes de 1000 pages vous feront gagner du temps en résumant les dures leçons que d'autres ont apprises. Il est délirant de penser que vous pouvez devenir un programmeur qualifié comme un effet secondaire indolore d'obtenir un doctorat en physique. Ce n'est pas que vous ne pouvez pas sortir d'un doctorat en physique. avec des compétences de programmation folles, c'est juste que cela vous coûtera du temps et des ennuis.

Code terminé est une bonne introduction à la mécanique du développement logiciel, y compris des conseils sur la façon d'écrire et de structurer un code clair et maintenable. Oui, c'est un énorme tome, mais il n'est certainement pas aussi dense que le disent les "Principes de la mécanique quantique" de Dirac ou la "Gravitation" de MTW. Code Complete est aussi proche que possible d'une liste de contrôle en cinq étapes pour écrire un meilleur logiciel.

Matlab, VIM, C, MPI et Valgrind sont d'excellents outils à connaître. Vous ne mentionnez pas l'utilisation d'un système de contrôle de version. Si, par hasard, vous n'utilisez pas déjà un système de contrôle de version, vous devez commencer à en utiliser un immédiatement. Le contrôle de version est également un don pour la rédaction de votre thèse. Les autres outils de base que vous devez connaître sont un débogueur, un profileur d'exécution, un cadre de journalisation et un cadre de tests unitaires. Vous n'avez pas besoin de lire un livre de 1000 pages pour chacun d'eux. Parcourez les didacticiels en ligne pour obtenir les bases, puis commencez à travailler avec eux. Plongez plus profondément dans la documentation à mesure que vos besoins deviennent plus sophistiqués.

Vous conseiller sur l'apprentissage des fondamentaux de l'informatique (par opposition aux fondamentaux de la construction de logiciels) est plus difficile. Vous ne spécifiez pas le problème sur lequel vous travaillez, que vous développiez de nouveaux algorithmes ou appliquiez des algorithmes existants. Selon votre problème de recherche, une étude des structures de données de base et des algorithmes standard peut être utile. D'autres problèmes bénéficieraient davantage d'une solide expérience en analyse numérique. Si vous voulez apprendre les bases de l'analyse algorithmique, il y a plusieurs bons textes.Le manuel de conception d'algorithmes et l' introduction aux algorithmes me viennent à l'esprit. Il y a aussi quelques bons cours d'introduction disponibles en ligne maintenant: Conception et analyse d'algorithmes et Algorithmes .

Charles E. Grant
la source
Merci pour les liens, je vais y jeter un œil. Je sais que je ne deviendrai pas un gourou du codage en un week-end, mais je m'attends à m'améliorer progressivement avec le temps - surtout si je cherche l'inspiration en dehors de la physique (comme beaucoup de physiciens que je connais ne se soucient pas des bonnes pratiques de codage).
user787267
1
J'ajouterais du python dans les outils comme nombre lisible
Xavier Combelle
2
+1 pour suggérer le code terminé. C'est vraiment la meilleure chose que l'opérateur puisse lire pour résoudre le problème en question.
JW01
9

Mes antécédents sont un peu similaires aux vôtres - j'étais un diplômé en physique qui était un programme autodidacte. Après avoir obtenu mon diplôme, j'ai accepté quelques emplois en informatique et suis finalement devenu ingénieur logiciel; y compris un peu de temps à travailler sur OpenGDA (logiciel utilisé pour exécuter des expériences sur divers sites de synchrotron).

La principale chose que j'ai apprise au sujet des questions que vous vous posiez pendant que j'arrivais ici est qu'il est beaucoup plus facile d'obtenir ces compétences d'autres personnes que d'essayer de les acquérir vous-même. Un mentor expérimenté peut facilement vous aider à identifier où votre code est faible ou où les modèles et pratiques courants peuvent vous aider. Bien que j'aie appris à écrire C et Objective-C par moi-même, je ne savais pas exactement ce que je ne savais pas (si vous voyez ce que je veux dire) jusqu'à ce que je travaille avec d'autres personnes sur le même code. Le fait que vous demandiez ici des conseils signifie que vous vous débrouillez mieux que moi :-).

Maintenant, où trouvez-vous un ingénieur logiciel professionnel apprivoisé? J'ai récemment rejoint MentorNet , un système qui associe des programmeurs expérimentés à des protégés.

Mais vous n'avez pas à opter pour un système formel comme celui-là. Trouver un groupe de rencontre de programmeurs local (ou où le département de génie logiciel de votre université se rend après le travail le vendredi) est un excellent point de départ.


la source
MentorNet semble très intéressant - je vais y jeter un œil. S'agit-il d'une transition difficile du physicien à l'ingénieur logiciel?
user787267
@ user787267 Étant donné que je m'intéressais à la programmation (et que j'étais déjà programmeur amateur), j'étais motivé à faire la transition telle qu'elle vous ressemble, donc je n'ai pas trouvé le côté technique difficile. Ce qu'il m'a fallu plus de temps pour comprendre le wetware: comprendre ma place dans une équipe de projet plus grande et qui était expert dans ce qui est un grand changement par rapport au codage "loup solitaire" que je faisais auparavant.
5

Pas de voie royale vers les logiciels

Dans l'Antiquité, Euclide a posé une question comme la vôtre à son élève le roi Ptolémée. Sa réponse: "Il n'y a pas de voie royale vers la géométrie".

Vous mentionnez que votre superviseur rirait s'il savait combien de temps vous passez à écrire du code comme un développeur professionnel. D'autres ont répondu à vos questions avec une liste de choses à apprendre allant du contrôle des sources à la conception et à l'analyse des algorithmes.

Ils sont loin de votre objectif:

"Je dois passer du temps sur la physique réelle"

Pianiste de concert ou One Man Band?

Le monde bouge trop vite pour que les gens puissent barboter. Si vous voulez être pianiste de concert, ne divisez pas votre temps à apprendre les instruments pour devenir un orchestre d'un seul homme.

Mon concept pour le rôle d'un doctorat en physique sur des projets de moyenne à grande envergure est celui de chef d'idée pour la définition de système, expert en théorie, expert en la matière lors de la création de cas d'utilisation et utilisateur final / juge pour les résultats générés par les artefacts logiciels. Travaillez en étroite collaboration avec les meilleurs ingénieurs logiciels que vous pouvez.

Comment puis-je évaluer si mon travail est également bon du point de vue d'un programmeur?

Si vous voulez placer la barre haute, commencez ici:

Architecture logicielle en pratique, Len Bass, Paul Clements, Rick Kazman

Recherchez le chapitre "Comprendre les attributs de qualité". Au-delà du code, il considère l'utilisabilité, modifiable, les performances, la sécurité, la disponibilité, la fiabilité, la testabilité, la maintenabilité et la portabilité (vous ne pouvez pas le transporter, mais pouvez-vous porter la conception d'une plate-forme à une autre). Tous ont besoin d'objectifs mesurables spécifiques. Des références similaires incluent:

http://msdn.microsoft.com/en-us/library/ee658094.aspx

http://www.sei.cmu.edu/reports/95tr021.pdf

Vos objectifs par rapport à C et C ++

Comme FORTRAN, ce sont des langues dures et anciennes. Les indicateurs positifs pour C / C ++ comprennent:

  • Application avec matériel, systèmes embarqués.
  • Projet existant que vous souhaitez comme points de départ.

Il y a beaucoup de gens qui font du développement web, de la visualisation de données et du big data. Beaucoup sont motivés pour trouver ou créer d'autres langues. Par exemple, le physicien Sir Tim Berners-Lee a fait son succès avec HTML (mais est peu connu pour la physique). Évaluez votre objectif par rapport à votre langage de programmation.

Envisagez d'utiliser Matlab

Matlab a une grande base installée, est spécialisée pour les mathématiques et les sciences. Il dispose d'outils pour la visualisation des données. Il permet aux scientifiques et aux mathématiciens d'exprimer des problèmes dans le domaine du problème plutôt que dans le domaine de la solution. Matlab fabrique des produits Parallel Computing Toolbox et Distributed Computing Server.

Je m'attends à ce que le succès de Matlab soit dû à l'utilisation d'équipes multidisciplinaires avec des experts en physique, mathématiques, électronique et instrumentation, systèmes d'exploitation, langages de programmation, développement de logiciels, tests de logiciels, architecture et conception de logiciels. L'analogie peut être un peu exagérée, mais pourquoi vous mettriez-vous seul là-bas, à commencer par un marteau, un ciseau et une râpe pour faire quelque chose quand vous avez une imprimante 3D disponible? Comme Newton pourrait le demander, pourquoi ne pas vous tenir sur les épaules de quelqu'un?

DeveloperDon
la source
4

Vous pourrez faire un long chemin en physique sans rien savoir du style "professionnel" (parler d'expérience). Mais j'ai vu beaucoup de gens perdre du temps sans fin parce qu'ils ont perdu la trace de ce qu'ils faisaient ou après avoir développé leur code pendant quelques années, ils se sont perdus dans leur complexité (même dans le monde universitaire, il n'y a pas de code "jetable", mais les choses rester plus longtemps que vous ne le pensez au départ).

Je vous suggère de prendre une longueur d'avance dans les algorithmes et les structures de données, par exemple avec ce cours . Après cela, vous devriez être en mesure de penser aux performances à un niveau plus productif et être en mesure de suivre, par exemple, des articles sur Wikipedia.

Après cela, familiarisez-vous avec ce qui est disponible dans le cœur de votre langue, par exemple pour C ++ cppreference.com . Je vous recommande également fortement de lire les séries Effective C ++ de Scott Meyers et Accelerated C ++ de Koenig & Moe. Au moins pour C ++, cela vous donnera une base solide du côté du langage.

En parallèle, vous devriez essayer de bien connaître vos outils. Il n'est pas improbable que vous développiez votre code sous Linux, alors essayez d'apprendre à obtenir plus de diagnostics (avertissements) de vos compilateurs (au moins gcc et clang). Découvrez également les outils d'analyse statique comme cppcheck ou scan-build de clang . Apprenez à faire de ces outils une partie intégrante de votre processus de développement, par exemple en les intégrant dans votre configuration de build (oui, vous devez utiliser au moins GNU make, ou mieux encore quelque chose comme GNU autotools / cmake / ...). Vous devez également ajouter des outils de profilage à votre jeu d'outils. Pour C ++, je vous recommande fortement d'apprendre tout ce que vous pouvez sur valgrind qui peut profiler à un niveau très bas (cela peut également vous aider à trouver des fuites de ressources).

Tout cela vous aidera à vous concentrer sur ce qui vous importe le plus (vos recherches) au lieu de perdre du temps à trouver des bogues ou à faire des optimisations inutiles. Bien sûr, cela est presque impossible à vendre à un conseiller, mais ils (et vous) seront impressionnés par la rapidité avec laquelle vous pourrez obtenir des résultats fiables.

Vous avez mentionné C et C ++, mais pour les calculs numériques, je ne peux pas recommander suffisamment Python avec numpy et scipy . Il vous permet d'écrire dans un langage propre et très propre à un très haut niveau (vous pouvez même travailler de manière interactive), tout en profitant des routines extrêmement optimisées implémentées en C, C ++ et FORTRAN. De plus, l'interfaçage de votre propre code C ou C ++ avec Python est presque trivial.

Benjamin Bannier
la source
Merci pour les liens! J'y reviendrai certainement (mais je ne pense pas avoir le temps de lire plusieurs livres - même si j'ai lu le C ++ accéléré au lycée à un moment donné). Je travaille dans un environnement Unix (j'utilise Vim comme éditeur et j'aime ça), et j'utilise largement make et Valgrind. J'ai également déclenché l'option -pedantic dans gcc et -Wall car cela aide beaucoup. J'aurais peut-être dû mentionner que je fais du calcul haute performance (avec la bibliothèque MPI pour la programmation parallèle) sur le supercalculateur de l'université.
user787267
Je dois également mentionner que Python n'est pas vraiment une option car mon code doit être très rapide - même si je l'aime bien pour le traçage par exemple. J'ai aussi beaucoup utilisé Matlab.
user787267
J'utilise assez souvent Python comme interface pour parler aux routines implémentées dans mon propre C ++. Avec Boost, c'est vraiment facile et vous obtenez toute la flexibilité de Python (par exemple pour le traitement des données pour le traçage). En outre, Python est assez pratique pour le prototypage. Une fois que je sais que quelque chose devient crucial, je peux toujours le déplacer en C ++. Puisque vous mentionnez MPI, je vous recommande de passer une soirée avec IPython avec une belle interface pour l'informatique distribuée.
Benjamin Bannier
@ user787267 Il n'est plus nécessairement vrai que Python fonctionne lentement - jetez un œil à youtube.com/watch?v=Iw9-GckD-gQ par exemple. La clé est que vous pouvez utiliser Python pour écrire plus rapidement un code de travail que vous pouvez ensuite accélérer 1) en utilisant numpy / scipy 2) en utilisant Cython ou shedskin, et 3) en mettant uniquement l'algorithme de base dans un module C / C ++ ou FORTRAN si vous avez vraiment besoin de cette dernière amélioration de 5%. Rappelez-vous également que le temps que vous passez à coder est le temps que le code ne s'exécute pas déjà, il peut donc parfois être plus efficace d'avoir un code de performance à 80% écrit en deux fois moins de temps
Tobias Kienzler
Je fais généralement des prototypes dans Matlab pour tester les trucs faciles, mais j'ai voulu passer en Python pendant un certain temps. Je vais y jeter un œil. En raison de grandes parties de mon code déjà écrites en C ++, je ne veux cependant pas changer la langue à mi-chemin. Bien qu'il soit vrai que vous devez également prendre en compte la programmation horaire en temps réel (et croyez-moi, je le fais), je ne pense pas que cela devrait être une excuse pour ne pas améliorer vos compétences en programmation (progressivement).
user787267
4

Comment puis-je évaluer si mon travail est également bon du point de vue d'un programmeur?

  • Est-ce correct? Produit-il des résultats corrects dans tous les cas?

  • D'autres personnes sont-elles capables de lire et de comprendre facilement votre code?

  • Lorsque votre superviseur dit "Génial, maintenant faites-le aussi X ..." devez-vous réécrire beaucoup de code?

  • Lorsque vous avez écrit un programme, devient-il un outil que vous pouvez utiliser encore et encore, ou est-ce une utilisation une fois et le jeter?

Si vous pouvez répondre oui, oui, non et «oui, j'essaie de faire des outils plutôt que des calculs ponctuels», alors vous vous débrouillez déjà assez bien. Une bonne partie de ce que nous faisons en tant que programmeurs est censée aider avec le genre de choses énumérées ci-dessus.

Caleb
la source
3

Vos programmes seront complètement différents du code source commercial, par conséquent, de nombreuses bonnes pratiques et approches ne s'appliqueront pas à votre développement de code source au jour le jour. Mais il existe un bon moyen d'apprendre quelques trucs et astuces.

Laissez un bon développeur de logiciels examiner votre code et l'optimiser ensemble. Cela vous donnera beaucoup plus d'expérience et vous enseignera les bonnes pratiques. Consultez également le code source écrit par d'autres personnes. Recherchez des projets open source sur sourceforge ou github et lisez leur code source.

Mais surtout, demandez-vous si vous avez réellement besoin d'apprendre quelque chose de nouveau pour atteindre vos objectifs. Faire des choses inutiles juste pour rendre le code plus joli n'ajoutera aucune valeur à vos applications.

Andrzej Bobak
la source
Lire et participer à des projets open source est en fait une très bonne idée - mais quelque chose que je devrais faire pendant mon temps libre (mais comme j'aime la programmation, cela ne devrait pas être trop un problème). Une des raisons pour lesquelles je souhaite devenir un meilleur programmeur est que je ne suis pas sûr de rester dans le monde universitaire. Quand mon ph.d. est fait, je pourrais peut-être trouver un emploi dans l'industrie - et ici, un programmeur qualifié devrait être en forte demande. Une autre raison est la satisfaction intellectuelle de créer quelque chose d'élégant / beau - comme résoudre une équation différentielle vraiment difficile.
user787267
Malheureusement, l'industrie requiert des compétences que vous ne gagnez généralement pas dans le développement académique. Les éléments que vous écrirez au cours de vos recherches universitaires représentent généralement moins de 5% du code source de l'application commerciale.
Andrzej Bobak
3

Pour devenir un meilleur programmeur, il n'y a pas de solution miracle. Si vous êtes autodidacte, la clé est la conscience de soi, ce qui ressemble à vous. Cependant, apprendre à bien coder se résume principalement à la lecture et à la pratique.

Être critique envers votre propre code est l'un des meilleurs moyens de s'améliorer. Demandez-vous toujours:

  • Sera-ce facile à changer?
  • Est-ce facilement testable?
  • Puis-je simplifier cela? Puis-je facilement comprendre cela quand je le revois dans 3 mois?

Mon autre suggestion serait de ne pas vous enfermer dans C / C ++. Bien que ce soient de bonnes langues utilisées pour une raison, elles nécessitent que vous fassiez beaucoup de choses qui ne sont pas liées au sujet. Regardez dans Matlab, je serais surpris si l'université n'a pas cela à votre disposition. Considérez un langage de script comme Python. Pensez fortement à choisir un langage fonctionnel comme Haskell - le paradigme est de nature très mathématique et s'adapterait probablement à vos problèmes comme un gant. En bref, explorez d'autres langages / paradigmes. Même s'ils ne deviennent pas un outil permanent dans votre ceinture, ils feront de vous un meilleur programmeur.

Vous voudrez peut-être également examiner la conception d'un algorithme. Je soupçonne d'avoir obtenu le poste, vous êtes déjà relativement à la hauteur, mais les algorithmes sont incroyablement importants lors de l'analyse numérique. En fait, je soupçonne qu'il existe des ressources spécifiquement axées sur les algorithmes d'analyse numérique.

Ne perdez jamais de vue votre objectif principal en écrivant le code. Vous devez faire avancer les choses. Devenir un meilleur programmeur est une méthode pour y parvenir. La sélection des bons outils pour le travail en est une autre.

Mike Cellini
la source
2

Premièrement, «élégant» est un terme relatif. L'abstraction peut vous sembler élégante, mais pour un autre aficionado, elle peut sembler inutile. Quoi qu'il en soit, pour répondre à votre question, vous devriez essayer de publier votre code pour examen sur http://codereview.stackexchange.com .
S'éloignant du point principal, quelques conseils non sollicités basés sur ma propre expérience. Si vous pouvez faire tout votre travail avec juste C, alors pourquoi voulez-vous le coder de manière abstraite? Par cela, voulez-vous permettre à d'autres de réutiliser votre code? Si vous avez vraiment une bonne raison de passer au C ++, optez pour l'abstraction et l'apprentissage des concepts C ++ et OO. Sinon, laissez tomber l'idée. À mon humble avis, ne devriez-vous pas viser à ce que votre code soit plus lisible et vos résultats scientifiques reproductibles que de lui donner des abstractions OO? J'avais moi-même ce genre d'obsession d'apprendre OOPS et de coder "élégant". Mais le C ++ prendra du temps à maîtriser. Vous devrez apprendre la gestion de la mémoire car le garbage collection n'est pas automatique en C ++. Suivez mes conseils depuis que j'ai moi-même travaillé pour un laboratoire de recherche et perdu beaucoup de temps à apprendre le C ++ et l'OO,

HAcKnRoCk
la source
1
Mais C est encore plus non géré que C ++. En C ++, il y a au moins RAII.
Benjamin Bannier
J'aime coder, donc je veux devenir un meilleur programmeur. Je suis un physicien d'abord et un programmeur ensuite, mais cela ne signifie pas que je ne devrais pas améliorer mes compétences en programmation - après tout, si je décide de publier mon code avec les résultats scientifiques, il vaudrait mieux avoir du plaisir, code lisible.
user787267
2

Compte tenu de votre mention du manque de temps pour étudier la théorie.

Si vous avez regardé votre ancien code après quelques mois et vous êtes demandé "quel genre d'idiot a écrit ce code", vous progressez.

Comment avez-vous progressé? En voyant un meilleur code écrit par d'autres. Une personne ne connaît jamais la valeur de «l'élégance» ou du «bon» code à moins de la voir ajouter de la valeur à son travail. Plutôt que de lire la théorie, je vous encourage à garder les yeux ouverts sur le code écrit par d'autres dans votre domaine de travail. Gardez les yeux ouverts sur les concepts discutés sur stackoverflow (balise C ++). Passer seulement quinze minutes par jour à effectuer de telles recherches peut vous exposer au hasard à des concepts qui peuvent vous aider. Il peut vous montrer un code mieux écrit que votre code. C'est à ce moment-là que vous suivez Wikipédia et que vous en apprenez davantage. Un tel apprentissage, issu de la curiosité, vous durera beaucoup plus longtemps et vous sera utile que la théorie que vous oublierez au réveil du lendemain.

Pensez également à essayer des langages comme MATLAB ou Python.

Nav
la source
Je passe beaucoup de temps sur Stack Exchange - c'est une ressource inestimable pour moi dans mon travail quotidien. J'ai beaucoup utilisé Matlab, mais il est très facile de développer de mauvaises habitudes telles que de ne pas pré-allouer de tableaux car c'est très indulgent.
user787267
+1 pour python @ user787267 Je ne comprends pas vraiment pourquoi ne pas préallouer un tableau est une mauvaise habitude
Xavier Combelle
2

En tant que physicien devenu programmeur moi-même, j'ai trouvé mon expérience en physique très utile pour former les bonnes métaphores pour comprendre les concepts logiciels. Cette perspective a également rendu l'apprentissage de la programmation plus amusant pour moi et m'a aidé à développer le sens de «l'élégance» dans les logiciels, que vous semblez viser.

J'ai décrit le rôle important et sous-estimé des métaphores et des analogies dans les logiciels dans ma chronique CUJ "Patterns of Thinking - noms, métaphores, meilleure programmation et politique du langage" . Par exemple, les concepts OO de l'héritage de classe sont souvent comparés au passage de traits des parents à la progéniture dans une famille. Ceci est une analogie incorrecte. L'analogie correcte pour l'héritage de classe est la classification biologique des organismes (par exemple, une classe RedRose est une sorte de fleur et une fleur est une sorte de plante).

Ou prenez par exemple le concept logiciel d'une machine à états hiérarchique. Une bonne métaphore ici est le concept d'un système quantique lié tel que l'atome d'hydrogène. Comme vous vous en souvenez, les états d'un atome sont numérotés par trois nombres quantiques | n, l, m>, précisément parce qu'ils sont "imbriqués" (hiérarchiques). Cette métaphore vous montre comment comprendre que les états s'imbriquent dans les états (tout comme les états de moment angulaire (l) se nichent dans les états d'énergie (n)) et vous voyez également immédiatement que l'imbrication d'états est toujours le reflet d'une symétrie du système.

Une autre analogie intéressante de la physique est le "modèle d'acteur du calcul", qui a récemment été redécouvert grâce aux processeurs multicœurs et à l'informatique distribuée dans le "cloud". J'ai trouvé utile et amusant de penser aux événements échangés par des acteurs avec état (alias objets actifs) comme des bosons virtuels, tels que des photons dans QED, ou des gluons dans QCD. Cette métaphore explique la nature asynchrone fondamentale de la communication, le traitement des événements de bout en bout (saut quantique) et l'encapsulation stricte des objets actifs, qui ne peuvent interagir entre eux que via les artefacts intermédiaires explicites.

Quoi qu'il en soit, le développement d'une métaphore système est une pratique recommandée dans XP (programmation eXtreme), et en tant que physicien, vous aurez un avantage à trouver de bonnes métaphores. Vous gagnerez également le sens de «l'élégance», car votre logiciel héritera de l'intégrité conceptuelle des bonnes métaphores que vous appliquez.

Miro Samek
la source
Bien que la physique soit potentiellement une riche source de métaphores, l'intention dans XP est de trouver une métaphore qui facilite la communication avec le client sur place et les autres membres de l'équipe, donc aurait généralement tendance à choisir des métaphores qui sont plus communément comprises.
Pete Kirkham
2

Je peux vous dire que les gains les plus importants que j'ai réalisés en termes d'approche de la résolution des problèmes ont tous été obtenus grâce à l'apprentissage de langages fonctionnels et d'analyseurs. Les deux découvertes ont été faites par accident. Donc, je vous dis maintenant si vous voulez vraiment devenir un meilleur programmeur, vous devez en apprendre davantage sur les différentes techniques impliquées dans l'écriture d'un compilateur, par exemple les analyseurs et les générateurs d'analyseurs, et vous devez apprendre à composer des calculs avec un ordre plus élevé. les fonctions.

PL101: Créez votre propre langage de programmation est une excellente ressource pour l'analyseur et le compilateur . Je n'ai toujours pas trouvé une bonne introduction à la programmation fonctionnelle mais j'entends vraiment de bonnes choses à propos de SICP .

davidk01
la source
-5

Un diplômé en informatique ne sait pas bien coder lorsqu'il obtient son diplôme; ils ne sont pas tellement en demande lorsqu'ils quittent l'université. Seulement s'ils acquièrent l'expérience.

La réponse à votre question est que vous devez apprendre les modèles de conception. J'ai programmé en Java, .NET et maintenant je travaille en tant que programmeur PHP, Javascript et MySQL. .NET a d'ailleurs un niveau d'abstraction très important, par exemple ASP.NET. Cela signifie que vous pouvez ignorer l'apprentissage de l'abstraction. Les langages comme Perl, PHP, etc. ont un faible niveau d'abstraction.

Lisez Head First Design Patterns, c'est un bon livre. C'est un livre assez complet. C'est tout ce dont vous aurez besoin.

Dmitry Makovetskiyd
la source
J'ai une idée de la raison pour laquelle cette réponse a été rejetée, mais peut-être que ce sera utile si les votants ont dit pourquoi?
Pierre Arlaud