¿Cuáles son los “conceptos difíciles” más comunes que se deben entender al aprender a programar?

He pasado mucho tiempo enseñando a los nuevos programadores las cuerdas, tanto en el contexto académico como en la industria. Así que esto viene principalmente de esa experiencia.

El mayor problema inicial es entender la ejecución procesal. Comprender la ejecución de los procedimientos parece realmente simple: un programa simplemente ejecuta los pasos que le dices y nada más. No hay supervisión racional, solo ejecución. Cuando ‘simula un programa en su cabeza’, los nuevos programadores no limitan la ejecución a lo que está allí, sino el contexto de fondo de lo que están tratando de hacer, que no se expresa como un código.

Creo que esta es la razón por la que los cursos de programación le dan problemas en los que rastrea la ejecución de un programa sin un significado claro (por ejemplo, int * magicfoo = y algún otroVarVar) porque todo tiene un significado limitado, no intenta imponer sus expectativas sobre lo que programa está tratando de hacer

También creo que esta es la razón por la que el aprendizaje de código codificado en términos de jugar un videojuego tiene mucho sentido. La mayoría de los jugadores, entiendan que un juego ejecuta sus comandos a ciegas.

Más allá de eso, creo que el problema mucho más grande que obstaculiza a los programadores nuevos y a los más antiguos es una gran comprensión de la abstracción: cómo diseñarlos y construirlos, y dónde son apropiados. Una vez que entienda, la ejecución del procedimiento, los pasos que puede dar están circunscritos y debe construir pasos más ricos a partir de pasos más pequeños.

Gran parte de este problema se debe a que los primeros idiomas que enseñamos a las personas son Java y Python, que no admiten de forma nativa abstracciones. Y a diferencia del pensamiento procedimental, la noción de construir abstracciones no tiene un análogo a otra actividad que nos gusta jugar videojuegos.

Hay problemas más pequeños y específicos, como comprender qué es una variable y el papel que desempeña dentro de una función. Este es un obstáculo importante, pero creo que es algo que se debe a un error en la ejecución de los procedimientos.

Aquí hay algunos principios tomados libremente de las Perlas de Programación de Jon Bentley, Capítulo 1.

Indicar el problema correcto.

“El mayor desafío para cualquier pensador es plantear el problema de una manera que permita una solución”. – Bertrand Russell (filósofo)

Haciendo un diseño simple.

“Un diseñador sabe que ha llegado a la perfección no cuando ya no hay nada que agregar, sino cuando ya no hay nada que quitar”. -Antoine de Saint-Exupéry

Programación de perlas es un gran libro, por cierto.

Quora User tiene razón al mencionar los punteros, pero yo iría un paso más general. Diría que la indirección es el concepto difícil aquí (que es lo que hace que los punteros sean difíciles de entender para los principiantes).

Además, subprocesos / concurrencia en lenguajes de programación con datos mutables.