Temario


Un track de Exercism completo tiene dos tipos de ejercicios: ejercicios de concepto y ejercicios de práctica. Son fundamentalmente distintos y se complementan muy bien.

Los ejercicios de concepto de un track son ejercicios diseñados para enseñar conceptos individuales que forman la base de un lenguaje de programación específico. Estos conceptos forman un temario.

Esta documentación contiene indicaciones y consejos sobre cómo diseñar con éxito un temario para tu track.

El objetivo de un temario

El objetivo final de un temario es llevar a los estudiantes a leer y escribir con comodidad código idiomático en el lenguaje de destino.

Cada ejercicio de concepto está muy enfocado. Es un paso pequeño y muy específico que acerca al estudiante a entender algo sobre el lenguaje. Solo se apoya en conceptos que ya se presentaron antes.

Al resolver el ejercicio, el estudiante empieza el proceso de familiarizarse con el concepto. La comprensión llega sobre todo haciendo, mucho más que con explicaciones. El contenido explicativo está ahí para presentar al estudiante las ideas que necesita para resolver el ejercicio (de ahí la elección del nombre del archivo: «introduction.md»).

Queremos permitir que los estudiantes empiecen a escribir código de inmediato, sin tener que entenderlo todo de antemano. Para lograrlo, pasamos por alto detalles y dejamos muchas cosas sin explicar. Simplificamos y damos esqueletos de código siempre que es posible. Esto reduce la carga cognitiva de empezar y da tiempo y espacio para que el conocimiento se asiente. Con este enfoque no decimos que el estudiante no necesite saber esas cosas, decimos que no las necesita saber todavía.

A menudo los primeros ejercicios deben contener código no idiomático. Esto se debe a que al principio el estudiante aún desconoce la mayor parte del lenguaje y la mayoría de los conceptos todavía no se han presentado. Al permitir código no idiomático en los primeros ejercicios, los estudiantes pueden dar muchos pasos pequeños por terreno conocido en lugar de unos pocos pasos grandes por terreno desconocido. El resultado es que llegan antes a la etapa del código idiomático y con menos fricción.

Estructura básica

Los ejercicios se organizan como un árbol, con un ejercicio introductorio en la cima como punto de partida. Los ejercicios posteriores enseñan conceptos que dependen de haber entendido conceptos que se enseñan antes.

Portar y tomar prestado

Puede valer la pena ver cómo otros tracks de lenguajes han desarrollado sus ejercicios de concepto. Puedes encontrar ejemplos de ejercicios de concepto de otros tracks de lenguajes aquí.

Dicho esto, si decides usar otros ejercicios como punto de partida para los tuyos, asegúrate de que el ejercicio resultante trate sobre el concepto tal como existe en tu lenguaje. A veces los conceptos difieren sutilmente, a veces de forma radical. A veces los conceptos no existen en absoluto en otros lenguajes.

El temario, y por lo tanto el árbol de conceptos, debe representar los conceptos que existen en este lenguaje específico.

No incluyas conceptos solo porque otros tracks lo hagan.

En algunos casos puede ser tentador incluir un concepto porque la gente a menudo tiene que sortearlo usando conceptos que sí existen. En vez de hacer eso, presenta el concepto que el lenguaje sí usa y considera agregar un ejercicio que explique cómo usarlo en ese tipo de situación.

Por ejemplo, en Go no hay enums. En su lugar, el árbol de conceptos de Go presenta las constantes y enseña a usar constantes en el tipo de situación en la que usarías enums en otros lenguajes.

Pedir ayuda

No dudes en pedir ayuda. Es mejor preguntar de antemano o mientras trabajas en un ejercicio que discutirlo durante la revisión de código.

En GitHub puedes mencionar al equipo @exercism/learning-mode. En el foro de Exercism, abre un issue en la categoría Exercism Support.

Primeros pasos

Nuestra experiencia nos ha enseñado que la forma más pragmática de desarrollar un temario es hacer crecer el árbol de conceptos de forma orgánica, empezando por los conceptos más sencillos. No tenemos que diseñarlo todo de antemano y, de hecho, en general es útil no pensar demasiado a futuro.

Empezamos con el mínimo de conceptos, los más fundamentales para escribir cualquier cosa en el lenguaje. También tratamos de empezar con los conceptos que resultan más familiares para el desarrollador promedio. Lo familiar es bueno. Lo familiar no confunde.

Recuerda que, aunque la meta es escribir código idiomático, los peldaños para llegar ahí no siempre son idiomáticos. Usar lo familiar, aunque no sea un gran ejemplo de código en ese lenguaje, ayuda a que el estudiante avance más rápido hacia la meta de un código más típico del lenguaje.

Desarrollar el primer ejercicio

