Je ne suis pas un bon programmeur (en logique), comment dois-je résoudre ce problème? [fermé]

50

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 romanquand 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:

  1. 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 ?
  2. Ou devrais-je revenir à la base et étudier des mathématiques de base?
  3. 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!

John
la source
3
Si ce n'est pas amusant de résoudre des énigmes pour vous, pourquoi s'en préoccuper?
V4Vendetta
3
Ce n'est pas amusant parce que j'ai du mal à le résoudre. Si je réussis bien, je suis sûr que ça va me plaire!
John
1
Vous pouvez toujours essayer ce (avertissement, SÉRIEUX addictif si vous êtes dans la résolution de casse - tête)
Benjol
2
Rien ne vient nativement. Même les compétences les plus fondamentales nécessitent un apprentissage. Je recommanderais le calcul et la mécanique classique comme terrains de jeu pour la formation des capacités requises, mais de nombreuses autres matières (y compris totalement non mathématiques) pourraient faire de même.
SK-logic
3
@John confirmé. C'était un problème difficile. Vous ne devriez pas vous sentir mal si vous ne pouvez pas le résoudre en 5 minutes. Une heure et demie pour le faire, après avoir lu le wiki sur les chiffres romains, et seulement en comparant ses résultats avec ceux d'une autre implémentation, j'ai pu corriger un bogue. J'ai pensé (comme beaucoup d'autres) qu'IL était un nombre valide. Faux. XXXIX est le bon numéro. De plus, je devais regarder d’autres implémentations pour l’optimiser (j’avais pré-caché II, III, XX, XXX etc., mais c’est inutile). Ne vous sentez pas mal!
Xanatos

Réponses:

24

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:

  1. Définir une question
  2. Recueillir des informations et des ressources (observer)
  3. Formuler une hypothèse explicative
  4. Tester l'hypothèse en réalisant une expérience et en collectant des données de manière reproductible
  5. Analyser les données
  6. Interpréter les données et tirer des conclusions qui servent de point de départ à de nouvelles hypothèses
  7. Publier les résultats
  8. Retester (fréquemment effectué par d'autres scientifiques)

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 :

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 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é.

Spencer Rathbun
la source
19

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" .

JesperE
la source
Mais beaucoup des start - ups chauds seulement l' accent sur des compétences en résolution de puzzle. Prenez facebook. Si je ne suis pas bon en résolution de casse-tête, je ne peux même pas postuler là-bas!
John
6
Le premier casse-tête de Facebook est le robot casse-tête, pour éviter de devoir parcourir des milliers et des milliers de CV. Si vous voulez vraiment travailler pour FB, alors vous devez être capable de résoudre ce genre de problèmes, mais il y a plein d'autres bons endroits où travailler.
JesperE
réponse fantastique. me met aussi à l'aise ... =]
Hartley Brody
9

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.

SetiSeeker
la source
4

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.

Carra
la source
2

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.

V4Vendetta
la source
1

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

Carlo Kuip
la source
1

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.

Josiah
la source