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?
la source
Réponses:
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 .
la source
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
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:
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:
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?
la source
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.
la source
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.
la source
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.
la source
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:
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.
la source
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,
la source
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.
la source
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.
la source
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 .
la source
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.
la source