Je programme depuis quelques années et je suis généralement bon lorsqu'il s'agit de résoudre des problèmes et de créer des scripts de petite à moyenne taille, cependant, je ne suis généralement pas bon pour concevoir des programmes à grande échelle de manière orientée objet. Quelques questions
Récemment, un collègue qui a le même nombre d'années d'expérience que moi et je travaillais sur un problème. Je travaillais sur un problème plus longtemps que lui, cependant, il a trouvé une meilleure solution et à la fin nous allons utiliser son design. Cela m'a vraiment touché. J'admets que son design est meilleur, mais je voulais proposer un design aussi bon que le sien. J'envisage même de quitter le travail. Je ne sais pas pourquoi mais soudain je me sens sous une certaine pression, par exemple que penseraient les juniors de moi et etc? Est-ce normal? Ou je pense un peu trop à cela?
Mon travail consiste à programmer en Python. J'essaie de lire le code source, mais comment pensez-vous que je peux améliorer mes compétences en conception? Y a-t-il de bons livres ou logiciels que je devrais étudier?
Veuillez m'éclairer. J'apprécierai vraiment ton aide.
Je pense que c'est un signe très positif de vos compétences. Il est beaucoup plus courant pour les personnes qui ont du mal à trouver le "meilleur" design dans une équipe d'être complètement incapables de reconnaître pourquoi un autre design est meilleur.
Vous avez deux atouts vraiment formidables (et étonnamment rares) pour vous:
Vous n'avez que quelques années et vous avez un long chemin à parcourir, mais avec cette attitude, vous y arriverez certainement, n'abandonnez pas; nous faisons tous face à des revers mentaux comme celui-ci. Aussi souvent que j'en ai l'occasion, j'aime brancher principes de conception (PAS les mêmes que les modèles de conception) et je pense que c'est un exemple parfait de l'endroit où ils sont utiles. Étudiez-les et entraînez-vous à les appliquer dans vos conceptions, vous vous en rendrez compte avant d'avoir franchi une nouvelle étape à cet égard.
À la fin de la journée, souvenez-vous que la conception est difficile. Nous traitons tous les jours des abstractions complexes de haut niveau, les créer à partir de l'air, les faire fonctionner correctement et les utiliser facilement par des collègues est une tâche extrêmement difficile. Il faut de la pratique, pour années .
Alors rassurez-vous et souvenez-vous juste: il y a un tas de gens qui ne peuvent pas évaluer deux conceptions et en reconnaître une comme préférable à une autre, comment pensez-vous qu'ils s'entendent bien pour créer de bons designs?
Modifier:
'autre astuce, après avoir fait le tour des principes et pratiqué un peu leur application, je pense qu'il y a un autre joyau d'une autre question ici qui parle de la valeur d'étudier une variété de langues qui ont des buts et des règles différents:
Idéalement, chaque programmeur devrait connaître un langage de chaque classe. Que pourriez-vous apprendre:
- Un langage statique de type OOP mainstream: Java, C # (principalement utilisé dans les logiciels d'entreprise) et C++ (programmation système et applications bureautiques complexes)
- Un langage basé sur le prototype OOP: Javascript (programmation web côté client)
- Un langage procédural: C (logiciel embarqué et programmation système)
- Un langage fonctionnel: Haskell, ML ou LISP (les langages fonctionnels conviennent aux logiciels hautement parallélisés).
Un langage de programmation logique (Prolog) n'est probablement pas très utile dans l'industrie, étant principalement utilisé dans la recherche en IA.
Cela aidera à élargir la variété des idées qui vous viennent à l'esprit lorsque vous essayez de concevoir une solution.
La meilleure façon d'améliorer la conception de logiciels est de concevoir des logiciels*. Une façon de le faire est de regarder les concours de conception: TopCoder a une archive de plus de 100 conceptions de composants, avec une documentation de conception UML et des implémentations en Java et/ou C #. Récupérez un composant fini que vous aimez, lisez la spécification des exigences et essayez de trouver une conception originale pour répondre aux exigences. Passez une heure ou deux à réfléchir au problème et à dessiner un diagramme de classe, puis ouvrez la conception gagnante et lisez ce que l'auteur a fait . Comparez sa conception à la vôtre, repérez les différences et voyez si votre conception est meilleure. Vérifiez le tableau de bord du concours pour voir comment les juges ont évalué la conception. Cela vous donnera les commentaires dont vous avez besoin pour décider comment améliorer vos compétences en conception.
Eh bien, ne quittez pas votre travail. Il vaut mieux travailler avec quelqu'un qui a de meilleures compétences que vous, afin que vous puissiez apprendre de lui.
Regardez la meilleure conception et déterminez pourquoi elle est meilleure. L Apprenez à partir du design accepté et réfléchissez à des façons d'appliquer un design similaire dans d'autres situations. Une fois que vous savez pourquoi c'est mieux que votre design, vous savez ce qu'il ne faut pas faire la prochaine fois que vous faites un design. Parlez à l'autre développeur et demandez-lui comment il a conçu le design.
Pour améliorer les compétences en conception, la meilleure chose à faire est de créer des conceptions, puis d'être brutal avec vous-même en les évaluant et en déterminant comment les améliorer. Posez-vous des questions telles que: cela fonctionnera-t-il et répond-il aux exigences à tous les égards, est-il maintenable, comment pourrai-je le tester, entraînera-t-il des problèmes de performances, quelle est la probabilité de changement et à quel point la conception être capable de gérer le changement. Lisez à propos des modèles de conception, puis essayez de les appliquer à vos conceptions. Refactor impitoyablement après avoir conçu un design initial. Si vous concevez une base de données avec l'application, lisez en détail la normalisation et le réglage des performances de la base de données, vous en apprendrez beaucoup sur la conception de la base de données si vous apprenez à faire fonctionner une base de données de la manière la plus efficace et la plus efficace. Pour les applications, pensez aux principes de DRY et SOLID pour faire votre conception. Lisez à propos des anti-modèles pour savoir quelles choses éviter).
Reconnaître un meilleur design est une capacité importante. Vous devez favoriser cela en suivant certaines des suggestions précédentes concernant l'examen des conceptions.
Sur quels critères avez-vous mieux jugé l'autre design? Était-ce plus simple et plus facile à comprendre? At-il fourni un avantage en termes de performances? Était-ce plus extensible? Il existe de nombreux principes de conception tels que la décomposition, l'abstraction, le masquage des informations et la modularité des composants que vous pouvez utiliser pour évaluer les conceptions et que vous pourriez déjà reconnaître.
Vous obtiendrez des idées sur différents principes de conception à partir de certaines des sources suivantes: http://www.cs.wustl.edu/~schmidt/PDF/design-principles4.pdf Conception de logiciels sur wikipedia Google "Principes de conception de logiciels"
Comprendre différents modèles de conception de logiciels, tels que la conception orientée objet ou la conception fonctionnelle ou la conception d'analyse structurée. Ceux-ci peuvent être des mentalités entièrement différentes à partir desquelles aborder une tâche de conception et ils ont chacun des domaines dans lesquels ils Excel. Apprenez-les en tant qu'outils pour votre boîte à outils. http://userpages.umbc.edu/~khoo/survey2.html
Assurez-vous de séparer la conception de l'implémentation, essayez de schématiser les choses que vous voyez comme de bonnes conceptions, pour séparer le langage et les spécificités de l'implémentation des principes de conception de niveau supérieur. Et pour développer votre "œil design" et vos capacités de communication.
Enfin, mais peut-être le plus important, la lecture à grande échelle est un très bon outil - il y a beaucoup de choses intéressantes, des fractales à l'analyse bayésienne, à la logique floue au traitement du langage naturel, qui peuvent fournir du fourrage aux idées qui émergeront plus tard et de manière inattendue. Avec le Web, vous pouvez parcourir des sujets à grande échelle, juste pour votre amusement et votre édification et cela en bénéficiera. Vous n'avez pas besoin de devenir expert, simplement familier avec les termes et les idées.
Amusez-vous - ne le faites pas si vous ne l'appréciez pas au moins un peu!
Eh bien, vous avez déjà fait le premier pas. Vous admettez que vous avez quelque chose à apprendre, que le travail de votre collègue est meilleur que le vôtre et que vous voulez apprendre et vous améliorer.
La deuxième étape consiste à analyser. Regardez son travail et ne dites pas simplement que c'est mieux; comprendre pourquoi c'est mieux. Cherchez des détails et des points précis qu'il a fait mieux.
Une fois que vous avez compris cela, extrayez les principes sous-jacents. Posez des questions comme celles-ci:
Essayez de comprendre les choses par vous-même, car vous intérioriserez mieux les idées si vous arriviez à la chaîne de raisonnement qui vous a amené à la conclusion vous-même, mais discutez également avec votre collègue pour vous assurer que vous obtenez les choses droite. (Vous ne voulez pas aller faire des erreurs dans votre raisonnement et intérioriser un mauvais principe, après tout.) Et n'hésitez pas à demander de l'aide à votre collègue si vous ne pouvez pas comprendre les choses. La programmation est une discipline où l'humilité a tendance à être respectée, et de nombreux codeurs saisiront l'occasion d'apprendre quelque chose de nouveau à quelqu'un, ce qui explique probablement pourquoi StackOverflow est devenu si gros si vite.
Je voudrais également ajouter (en plus des bonnes réponses) qu'il y a plus que "Il peut créer un meilleur design que moi". Les autres réponses se concentrent sur la façon dont vous pouvez vous améliorer au Design, ce qui est tout bon ... mais ...
Je parie que vous pouvez faire mieux que votre collègue. Pas pour créer un match de pisse ou quoi que ce soit (vous pouvez faire Y mieux? Baise-toi, je peux faire X mieux!), Mais pour souligner la vérité que tout le monde a des forces et des faiblesses.
À mon travail, il y a 4 développeurs. Il y a des moments où les deux "programmeurs" principaux peuvent créer des trucs qui me laissent juste dans la poussière. Ça me fait tourner la tête en essayant d'enrouler ma tête autour de leurs créations.
Mais je suis bien meilleur en SQL et en script de ligne de commande qu'eux, et je peux automatiser des trucs qui LES LAISSENT dans la poussière.
Sont-ils meilleurs que moi? Dans certains domaines, c'est certain. Bon sang, dans beaucoup de domaines, ils le sont - je suis de loin le développeur junior de ma boutique et individuellement, ils ont des années d'expérience sur moi. Malgré ces années d'expérience, je suis meilleur dans certains domaines qu'eux-mêmes.
Arrêtez de vous concentrer sur le fait que quelqu'un est meilleur en X que vous. Cette personne, sans essayer ni même y penser, pourrait être en mesure de vous dépasser même après vous y avoir exercé pendant les 10 prochaines années. Non pas que vous ne deviez pas du tout travailler à corriger vos faiblesses, mais n'oubliez pas que pour chaque force, il y a une faiblesse.
Concentrez-vous sur les deux - Forces et faiblesses - de vous et de vos collègues.
Dans tous les aspects de la vie, vous trouverez des gens qui ne sont pas aussi bons que vous, ainsi que des gens qui sont meilleurs que vous, surtout après seulement "quelques années" d'expérience.
Vous devez apprendre de tout le monde.
Ne te sens pas mal. Peut-être que votre collègue est un naturel. Vous devez le féliciter sincèrement et apprendre autant que possible de lui.
Ne laissez pas les professionnels jalouser entre vous et l'opportunité d'apprendre.
Quelques années, ce n'est vraiment pas tant que ça. Et il y a des gens avec des vues de conception de haut niveau meilleures ou pires. Par exemple, j'ai connu des gens capables d'écrire des algorithmes complexes pour des programmes de bas niveau en un clin d'œil mais incapables de comprendre une conception de niveau supérieur et des concepts comme la cohésion et les dépendances. Cependant, ce n'est pas un état de fait. Vous pouvez vous améliorer à la fois dans la conception de niveau supérieur (lire quelques livres, essayer quelques astuces à la maison, etc.) et vous pouvez également découvrir que dans d'autres domaines de la programmation, votre collègue programmeur est moins bon. De plus, si vous pensez être à peu près au même niveau en termes d'expérience et de connaissances techniques, cela peut avoir eu une situation aléatoire. La prochaine fois, vous aurez peut-être de meilleures idées de conception. De plus, au lieu de quitter votre emploi, saisissez cette occasion et apprenez de votre collègue. La prochaine fois, faites un design ensemble, essayez de saisir ses secrets, ses pensées. La programmation est comme un métier, elle s'apprend en faisant et en regardant les autres le faire.
Les compétences en conception viennent principalement de l'expérience et après avoir lu quelques livres importants. Je vous recommanderais les suivants:
Aucun de ces livres n'est une solution miracle, mais la lecture des 2 premières recommandations changera probablement votre vision et votre perception de la programmation pour toujours.
Ne le laissez pas vous toucher. Si vous avez des années d'expérience dans la correction de bogues et la création de petits programmes, c'est ce que vous allez faire avec Excel. Votre collègue a probablement des années d'expérience dans la conception de projets plus importants.
Être familier avec les bits sous-jacents est incroyablement pratique, mais si vous voulez améliorer la conception, vous devrez concevoir quelques projets. Répétez jusqu'à ce que la compétence s'enfonce.
Bref, "des années d'expérience" ne sont pas toujours équivalentes. Allez faire en sorte que vos années valent quelque chose.
"Mieux" implique souvent de mesurer vos conceptions ou votre code par rapport à quelque chose/quelqu'un de mieux, de comparer soigneusement ce qui est différent, d'apprendre de ces différences et d'essayer continuellement d'améliorer vos futurs modèles en fonction de cela. Si vous vous sentez trop mal de découvrir que vous devez en savoir plus, vous ralentirez ce processus bénéfique. Si vous déménagez dans un endroit où il n'y a pas de personnes (ou d'autres ressources) qui peuvent parfois ou toujours vous fournir une meilleure comparaison, vous risquez de perdre cette occasion d'apprendre et de ralentir votre processus de paris.