¿Resuelve problemas de programación o completa ejercicios? (La diferencia importa).

La gente tiende a utilizar los términos "problemas" y "ejercicios" indistintamente. Pero hay una diferencia y es importante.

El profesor Paul Zeitz hace la distinción.

Tome 5 × 5. Eso es fácil y eso es un ejercicio. También lo es 5.490.900 × 496. Es un poco más difícil y te llevará más tiempo resolverlo, pero sabes qué hacer. Ese es el punto clave.

“Un ejercicio es una pregunta matemática que inmediatamente sabes cómo responder”, explica Zeitz en una serie de conferencias sobre resolución de problemas. "Puede que no lo contestes correctamente, de hecho, es posible que nunca lo contestes correctamente ... pero no hay duda de cómo proceder".

No es así con los problemas. Un problema, según Zeitz, "es una cuestión matemática que no sabes cómo responder, al menos inicialmente".

Define problemas y ejercicios a través de la lente de la resolución de problemas matemáticos, pero también son aplicables a la programación.

Cada día ponemos a trabajar nuestras habilidades de resolución de problemas como programadores: depurando código, aprendiendo un tema nuevo o incluso resolviendo un problema. Los ejercicios tienen su lugar, pero como programador no hay sustituto para resolver problemas.

Ejercicio con ejercicios

Hay dos formas de beneficiarse de los ejercicios. Primero, son útiles para aprender un tema nuevo.

Estoy aprendiendo JavaScript en este momento y estoy usando una combinación de ejercicios y problemas para hacerlo. Los ejercicios me ayudan a ver patrones y a sentirme cómodo con los conceptos y la sintaxis.

Aquí hay un ejemplo de un ejercicio de un proyecto que me pidió que escribiera una función, que tomó una serie de autos.

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 }, ... ] 

Tuve que ordenar la matriz de objetos por car_modelclave, en orden ascendente.

No quiere decir que este ejercicio fue muy sencillo, no lo fue. Me tomó tiempo y recibí una buena cantidad de mensajes de error.

Sin embargo, califica como un ejercicio porque sabía lo que tenía que hacer desde el principio.

Recientemente aprendí sobre matrices en JavaScript. Estaba familiarizado con la clasificación de datos por mi experiencia con Python, aunque tuve que investigar cómo hacerlo en JavaScript. Las instrucciones explícitas también ayudaron.

Pero los conceptos aún eran nuevos. Necesitaba practicar para ponerlos juntos, por eso este ejercicio fue valioso. La repetición genera familiaridad, y los conceptos comenzaron a solidificarse en mi mente.

Mantenga lo que ha ganado

Los ejercicios también ayudan a mantener actualizada la información aprendida.

Mientras aprendo JavaScript, no quiero olvidar todo lo que aprendí sobre el primer idioma que aprendí, Python. Entonces uso Anki, un programa de tarjetas, varias veces al día.

En este contexto, los ejercicios le ayudarán a mantener en orden una montaña de material, le recordarán conceptos importantes y le ayudarán a sentirse más cómodo utilizando una estructura o enfoque de datos en particular. Es un trabajo de mantenimiento del conjunto de conocimientos que ha adquirido hasta ahora.

Tengo más de 1,000 tarjetas llenas de material que he visto muchas veces antes. Algunas tarjetas tienen preguntas sobre la sintaxis. Otros me piden que escriba consultas SQL o comandos de línea de comandos o Git. Muchos otros están llenos de ejercicios, como "rotar una lista de números a la derecha por un valor posicional".

Es importante señalar que este ejercicio fue una vez un problema para mí. Si haces un problema lo suficiente, puede convertirse en un ejercicio. Al mismo tiempo, puede convertir un ejercicio en un problema agregando una restricción.

Los ejercicios son una pendiente resbaladiza. Por un lado, son útiles para el aprendizaje. Por otro lado, es fácil sentirse cómodo apegándose exclusivamente a los ejercicios.

Esa es la desventaja: permanecer en su zona de confort.

Hacer frente a la ambigüedad

La programación se trata de resolver problemas. Y la solución de problemas le llevará fuera de su zona de confort. Ésto es una cosa buena.