En lugar de intentar trazar todo el árbol de conceptos de antemano, empieza solo con el primer ejercicio. El objetivo del primer ejercicio es permitir que el estudiante empiece a aprender con la menor fricción posible. Está dando el primerísimo paso para familiarizarse con cómo se ve el código en este lenguaje. Puede que escriba un pequeño fragmento de código o quizá solo un par de agregados a un esqueleto para completar el ejercicio. Los estudiantes ya resolvieron «Hello, World!» para acceder a este ejercicio. Pero en «Hello, World!» solo están cambiando el texto. Puede que toda la sintaxis del lenguaje les siga resultando desconocida. Trata de optimizar para un logro rápido y para que los estudiantes se familiaricen lo suficiente con lo mínimo de sintaxis como para seguir avanzando con confianza.

Lee más sobre desarrollar el primer ejercicio.

Los siguientes ejercicios

El primer ejercicio debería desbloquear un puñado de ejercicios que presenten conceptos fundamentales. Serán cosas como primitivos o tipos básicos y operaciones simples sobre esos tipos.

Lee más sobre desarrollar los siguientes ejercicios.

¿Y después qué?

Aquí es donde a menudo empieza a ponerse interesante. Hay muchísimo que podrías presentar en este punto. ¿Cómo decides qué conceptos abordar después?

En realidad da casi igual. Mientras empieces por algún punto que parezca razonable, va a estar bien.

Lee más sobre lo que consideramos «razonable» en el contexto de expandir el árbol de conceptos.

No conviertas ejercicios de práctica

Un buen ejercicio de concepto está muy enfocado y, idealmente, enseña un solo concepto. Por lo general habrá una única forma esperada de resolverlo. Esto contrasta con los ejercicios de práctica, que son abiertos y se prestan a la exploración.

Un buen ejercicio de concepto suele ser un mal ejercicio de práctica, y viceversa. Como los objetivos de los ejercicios de práctica y de los ejercicios de concepto son completamente distintos, no tomamos ejercicios de práctica ni los convertimos en ejercicios de concepto. Escribimos todos los ejercicios de concepto desde cero o los basamos en historias creadas expresamente para enseñar conceptos simples.

Alentamos a pasar por alto detalles

A veces vas a sentir que hay un bloqueo. El concepto A requiere entender el concepto B, y el B requiere entender el A.

En ese caso, simplifica. Pasa por alto algo de complejidad en uno para que puedas familiarizar a los estudiantes con el otro. Está perfectamente bien decir que algo se presentará con más profundidad más adelante y que, por ahora, el estudiante solo necesita entender ese pedacito.

Los conceptos se entienden más a fondo por etapas y con el tiempo.

Seleccionar historias

Un ejercicio de concepto siempre tiene una historia.

Si estás haciendo un fork de un ejercicio de otro track, el ejercicio ya tendrá una historia. En ese caso, ya está.

Para ver si hay historias existentes que puedas usar o ejercicios que puedas bifurcar, mira la lista de historias.

Si tienes un concepto pero no una historia, nuestra recomendación es escribir un ejemplo de código pequeño y simple que use el concepto que estás presentando. Luego haz ingeniería inversa para armar una historia a partir del código. Mantén la historia increíblemente simple. No tiene que ser buena ficción. No necesita una trama fuerte ni desarrollo de personajes. Puede tener solo un par de líneas.

Comparte tus ideas para historias con el equipo de Exercism. Tenemos mucha experiencia creando historias adecuadas.

Una vez que tengas una historia, probablemente necesites ajustar un poco el código para que encaje con la historia.

Aportes de la comunidad

Trabajar en un temario implica dos actividades separadas pero entrelazadas:

  1. Diseño del temario: seleccionar y ordenar conceptos
  2. Implementación de ejercicios: escribir documentación y crear ejercicios para enseñar esos conceptos

Hemos visto que es divertido y enriquecedor lograr que la comunidad en general contribuya a implementar ejercicios. El diseño del temario en sí, en cambio, es más fácil de abordar con un equipo pequeño de colaboradores que estén todos involucrados en construir una comprensión del temario completo con todas sus complejidades.

Dicho esto, recomendamos que el equipo de diseño del temario implemente primero los primeros cinco o seis conceptos, antes de abrirse a los aportes de la comunidad. Esto ayuda a asegurar que las personas del equipo central de diseñadores del temario entiendan el proceso por sí mismas antes de tener que revisar pull requests de personas de la comunidad en general.

También es más fácil crear issues para estos conceptos de orden superior y suele ser más divertido para los miembros de la comunidad trabajar en ellos, ya que hay menos restricciones de las que preocuparse.

Crear issues

Todavía no hemos descubierto cuál es la mejor manera de crear issues para crear ejercicios de concepto.

En algunos tracks hemos probado crear ejercicios separados para el concepto en sí y para el ejercicio. En otros, hemos probado crear issues que incluyen una lista de verificación para ir avanzando. En general, creemos que esto sigue siendo demasiado intimidante y nos gustaría encontrar una mejor manera.

Por favor, habla con nosotros sobre el proceso cuando empieces a crear issues, y haremos lo posible por ayudarte a determinar cómo proceder.

Actualizaremos la documentación a medida que aprendamos mejores formas de abordar esto.