Résolvez-vous des problèmes de programmation ou effectuez-vous des exercices? (La différence compte.)

Les gens ont tendance à utiliser les termes «problèmes» et «exercices» de manière interchangeable. Mais il y a une différence - et c'est important.

Le professeur Paul Zeitz fait la distinction.

Prenez 5 × 5. C'est facile et c'est un exercice. Il en va de 5 490 900 × 496. C'est un peu plus difficile et cela vous prendra plus de temps à résoudre, mais vous savez quoi faire. C'est le point clé.

«Un exercice est une question mathématique à laquelle vous savez immédiatement comment répondre», explique Zeitz dans une série de conférences sur la résolution de problèmes. "Vous ne pouvez pas y répondre correctement, en fait vous ne pouvez jamais y répondre correctement ... mais il n'y a aucun doute sur la façon de procéder.

Ce n'est pas le cas avec les problèmes. Un problème, selon Zeitz, "est une question mathématique à laquelle vous ne savez pas comment répondre, du moins au début."

Il définit les problèmes et les exercices sous l'angle de la résolution de problèmes mathématiques, mais ils sont également applicables à la programmation.

Chaque jour, nous mettons nos compétences en résolution de problèmes au service de programmeurs: débogage de code, apprentissage d'un nouveau sujet ou même résolution d'un problème. Les exercices ont leur place, mais en tant que programmeur, rien ne remplace la résolution de problèmes.

Exercice avec exercices

Il existe deux façons de profiter des exercices. Tout d'abord, ils sont utiles lors de l'apprentissage d'un nouveau sujet.

J'apprends JavaScript en ce moment et j'utilise un mélange d'exercices et de problèmes pour le faire. Les exercices m'aident à voir les modèles et à me familiariser avec les concepts et la syntaxe.

Voici un exemple d'exercice d'un projet qui m'a demandé d'écrire une fonction, qui a pris un tableau de voitures.

const cars = [ { id: 1, car_make: "Lincoln", car_model: "Navigator", car_year: 2009 }, { id: 2, car_make: "Mazda", car_model: "Miata MX-5", car_year: 2001 }, { id: 3, car_make: "Land Rover", car_model: "Defender Ice Edition", car_year: 2010 }, ... ] 

J'ai dû trier le tableau des objets par car_modelclé, par ordre croissant.

Cela ne veut pas dire que cet exercice a été un jeu d'enfant - ce n'était pas le cas. Cela m'a pris du temps et j'ai reçu ma juste part de messages d'erreur.

Cependant, cela se qualifie comme un exercice car je savais ce que je devais faire dès le départ.

J'avais récemment découvert les tableaux en JavaScript. J'étais familier avec le tri des données de mon expérience avec Python, même si j'ai dû rechercher comment faire cela en JavaScript. Les instructions explicites ont également aidé.

Mais les concepts étaient encore nouveaux. J'avais besoin de m'entraîner à les assembler, c'est pourquoi cet exercice était précieux. La répétition engendre la familiarité et les concepts ont commencé à se solidifier dans mon esprit.

Conservez ce que vous avez gagné

Les exercices aident également à garder à jour les informations apprises.

En apprenant JavaScript, je ne veux pas oublier tout ce que j'ai appris sur le premier langage que j'ai appris, Python. J'utilise donc Anki, un programme flashcard, plusieurs fois par jour.

Dans ce contexte, les exercices vous aident à garder une montagne de données droite, à vous rappeler des concepts importants et à vous familiariser avec une structure de données ou une approche particulière. C'est un travail de maintenance sur l'ensemble des connaissances que vous avez acquises jusqu'à présent.

J'ai plus de 1 000 cartes remplies de matériel que j'ai vu plusieurs fois auparavant. Certaines cartes ont des questions sur la syntaxe. D'autres me demandent d'écrire des requêtes SQL ou des commandes en ligne de commande ou Git. Beaucoup d'autres sont remplis d'exercices, comme "faire pivoter une liste de nombres vers la droite d'une valeur de position".

Il est important de noter que cet exercice a été un problème pour moi. Si vous faites suffisamment un problème, cela peut devenir un exercice. En même temps, vous pouvez faire d'un exercice un problème en ajoutant une contrainte.

Les exercices sont une pente glissante. D'une part, ils sont utiles à des fins d'apprentissage. D'un autre côté, il est facile de se mettre à l'aise en se contentant d'exercices exclusivement.

C'est l'inconvénient: rester dans votre zone de confort.

Gérer l'ambiguïté

La programmation consiste à résoudre des problèmes. Et la résolution de problèmes vous fera sortir de votre zone de confort. C'est une bonne chose.

