Los pilares principales del aprendizaje de la programación y por qué los principiantes deberían dominarlos.

Llevo más de 20 años programando. Durante ese tiempo, tuve el placer de trabajar con muchas personas, de las que aprendí mucho. También he trabajado con muchos estudiantes recién salidos de la universidad, con los que tuve que asumir el papel de profesor o mentor.

Últimamente, he estado involucrado como entrenador en un programa que enseña codificación a principiantes absolutos.

Aprender a programar es difícil. A menudo encuentro que los cursos universitarios y los bootcamps pasan por alto aspectos importantes de la programación y adoptan enfoques deficientes para enseñar a los novatos.

Quiero compartir los cinco pilares básicos que creo que deben basarse en un curso de programación exitoso. Como siempre, me dirijo al contexto de las aplicaciones web convencionales.

El objetivo de un novato es dominar los fundamentos de la programación y comprender la importancia de las bibliotecas y los marcos.

Los temas avanzados como la nube, las operaciones en general o las herramientas de compilación no deben formar parte del plan de estudios. También soy escéptico cuando se trata de patrones de diseño. Suponen una experiencia que los principiantes nunca tienen.

Así que veamos dónde deberían comenzar los nuevos programadores.

Desarrollo basado en pruebas (TDD)

TDD trae muchos beneficios. Desafortunadamente, es un tema avanzado para el que los principiantes no están completamente preparados.

Los principiantes no deberían escribir exámenes. Esto sería demasiado para sus niveles básicos de habilidad. En su lugar, deben aprender a usar y trabajar con pruebas.

Cada curso de programación debe centrarse en ejercicios. Amplío mis ejercicios con pruebas unitarias y proporciono a los estudiantes un entorno que ya está configurado para ejecutar esas pruebas.

Todo lo que los estudiantes tienen que hacer es escribir su código y luego ver las luces del testrunner cambiar de rojo a verde. La gamificación resultante es un buen efecto secundario.

Por ejemplo: si la tecnología seleccionada es Spring, proporciono los ejercicios y pruebas dentro de un proyecto Spring. Los estudiantes no necesitan saber nada sobre Spring. Todo lo que necesitan saber es la ubicación de los ejercicios y el botón para activar las pruebas.

Además, los estudiantes deben saber cómo usar un depurador y tener a mano un bucle de lectura-evaluación-impresión (REPL). La capacidad de analizar código durante el tiempo de ejecución y tener un patio de juegos para pequeños experimentos es esencial en TDD.

El punto principal es garantizar que los estudiantes no tengan que aprender comportamientos TDD básicos después de haber adquirido las habilidades básicas de programación. Cambiar los hábitos más adelante en la carrera de los estudiantes será mucho más difícil que aprender esos hábitos ahora. Es por eso que deben realizar pruebas de unidad de vida y aliento desde el principio.

Más adelante en su vida profesional, deberían tener antipatía por los proyectos sin pruebas unitarias. Deberían ver intuitivamente la ausencia de pruebas unitarias como anti-patrón.

Fundamentos primero

Escucho muy a menudo que los novatos deberían comenzar inmediatamente con un marco. Es como enseñar a las personas a conducir colocándolas en un coche de rally y pidiéndoles que eviten el sobreviraje. Esto simplemente ignora el hecho de que todavía confunden el freno con el acelerador.

Lo mismo se aplica cuando iniciamos a los estudiantes con un marco como Angular. Los principiantes deben comprender primero los fundamentos de la programación. Deben estar familiarizados con los elementos básicos y lo que significa escribir código antes de poder usar el de otra persona.

El concepto de función, variable, condición y bucle es completamente ajeno a los principiantes. Estos cuatro elementos sientan las bases de la programación. Todo lo que hace un programa depende de ellos.

Los estudiantes están escuchando estos conceptos por primera vez, pero es de suma importancia que los estudiantes se familiaricen con ellos. Si los estudiantes no dominan los fundamentos, todo lo que sigue parece mágico y conduce a la confusión y la frustración.

Los profesores deberían dedicar más tiempo a estos fundamentos. Pero, lamentablemente, muchos avanzan demasiado rápido. El problema es que algunos profesores luchan por ponerse en el papel de estudiantes. Han estado programando durante años y han olvidado los tipos de problemas con los que tiene que lidiar un principiante. Es bastante similar a un piloto de rally profesional. No puede imaginar que alguien necesite pensar antes de frenar. Simplemente lo hace automáticamente.

Diseño mis ejercicios para que sean desafiantes pero que se puedan resolver en un período de tiempo razonable utilizando una combinación de los cuatro elementos principales.

Un buen ejemplo es un conversor de números árabes y romanos. Este desafío requiere paciencia por parte de los estudiantes. Una vez que aplican con éxito los cuatro elementos para resolver el desafío, también obtienen un gran impulso en la motivación.

Los fundamentos son importantes. No sigas adelante hasta que se hayan resuelto.

Bibliotecas y marcos

Después de que los estudiantes pasen mucho tiempo codificando, deben aprender que la mayor parte del código ya existe en forma de biblioteca o marco. Esto es más una forma de pensar que un patrón.

Como he escrito antes: los desarrolladores modernos conocen y eligen la biblioteca adecuada. No pasan horas escribiendo una versión con errores por su cuenta.

