Ok, alors voici mon problème:
Je travaille pour une grande entreprise, certains comment at-on décroché un emploi (franchement parce que l'entretien était facile). Ce n'est pas que je ne connaisse pas mon travail, je suis plutôt doué pour comprendre Java, ce sont des bibliothèques, etc.
Mais, chaque fois que j'essaie de résoudre un problème de logique, je trouve vraiment difficile de 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 été capable de le mettre en œuvre après 1 à 2 heures d'essais!
Je me sens bête et ne mérite pas d'être un ingénieur en logiciel. Les capacités de résolution de casse-tête devraient venir naturellement à un excellent programmeur. Mais lorsque j'essaie de résoudre des énigmes, je ne suis pas en mesure de trouver une solution et je ne fais que chercher 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 du point de vue mathématique ou logique, 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 de logique difficiles que mes amis me posent.
Je me sens démoralisé :(
TL; DR: Je comprends les choses d’un point de vue pratique (implémentation des fonctionnalités de notre produit), mais lorsqu’on essaie de résoudre un problème, par exemple ProjectEuler, je crains! Et j'ai besoin d' aiguiser mon cerveau!
Donc, mes questions sont:
- Comment dois-je m'y prendre pour le réparer? Devrais-je commencer par résoudre (et m'obliger à) résoudre les problèmes du projet? Même s'il me faut des heures pour résoudre des problèmes fondamentaux ?
- Ou devrais-je revenir à la base et étudier des mathématiques de base?
- Je ne trouve pas vraiment amusant de résoudre des énigmes. Mais je veux que ce soit amusant pour moi! Et je pense que si je les comprends mieux, cela me plaira!
PS: Je n’ai jamais été éduqué en CS (mon premier cycle était électrique). Mais ce n'est pas une excuse pour être un développeur nul.
Merci!
Réponses:
Tout d’abord, c’est merveilleux que vous voyiez cela comme une faiblesse de vos compétences. En fait, vous savez où vous devez vous améliorer, ce qui facilite beaucoup le travail et indique que vous êtes meilleur que vous ne le pensez.
Je crois que votre principal problème, que j’ai vu maintes fois auparavant, est que vous n’avez pas un "ensemble d’outils de résolution de problèmes". Que faites-vous face à un problème? Comment vous y prenez-vous pour le résoudre? Je suis lent en maths, mais parce que je sais utiliser les petits outils de maths ensemble, j’ai fait du calcul.
Ainsi, en plus de travailler uniquement sur la résolution de problèmes, vous devez examiner quels outils et compétences vous apportez à la table lorsque vous le faites. Si vous deviez travailler sur une nouvelle fonctionnalité au travail, restez-vous assis 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, mais vous ne les connaissez pas encore . L'article de Wikipédia contient des liens vers des techniques de résolution de problèmes. Mais l'outil le plus important est la méthode scientifique . L'article de Wikipédia comprend une approche pragmatique:
Tous les problèmes peuvent être résolus de cette façon! Cependant, beaucoup de gens ne passent pas par ces étapes. C'est comme un développeur qui refuse de tester son code. Du tout. Il aura du mal à comprendre que des bugs existent.
Enfin, l’autre outil principal de résolution de problèmes est la décomposition en étapes simples . Par exemple, le premier problème dans les exemples du projet Euler :
Nous avons deux faits et un problème ici. Le fait un nous montre comment définir un multiple de trois ou cinq inférieur à 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 entendu, nous pouvons examiner les faits et appliquer un simple renversement de l'ordre. 3, 5, 6 et 9 sont des multiples de 3 ou 5. Soit 3% 3, 5% 5, 6% 3, 9% 3 donnent tous un mod de zéro. Une autre approche consisterait donc à passer de 999 à 1 et à moduler chaque nombre avec 3 et 5. Recueillir la liste de valeurs et les additionner.
Je suggérerais l'art de la programmation unix comme un excellent exemple d'utilisation de petits outils dans le monde de la programmation. Les chaîner vous permet de résoudre des problèmes très complexes, et je ne compte pas le nombre de fois que ces concepts m'ont aidé.
la source
Beaucoup de programmeurs sont aussi des "résolveurs de puzzle" naturels, mais la programmation est bien plus que cela. Si tous les programmeurs étaient concentrés 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 épineux, mais aucun d’entre eux ne serait utilisable ou maintenable.
Je trouve qu'il y a relativement peu de défis de type "résoudre des é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 avant trois ans. Tout cela représente un défi, mais pas tellement de type logique. D'autre part, j'ai des collègues qui passent le plus clair de leur temps à réfléchir aux algorithmes d'optimisation du compilateur et qui sont très bons dans ce domaine.
Je pense qu'il est important que les programmeurs pensent constamment à "comment puis-je m'améliorer dans ce que je fais?", Mais être un bon programmeur ne signifie pas nécessairement que vous maîtrisez bien les énigmes.
Personnellement, je résous mon problème en résolvant des "géocaches mystères" .
la source
Laissez-moi simplement vous prévenir, plus vous en savez, plus vous réalisez à quel point vous en savez peu.
Juste ne soyez pas découragé par ça. 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 du projet .
Mes raisons à cela sont simples, commençons 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 réessayez.
Une fois que vous avez résolu le problème, le projet euler comporte une section dans laquelle ils vous indiquent les meilleures réponses pour chaque implémentation linguistique. Examinez leur réponse dans la langue de votre choix, comprenez leur solution et la pensée qui y est allée.
Fermez maintenant la réponse fournie et réessayez vous-même jusqu'à ce que vous la résolviez à nouveau.
Si vous pratiquez suffisamment, la logique et la pensée pour résoudre ces problèmes deviendront de plus en plus faciles pour vous.
la source
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 commencez à classer les problèmes. Cela ressemble beaucoup au problème des vendeurs itinérants, 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 des connaissances de base en mathématiques. D'autres sont plus faciles à résoudre une fois que vous connaissez quelques-uns de ces algorithmes.
la source
Je crois sincèrement que vous venez de commencer votre parcours en programmation. Alors, si cela vous prend un peu de temps pour comprendre et bien faire les choses, cela ne semble pas être un problème. La seule différence est qu’à chaque tentative vous apprenez quelque chose comme WoW! ! la dernière chose que je fais n'a pas de sens du tout parce que j'avais besoin décimal et non double
Si la résolution de casse-tête ne vous intéresse pas, ne cherchez pas plus loin, il existe d'autres problèmes logiques une fois que vous connaissez votre base de code, vous pouvez choisir de travailler dessus et de présenter toutes les modifications suggérées à votre mentor ou à votre responsable. . (ne vous inquiétez pas si vous faites une erreur, ils vous aideraient à comprendre pourquoi votre méthodologie est défectueuse, alors soyez un observateur attentif et un auditeur averti)
Il vous faudra un peu de temps pour vous installer et ensuite vous pourrez peut-être commencer à tirer à plein régime. Inutile de dire que vous n'avez pas besoin de chercher une solution sur Google ou SO, faites des efforts particuliers et lancez votre navigateur uniquement en cas de doute ou de manque total de connaissance.
la source
Premièrement, sachant que votre faiblesse est une force réelle, vous savez donc quoi étudier pour obtenir un meilleur jeu.
Mon conseil serait, lisez beaucoup de code qui résout les problèmes de logique. Chacun a son propre style pour résoudre les énigmes, la lecture de code peut vous indiquer comment vous pouvez apprendre à le faire. De plus, le fait de pouvoir comprendre le code vous indique probablement également la théorie mathématique qui décrit le problème. Par conséquent, vous découvrirez également les problèmes sous-jacents.
A bientôt, Carlo
la source
Je pense que je devrais ajouter à cela.
Comme la réponse choisie l'a déjà indiqué, connaître votre faiblesse est un avantage considérable et il existe quelques outils de base pour l'apprentissage des techniques de résolution de problèmes. Cependant, je pense que la réponse manque, c’est tout simplement de trouver des moyens de résoudre des problèmes difficiles - beaucoup. Soyez obstiné à résoudre complètement chaque problème que vous essayez. La lecture de code, beaucoup de code, est bonne, de même que la lecture de livres sur la résolution de problèmes, mais l'écriture de code est presque plus importante.
À certains égards, nous partageons la même faiblesse (bien que ce ne soit pas aussi grave que vous le pensez). Pour mettre en pratique 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'essaie de les résoudre dans chacun d'entre eux. Pour les problèmes plus difficiles, je pourrais choisir 3 langues très différentes les unes des autres, juste pour que le temps que je consacre au problème soit raisonnable. Pour tous les problèmes, une fois que j'ai trouvé une solution, je recherche les solutions que d'autres ont proposées et m'assure de les comprendre. Si vous ne comprenez pas une solution, vous pouvez toujours poster sur StackOverflow ou probablement même ici sur Programmers Stack Exchange ou quelque chose du genre et je suis sûr qu'il y a quelqu'un sur le site qui pourrait répondre à votre question (il est rare que ce ne soit pas le cas).
Fondamentalement, cependant, assurez-vous que vous pratiquez, et pas seulement à lire, et pratiquez beaucoup. Tout comme le sport, une pensée claire demande du temps et des efforts.
Une autre chose que vous pouvez faire pour vous aider à mieux réfléchir aux problèmes consiste à écrire la suite de tests pour les problèmes que vous résolvez en premier. Vous ne pouvez pas écrire un bon test pour un problème sans d'abord bien le comprendre. Si vous faites cela pour différentes langues, cela présente l'avantage de vous enseigner différentes techniques de test en même temps.
la source