Para mí, los problemas tienen dos cualidades distintivas. La primera es la ambigüedad. La resolución de problemas se trata en gran medida de cómo lidiar con la ambigüedad de manera efectiva.

  • Aparece un mensaje de error cada vez que se ejecuta su programa. ¿Por qué? ¿Que esta pasando? ¿Dónde está el error? ¿Cómo puedes arreglarlo?
  • Saca una nueva declaración de problema. Lo lees y lo relees. A primera vista, no tiene idea de lo que está sucediendo, y mucho menos de lo que necesita hacer para resolverlo. Incluso puede tener la sensación de "ciervo en los faros" que va acompañada de un hoyo en la parte inferior de su estómago. (¡Escogiste un buen problema!)
  • Necesita aprender sobre bases de datos relacionales. Eso es bastante amplio. ¿Cómo lo vas a hacer? ¿En qué concentrarse primero? ¿Lo que más importa? ¿Qué es lo que realmente necesita saber ahora mismo ?

Todos estos ejemplos implican ambigüedad. Y todos ellos requieren resolver problemas , ya sea encontrar y solucionar un error, resolver un problema real o aprender un nuevo tema.  

Para progresar, investiga, experimenta, extrae los hechos, crea un plan y aplica una variedad de tácticas de resolución de problemas. En resumen, aprendes a resolverlo. Cuanto más tiempo pases con un problema y las diferentes perspectivas que ganes, más capas revelará y más te acercarás al momento "ajá".

Abraza la lucha

La otra diferencia con los problemas es la lucha. Es real.

La resolución de problemas pondrá a prueba su resistencia mental y su paciencia. El progreso puede ser lento y el proceso tedioso. Me he esforzado en resolver problemas durante horas, días e incluso semanas.

No quiere decir que los ejercicios no te desafíen. Ellos pueden. Una cosa es cuando sabes que necesitas usar un método en particular; solo necesita que funcione correctamente. Eso es un desafío, que a veces puede ser francamente frustrante.

Pero es algo completamente diferente cuando no tiene idea de qué hacer desde el principio, lo que puede suceder varias veces al resolver un problema. Para mí, los problemas son una lucha.

La mejor solución es soportarlo y despegarte. En mi experiencia, la lucha significa que estoy aprendiendo mucho y el avance suele estar a la vuelta de la esquina.

A medida que supere la incomodidad mental, se encontrará pensando de manera creativa e ideando soluciones que nunca antes había pensado. (Se sorprende e impresiona a sí mismo, ¡sabe más de lo que piensa!) Se está convirtiendo en un programador más fuerte.

Incluso te encontrarás divirtiéndote. La resolución de problemas es un desafío, sin duda, e incluso frustrante a veces. Pero también es increíblemente gratificante.

Es como cruzar la línea de meta de una media maratón. Sin duda las últimas 13,1 millas fueron agotadoras, pero cruzar la línea de meta valió la pena y lo volvería a hacer. Resolver un problema se siente de la misma manera.

¿Qué es: problemas o ejercicios?

Cuando abras tu computadora portátil, ¿vas a resolver problemas o completar ejercicios?  

Los ejercicios tienen beneficios y está bien incorporarlos a sus sesiones de programación. Utilizo los ejercicios como calentamiento antes de una sesión de programación. Hojearé una baraja de tarjetas didácticas de Anki durante diez o quince minutos y trabajaré en algunos ejercicios. Si estoy aprendiendo algo nuevo, como JavaScript, es posible que tenga una sesión de programación completa dedicada a ejercicios.

Sin embargo, dedico tiempo cada día a resolver problemas, sin importar qué más esté aprendiendo o construyendo. Incluso en los días en que dedico una gran cantidad de tiempo a los ejercicios, también dedico mucho tiempo a la resolución de problemas.  

Entonces, cuando esté a punto de comenzar una sesión de programación, tenga en cuenta lo que se propone hacer: ejercicios o problemas. Y pase lo que pase, tómese un tiempo para resolver problemas.

La resolución de problemas es una habilidad que requiere mucha práctica y tiempo para desarrollarse. La única forma de mejorar es trabajar en ello todos los días. Es así de importante y por una buena razón.

Resolvemos problemas todos los días como programadores y de diversas formas. Hacer tiempo para resolver problemas es una obviedad; nuestro trabajo como programadores depende de ello.

Escribo sobre aprender a programar y las mejores formas de hacerlo (amymhaddad.com).