lunes, 19 de octubre de 2015

2. ¡Dame más comandos!

La importancia de empezar por los procedimientos.

 

  Si miramos el enfoque didáctico y el currículum presentado en el post anterior, "¿Por qué es importante Gobstones?", vemos que inmediatamente después de presentar la idea básica de comandos primitivos, secuencias y bloques, el siguiente concepto que se presenta es el de procedimientos (en su forma simple, es decir, sin parámetros). Este es uno de los *pilares fundamentales* del enfoque didáctico Gobstones.

  El concepto de procedimiento es una de las herramientas de abstracción básicas de cualquier lenguaje de programación, y creemos firmemente que un curso inicial de programación que pretende formar el pensamiento abstracto debe comenzar con este concepto como el primero y más importante de los conceptos presentados.

  Un procedimiento es una herramienta del lenguaje que permite que el programador defina nuevos comandos en términos de los anteriores, y de esa manera exprese las subtareas que identificó como parte del planteo de una estrategia de solución para el problema a resolver, *pero en términos del problema* y no en términos de la máquina que lo resuelve y sus comandos primitivos. (Posteriormente en el enfoque didáctico Gobstones se presenta la noción de función, que expresa la misma noción en el mundo de las expresiones).

  En el caso de Gobstones, los comandos primitivos hablan de bolitas (ya tocaremos el tema del universo de discurso en próximos posts), pero la gran mayoría de los problemas que se presentan (todos, con excepción de los primeros ejemplos de introducción) hablan de otros elementos: pueden ser dibujos u otras entidades, tales como piezas de ajedrez, flores, animales, etc., expresados mediante determinadas combinaciones de bolitas. Entonces, en lugar del comando Poner(Rojo) sería interesante contar con el comando PlantarFlor() que abstrae el hecho de que la flor se representa con una bolita roja, y comunica la intención del programador para esa bolita roja. Este comando puede ser definido por el programador a través de un procedimiento. Por este medio se consigue que la bolita roja adquiera para el lector del programa un significado especial (en este caso, representar a una flor). Posteriormente, si se decide cambiar la representación de la flor a 2 bolitas rojas y 1 verde, solo hace falta cambiar la implementación de PlantarFlor() para que ponga esa cantidad de bolitas, pero el resto del programa no se vería afectado, pues utiliza el nuevo comando PlantarFlor() que se expresa en términos del problema y no de la representación subyacente.

  Es un hecho conocido por todo programador, aunque no siempre explicitado, que los programas tienen una naturaleza dual: son al mismo tiempo una prescripción de bajo nivel en términos de las primitivas de la máquina de qué pasos deben ejecutarse para solucionar el problema (la *naturaleza operacional* de un programa) y una descripción de alto nivel de las ideas que se combinan para obtener dicha solución en términos del problema (la *naturaleza denotacional* de un programa).
  Los *cursos tradicionales* se focalizan en la definición de programa como secuencia de instrucciones, haciendo hincapié en la *naturaleza operacional* de los programas (el programa como prescriptor de una ejecución en términos de las primitivas de la máquina), y poniendo como centro de atención a la máquina que resuelve el problema, en lugar de al problema en sí, o a la persona que lee el programa.
  Nuestra elección de empezar por procedimientos en la *secuencia didáctica Gobstones* permite conceptualizar a los programas como descripciones de solución a un problema en términos de los conceptos del problema, enfatizando la *naturaleza denotacional* del programa (el programa como descripción de una solución en términos del mismo problema) abstrayendo el hecho de que es la máquina la que soluciona el problema, y comenzando así a adquirir la capacidad de explicitar el proceso de abstracción mediante herramientas del lenguaje.

  Estamos totalmente convencidos que si queremos formar pensamiento abstracto, el proceso de abstracción debe ser explícito desde el mismísimo comienzo del aprendizaje. Y la mejor manera de lograr esto es a través del uso de las herramientas de abstracción provistas por cualquier lenguaje de programación.
  Por eso los procedimientos, y su tempranísima utilización, son quizás la mayor contribución de la secuencia didáctica Gobstones. No debe descuidarse este hecho, ni restarle la más mínima importancia.
  Para Gobstones, los procedimientos importan.

domingo, 11 de octubre de 2015

1. Por qué Gobstones es importante (o "Why Gobstones matters")

