¿Es la habilidad para resolver problemas la habilidad 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 enfocan en esa habilidad?

Las habilidades para resolver problemas son muy importantes para la programación. Tenga en cuenta que las habilidades de resolución de problemas no son las mismas que, por ejemplo, los rompecabezas de Sudoku de trabajo o los enigmas de trabajo. La resolución de problemas es lo que lo lleva a partir de “Algo está mal, pero no estoy seguro de qué” y “OK, todo está funcionando ahora”.

Las habilidades de resolución de problemas son especialmente necesarias cuando se depura. Brian Kernighan señala que la depuración es al menos el doble de difícil que la programación. ¿Y qué haces mientras depuras? Resolución de 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 de 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. Por lo general, aprendes estrategias para resolver problemas haciendo, y ningún curso va a hacer cosas por ti . Tienes que resolver problemas tú mismo.

Ahora, algunos dicen que las habilidades de resolución de problemas no se pueden enseñar. Estoy en desacuerdo. 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 de esa manera, seguro. Pero hay mucha sutileza más allá de eso.

Esas sutilezas se pueden recoger a lo largo del tiempo, en contexto. Aquí es donde un buen mentor puede enseñarte bastante. Si estás atascado en un problema, pero tienes un buen mentor, pueden empujar tu proceso de pensamiento en la dirección correcta para que aún puedas resolver el problema. Esa es su señal de prestar atención a (a) cómo se atascó, y (b) qué información le dejó despegado. Si aprendes de eso, felicidades, has aumentado tus habilidades para resolver problemas. Ahora lavar, enjuagar, repetir.

Mi título es en Ingeniería Eléctrica. Al obtener mi licenciatura, tuve un total de 9 semestres de cursos de laboratorio. 5 laboratorios de EE, y 4 laboratorios de ciencias. Los cursos de EE fueron 2 horas de crédito cada uno si recuerdo correctamente; los laboratorios de ciencias contaron con 1 hora de crédito cada uno encima del 3CR para la conferencia. Entonces, más del 10% de mis horas de crédito provino de laboratorios.

¿Y qué te enseñan los laboratorios? Aparentemente, ayudan a reforzar el material al hacer que implementes un experimento o proyecto que emplea los principios. Pero, a menos que tenga una suerte extraordinaria, pasará una cantidad significativa de tiempo descubriendo por qué la teoría no coincide con la práctica. Ahí es donde realmente puede perfeccionar sus habilidades de resolución de problemas, a menudo aprendiendo de los TA en el laboratorio que estaban allí hace poco.

En programación, no es diferente, aparte de más código, menos cables. Necesitas programar. Necesitas pasar por encima de tu cabeza y aprender cómo volver sobre el agua y nadar de regreso a la orilla.

Porque están tratando de enseñarte cosas específicas, no de programación en general.

También la resolución de problemas significa diferentes cosas para diferentes personas. La resolución de problemas en el mundo real es muy diferente que en un algoritmo de vacío.

Es saber cómo hacer cosas de Google, cómo escanear documentos, cuándo pedir ayuda, cómo entender las bases de códigos, etc.

Tienes que resolverlo por ti mismo. Aprende una versión holística de la resolución de problemas con solo abordar problemas del mundo real. No creo que haya una manera clara de enseñarlo paso a paso.

La resolución de problemas es, sin duda, una de las habilidades más importantes para los programadores; Otras habilidades como escribir código eficiente, comunicación efectiva, trabajar con un equipo (y muchos otros) también son muy importantes. Es imposible decir que cualquier habilidad es la MÁS importante.

Los libros de programación enseñan a resolver problemas. Desafortunadamente, hay limitaciones en lo que realmente se puede enseñar. Como han señalado otros, se aprende principalmente a través de la experiencia.

Por ejemplo, un curso de algoritmos introductorios dedicará mucho tiempo a la clasificación de algoritmos. Ahora, en la programación de la “vida real”, puede simplemente llamar a un método de clasificación y no tiene que preocuparse por todos los detalles de implementación enseñados en algoritmos, por lo que en la superficie parece un ejercicio trivial.

