Tout le monde dit la même chose: "un vrai programmeur sait comment gérer de vrais problèmes." Mais ils oublient comment ils ont appris cette technique ou à quel endroit: ce n'est pas enseigné dans les écoles
Que puis-je faire pour améliorer ma capacité à résoudre des problèmes de programmation complexes? Quelles stratégies ont fonctionné pour vous? Y a-t-il des domaines spécifiques sur lesquels je devrais me concentrer, tels que les algorithmes ou les modèles de conception?
Réponses:
Quelques techniques qui pourraient ou non fonctionner:
la source
Utilisez la pensée en mode R ou en mode L selon vos besoins
Le mode R est l'approche créative non verbale que nous associons couramment au subconscient. Le mode L est l'approche linéaire, logique et verbale associée à votre "voix intérieure".
Si un problème semble être insoluble, c'est probablement parce que vous essayez de le résoudre en utilisant un mode de pensée incorrect. Pour les programmeurs, le mode de pensée par défaut a tendance à être le mode L, vous pouvez donc peut-être l'éteindre temporairement et accéder au mode R.
Comment accéder à la pensée en mode R
Il existe de nombreuses manières, mais essayez peut-être la méthode de Poincaré (du nom du célèbre mathématicien).
Notez tout ce que vous savez sur le problème. Immédiatement résoudre tous les aspects faciles de celui-ci (le cas échéant). Choisissez un seul élément de la liste des problèmes restants, puis partez pour une promenade dans laquelle vous ne serez ni dérangé ni distrait.
N'essayez pas d'analyser le problème pendant la promenade, laissez simplement votre esprit vagabonder et observez les images ou sensations intéressantes qui pourraient survenir et qui pourraient être liées au problème. Laissez-les fusionner. Si l'inspiration vous frappe, arrêtez immédiatement la promenade et écrivez de nouveau les connaissances que vous avez acquises.
Rincez et répétez jusqu'à ce que tous les problèmes aient un aperçu. Puis commencez à explorer les idées.
Recommandation de livre
La lecture de Pensée pragmatique et d'apprentissage peut également vous aider à devenir un meilleur solutionneur de problèmes. (Il me semble que nous avons beaucoup référencé ce livre récemment ...)
la source
Demande à quelqu'un d'autre...
Non sérieusement. Votre plus grande ressource peut être la personne assise à côté de vous. Ne leur demandez même pas la réponse au problème, demandez-leur de s'asseoir à côté de vous et de vous laisser expliquer le problème.
Souvent, vous y parviendrez en le verbalisant.
Parfois, l’autre personne posera une question ou indiquera un détail qui ouvrira la porte mentale.
Finalement, vous apprendrez à verbaliser des choses dans votre tête sans utiliser de marionnette et à repérer plus rapidement les détails essentiels du problème.
Et si tout le reste échoue au moins, ils pourraient peut-être vous montrer une technique que vous n'auriez pas pensé à utiliser.
la source
En fait, ma réponse courte est "résoudre plus de problèmes". Mais l'essentiel est: concentrez-vous vraiment sur les problèmes et n'abandonnez pas. Ne demandez pas d'aide sur StackOverflow ou quoi que ce soit. (Lire StackOverflow, ça va, bien sûr!). Faites des efforts pour obtenir une solution presque efficace, puis vous avez presque atteint votre objectif. Et continuez jusqu'à ce que vous obteniez une solution satisfaisante.
Pour moi, la résolution de problèmes est deux choses:
Le point 2 est vraiment crucial à mon avis car il vous oblige à changer votre façon de penser plus vous êtes pris avec un problème. Cela vous permet également de consacrer plus de temps à la résolution de problèmes, ce qui vous permet d'améliorer encore vos compétences. ;-)
Au fait, je vous recommande de lire Edward de Bono. Bien que j'aie acquis mes compétences en résolution de problèmes principalement en étudiant la physique, son écriture est vraiment intéressante.
Eh bien, ma boîte à outils pour la résolution de problèmes est la suivante:
Veuillez noter que la plupart de ces outils peuvent être appliqués de manière récursive.
Et mon algorithme est le suivant:
La première étape est une décision difficile, mais plus vous pratiquez, plus vous prenez de bonnes décisions.
Oh et j'oublie presque l'ingrédient le plus important:
Pensez positif à l'ensemble du processus. Ne pensez pas "J'espère que XYZ va maintenant résoudre le problème." Pensez plutôt: "Si XYZ ne fonctionne pas, alors je sais que YZX ne peut pas être la source du problème et je vérifierai si ZYX fonctionne." La résolution de problèmes peut parfois être amusante, en particulier si votre processus de recherche d’un problème se révèle élégant et informatif.
la source
Commencez également à identifier les problèmes. Parfois, vous devez reconnaître qu'il y a un problème avant de pouvoir le résoudre. À l'école, ils exigent trop de réponses et pas assez de questions de la part des élèves.
Trouvez autour de vous des gens qui résolvent les problèmes et demandez-leur comment ils s'y prennent.
Soyez prêt à vous tromper. Vous ne vous améliorerez pas si vous les gardez tous pour vous et vous ne serez d'aucune utilité.
la source
Le principal avantage d'une formation en informatique pour les ingénieurs en logiciel est la capacité de créer et de comprendre des abstractions. Les abstractions sont utilisées pour encapsuler des fonctionnalités communes, telles que les méthodes de classe String, dans des packages compacts et réutilisables nous permettant de nous concentrer sur le problème le plus important.
Apprenez à reconnaître et à créer des abstractions :
Mais surtout, les abstractions nous apprennent à décomposer un problème en morceaux plus petits et plus faciles à gérer . Combinée à un bagage scientifique, la combinaison de ces compétences peut créer un ingénieur capable de réduire le bruit et d'atteindre le cœur du problème.
Apprenez à résoudre des problèmes en utilisant la méthode scientifique :
Lors du dépannage d'une application de production présentant un problème difficile à trouver, il est parfois utile de casser davantage l'application (dans un environnement non productif) afin d'éliminer plusieurs variables afin d'en isoler et d'en éliminer une.
En résumé, la méthode scientifique, apprise en prenant tous les cours optionnels en physique et en sciences requis pour un diplôme en informatique, aide à résoudre ces problèmes comme si nous essayions un placebo et un nouvel essai de drogue sur une série de volontaires. Comme les scientifiques qui doivent parfois aggraver quelque chose pour le rendre meilleur, nous en tant qu'ingénieurs devons parfois faire de même.
La pensée scientifique de cette manière ne peut - en général - venir que d’avoir de l’expérience scientifique. Parfois, résoudre un problème ne peut pas être perçu comme un chemin linéaire de A à B.
En bref, étudier l'informatique, étudier d'autres domaines scientifiques, apprendre la programmation fonctionnelle. Cela vous aidera à penser comme un scientifique et à sortir des sentiers battus.
la source
Tout dépend du type de problèmes que vous souhaitez résoudre, mais apprendre à penser de manière logique si vous ne le faites pas déjà est une bonne chose.
Tout compte fait, et vous allez me haïr de le dire, mais la pratique rend parfait. Je ne me suis pas retiré du ventre de ma mère en sachant comment résoudre efficacement les problèmes, et personne d'autre ne l'a fait. Vous devez pratiquer et apprendre à faire les choses vous-même. Si vous êtes encore à l’école et n’avez pas de cours de type programmation / informatique, les mathématiques et les sciences sont également très utiles pour favoriser le développement de ces compétences.
la source
Je pense que ce que vous recherchez, c'est une heuristique informatique.
En ce qui concerne ce que 99% d'entre nous faisons dans les tranchées, il n'y a vraiment rien de nouveau sous le soleil. Donc, vous pouvez voir un problème et le reconnaître comme un problème de PD, ou un autre comme un problème qui pourrait bénéficier de la mémorisation, etc.
Comment gagnez-vous cette connaissance? Un bon diplôme de CS est un bon point de départ ... Pas l'ingénierie logicielle ou les systèmes d'information, mais ce genre de choses que la plupart des étudiants de premier cycle se plaignent de "ne pas être pratiques".
Vous pouvez le faire vous-même, mais ce sera probablement plus difficile. Je commencerais par ces deux cours:
Introduction aux algorithmes
Bonnes idées dans le CS théorique
la source
Mes réponses concernent spécifiquement le codage mais peuvent s'appliquer à n'importe quoi.
la source
En termes de pratique, je peux vous dire ce que je fais. Je suis plus intéressé par les mathématiques appliquées que par la programmation, mais les mathématiques appliquées appliquées à l'informatique sont une sorte de programmation. Je vois des problèmes et des solutions autour. Avant (ou parfois après, si mon travail nécessite une solution opportune), en me connectant à une solution connue - ou à une bibliothèque de codes existante, je me pose la question suivante: "Si le problème était vierge, vous ne pourrez pas trouver une solution en conserve, comment procéderiez-vous? " Si la réponse est assez simple, envisagez d’écrire une solution (analytique, ou un programme informatique pour la résoudre). Ignorer les cas finaux compliqués, vous êtes intéressé à explorer des approches et des algorithmes, pas à réinventer une bibliothèque existante. Si la solution nécessite trop d’efforts, ne programmez pas la solution complète, mais au moins, réfléchissez aux types de structures de données et de méthodes que vous voudriez utiliser. Pensez également aux méthodes alternatives.
la source
Il y a une grande question SO à ce sujet.
Ma réponse a été:
la source
Jouer aux échecs
Jouer aux échecs est un excellent entraîneur pour résoudre les problèmes de programmation. Les couches de problèmes et les arbres logiques se rapportent très bien. Cela vous aide également à penser à l’avenir et à planifier avant de vous engager dans une voie sous-optimale et de perdre du temps.
Les échecs exigent également un équilibre entre les «modes de pensée» gauche et droit. Si vous devenez trop analytique, vous pouvez vous perdre en essayant de tout calculer, ce qui est impossible. Cependant, chaque inspiration créatrice doit être vérifiée avec un calcul afin de s'assurer qu'il correspond à la réalité concrète de la situation. Les problèmes difficiles sont comme ça.
Les échecs démontrent que l’étude et la pratique conduisent à une amélioration solide de façon très linéaire. Cela est vrai aussi avec la résolution de problèmes de programme.
Jouer aux échecs peut aussi vous aider à comprendre ce qu’il ya à apprendre. Même si vous programmez (ou jouez aux échecs) depuis 10 ans, vous n'êtes pas encore grand maître.
la source
J'ai récemment résolu les problèmes du projet Euler . Les problèmes sont de difficulté variable. Les solutions ne nécessitent généralement pas de grandes quantités de code, mais vous devez prendre en compte de nombreux facteurs tels que l'exécution de votre algorithme. Vous pouvez utiliser la langue de votre choix en entrant simplement une réponse. Il existe une bonne solution pour une solution optimale à de nombreux problèmes et de nombreuses discussions sur chaque problème. Essayez de résoudre un problème chaque jour et vous serez étonné de l’amélioration de votre résolution de problèmes et de votre analyse. Pour plus de crédit, essayez de résoudre le même problème dans de nombreux langages, tels qu'un langage procédural (peut-être C ++), un langage de script (comme Python) et un langage fonctionnel (comme F #).
la source
Je viens d'une formation scientifique, alors quand je regarde un problème, j'ai tendance à utiliser des tactiques de la méthode scientifique . J'aime particulièrement mettre en place des "expériences" basées sur des hypothèses et utiliser des "contrôles", je vais donc construire quelque chose, puis ne changer / ajouter que 1 chose à ce sujet et voir le résultat de ce changement / ajout et si je " Je n’obtiens pas le résultat dont j’ai besoin, je le changerai et changerai quelque chose d’autre. Cela fonctionne bien pour le dépannage / le débogage du code. Parfois, vous obtenez la réponse que vous cherchez, mais vous apprenez toujours quelque chose de nouveau, même lorsque vous échouez. J'aime aussi apprendre par le réductionnisme- prendre quelque chose qui existe déjà (il est toujours bon de commencer par quelque chose que vous ne comprenez peut-être pas, mais vous savez que cela fonctionne) qui me semble complexe et qui me permet de voir si je peux le décomposer en ses composants et apprendre comment ils fonctionnent en premier. Il est parfois plus facile pour mon cerveau de gérer un apprentissage comme celui-ci au lieu d'aborder un problème de manière holistique et je peux utiliser ces connaissances pour construire moi-même d'autres choses complexes similaires. Je recommande également de lire des livres sur la logique et le raisonnement en choisissant des œuvres de penseurs classiques et modernes (commencez par Aristote et continuez vers le haut). Ils peuvent vous donner les bases de la logique de base que vous pouvez utiliser pour vous aider à résoudre des problèmes informatiques. Et, bien sûr, si vous ne pouvez pas résoudre un problème et que vous y travaillez depuis quelque temps, faites une pause cérébrale. Ruminant sur un aspect particulier d'une question est parfois préjudiciable. Tout le monde a besoin de pauses :)
la source
La partie la plus difficile de la résolution de problèmes est la "réduction perceptuelle".
Vous choisissez quelque chose qui semble être le problème et vous persévérez jusqu'à ce que vous soyez épuisé et que vous ne progressiez plus.
Pour ce faire, vous devez être absolument sûr de comprendre le problème. "Résoudre le bon problème" est la partie la plus importante de la résolution de problèmes.
Parfois, ils appellent cela "penser en dehors de la boîte". "La boîte" est un point de vue étroit qui peut ne pas inclure le vrai problème fondamental. Sortir des sentiers battus, c'est chercher le bon problème à résoudre.
Il existe de nombreux ouvrages sur les stratégies visant à éviter le rétrécissement qui va de pair avec une focalisation prématurée sur le mauvais problème.
L'astuce consiste principalement à déterminer quel est le véritable résultat escompté. Ensuite, déterminez ce qui bloque ce résultat souhaitable.
la source
Honnêtement, je pense que tout le monde est différent, la feuille de route de chacun pour devenir un meilleur solutionneur de problèmes est donc différente. Vous pouvez apprendre de l'expérience d'autres personnes, mais à la fin, vous devez vous frayer votre propre chemin. Il s’agit essentiellement d’apprendre quelque chose à la dure, mais c’est efficace dans ce cas.
Voici comment j'ai commencé à améliorer ma résolution de problèmes, bien que je ne sois pas encore très capable de résoudre les problèmes, mais qu'il soit meilleur que l'an dernier. Un nouveau projet m'a été confié, qui consistait à étendre un logiciel de suivi du temps open source en ajoutant trois nouveaux rapports à la direction. Ce logiciel a été écrit dans un langage que je n’avais jamais utilisé et il était mal documenté et très obscurcissant. J'ai creusé et fait une tonne de recherches puis j'ai juste travaillé sur les rapports par petites étapes. Une fois que j'ai eu les fonctionnalités de base, je les ai améliorées et finalement j'ai ajouté plus de fonctionnalités.
Donc, en d’autres termes, je vous recommande de trouver une sorte d’évier ou un projet du monde réel dans lequel vous pourrez nager. Si vous êtes actuellement employé en tant que programmeur, trouvez un projet ou demandez-en un à votre patron. Si ce scénario n'est pas possible, trouvez-en un en dehors du travail, par exemple un contrat / un travail indépendant. Je résous très bien et très rapidement les problèmes lorsque je dois le faire et je conserve ces connaissances en raison de l'intensité du projet. Si cela ne fonctionne pas pour vous, faites ce que tout le monde suggère sur ce fil :).
la source
La réponse est elle - même dans la question en proposant différentes solutions. Il y a toujours plus d'une solution (par exemple, le tri peut être effectué de différentes manières, à savoir tri par bulles, tri par sélections, etc.), il vous suffit de choisir un moyen de le faire (tri) de manière efficace. Essayez avec différents la prochaine fois et ainsi de suite ..... Et des livres pour la résolution de problèmes ..... Aucun Vous ne pouvez pas apprendre les compétences de résolution de problèmes à partir de livres, plus de code vous exécuterez plus de connaissances que vous gagnerez. Bonne chance
la source
Il est facile pour un programmeur d’attaquer mentalement un problème en visualisant comment le résoudre avec son langage de programmation préféré. Tout comme le charpentier classique qui voit tous les problèmes comme des clous lorsque son outil préféré est le marteau.
Je pense que les meilleurs exercices de résolution de problèmes surviennent lorsque vous dépassez le niveau pratique et que vous pensez simplement «c’est ce dont j’aurais besoin pour résoudre le problème de manière optimale». Dans certains cas, vous devrez peut-être apprendre beaucoup de choses pour appliquer la solution, mais l’essentiel est que votre capacité à élaborer une solution ne soit pas limitée à vos techniques historiques et existantes.
Un ancien exemple pratique pour moi est que j’ai appris à mettre en œuvre un multitâche coopératif efficace lorsque je me suis rendu compte que mon problème n’avait pas besoin de threads préventifs, même si j’aurais généralement été dans ma zone de confort en détruisant tous ces mutex ( semble finalement toujours cesser d’être à l’aise à un moment donné ..).
la source
Dans le développement d’applications, bon nombre des problèmes auxquels nous sommes confrontés sont soit notre propre invention, soit l’invention de l’idiot dont nous avons hérité, cette base de code gâchée. Résoudre un problème revient le plus souvent à trouver la source . Souvent, une fois que nous trouvons où cela se produit, la simple compétence est ce qui est nécessaire pour le résoudre .
À cette fin:
Tout l'entraînement cérébral dans le monde est inutile sans informations que le cerveau peut utiliser. Pour résoudre un problème, vous devez savoir quelles sont les premières possibilités ! Même dans ce cas, il est beaucoup plus rapide de travailler avec de bonnes informations plutôt que de simplement décrire le problème.
Je pourrais penser que les vaches ne comprendront pas pourquoi quelque chose prend trop de temps à exécuter. Mais si je dis "obtenons d’abord des données", je verrai peut-être que de nombreuses exceptions sont générées et je réalise que je pourrais le remplacer par une instruction if. Sans savoir comment collecter les informations, sachant que sur ma plate-forme, les exceptions prennent un peu trop de charge, et qu'il existe un moyen de vérifier avant d'essayer, c'est plus rapide, je ne résoudrais jamais le problème.
la source
Votre réponse comporte deux parties:
a) Technique de résolution de problèmes
b) Rendre votre cerveau intrinsèquement "meilleur" pour penser et résoudre des problèmes
Il y a toujours eu d'excellentes réponses sur le plan technique (supposons que vous connaissiez le problème, etc.), donc je ne vais pas en parler autant. En ce qui concerne l'entraînement de votre cerveau, vous pouvez faire plusieurs choses pour croiser ces synapses et établir davantage d'interconnexions.
1) Apprenez une nouvelle langue, une vraie langue (comme le français ou le chinois pourrait être un bon pari ces jours-ci)
2) Apprenez à jouer d'un nouvel instrument
3) Faites quelque chose d'artistique comme de la peinture, du dessin ou de la sculpture
4) Jouer au scrabble ou faire des mots croisés
5) Danse comme tu le penses. Non, je ne plaisante pas. Il a été démontré que la danse avait un impact sur votre cerveau et votre façon de penser
6) Élargissez vos expériences, des solutions innovantes sont venues de l’application d’une théorie dans un domaine à un autre, alors étudiez différents domaines et domaines que vous trouvez intéressants.
7) Exercice, l'exercice est d'une importance cruciale pour améliorer le processus de réflexion
Enfin, je vais vous donner mon meilleur conseil pour résoudre des problèmes difficiles: faire une longue marche. J'ai trouvé que cela fonctionne des miracles pour éclaircir la tête et laisser un contempler les problèmes
la source
Mon conseil serait de jeter le livre!
Pas littéralement bien sûr. Ce que je veux dire, c’est entrer dans un domaine dans lequel vous avez peu d’expérience et y résoudre des problèmes difficiles, sans apprendre les solutions existantes. Ne vous fiez qu'à votre créativité, à votre esprit critique et peut-être à un manuel de référence.
Vous pouvez concevoir un format d'image. Ou un serveur web. Ou un schéma de compression. Système de fichiers. Noyau. Intelligence artificielle. Langage de programmation. Système de vision par ordinateur.
Quelque chose que vous trouvez intéressant, assez complexe et dont vous n’avez jamais entendu parler. Ne pas lire à ce sujet: il suffit de sauter directement dans. Expérience. Faire des erreurs. Réinventer la roue.
Ne demande pas d'aide. Éloignez-vous des tutoriels. Restez à l'écart de la théorie. Ne tirez pas une solution de l'étagère.
Pourquoi?
Faites quelques tentatives et une fois que vous êtes satisfait de ce que vous avez accompli, laissez-le pendant quelques mois. Ensuite, revenez frais et voyez si vous pouvez trouver une nouvelle perspective. Après cela, il est temps de commencer à lire sur le problème et sur la façon dont les autres l’ont résolu (ou discuté avec des gens). À ce stade, au lieu de vous dire «oui, c'est logique» pendant que vous lisez, vous dites «oui, exactement », ou «bien, dans une certaine mesure», ou «wow, c'est intelligent».
En d'autres termes, vous penserez de manière beaucoup plus critique à ce que vous lisez et vous le trouverez beaucoup plus facile à comprendre et à retenir, car vous disposez déjà d'un grand "cadre mental" auquel le lier. Vous vous sentirez à l'aise avec les choses que vous avez découvertes indépendamment et vous repartirez avec un tas de nouvelles connaissances.
N'essayez pas de rendre votre solution parfaite. Prouvez à vous-même que vous pouvez résoudre le problème. Adoptez une attitude positive et si vous vous sentez découragé par le problème, rappelez-vous que la personne qui l'a résolu le premier en savait probablement autant que vous (en fait, ils ne savaient pas qu'il avait une solution!).
la source
La résolution de problèmes n'est pas quelque chose qui peut être enseigné ou même appris en lisant. Le seul moyen de mieux résoudre les problèmes est de les résoudre.
Vous pouvez vous renseigner sur différentes techniques et méthodologies de résolution de problèmes, ainsi que sur des outils et des technologies que vous pouvez utiliser pour résoudre des problèmes dans un domaine particulier. Sauf si vous pensez continuellement aux problèmes, essayez de trouver des solutions (trouvez plusieurs solutions pour chaque problème et évaluez-les les uns contre les autres), puis évaluez vos solutions par rapport aux solutions développées par d'autres, vous n'allez pas mieux résoudre le problème la résolution.
Je recommande de prendre un exemplaire de Pensée pragmatique et apprentissage: Refactor Your Wetware par Andy Hunt . C'est un livre sur la compréhension de votre façon de penser, de réagir et d'apprendre. Il apporte des théories pertinentes de la théorie du comportement et d'autres sciences cognitives. Il est spécifiquement destiné aux développeurs de logiciels, mais applicable à tout travailleur du savoir.
la source
Pour les débutants en programmation comme moi, je recommande le livre "Think Like a Programmer". Dans le premier chapitre, il aborde des techniques de résolution de problèmes telles que la reformulation et la division du problème, à commencer par ce que vous savez, la réduction, les analogies et les expérimentations.
Il existe ensuite des techniques plus avancées avec des exemples en C ++: résolution de problèmes de tableaux, de pointeurs et de mémoire dynamique, de classes, de récursivité, de réutilisation de code. Je ne peux pas commenter cette partie parce que c'est trop difficile pour moi pour le moment.
la source
Je résous autant de problèmes que possible. J'aime aussi certains livres de casse-tête comme celui-ci . Je bricole aussi avec des jeux de résolution de problèmes, comme des jeux de mathématiques comportant des nombres premiers ou un truc du genre, le sudoku, la tour de Hanoi, etc. Trouvez simplement des problèmes à résoudre. En outre, codez-le lorsque cela est possible.
la source
Au revoir résoudre BEAUCOUP de problèmes!
vous commencez avec des problèmes faciles et vous passez à des problèmes plus difficiles une fois que les problèmes faciles deviennent une routine au lieu de problèmes.
la source
Ne vous limitez pas à la théorie, faites plus de pratique. Avec la pratique vient l'expérience.
la source