El enfoque didáctico Gobstones.


  Comienzo este blog para ir volcando las razones tras las decisiones que nos llevaron al diseño de Gobstones con la idea de, por un lado, explicitarlas, por otro, documentarlas, y finalmente, para fortalecerlas a través de la discusión. Hay muchos aspectos a tratar especialmente respecto de qué características (o su ausencia) son fundamentales a la propuesta de este enfoque didáctico, sin las cuales no sería Gobstones. También vale la pena discutir sobre el objetivo original de esta propuesta, y cómo se amplió con el tiempo, y qué características deben cambiar para ello. Finalmente, hay cuestiones relacionadas con las herramientas de soporte, y cómo éstas contribuyen a realzar la secuencia Gobstones.

  Lo primero a considerar es el objetivo básico original de Gobstones, y su contexto, para situar las decisiones y apreciar el valor de las características elegidas para lograr el objetivo.

  El *objetivo primario* del enfoque didáctico Gobstones es servir para que una persona con cero conocimientos previos de programación pueda *aprender los conceptos fundamentales* vinculados con esta disciplina, de manera tal de ser capaz de solucionar problemas sencillos mediante el uso de programas. Para este aprendizaje no necesita conocimientos previos de matemáticas ni de lógica, aunque es útil si los tiene.
  La *idea fundamental* detrás del aprendizaje propuesto es *formar la capacidad de pensar en términos de abstracciones*, siendo capaces de explicitar las mismas y expresarlas en términos de herramientas básicas de lenguajes de programación. Y como objetivo adicional, los conceptos aprendidos deben ser lo suficientemente generales y transversales para permitir posteriormente el aprendizaje de cualquier forma de programación (o sea, de cualquier lenguaje en cualquier paradigma).

  El propósito original de Gobstones fue servir en un primer curso universitario de programación con la intención de sentar las bases conceptuales sobre las que las siguientes materias construyesen conocimientos más específicos. Sin embargo, Gobstones demostró ser útil también para jóvenes de nivel secundario, y también tener algunas características que lo hacen interesante incluso para personas que no tienen intenciones de volverse programadores.
  El enfoque Gobstones sirvió como una de las bases de inspiración para las propuestas de la Iniciativa Program.AR, y el lenguaje Gobstones forma parte del conjunto de herramientas de aprendizaje recomendadas como parte de esta iniciativa. Estamos trabajando activamente en mejorar tanto el lenguaje como las herramientas asociadas. Además, Gobstones es el lenguaje elegido por Mumuki para la enseñanza de los fundamentos de la programación. Puede encontrarse toda la información sobre Gobstones en el sitio oficial, o alternativamente, en la página de Gobstones en Github.

  El enfoque didáctico propuesto con Gobstones es osado: elimina elementos que muchos programadores consideran imprescindibles (como variables -- al menos por buena parte del curso --, E/S, estructuras de datos, etc.) y resignifica otros usualmente tratados como accesorios (como los procedimientos o los parámetros) o totalmente ignorados en cursos tradicionales (como las precondiciones). Además hace énfasis desde el principio en cuestiones de estilo (buena elección de nombres, indentación, comentarios) que otros cursos introductorios no resaltan o simplemente lo dejan librado al azar.

  Todas estas cuestiones hacen que Gobstones importe y vale la pena detenerse en las mismas. En próximos posts desarrollaremos dichas ideas. La intención es que haya un post por semana, aproximadamente, y que se puedan generar discusiones interesantes a partir de cada uno, porque Gobstones importa.

PD: El currículum propuesto por este enfoque didáctico (resumido) es el siguiente:
  1. Comandos primitivos, secuencias, bloques.
  2. Procedimientos simples. Contratos: propósito y precondiciones.
  3. Cuestiones de estilo: comentarios, indentación, elección de nombres.
  4. Repetición simple.
  5. Alternativa condicional.
  6. Expresiones.
  7. Funciones simples.
  8. Parámetros.
  9. Repetición indexada.
  10. Repetición condicional. Recorridos simples.
  11. Variables y memoria. Recorridos más complejos.
TRANSVERSALMENTE: Modelos de Representación, codificación vs. visión abstracta.
  Para ver el currículum completo y detallado, consultar el libro "Las bases conceptuales de la programación".