Para que esa transición de mentalidad sea un éxito, los ejemplos de la "fase de los fundamentos" deben poder resolverse mediante el uso de bibliotecas conocidas como Moment.js, Jackson, Lodash o Apache Commons.

De esta manera, los estudiantes comprenderán de inmediato el valor de las bibliotecas. Hicieron crujir sus cabezas en torno a esos complicados problemas. Ahora descubren que una biblioteca resuelve el ejercicio en poco tiempo.

Al igual que TDD, los estudiantes deberían sospechar cuando sus colegas se jactan de su biblioteca de administración de estado hecha por ellos mismos que hace que Redux sea innecesario.

Cuando se trata de marcos, los estudiantes no tendrán problemas para comprender la importancia una vez que comprendan la utilidad de las bibliotecas.

Dependiendo del plazo del curso, puede ser difícil dedicar tiempo a los marcos. Pero como ya señalé, el aspecto más importante es cambiar la mentalidad del estudiante de programar todo desde cero a explorar y usar bibliotecas.

No agregué herramientas a este pilar, ya que solo son útiles para desarrolladores experimentados. En esta etapa inicial, los estudiantes no necesitan aprender a integrar y configurar herramientas.

Maestro y aprendiz

Cuando tenía 20 años quería aprender a tocar el piano. No quería un maestro y pensé que podría aprenderlo por mi cuenta. Cinco años después, consulté a un tutor profesional. ¿Bien, qué puedo decir? He aprendido más en 1 mes que durante los cinco años anteriores.

Mi profesor de piano señaló errores en mi interpretación que no podía oír y me hizo consciente de cosas interpretativas que nunca hubiera imaginado. Después de todo, ella me inculcó la mentalidad para la música y el arte, los cuales estaban fuera de mi alcance como técnico.

Lo mismo ocurre en la programación. Si alguien no tiene experiencia en programación, entonces el autoestudio puede ser una mala idea. Aunque hay muchas historias de éxito, dudo de la eficacia de hacerlo solo.

En cambio, debería haber una relación de "maestro y aprendiz". Al principio, el maestro da reglas que el aprendiz debe seguir, ¡a ciegas! El maestro puede explicar las reglas, pero generalmente el razonamiento está más allá de la comprensión del aprendiz.

Estas reglas internalizadas forman una especie de red de seguridad. Si uno se pierde, siempre tiene un terreno seguro al que regresar.

La enseñanza no debe ser un monólogo. El maestro tiene que tratar con cada alumno de forma individual. Debe comprobar cómo trabajan los alumnos, dar consejos y adaptar la velocidad del curso a su progreso.

Una vez que los aprendices alcanzan un cierto nivel de dominio, se les debe animar a explorar nuevos territorios. El maestro se convierte en un mentor que comparte la "sabiduría" y está abierto a las discusiones.

Desafío y motivación

"¡Creemos un clon de Facebook!" Esto no proviene de un CEO respaldado por una horda de desarrolladores de software senior y un presupuesto de varios millones de euros. Es un ejercicio de un curso introductorio para programadores. Tal empresa es virtualmente imposible. Peor aún, los estudiantes son llevados al país de las maravillas y engañados al creer que tienen habilidades que están realmente más allá de su alcance.

Sin duda el profesor es consciente de eso, pero crea este tipo de ejercicios por motivos de motivación.

El objetivo principal de un ejercicio no es entretener. Debe crearse en torno a una técnica en particular y debe ayudar a los estudiantes a comprender esa técnica.

La motivación es buena, pero no sacrifica el contenido. Programar no es fácil. Si los estudiantes no tienen una motivación intrínseca, la codificación podría no ser el camino a seguir.

Los novatos deben experimentar lo que significa ser un desarrollador profesional. Deben saber lo que les espera antes de invertir muchas horas.

Por ejemplo, muchas aplicaciones empresariales se centran en cuadrículas y formularios complejos. Crear estos es una habilidad importante que los ejercicios pueden impartir. Crear una aplicación similar a Facebook podría no ser la mejor lección para que los estudiantes aprendan de inmediato.

De manera similar, un no programador podría sorprenderse de las pocas líneas de código que un desarrollador escribe por día. Incluso hay ocasiones en las que eliminamos código o no logramos nada.

¿Por qué? Porque las cosas van mal todo el tiempo. Pasamos horas interminables arreglando algunos errores extremadamente extraños que resultan ser un simple error tipográfico. Es posible que alguna herramienta no funcione solo porque una biblioteca obtuvo una actualización de versión menor. O el sistema falla porque alguien olvidó agregar un archivo a git. La lista puede seguir y seguir.

Los estudiantes deben disfrutar de estas experiencias. Un ejercicio dirigido a una biblioteca desconocida bajo presión de tiempo podría ser exactamente lo correcto. ;)

El sol no siempre brilla en la vida real. Los principiantes deben estar bien preparados para la realidad de la programación.

Asesoramiento final

Por último, pero no menos importante: uno no puede convertirse en programador profesional en dos semanas, dos meses o incluso un año. Se necesita tiempo y paciencia.

Los instructores no deben apresurarse ni hacer falsas promesas. Deben centrarse en si los estudiantes comprenden los conceptos y no avanzar demasiado rápido.

Publicado originalmente en www.rainerhahnekamp.com el 10 de junio de 2018.