El objetivo de toda la discusión es hacer que los alumnos vean el proceso de resolución de problemas en acción. Diseñar un algoritmo de clasificación es un ejemplo básico de un “problema” que necesita ser “resuelto”. Comprender cómo implementar diferentes algoritmos y seleccionar la mejor estrategia para clasificar lo ayuda a aprender cómo resolver problemas de una manera muy rudimentaria. Un examen cuidadoso de lo que se cubre en este tipo de análisis mejorará su proceso de resolución de problemas. Desafortunadamente, la mayoría de los estudiantes simplemente aprenden los algoritmos y completan los ejercicios, y no profundizan más que eso.

Parte de la razón por la que parece que la resolución de problemas no se enseña es que los libros de programación le dan las respuestas. No sería una herramienta muy útil si el libro simplemente sugiriera el problema y sus limitaciones sin dar la solución. Entonces, hay un problema, luego está la solución, a menudo acompañada por el proceso de pensamiento detrás de la solución que es el proceso de resolución de problemas.

Si acabas de leer el libro e implementar la solución, no estás aprendiendo a resolver el problema. Un método más efectivo es leer el problema, luego cerrar el libro e intentar encontrar una solución. Después de crear una solución por su cuenta, regrese y compare sus resultados con lo que está escrito en el libro. Entonces aprendes a resolver problemas.

En un salón de clases, hay una mayor limitación de tiempo: simplemente no hay suficiente tiempo en la clase para cubrir el material requerido mientras se permite que cada estudiante resuelva los problemas por sí mismo. Los instructores realmente excelentes pueden obtener el proceso de resolución de problemas de sus estudiantes incluso dentro de las limitaciones de tiempo, pero esto a menudo hace que algunos estudiantes obtengan todas las respuestas, mientras que otros luchan por mantenerse al día.

Tuve la suerte de tener a uno de esos excelentes instructores al principio de mi educación y de ser uno de los estudiantes que podría seguir el proceso de resolución de problemas durante las discusiones en clase. Después de esa experiencia, pude “obtener” los conceptos de resolución de problemas en otras clases que no tenían tan buenos instructores.

La resolución de problemas es realmente un proceso autodirigido. Requiere curiosidad, flexibilidad, observación y análisis cuidadosos, y un marco conceptual que crece lentamente con el tiempo. De esas cosas, la única que se puede enseñar es el marco conceptual, de modo que es lo que proporcionan los libros y las clases. El resto depende de usted.

No, no es. La habilidad número uno que necesita un programador es la capacidad de organizar un proceso y presentarlo. El mejor indicador del potencial de alguien para ser programador es si esa persona puede escribir un buen párrafo.

No me refiero a la calidad literaria ni a la creación de ficción, pero ¿puede una persona escribir un buen párrafo expositivo? La capacidad de escribir un párrafo se relaciona exactamente con la escritura de una buena función / procedimiento / método. ¿Puede uno nombrar la función es lo mismo que escribir la oración del tema? ¿Se puede escribir las oraciones explicativas, manteniéndose exactamente en el tema, y ​​al mismo nivel de detalle o nivel de abstracción es lo mismo que escribir el cuerpo de la función? ¿Se sabe cómo concluir el párrafo / función?

Si sabes cómo explicar algo, puedes escribir una función. En un lenguaje de programación. Componer párrafos en un ensayo es como diseñar una clase o un módulo. Solo necesita aprender la sintaxis de su lenguaje de programación para expresar su código de la misma manera que necesita saber la gramática para escribir oraciones adecuadas.

El aspecto más importante del código de trabajo es cuán legible y comprensible es para otros programadores. El código se lee mucho más a menudo de lo que está escrito. A una computadora no le importa cuán malo sea el código, pero cualquiera (incluido el autor) se preocupará profundamente por su calidad cuando tenga que resolverlo después del hecho. El tiempo del globo ocular humano es costoso, por lo que es importante que el código se escriba, desde el primer día, de una manera que maximice su comprensión. Cualquier otro atributo es menos importante en la implementación inicial.

Hasta cierto punto, sí. Pero esa no es la única habilidad. Dicho esto, sin embargo, la resolución de problemas no se le puede enseñar. Es una habilidad que adquirirá durante un período de tiempo a través de la práctica.

El 100% de los libros de programación enseñan habilidades para resolver problemas.

Si un libro parece ser uno de programación, pero no se enfoca en esa habilidad, es tan bueno como el papel higiénico. No, el papel del toiler es más suave.