¿Cuál es una forma efectiva de enseñar los aspectos creativos de la programación?

Tantas buenas preguntas en una, realmente debería separarse en varias preguntas. Sin embargo, dadas sus preguntas, en realidad no veo que el problema sea uno con los aspectos ‘creativos’ de la programación. Son saltos cognitivos que él no ha hecho, y en realidad son procesos bastante algorítmicos y ‘aburridos’. Si me equivoco, puedes saltarte el resto de esta larga respuesta.

En primer lugar, no tocaría los diseños arquitectónicos reales hasta que comprenda los conceptos básicos de encapsulación y abstracción. MVC es un buen ejemplo de por qué abstraemos y encapsulamos, pero, en realidad, solo a gran escala con mecanismos más complejos como la generalización y el polimorfismo. Hasta que comprenda los conceptos, le será muy difícil comprender MVC en código. Sin embargo, podría intentar algo como MVC sin código. Como ejemplo, uso habitualmente la analogía del cuerpo humano para ilustrar MVC sin dar código: cerebro (modelo), músculos (controlador), expresión física (vista). Me gusta relacionar construcciones de programación con tangibles y luego mover el concepto a la programación. Acelerar la programación no es algo que recomiendo si desea que comprenda los conceptos que se aplican a medida que se aplican (en lugar de después de que se apliquen). La programación ayuda a solidificar las ‘reglas’ del entorno, pero realmente no lo veo como una presentación increíble.

En segundo lugar, su comportamiento de escribir condicionales en lugar de un bucle es común para los estudiantes que no han comprendido la idea de la abstracción. Es posible que desee dar un paso atrás y hacer que el alumno (de ahora en adelante lo llamo ‘Bob’) simplemente verifique que comprende el concepto. La noción de que una variable oculta el valor de un literal y que el valor del literal podría cambiar antes de que vuelva a mirar es un salto cognitivo (piense en los bebés que juegan al escondite, es el mismo concepto): generalmente uso cartas y un juego de manos humorístico para ilustrar este punto.

Una vez que ‘Bob’ comprende el concepto de abstracción, entonces paso a la fase de reconocimiento de patrones. El concepto de escribir declaraciones, ver el patrón y aplicar la abstracción para reducir la reutilización del código (en realidad es casi algorítmico); vea a continuación un ejemplo. Después de eso, se trata de encontrar problemas que demuestren el poder y la flexibilidad de un bucle en muchos condicionales (los arreglos son ideales para esto). Cuando enseño Java, uso un juego de mesa mundano por turnos (Tic-Tac-Toe, Connect Four, Othello, etc.). Haga que ‘Bob’ comience con el escenario base, luego expanda (entonces, NxN Tic-Tac-Toe). Obtenga ‘Bob’ para crear una aplicación para la que esté motivado.

Reconocimiento de patrones:
1. Escribe declaraciones
if (opción == 1) {add = 1; }
if (opción == 2) {add = 3; }
if (opción == 3) {add = 6; }

2. Encuentra lo que es * exactamente * lo mismo
if (opción == ??) {add = ??; }

3. Para cada signo de interrogación, hacemos una variable y comenzamos la variable como el primer valor que usamos en el patrón. Si lo que está cambiando es un nombre de variable, entonces hacemos matrices (simplemente no está en este ejemplo).
int c = 1;
int d = 1;

4. Luego rodeamos el “mismo” código con un bucle sin completar la expresión booleana.
int c = 1;
int d = 1;
mientras( ?? ) {
if (opción == ??) {add = ??; }
}

5. Ahora, descubrimos cómo cambia cada línea en el original (en este ejemplo, c cambia por 1 yd por 2, luego 3). Si el cambio es constante, agregamos la declaración al final del ciclo, de lo contrario rehacemos todo el proceso para el valor cambiante (este proceso llega a la conclusión de que d está cambiando por c).
int c = 1;
int d = 1;
mientras( ?? ) {
if (opción == ??) {add = ??; }
c = c + 1;
d = d + c; // Me salté algunos pasos por brevedad
}

6. Completamos los signos de interrogación para las variables (no la expresión booleana)

if (opción == c) {add = d; }

7. Completamos la expresión booleana observando cuándo se detienen los condicionales originales.
mientras que (c <= 3) {…}