Ok, voici donc mon problème:
Je travaille pour une grande entreprise, certains ont décroché un emploi (franchement parce que l'entretien était facile). Ce n'est pas que je ne connais pas mes affaires, je suis assez bon pour comprendre Java, ce sont les bibliothèques, etc.
Mais, chaque fois que j'essaie de résoudre un problème de logique, j'ai du mal à trouver une solution.
Par exemple, conversion of decimal to roman
, quand j'ai vu la solution, je trouve que c'est un problème simple. Mais je n'ai pas pu l'implémenter après 1-2 heures d'essais!
Je sens que je suis stupide et ne vaut pas la peine d'être ingénieur logiciel. capacités de résolution de casse-tête devrait venir nativement à un grand programmeur. Mais quand j'essaye de résoudre des énigmes, je n'arrive pas à trouver de solution et je la recherche simplement sur Google! .... et je déteste ça!
Quand on me donne un problème (comme implémenter la fonctionnalité xyz) au travail, je suis assez rapide et je suis respecté sur mon lieu de travail pour cela, mais je n'en suis pas du tout fier. Parce que quand j'essaie de résoudre un problème difficile mathématiquement ou logiquement, je tâtonne. Je sens toujours que j'aime ce que je fais (en tant qu'ingénieur) mais je suis vraiment triste de ne pas pouvoir résoudre certains problèmes logiques difficiles que mes amis rencontrent.
Je me sens démoralisé :(
TL; DR: Je comprends les choses d'un point de vue pratique (implémentant des fonctionnalités dans notre produit) mais lorsque j'essaie de travailler sur un problème à partir de ProjectEuler, je SUCE mal! Et je dois Aiguiser mon cerveau!
Donc, mes questions sont:
PS: Je n'ai jamais fait d'études en CS (mon premier cycle était électrial). Mais ce n'est pas une excuse pour être un développeur excentrique.
Merci!
Tout d'abord, c'est merveilleux que vous voyiez cela comme une faiblesse dans vos compétences. En fait, vous savez où vous devez vous améliorer, ce qui rend la tâche beaucoup plus facile et indique que vous êtes meilleur que vous ne le pensez.
Je crois que votre principal problème, que j'ai vu plusieurs fois auparavant, est que vous n'avez pas de "jeu d'outils de résolution de problèmes". Face à un problème, que faites-vous? Comment allez-vous le résoudre? Je suis lent en mathématiques, mais parce que je sais comment utiliser les petits outils des mathématiques ensemble, j'ai réussi le calcul.
Ainsi, en plus de simplement travailler sur la résolution de problèmes, vous devez regarder quels outils et compétences vous apportez à la table lorsque vous le faites. Si vous alliez travailler sur une nouvelle fonctionnalité au travail, vous asseyez-vous simplement sans IDE, sans débogueur, sans documentation, sans Internet et sans code source? Bien sûr que non!
Il existe des outils pour résoudre les problèmes, vous ne les connaissez tout simplement pas .... encore . L'article de wikipedia a quelques liens vers des techniques de résolution de problèmes. Mais l'outil le plus important est la méthode scientifique . L'article wikipedia inclut une approche pragmatique:
Tous les problèmes peuvent être résolus de cette façon! Beaucoup de gens ne suivent pas ces étapes. C'est comme un développeur qui refuse de tester son code. Du tout. Il aura du mal à trouver des bogues.
Enfin, l'autre outil principal de résolution de problèmes est de le décomposer en étapes simples . Par exemple, le premier problème dans exemples du projet Euler :
If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.
Find the sum of all the multiples of 3 or 5 below 1000.
Nous avons deux faits et un problème ici. Le fait un nous montre comment définir un multiple de trois ou cinq en dessous de 10. 3 * 1,3 * 2,3 * 3,5 * 1 sont tous valides. 5 * 2 n'est pas parce qu'il est égal à 10. Ensuite, le fait deux nous dit que nous les additionnons pour obtenir 23.
Nous avons donc déjà une méthode pour trouver des valeurs, et nous pouvons les additionner pour obtenir notre somme. Bien sûr, nous pouvons regarder les faits et appliquer un simple revers de la commande. 3, 5, 6 et 9 sont des multiples de 3 ou 5. Autrement dit, 3% 3, 5% 5, 6% 3, 9% 3 donnent tous un mod de zéro. Une autre approche serait donc de passer de 999 à 1 et de moduler chaque nombre avec 3 et 5. Recueillir la liste des valeurs et les additionner.
Je suggère L'art de la programmation Unix comme un excellent exemple d'utilisation de petits outils dans le monde de la programmation. Les enchaîner ensemble vous permet de résoudre des problèmes très complexes, et je ne peux pas compter le nombre de fois où ces concepts m'ont aidé.
De nombreux programmeurs sont aussi des "résolveurs de casse-tête" naturels, mais la programmation est bien plus que cela. Si tous les programmeurs se concentraient sur la résolution de problèmes algorithmiques intéressants, nous aurions des charges et des charges de logiciels qui pourraient résoudre des problèmes sympas, mais aucun d'entre eux ne serait utilisable ou maintenable.
Je trouve qu'il y a relativement peu de défis de type "résolution d'énigmes" dans mon travail. La plupart des défis concernent davantage l'étude de l'ancien code, l'apprentissage d'une nouvelle API, la conception de l'architecture de certains composants d'une manière que les gens ne jureront pas dessus dans trois ans. Tout cela est difficile, mais pas tellement du genre logique. D'un autre côté, j'ai des collègues qui passent la plupart de leur temps à penser aux algorithmes d'optimisation du compilateur, et qui sont très bons dans ce domaine.
Je pense qu'il est important que les programmeurs réfléchissent constamment à "comment puis-je m'améliorer dans ce que je fais?", Mais être un bon programmeur ne nécessite pas nécessairement que vous soyez doué pour résoudre des énigmes.
Personnellement, j'obtiens ma solution de résolution de casse-tête en résolvant "géocaches mystères" .
Permettez-moi de vous avertir, plus vous en savez, plus vous réalisez à quel point vous en savez peu.
Ne vous découragez pas. Continuez à apprendre et à essayer de travailler sur les domaines qui vous manquent.
Passons maintenant à votre question. Ma suggestion serait de commencer à travailler sur les problèmes sur projet eule r.
Mes raisons sont simples, commencez par la question la plus populaire, ce sont normalement les problèmes les plus faciles à résoudre.
Lorsque vous êtes confronté à un problème, essayez de le résoudre, travaillez par vous-même, essayez différentes approches. Le fonctionnement du projet euler vous permet de vérifier et de tester votre réponse.
Si vous décidez que vous ne pouvez pas résoudre ce problème, commencez à rechercher le problème (sans chercher la réponse). Non, essayez encore.
Une fois que vous avez résolu le problème, le projet euler a une section où ils vous montrent les meilleures réponses pour chaque implémentation de langue. Passez en revue leur réponse dans votre langue préférée, comprenez leur solution et la pensée qui y est entrée.
Fermez maintenant la réponse fournie et réessayez par vous-même jusqu'à ce que vous la résolviez à nouveau.
Si vous vous entraînez suffisamment, la logique et la réflexion pour résoudre ces problèmes deviendront de plus en plus faciles pour vous.
La plupart des tâches de programmation ne nécessitent pas beaucoup de logique. Mais ce ne sont peut-être pas les emplois que vous aimez.
En règle générale, essayez d'apprendre des algorithmes et des structures. Je peux conseiller le manuel de conception d'algorithmes de Skiena. Une fois que vous les connaissez, vous commencerez à classer les problèmes. Cela ressemble beaucoup au problème des vendeurs ambulants, ici je peux utiliser un arbre, ici je peux utiliser une recherche binaire ...
Project Euler propose une grande variété de puzzles. Beaucoup d'entre eux sont facilement réalisables avec une connaissance de base en mathématiques. D'autres sont plus faciles à résoudre une fois que vous connaissez quelques-uns de ces algorithmes.
Je crois vraiment que vous venez de commencer votre voyage dans la programmation, donc tout d'abord si cela vous prend un certain temps pour saisir et bien faire les choses, cela ne semble pas être un problème. La seule différence que cela fait est à chaque tentative que vous apprenez quelque chose comme WoW!! La dernière chose que j'ai faite n'a aucun sens car j'avais besoin de décimales et non de double
Si la résolution de casse-tête ne vous intéresse pas, ne cherchez pas cela, il y a d'autres problèmes logiques qui flottent une fois que vous connaissez votre base de code, vous pouvez choisir d'y travailler et de présenter les modifications suggérées à votre mentor ou à votre responsable. . (ne vous inquiétez pas si vous faites une erreur, cela vous aiderait à savoir pourquoi votre méthodologie est défectueuse, alors soyez un observateur avisé et un auditeur apte)
Il vous faudra un certain temps pour vous calmer et vous pourriez peut-être continuer à tirer sur tous les cylindres. Inutile de dire évitez l'envie de rechercher une solution sur Google ou SO, faites des efforts de votre part et ne lancez votre navigateur que lorsque vous avez un doute ou absolument aucune idée.
Je pense que je devrais ajouter à cela.
Comme la réponse choisie l'a déjà indiqué, connaître votre faiblesse est un énorme avantage et il existe des outils de base pour apprendre les techniques de résolution de problèmes. Ce qui, à mon avis, fait défaut dans la réponse, est simplement de trouver des moyens de pratiquer des problèmes difficiles - beaucoup. Soyez têtu de terminer complètement tous les problèmes que vous essayez. Lire du code, beaucoup de code, c'est bien, tout comme lire des livres sur la résolution de problèmes, mais écrire du code est presque plus important.
À certains égards, nous partageons la même faiblesse (bien que ce ne soit pas aussi mauvais que vous le pensez). Pour pratiquer mes compétences en résolution de problèmes, je travaille toujours sur un problème de projet Euler ou HackerRank. Si c'est un problème facile, je choisis 7 langages de programmation et j'essaye de le résoudre dans chacun d'eux. Pour les problèmes plus difficiles, je pourrais choisir 3 langues très différentes les unes des autres, juste pour garder le temps que je passe sur le problème raisonnable. Pour tous les problèmes, une fois que j'ai trouvé une solution, je recherche les solutions que d'autres ont trouvées et je m'assure de les comprendre. Si vous ne comprenez pas une solution, vous pouvez toujours publier sur StackOverflow ou probablement même ici sur Programmers Stack Exchange ou quelque chose et je suis sûr qu'il y a quelqu'un sur le site qui pourrait répondre à votre question (il est rare qu'il n'y en ait pas).
Fondamentalement, cependant, assurez-vous de pratiquer, et pas seulement de lire, et de pratiquer beaucoup. Tout comme le sport, une réflexion claire demande du temps et des efforts.
Une autre chose que vous pouvez faire pour aider votre façon de penser les problèmes est d'écrire d'abord la suite de tests pour les problèmes que vous résolvez. Vous ne pouvez pas écrire un bon test pour un problème sans d'abord bien le comprendre. Si vous le faites pour différentes langues, cela a l'avantage de vous enseigner différentes techniques de test en même temps.
Tout d'abord, connaître votre faiblesse est une force réelle, vous savez donc quoi étudier pour obtenir un meilleur jeu.
Mon conseil serait de lire beaucoup de code qui résout les problèmes de logique. Chacun a son propre style dans la résolution d'énigmes, la lecture de code peut vous indiquer comment vous pouvez apprendre à le faire. De plus, être en mesure de comprendre le code vous indique probablement également la théorie mathématique qui décrit le problème, de sorte que vous en apprendrez également sur les problèmes sous-jacents.
À la vôtre, Carlo