¿Es la habilidad para resolver problemas la más importante que debe tener un programador? Si es así, ¿por qué la mayoría de los libros de programación de computadoras no se centran en esa habilidad?

Las habilidades de resolución de problemas son muy importantes para la programación. Tenga en cuenta que las habilidades de resolución de problemas no son lo mismo que, por ejemplo, trabajar con rompecabezas Sudoku o trabajar con rompecabezas. La resolución de problemas es lo que te lleva de "Algo va mal pero no estoy seguro de qué" a "Vale, ahora todo funciona".

Las habilidades de resolución de problemas son especialmente necesarias a la hora de depurar. Brian Kernighan señala que depurar es al menos el doble de difícil que programar. ¿Y qué haces mientras depuras? Resolver problemas. Pasas de "Mi programa no funciona y no sé por qué" a "Mi programa funciona correctamente".

Pero aquí está la cuestión: Aparte de algunas técnicas específicas del dominio como el uso de un depurador o aserciones o similares para reducir un error, la resolución de problemas en sí no es una habilidad específica de la programación. Generalmente se aprenden las estrategias de resolución de problemas haciendo, y ningún curso va a hacer las cosas por ti. Tienes que resolver los problemas por ti mismo.

Ahora, algunos dicen que las habilidades de resolución de problemas no pueden ser enseñadas. Yo no estoy de acuerdo. Claro, no se enseñarán en una conferencia con una pizarra y una tarea de un libro de texto. Algunas habilidades, como el razonamiento básico y la deducción, pueden enseñarse así, claro. Pero hay muchas sutilezas más allá de eso.

Esas sutilezas se pueden aprender con el tiempo, en el contexto. Aquí es donde un buen mentor puede enseñarte mucho. Si estás atascado en un problema, pero tienes un buen mentor, puede empujar tu proceso de pensamiento en la dirección correcta y permitirte resolver el problema. Esa es la señal para que prestes atención a (a) cómo te atascaste y (b) qué ideas te hicieron salir del atolladero. Si aprendes de ello, enhorabuena, has aumentado tus habilidades para resolver problemas. Ahora lava, aclara y repite.

Mi licenciatura es en Ingeniería Eléctrica. Mientras obtenía mi licenciatura, tuve un total de 9 semestres de cursos de laboratorio. 5 laboratorios de EE, y 4 laboratorios de ciencias. Los cursos de ingeniería eléctrica tenían 2 horas de crédito cada uno, si no recuerdo mal; los laboratorios de ciencias contaban con 1 hora de crédito cada uno, además de los 3 créditos de las clases. Así que más del 10% de mis horas de crédito provenían de los laboratorios.

¿Y qué te enseñan los laboratorios? Ostensiblemente, ayudan a reforzar el material haciendo que implementes un experimento o proyecto que emplee los principios. Pero, a menos que tengas una suerte extraordinaria, pasarás una cantidad significativa de tiempo averiguando por qué la teoría no coincide con la práctica. Ahí es donde puedes perfeccionar tus habilidades de resolución de problemas, a menudo aprendiendo de los profesores del laboratorio que no hace mucho estaban allí.

En la programación, no es diferente, aparte de más código, menos cables. Hay que programar. Necesitas meterte en la cabeza y aprender a salir a flote y nadar de vuelta a la orilla.