Pour moi, les problèmes ont deux qualités distinctives. Le premier est l'ambiguïté. La résolution de problèmes consiste en grande partie à gérer efficacement l'ambiguïté.

  • Un message d'erreur apparaît à chaque exécution de votre programme. Pourquoi? Que se passe-t-il? Où est le bug? Comment pouvez-vous le réparer?
  • Vous obtenez une nouvelle déclaration de problème. Vous l'avez lu et relu. À première vue, vous n'avez aucune idée de ce qui se passe, et encore moins de ce que vous devez faire pour le résoudre. Vous pouvez même ressentir la sensation de «cerf dans les phares», accompagnée d'une fosse au fond de l'estomac. (Vous avez choisi un bon problème!)
  • Vous devez en savoir plus sur les bases de données relationnelles. C'est assez large. Comment allez-vous vous y prendre? Sur quoi se concentrer en premier? Ce qui compte le plus? Que devez-vous vraiment savoir maintenant ?

Ces exemples impliquent tous une ambiguïté. Et tous nécessitent de résoudre des problèmes , qu'il s'agisse de trouver et de résoudre un bogue, de résoudre un problème réel ou d'apprendre un nouveau sujet.  

Pour progresser, vous recherchez, expérimentez, extrayez les faits, créez un plan et appliquez une variété de tactiques de résolution de problèmes. En bref, vous apprenez à le comprendre. Plus vous passez de temps avec un problème et les différentes perspectives que vous gagnez, plus il révèle de couches et plus vous vous rapprochez du moment «aha».

Embrassez la lutte

L'autre différence avec les problèmes est la lutte. C'est vrai.

La résolution de problèmes mettra à l'épreuve votre endurance mentale et votre patience. Les progrès peuvent être lents et le processus fastidieux. J'ai travaillé dur pour les problèmes pendant des heures, des jours et même des semaines.

Cela ne veut pas dire que les exercices ne vous mettront pas au défi. Ils peuvent. C'est une chose quand on sait que l'on doit utiliser une méthode particulière; il vous suffit de le faire fonctionner correctement. C'est un défi, qui peut parfois être carrément frustrant.

Mais c'est tout autre chose lorsque vous ne savez pas quoi faire depuis le début, ce qui peut arriver plusieurs fois lors de la résolution d'un problème. Pour moi, les problèmes sont une lutte.

La meilleure solution est de l'endurer et de vous décoller. D'après mon expérience, la lutte signifie que j'apprends beaucoup et la percée est généralement au coin de la rue.

En traversant l'inconfort mental, vous vous surprendrez à penser de manière créative et à concevoir des solutions auxquelles vous n'aviez jamais pensé auparavant. (Vous vous surprenez et vous impressionnez - vous en savez plus que vous ne le pensez!) Vous devenez un programmeur plus fort.

Vous vous surprendrez même à vous amuser. La résolution de problèmes est difficile, bien sûr, et même parfois frustrante. Mais c'est aussi incroyablement gratifiant.

C'est comme franchir la ligne d'arrivée d'un semi-marathon. Il ne fait aucun doute que les 13,1 derniers milles étaient exténuants, mais franchir la ligne d'arrivée en valait la peine et je le referais. La résolution d'un problème est la même chose.

De quoi s'agit-il: problèmes ou exercices?

Lorsque vous ouvrez votre ordinateur portable, allez-vous résoudre des problèmes ou faire des exercices?  

Les exercices ont des avantages et vous pouvez les intégrer à vos sessions de programmation. J'utilise des exercices comme échauffement avant une session de programmation. Je vais parcourir un jeu de cartes mémoire Anki pendant dix ou quinze minutes et faire quelques exercices. Si j'apprends quelque chose de nouveau, comme JavaScript, il se peut que j'aie une session de programmation entière consacrée aux exercices.

Cependant, je consacre du temps chaque jour à résoudre des problèmes - peu importe ce que j'apprends ou construis. Même les jours où je consacre beaucoup de temps aux exercices, je consacre aussi beaucoup de temps à la résolution de problèmes.  

Ainsi, lorsque vous êtes sur le point de démarrer une session de programmation, sachez ce que vous vous apprêtez à faire: exercices ou problèmes. Et quoi qu'il arrive, prenez le temps de résoudre les problèmes.

La résolution de problèmes est une compétence qui demande beaucoup de pratique et de temps à développer. La seule façon de s'améliorer est d'y travailler chaque jour. C'est si important et pour une bonne raison.

Nous résolvons des problèmes chaque jour en tant que programmeurs et de différentes manières. Prendre le temps de résoudre les problèmes est une évidence; notre travail de programmeurs en dépend.

I write about learning to program, and the best ways to go about it (amymhaddad.com).