Tout le monde dit la même chose: "un vrai programmeur sait gérer de vrais problèmes." Mais ils oublient comment ils ont appris cette capacité ou où: 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, comme les algorithmes ou les modèles de conception?
Quelques techniques qui pourraient ou non fonctionner:
Utilisez la réflexion en mode R ou en mode L selon les besoins
Le mode R est l'approche créative et 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 insoluble, c'est probablement parce que vous essayez de le résoudre en utilisant le mode de réflexion incorrect. Pour les programmeurs, le mode de réflexion par défaut a tendance à être le mode L, il peut donc être utile de le désactiver temporairement et d'accéder au mode R.
Comment accéder à la réflexion en mode R
Il existe de nombreuses façons, mais essayez peut-être la méthode Poincaré (du nom du célèbre mathématicien).
Notez tout ce que vous savez sur le problème. Résolvez immédiatement tous les aspects faciles (le cas échéant). Choisissez un seul élément dans la liste des "problèmes difficiles" restants, puis partez en promenade où vous ne serez pas dérangé ou distrait.
N'essayez pas d'analyser le problème pendant la marche, laissez simplement votre esprit vagabonder et observez toutes les images ou sensations intéressantes qui pourraient être liées au problème. Laissez-les fusionner. Si l'inspiration frappe immédiatement, arrêtez la marche et revenez pour noter les informations que vous avez acquises.
Rincez et répétez jusqu'à ce que tous les problèmes aient un aperçu. Ensuite, commencez à explorer les idées.
Recommandation de livre
Lire également Pensée et apprentissage pragmatiques peut vous aider à devenir un meilleur résolveur de problèmes. (Il me semble que je fais souvent référence à ce livre récemment ...)
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 le découvrirez en le verbalisant.
Parfois, l'autre personne posera une question ou indiquera un détail qui déverrouillera le déluge mental.
Finalement, vous apprendrez à verbaliser les choses dans votre tête sans utiliser de marionnette et à repérer plus rapidement les détails clés du problème.
Et si tout le reste échoue au moins, ils pourraient vous montrer une technique que vous n'auriez pas pensé utiliser.
En fait, ma réponse courte est "résoudre plus de problèmes". Mais le fait est: concentrez-vous vraiment sur les problèmes et n'abandonnez pas. Ne demandez pas d'aide sur StackOverflow ou autre. (La lecture de StackOverflow est ok bien sûr!) Essayez dur jusqu'à ce que vous obteniez une solution presque fonctionnelle, puis vous avez presque atteint votre objectif. Et continuez jusqu'à ce que vous ayez 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 coincé avec un problème. Il vous permet également de consacrer plus de temps à la résolution de problèmes, ce qui vous permet d'améliorer encore plus 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 de 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:
L'étape 1 est une décision difficile à prendre, mais vous prenez de meilleures décisions plus vous vous entraînez.
Oh et j'oublie presque l'ingrédient le plus important:
Pensez positivement à 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, 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.
Commencez également à travailler sur la capacité d'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 demandent trop de réponses et pas assez de questions aux élèves.
Trouvez des gens autour de vous 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é.
Le principal avantage d'une formation en informatique pour les ingénieurs logiciels est la capacité de créer et de comprendre des abstractions. Les abstractions sont utilisées pour encapsuler des fonctionnalités courantes, telles que les méthodes de classe String, dans des packages serrés et réutilisables qui nous permettent de nous concentrer sur le problème le plus important.
Apprenez à reconnaître et à créer des abstractions:
Mais surtout, les abstractions nous apprennent comment décomposer un problème en morceaux plus petits et plus faciles à gérer. Lorsqu'elles sont combinées à une formation scientifique, la combinaison de ces compétences peut créer un ingénieur capable de couper à travers le bruit et d'aller au 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 où il existe un problème difficile à trouver, il est parfois utile de décomposer davantage l'application (dans un environnement de non-production) 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 au choix en physique et autres cours au choix en sciences nécessaires pour un diplôme en informatique, aide à résoudre ces problèmes comme si nous essayions un placebo et un nouvel essai de médicament sur une série de volontaires. Comme les scientifiques qui doivent parfois aggraver quelque chose pour le rendre meilleur, parfois nous, ingénieurs, devons faire de même.
La réflexion scientifique de cette manière ne peut - en général - provenir que d'une expérience dans le domaine scientifique. Parfois, la résolution d'un problème ne peut pas être perçue comme un chemin linéaire de A à B.
En bref, étudiez l'informatique, étudiez d'autres domaines scientifiques, apprenez la programmation fonctionnelle. Ceux-ci vous aideront à penser comme un scientifique et à sortir des sentiers battus.
Je pense que ce que vous recherchez est une heuristique informatique.
En ce qui concerne ce que 99% d'entre nous font dans les tranchées, il n'y a vraiment rien de nouveau sous le soleil. Vous pouvez donc voir un problème et le reconnaître comme un problème DP, ou un autre comme un problème qui pourrait bénéficier de la mémorisation, etc.
Comment acquérez-vous ces connaissances? Un bon diplôme CS est un bon point de départ ... Pas du génie logiciel ou des systèmes d'information, mais ce genre de choses que la plupart des étudiants de premier cycle se plaignent de "ne pas être pratique".
Vous pouvez le faire vous-même, mais ce sera probablement plus difficile. Je commencerais par ces deux cours:
Tout dépend du type de problèmes que vous souhaitez résoudre, mais apprendre à penser logiquement si vous ne le faites pas déjà est une bonne chose.
Dans l'ensemble, et tu vas me détester pour l'avoir dit, mais la pratique rend parfait. Je n'ai pas été retirée du ventre de ma mère en sachant comment résoudre les problèmes et personne d'autre ne l'a fait. Vous devez vous entraîner et apprendre à faire les choses par vous-même. Si vous êtes encore à l'école et que vous n'avez pas de cours de type programmation/informatique, les mathématiques et les sciences sont également très bonnes pour favoriser le développement de ces compétences.
Mes réponses concernent spécifiquement le codage mais peuvent s'appliquer à tout.
En termes de pratique, je peux vous dire ce que je fais. Je m'intéresse plus aux mathématiques appliquées qu'à la programmation, mais les mathématiques appliquées appliquées à l'informatique sont en quelque sorte de la programmation. Je vois des problèmes et des solutions autour. Avant (ou parfois après, si mon travail nécessite une solution opportune), de créer un lien vers une solution connue - ou une bibliothèque de code existante, je me demande: "S'il s'agissait d'un problème vierge - vous ne pourrez pas trouver une solution en conserve, comment feriez-vous? " Si la réponse est quelque peu simple, envisagez d'écrire une solution (analytique ou un programme informatique pour la résoudre). Ignorez les cas finaux compliqués, -vous êtes intéressé à exlorer les approches et les algorithmes, pas à réinventer une bibliothèque existante. Si la solution nécessite trop d'efforts, ne programmez pas la solution complète, mais pensez au moins aux types de structures de données et de méthodes que vous souhaitez utiliser. Pensez également à des méthodes alternatives.
Je viens d'un milieu scientifique, donc 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", donc je vais construire quelque chose et ensuite changer/ajouter seulement 1 chose à ce sujet et voir quel est le résultat de ce changement/ajout et si je ' Je n'obtiens pas le résultat dont j'ai besoin, je vais le rétablir et changer autre chose. Cela fonctionne bien pour le dépannage/débogage du code. Parfois, vous obtenez la réponse que vous cherchez, mais vous apprenez toujours quelque chose de nouveau en faisant cela même lorsque vous échouez. J'aime aussi apprendre à travers réductionnisme - prendre quelque chose qui existe déjà (toujours bon pour commencer avec quelque chose que vous ne comprenez peut-être pas, mais vous savez que ça marche) et qui me semble complexe et voir si je peux le casser dans ses composants et apprenez 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 montez). Ils peuvent vous donner certaines des bases de la logique de base que vous pouvez utiliser pour aider à la résolution de problèmes dans les ordinateurs. Et, bien sûr, si vous ne pouvez pas résoudre un problème et que vous y travaillez depuis un certain temps, faites une pause cérébrale. Ruminant sur un aspect particulier d'un problème est parfois préjudiciable. Tout le monde a besoin de pauses :)
Il y a un grand SO question à ce sujet.
Ma réponse a été:
La meilleure façon de s'améliorer est de s'entraîner!
Abonnez-vous au flux RSS à: http://www.mensa.org.uk/puzzles/ et prenez le temps de les compléter au fur et à mesure de leur sortie.
Un calendrier de bureau de puzzle (par exemple http://www.calendars.com/product.asp?PID=1&MGID=-1&IID=46387&cm_mmc=Affiliate_Program--performics--k137666-_-DDI%20Link ) est également une bonne idée car elle vous donnera des problèmes réguliers, de la taille d'une bouchée et variés à résoudre.
Bien que ceux-ci soient invariablement hors sujet des problèmes auxquels vous vous trouverez confrontés, la variété est importante car elle vous obligera à penser comme vous ne l'avez jamais fait auparavant, ce qui est vraiment la résolution de problèmes.
Modifier: Vérifiez également: http://www.mindtools.com/pages/main/newMN_TMC.htm pour de bons conseils de résolution de problèmes.
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 sont très bien liés. Cela vous aide également à penser à l'avance et à planifier avant de suivre une voie sous-optimale et de perdre du temps.
Les échecs nécessitent également un équilibre entre les "modes de pensée" gauche et droit. Si vous devenez trop analytique, vous pouvez vous enliser en essayant de tout calculer, ce qui est impossible. Cependant, chaque inspiration créative doit être vérifiée par un calcul pour s'assurer qu'elle correspond à la réalité concrète de la situation. Les problèmes difficiles sont comme ça.
Les échecs démontrent comment l'étude et la pratique conduisent à une amélioration solide de manière très linéaire. Cela est également vrai pour la résolution de problèmes de programme.
Jouer aux échecs peut également vous aider à comprendre combien il y a à apprendre. Même si vous programmez (ou jouez aux échecs) depuis 10 ans, vous n'êtes pas encore un grand maître.
J'ai récemment résolu les problèmes à Project 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 n'importe quelle langue que vous aimez, en entrant simplement une réponse. Il existe une bonne rédaction d'une solution optimale pour 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 voir à quel point votre résolution de problèmes et votre analyse s'améliorent. Pour un crédit supplémentaire, essayez de résoudre le même problème dans de nombreux langages, comme un langage procédural (peut-être C++), un langage de script (comme python) et un langage fonctionnel (comme F #).
La partie la plus difficile de la résolution de problèmes est le "rétrécissement perceptuel".
Vous choisissez quelque chose qui semble être le problème et vous poursuivez obstinément jusqu'à ce que vous soyez épuisé et que vous ne progressiez pas.
Pour ce faire, assurez-vous - absolument sûr - que vous comprenez vraiment 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 "sortir des sentiers battus". "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 livres sur les stratégies pour éviter le rétrécissement qui va avec une concentration prématurée sur le mauvais problème.
Le plus souvent, l'astuce consiste à déterminer quel est le véritable résultat. Ensuite, déterminez ce qui bloque ce résultat souhaitable.
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é et qui a bousillé la base de code. 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 résoudre cela.
À cette fin:
Toute la formation cérébrale dans le monde est inutile sans information à utiliser par le cerveau. Afin de résoudre un problème, vous devez savoir quels sont les possibilités en premier! Même dans ce cas, il est beaucoup plus rapide de travailler avec de bonnes informations plutôt qu'avec une simple description du problème.
Je pourrais spéculer jusqu'à ce que les vaches rentrent à la maison pour savoir pourquoi quelque chose prend trop de temps à exécuter. Mais si je dis "permet d'obtenir d'abord des données", je verrais peut-être que de nombreuses exceptions sont levées et je me rendrai compte que je pourrais le remplacer par une instruction if à la place. Sans savoir comment collecter les informations, sachant que sur ma plate-forme, les exceptions prennent un peu de temps et qu'il existe un moyen de vérifier avant d'essayer plus rapidement, je ne résoudrais jamais le problème.
Votre réponse comporte deux parties:
a) Technique pour la résolution de problèmes réels
b) Rendre votre cerveau intrinsèquement "meilleur" pour la réflexion et la résolution de problèmes
Il y a toujours eu d'excellentes réponses sur la technique (supposez que vous connaissez 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 traverser ces synapses et créer plus d'interconnexions
1) Apprenez une nouvelle langue, une vraie langue (comme le français ou le chinois pourrait être un bon pari de nos jours)
2) Apprenez à jouer un nouvel instrument
3) Faites quelque chose d'artistique comme la peinture, le dessin ou la sculpture
4) Jouez au scrabble ou faites des mots croisés
5) Dansez comme vous l'entendez. Non, je ne plaisante pas. Il a été démontré que la danse a un impact sur votre cerveau et votre pensée
6) Élargissez vos expériences, des solutions innovantes sont venues de l'application d'une théorie dans un domaine dans un autre afin d'étudier différents domaines et domaines que vous trouvez intéressants
7) Exercice, l'exercice est crucial important pour améliorer le processus de réflexion
Enfin, je vais vous proposer ma meilleure astuce pour résoudre les problèmes difficiles: faites une longue marche. J'ai trouvé que cela fait des miracles pour se vider la tête et laisser réfléchir les problèmes
Il est facile pour un programmeur d'attaquer mentalement un problème en visualisant comment résoudre le problème avec son langage de programmation préféré. Tout comme le menuisier 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 arrivez au-dessus du niveau pratique et pensez simplement en termes de "c'est ce dont j'ai besoin pour le résoudre de manière optimale". Dans certains cas, vous devrez peut-être apprendre (beaucoup) de nouvelles choses pour appliquer la solution, mais le point clé est que votre capacité à élaborer une solution ne devrait pas être limitée à vos techniques historiques et existantes.
Un vieil exemple pratique pour moi est que j'ai appris à implémenter un multitâche coopératif efficace quand j'ai réalisé que mon problème n'avait pas vraiment besoin de threads préemptifs, même si j'aurais habituellement été directement dans ma zone de confort en frappant tous ces mutex (que finalement semblent toujours cesser d'être à l'aise à un moment donné ..).
La résolution de problèmes n'est pas quelque chose qui peut être enseigné ou même appris par la lecture. La seule façon de mieux résoudre les problèmes est de résoudre les problèmes.
Il existe différentes techniques et méthodologies à la résolution de problèmes que vous pouvez lire, et vous pouvez lire sur les outils et technologies que vous pouvez utiliser pour résoudre des problèmes dans un domaine particulier. À moins que vous ne pensiez continuellement aux problèmes, essayez de trouver des solutions (trouvez plusieurs solutions pour chaque problème et évaluez-les les unes par rapport aux autres), puis évaluez vos solutions par rapport aux solutions développées par d'autres, vous n'améliorerez pas le problème résoudre.
Je recommande de prendre une copie de Réflexion et apprentissage pragmatiques: refactorisez votre Wetware par Andy Hunt . C'est un livre sur la façon dont vous pensez, réagissez et apprenez. 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.
Pour les débutants en programmation comme moi, je recommande le livre "Think Like a Programmer". Dans le premier chapitre, il couvre des techniques de résolution de problèmes telles que la reformulation et la division du problème, en commençant par ce que vous savez, la réduction, les analogies et l'expérimentation.
Ensuite, il existe des techniques plus avancées avec des exemples en C++: résolution de problèmes avec les tableaux, les pointeurs et la mémoire dynamique, les classes, la récursivité, la réutilisation du code. Je ne peux pas commenter cette partie car c'est encore trop difficile pour moi.
Mon conseil serait de jeter le livre!
Pas littéralement bien sûr. Ce que je veux dire, c'est d'entrer dans un domaine dans lequel vous avez peu d'expérience et d'y résoudre des problèmes difficiles, sans avoir à connaître les solutions existantes. Ne comptez que sur votre créativité et votre esprit critique et peut-être sur 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, qui est raisonnablement complexe et dont vous n'avez jamais entendu parler. Ne pas lisez-le: sautez directement dedans. Expérimentez. Faire des erreurs. Réinventer la roue.
Ne demandez pas d'aide. Éloignez-vous des tutoriels. Éloignez-vous de la théorie. Ne retirez 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. Revenez ensuite frais et voyez si vous pouvez trouver une nouvelle perspective. Après cela, il est temps de commencer à lire sur le problème et comment les autres l'ont résolu (ou parler avec les gens). À ce stade, au lieu de vous dire "oui, cela a du sens" pendant que vous lisez, vous direz "oui, exactement", ou "bien, dans une certaine mesure", ou "wow, C'est malin".
En d'autres termes, vous penserez beaucoup plus de manière critique à ce que vous lisez, et vous le trouverez beaucoup plus facile à comprendre et à mémoriser car vous avez déjà un grand "cadre mental" auquel le joindre. Vous vous sentirez bien dans ces choses que vous avez découvertes de façon indépendante, et vous repartirez avec un tas de nouvelles connaissances.
N'essayez pas de rendre votre solution parfaite. Prouvez-vous simplement que vous pouvez résoudre le problème. Adoptez une attitude "can-do", et si vous vous sentez intimidé par le problème, rappelez-vous que la personne qui l'a résolu en savait probablement autant que vous (en fait, ils ne savaient pas qu'il y avait une solution!).
Honnêtement, je pense que tout le monde est différent, donc la feuille de route de chacun pour devenir un meilleur résolveur de problèmes est différente. Vous pouvez apprendre de l'expérience des autres, mais à la fin vous devez forger 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, même si je ne suis pas encore un excellent résolveur de problèmes, juste meilleur que l'an dernier. On m'a donné un nouveau projet au travail qui consistait à étendre un logiciel open source de suivi du temps, en ajoutant trois nouveaux rapports pour la gestion. Ce logiciel a été écrit dans une langue que je n'avais jamais utilisée et il était mal documenté et très obscurci. J'ai creusé et fait une tonne de recherches, puis j'ai juste travaillé sur les rapports par étapes, une fois que j'ai eu des fonctionnalités de base, je les ai améliorées et finalement j'ai ajouté plus de fonctionnalités.
En d'autres termes, je vous recommande de trouver une sorte de projet réel de nage ou de nage sur lequel travailler. Si vous êtes actuellement employé comme 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, peut-être un contrat/travail indépendant ou quelque chose. Je résous très bien et très rapidement les problèmes quand je le dois 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 sur ce fil suggère :).
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 fait de différentes manières, à savoir le tri à bulles, le tri par sélections, etc.), il vous suffit de choisir une manière 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