J'ai toujours aimé la physique et j'ai toujours aimé le codage, alors quand j'ai eu l'offre d'une position de doctorat en physique numérique (les détails ne sont pas pertinents, c'est une programmation surtout 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 nouvelles connaissances de base sur la manière de coder de manière orientée objet, ni le nom de cet algorithme spécifique qui optimise la recherche dans certains arbres KD.
Étant donné que tout mon travail a été plus préoccupé par le Physique et les résultats scientifiques, j'ai sans aucun doute quelques mauvaises habitudes - davantage parce que mon codage est le mien, et pas vraiment le travail d'équipe. J'ai principalement utilisé c puisqu'il est très simple et "ce que vous écrivez est ce que vous obtenez" - aucun besoin d'abstractions fantaisie. Cependant, je suis récemment passé à C++ puisque j'aimerais en savoir plus sur le pouvoir qui est livré avec abstraction, et c'est de joli type C (Syntax-sage au moins).
Comment puis-je m'apprendre au code d'une bonne façon abstraite comme un diplômé en informatique?
Je sais que mon code est efficace, mais je veux que ce soit élégant aussi et lisible. N'oubliez pas que je n'ai pas le temps de lire plusieurs tomes de 1000 pages sur la programmation abstraite. J'ai besoin de passer du temps sur la recherche sur la physique actuelle (mon superviseur me moquerait de moi s'il savait que j'ai passé 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?
N'oubliez pas que je n'ai pas le temps de lire plusieurs tomes de 1000 pages sur la programmation abstraite.
Vous demandez donc à quelqu'un de vous donner une liste de chèques en cinq étapes qui vous fera un programmeur qualifié? ça ne va pas arriver !
Comme pour toute autre discipline, si vous voulez avoir du bien à la programmation, vous devez passer du temps et des efforts de pratique et d'étudier. Vous apprenez à écrire un code clair et élégant en écrivant beaucoup de code et en lisant soigneusement le code des autres. Certains de ces tomes de 1000 pages vous feront réellement économiser du temps en résumant les leçons difficiles d'autres personnes ont appris. Il est délirant de penser que vous pouvez devenir un programmeur qualifié comme un effet secondaire sans douleur d'obtenir un doctorat physique .. ce n'est pas que vous ne pouvez pas sortir d'un doctorat physique. Avec des compétences en programmation folle, c'est juste que cela vous coûtera du temps et des problèmes.
code complet est une bonne introduction à la mécanique du développement de logiciels, y compris des conseils sur la manière d'écrire et de structurer le code clair et maintenu. Oui, c'est un énorme tome, mais il n'est certainement pas aussi dense que dire que les "principes de la mécanique quantique" de Dirac ou de la "gravitation" de MTW. code complète est aussi proche que vous allez accéder à une liste de contrôle à cinq étapes pour écrire de meilleurs logiciels.
Matlab, Vim, C, MPI et Valgrind sont d'excellents outils à savoir. Vous ne mentionnez pas à l'aide d'un système de contrôle de version. Si, par une Fluke, vous n'utilisez pas déjà un système de contrôle de version, vous DOIT Commencez en utilisant un immédiatement. La version de version est également un message de Dieu pour écrire votre thèse. D'autres outils de base que vous devriez savoir sont un débogueur, un profileur d'exécution, un cadre de journalisation et un cadre de test unitaire. Vous n'avez pas à lire un livre de 1000 pages pour chacun de ceux-ci. Travaillez dans les tutoriels en ligne pour obtenir les bases, puis commencer à travailler avec eux. Plongez plus profondément dans la documentation que vos besoins deviennent plus sophistiqués.
Vous conseiller sur l'apprentissage des principes fondamentaux de l'informatique (par opposition aux fondamentaux de la construction de logiciels) est plus difficile. Vous ne spécifiez pas quel problème vous travaillez, que vous développiez de nouveaux algorithmes ou que vous appliquez des algorithmes existants. Selon votre problème de recherche, une enquête sur les structures de données de base et les algorithmes standard pourrait être utile. D'autres problèmes profiteraient davantage d'un fond solide en analyse numérique. Si vous voulez apprendre les bases de l'analyse d'algorithmes, plusieurs bons textes. le manuel de conception d'algorithme et introduction aux algorithmes Spring à l'esprit. Il existe également quelques bonnes parcours d'introduction disponibles en ligne maintenant: conception et analyse des algorithmes et algorithmes .
Mon origine est un peu similaire à la vôtre, j'étais un diplôme de physique qui était auto-enseigné en programmation. Après avoir obtenu mon diplôme bien que j'ai pris quelques emplois informatiques et je suis finalement devenu un ingénieur logiciel; Y compris un peu de temps à travailler sur OpenGDA (logiciel utilisé pour exécuter des expériences sur différents sites de synchrotron).
La principale chose que j'ai apprise sur les questions que vous avez pendant que j'avanceais ici est qu'il est beaucoup plus facile d'obtenir ces compétences à d'autres personnes que d'essayer de les ramasser soi-même. Un mentor expérimenté peut facilement vous aider à identifier où votre code est faible ou lorsque des modèles et des pratiques courants peuvent vous aider. Bien que j'ai appris à écrire C et objectif-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 travaillais avec d'autres personnes sur le même code. Le fait que vous demandez ici de conseils signifie que vous faites mieux que ce que je fais déjà :-).
Maintenant, où trouvez-vous un ingénieur logiciel professionnel apprivoisé? J'ai récemment rejoint MagneNet , un système qui partient des programmeurs expérimentés avec des protégés.
Mais vous n'avez pas à aller pour un système formel comme ça. Trouver un groupe de rencontres de programmeur local (ou lorsque le service de l'ingénierie du logiciel de votre université s'affiche vendredi) est un endroit idéal pour commencer.
Aucun chemin royal vers le logiciel
Dans l'Antiquité, Euclid a été posé une question comme la vôtre de son étudiant King Ptolemy. Sa réponse: "Il n'y a pas de route royale à la géométrie."
Vous mentionnez que votre superviseur rigolerait s'il savait combien de temps vous passez à essayer d'écrire du code comme un développeur professionnel. D'autres ont répondu à vos questions avec une liste de blanchisserie de choses à apprendre allant du contrôle de la source à la conception et à l'analyse des algorithmes.
Ils tombent après votre objectif:
"J'ai besoin de passer du temps sur la physique"
pianiste de concert ou une bande d'un homme?
Le monde se déplace trop vite pour les gens pour barboter. Si vous voulez être un pianiste de concert, ne divisez pas votre temps d'apprentissage des instruments pour devenir une bande d'un homme.
Mon concept pour le rôle d'un doctorat en physique sur des projets médiatiques à grands est comme une idée de la définition du système, d'experts en théorie, d'expert en matière de matière lors de la création de cas d'utilisation et d'utilisateur final/juge pour les résultats générés par des 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 régler la barre haute, commencez ici:
Architecture logicielle dans la pratique, Len Bass, Paul Clements, Rick Kazman
Recherchez le chapitre "Comprendre les attributs de qualité". Au-delà du code, il considère la convivialité, la sécurité, la sécurité, la sécurité, la disponibilité, la fiabilité, la vérification de la vérification, la maintenance et la portablie (pas le pouvez le porter, mais pouvez-vous porter la conception d'une plate-forme à une autre). Tous ont besoin d'objectifs mesurables spécifiques. Les références similaires incluent:
http://msdn.microsoft.com/en-us/library/ee658094.aspx
http://www.sei.cmu.edu/reports/95tr021.pdf
Vos objectifs contre C et C++
Comme Fortran, ce sont des langues dures et de vieilles anciennes. Indicateurs positifs pour C/C++ incluent:
Il y a beaucoup de gens qui font le développement Web, la visualisation des données et les grandes données. Beaucoup sont motivés pour trouver ou faire d'autres langues. Par exemple, le physicien Sir Tim Berners-Lee a fait son succès avec HTML (mais c'est peu connu pour la physique). Évaluez votre objectif contre votre langage de programmation.
envisagez d'utiliser MATLAB
Matlab a une excellente base installée, est spécialisée pour les mathématiques et les sciences. Il a des outils pour la visualisation des données. Il permet aux scientifiques et aux mathématiciens d'exprimer des problèmes dans le domaine problématique plutôt que le domaine de la solution. MATLAB constitue une boîte à outils informatique parallèle et des produits de serveur de calcul distribués.
Je pense que le succès de Matlab est due à l'utilisation d'équipes multidisciplinaires avec des personnes expertes en physique, en mathématiques, en électronique et en instrumentation, systèmes d'exploitation, langages de programmation, développement de logiciels, test de logiciel, architecture logicielle et design. L'analogie peut être un étirement, mais pourquoi vous mettriez-vous seul seul, en commençant par un marteau, un ciseau et raconter pour faire quelque chose lorsque vous avez une imprimante 3D disponible? Alors que Newton pourrait demander, pourquoi ne pas rester sur les épaules de quelqu'un?
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?
Les autres personnes sont-elles capables de lire et de comprendre facilement votre code?
Lorsque votre superviseur dit "Great, le fait maintenant faire aussi x ..." Devez-vous réécrire beaucoup de code?
Lorsque vous avez écrit un programme, est-ce que cela devient un outil que vous pouvez utiliser ultérieurement, ou est-ce qu'il l'utilise une fois et la jetez-la quelque chose?
Si vous pouvez répondre oui, oui, non, et "oui, j'essaie de faire des outils plutôt que des calculs unique", alors vous vous rendez déjà bien déjà bien. Une bonne partie de ce que nous faisons, car les programmeurs sont censés aider avec les types de choses énumérées ci-dessus.
Vous pourrez faire un long chemin en physique sans rien savoir sur le style "professionnel" (parlant de l'expérience). Mais j'ai vu beaucoup de gens gaspiller du temps sans fin, car ils ont perdu la trace de ce qu'ils font de ce qu'ils font ou après avoir cultivé leur code pendant quelques années, il vient de se perdre dans sa complexité (même dans les universités, il n'y a pas de code "jeter", mais les choses Coller beaucoup plus longtemps que vous ne le pensez initialement).
Je vous suggère de commencer une tête de départ dans des algorithmes et des structures de données, par ex. avec ce cours . Après cela, vous devriez pouvoir réfléchir à la performance sur un niveau plus productif et être capable de suivre par ex. Articles sur Wikipedia.
Après cela, vous vous êtes habitué à ce qui est disponible au cœur de votre langue, par exemple. Pour C++ CPPreference.com . Je vous recommanderais également de lire le efficace C++ de Scott Meyers et accéléré C++ par koenig & moe. Au moins pour C++, cela vous donnera une base solide sur le côté linguistique.
En parallèle, vous devriez essayer de bien connaître vos outils. Il n'est pas peu probable que vous développiez votre code sous Linux, essayez donc d'apprendre à obtenir plus de diagnostics (avertissements) de vos compilateurs (au moins GCC et CLang). En savoir plus sur les outils d'analyse statique tels que - CPPCheck ou Buances de numérisation de Clang . Découvrez comment faire de ces outils une partie intégrante de votre processus de développement, par ex. En les intégrant à votre configuration de construction (oui, vous devez utiliser au moins GNU faire, voire mieux quelque chose comme GNU AutoTools/Cmake/...) . Vous devez également ajouter des outils de profilage à votre outilsset. Pour C++, je vous recommanderais vivement d'apprendre tout ce que vous pouvez sur la valcrine 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 que vous aimez le plus (vos recherches) au lieu de perdre du temps à trouver des bogues ou de faire des optimisations inutiles. Bien sûr, cela est presque impossible à vendre à un conseiller, mais ils (et vous) seront impressionnés, mais 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 vous recommander Python avec NUMPY ET SCIPY suffisamment. Cela vous permet d'écrire dans une langue propre propre. De haut niveau (vous pouvez même travailler de manière interactive), tout en profitant de routines extrêmement optimisées implémentées dans C, C++ et Fortran. En outre, vous interfaçez votre propre code C ou C++ avec Python est presque trivial.
En ce qui concerne de meilleurs programmeurs, il n'y a pas de balle magique. Si vous êtes autodidacte, la clé est la conscience de soi, ce que cela ressemble à vous avoir. Cependant, l'apprentissage de CODE bien surtout revient à lire et à pratiquer.
Être critique de votre propre code est l'un des meilleurs moyens d'aller mieux. Toujours vous demander:
Mon autre suggestion serait ne vous enfermerait pas dans C/C++. Bien que ce soient de bonnes langues utilisées pour une raison, ils ont besoin que vous fassiez beaucoup de choses qui ne sont pas liées à la matière. Regardez dans Matlab, je serais surpris si l'université n'ait pas cela disponible pour vous. Considérons un langage de script comme Python. Envisagez vivement de ramasser une langue fonctionnelle comme Haskell - le paradigme est de nature très mathématique et conviendrait probablement à vos problèmes comme un gant. En bref, explorez d'autres langues/paradigmes. Même s'ils ne deviennent pas un outil permanent dans votre ceinture, ils vous feront un meilleur programmeur.
Vous pouvez également vouloir regarder dans certains design d'algorithme. Je soupçonne avoir eu le travail, vous êtes déjà relativement à la hauteur de ceci, mais des algorithmes sont incroyablement importants lors de l'analyse numérique. En fait, je soupçonnerais que des ressources sont spécifiquement destinées aux 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 faire cela. La sélection des bons outils pour le travail est une autre.
Vos programmes seront complètement différents à partir du code source commerciale, donc beaucoup de bonnes pratiques et les approches ne seront pas applicables dans votre code source au jour le jour le développement. Mais il y a une bonne façon d'apprendre quelques trucs et astuces.
Laissez un bon logiciel de revue développeur votre code et optimiser ensemble. Il vous donnera beaucoup plus d'expérience et vous enseigner les bonnes pratiques. En outre le code source d'examen écrit par d'autres personnes. Recherche de projets open source sur SourceForge ou github et lire leur code source.
Mais surtout, pensez que vous avez réellement besoin d'apprendre quelque chose de nouveau pour atteindre vos objectifs. Faire des choses inutiles juste pour faire le look de code plus joli n'ajouter une valeur à vos applications.
Premièrement, "élégant" est un terme relatif. L'abstraction peut sembler élégante à vous, mais à un autre aficionado, cela pourrait sembler inutile. Quoi qu'il en soit, pour répondre à votre question, vous devriez essayer de poster votre code pour examen sur http://codereview.stackexchange.com .
[.____] Débarquement du point principal, des conseils non sollicités basés sur ma propre expérience. Si vous pouvez obtenir tout votre travail avec juste C, alors pourquoi voulez-vous le coder de manière abstraite? Par cela, voulez-vous permettre aux autres de renvoyer votre code? Si vous avez vraiment une raison solide de passer à C++, accédez à l'abstraction et à l'apprentissage C++ et OO concepts. Sinon, déposez l'idée. Dans mon humble avis, ne devriez-vous pas viser votre code plus lisible et vos résultats scientifiques reproductibles que de lui donner OO abstractions? J'ai moi-même eu cette sorte d'obsession d'apprendre oups et de coder "élégant". Mais C++ prendra du temps à Master.Vous devrez apprendre la gestion de la mémoire puisque la collecte des ordures n'est pas automatique en C++. Prenez mon conseil depuis que j'ai travaillé pour un laboratoire de recherche moi-même et j'ai perdu beaucoup de temps l'apprentissage de C++ et OO, au lieu de vous concentrer sur le travail principal à portée de main.