14 de julio de 2010

Python para alumnos de educación media

El pasado miércoles 14 de julio tuvimos como parte de las actividades del CampTECh el taller Aprendiendo a programar con Scribbler impartido por la profesora Patricia Chávez. Dirigido a niños y niñas de secundaria y preparatoria, el CampTECh busca cambiar la percepción que tienen las nuevas generaciones hacia el área de las Tecnologías de Información mediante actividades interesantes y divertidas.

La siguiente imagen muestra un robot Scribbler:


Este pequeño robot cuenta con dos motores independientes, una bocina, tres leds, tres tipos distintos de sensores, un puerto para comunicación serial y un orificio para colocar un plumón y así poder pintar sobre el piso. En el puerto serial se le inserta un tarjeta Fluke la cual permite la comunicación vía Bluetooth. Esta misma tarjeta cuenta además con una cámara fotográfica, sensores adicionales y un indicador de batería baja.

Hay varias formas de programar el Scribbler, pero en el CEM hemos optado por usar el software y material didáctico desarrollado por el Institute for Personal Robots in Education (IPRE). Este instituto desarrolló el framework Myro (My Robot) el cual permite programar el robot utilizando el lenguaje de programación Python.

El taller impartido en el CampTECh tuvo una duración de dos horas aproximadamente. Los 55 participantes (ninguno con experiencia previa usando Python) se dividieron en 13 equipos de cuatro o cinco integrantes cada uno. A cada equipo se le prestó un robot Scribbler con su tarjeta Fluke correspondiente y una laptop con un adaptador Bluetooth USB. A los participantes primero se les instruyó en los conceptos necesarios para poder hacer que el robot tocara tonos musicales, se moviera hacia adelante y girara. También se les enseñó a definir funciones sencillas y hacer repeticiones usando la instrucción for. Como actividad por cuenta propia, cada equipo tuvo que programar a su robot para que dibujara una estrella.

La siguiente foto muestra la solución de un equipo compuesto exclusivamente por niños de secundaria:



Dicho equipo escribió primero una función para dibujar un triángulo:
def triangulo(robot):
    for i in range(3):
        robot.forward(1, 1)
        robot.turnLeft(1, 2.25)
Luego ejecutaron la función una vez, rotaron su pliego de papel, y volvieron a ejecutar la función para obtener una estrella de David. No está nada mal para un grupo de principiantes tan jóvenes.

Un equipo de chicos de preparatoria logró programar una estrella mucho más elaborada (algunos miembros de este equipo ya tenían experiencia programando en otros lenguajes):


La parte final de la actividad consistía en que cada equipo disfrazara a su robot. Así es como terminaron los 13 robots:


El resultado del taller fue definitivamente muy gratificante tanto para los participantes como para los que pudimos facilitar la experiencia.

Para estudiantes entre 12 y 17 años de edad, la introducción a la programación resulta más sencilla usando herramientas como Alice o Scratch. De hecho, el día anterior la profesora Ma. de los Angeles Junco impartió un taller de Alice a estos mismo chicos también como parte del CampTECh. Sin embargo, el poder programar robots usando Python les brinda la oportunidad de conocer un lenguaje de programación de verdad en un dominio que les resulta muy estimulante. Todo esto se logra cubrir en poco tiempo gracias a que no se requiere inundar a los alumnos con un montón de nimiedades sintácticas tal como ocurriría se tuviéramos que usar otros lenguajes.

12 de julio de 2010

¿Qué sigue después de Python?

Una pregunta que normalmente surge con la propuesta de usar Python como primer lenguaje de programación es la siguiente: ¿qué sigue después? Específicamente, ¿se debe seguir usando Python en cursos de programación posteriores, o se debe migrar a otro lenguaje? A mi me parece que ambas son alternativas viables, pero voy a elaborar a continuación mi punto de vista en el contexto de los planes de estudio 2011 del Tec de Monterrey.

Tal como comenté en mi entrada anterior, existen dos versiones del curso de introducción a la programación: una para las carreras del área de las Tecnologías de Información y Electrónica (TIEs) y otra para el resto de las carreras de ingeniería. De hecho, en lo que a programación se refiere, hay que considerar dos líneas de materias, tal como lo muestra la siguiente figura:

La propuesta concreta que se ha manejado hasta el momento es usar Python tanto en el curso de Fundamentos de programación como en el de Solución de problemas con programación.

El curso de Métodos numéricos podría beneficiarse también de utilizar Python por las siguientes razones: 1) los alumnos no tendrían que aprender un lenguaje nuevo, 2) Python tiene varias características que lo hacen más amigable hacia el cómputo numérico que lenguajes como C/C++ o Java. Los referencias [1, 2] son libros de texto que tienen un enfoque hacia los métodos numéricos y la programación científica.

En lo que respecta a las materias de Programación orientada a objetos y Estructura de datos, soy de la idea de que se debe utilizar un solo lenguaje para ambos cursos y que sí conviene moverse en este etapa a un lenguaje más convencional/comercial. Habiendo dicho lo anterior, veo tres candidatos potenciales: Java, C++ o C#. Sin embargo, considerando que los alumnos de las TIEs requieren en cursos posteriores escribir programas que interaccionan directamente con la plataforma anfitriona (hardware y/o sistema operativo), podría resultar más conveniente cubrir el lenguaje C++ en estas dos materias.

Personalmente, C++ no es de mis lenguajes favoritos, sin embargo me parece que resultaría en un buen complemento de Python para nuestros alumnos. Por un lado, Python es un lenguaje normalmente interpretado (de ejecución lenta), con tipos dinámicos y administración automática de memoria. Por otro lado, C++ es un lenguaje típicamente compilado (de ejecución rápida), de tipos estáticos con declaraciones explícitas y generalmente con administración manual de memoria. Tienen en común que son lenguajes orientados a objetos basados en clases, pero también soportan de manera muy natural el estilo de programación procedural. Python y C++ comparten estructuras de control (condiciones, ciclos y excepciones) muy parecidas, lo mismo que los operadores aritméticos, lógicos y relacionales. En términos generales, la lógica de programación que desarrollan nuestros alumnos con Python es básicamente la misma que requieren para usar adecuadamente C++.

En resumidas cuentas, me parece que Python y C++ tienen suficientes elementos en común como para facilitar el proceso de migración del primero hacia el segundo, pero también tienen suficientes diferencias como para resultar en una experiencia de aprendizaje muy enriquecedora en el área de la ciencia de la computación.

Por último, los alumnos de la carrera de Ingeniero en Sistemas/Tecnologías Computacionales (a la cual usualmente me refiero usando la expresión regular /I[ST]C/) tendrán otras materias en las que podrán aprender y practicar Java y C#. Me vienen a la mente las siguientes: Desarrollo de aplicaciones web, Diseño y arquitectura de software, y tres proyectos integradores. Si nuestros alumnos conocen Python y C++, aprender Java y C# no les será muy complicado.


Referencias

[1] Kiusalaas, J. Numerical Methods in Engineering with Python, 2nd ed. Cambridge University Press, 2010.
[2] Langtangen, H. P. A Primer on Scientific Programming with Python. Springer, 2009.

9 de julio de 2010

El nombre del primer curso de programación

El primer curso de programación ha tenido varios nombres desde que se ofrece en el Tecnológico de Monterrey. Algunos de los nombres que recuerdo desde los años ochenta son: Computación electrónica I, Computación I y más recientemente Fundamentos de programación. Con el diseño de los planes 2011 surgió la inquietud sobre el nombre que debía tener ahora esta materia. Este es el tema de esta entrada del blog, pero debo iniciar presentando algo de contexto.

Los planes 2011 reconocen la relevancia que juega la programación no sólo en el área de Tecnologías de Información y Electrónica (TIEs) sino en todas las demás carreras de ingeniería. Como resultado de esto, las siguientes 27 carreras del Tec incorporan una materia de introducción a la programación:

Carrera en el área de Ciencias de la Salud
  • Ingeniero Biomédico (IMD)

Carreras en el área de Humanidades y Ciencias Sociales
  • Licenciado en Animación y Arte Digital (LAD)
  • Licenciado en Comunicación y Medios Digitales (LCMD)

Carreras en el área de Ingeniería y Arquitectura
  • Ingeniero Agrónomo (IA)
  • Ingeniero en Agrobiotecnología (IAB)
  • Ingeniero en Biotecnología (IBT)
  • Ingeniero Civil (IC)
  • Ingeniero en Diseño Automotriz (IDA)
  • Ingeniero en Desarrollo Sustentable (IDS)
  • Ingeniero Físico Industrial (IFI)
  • Ingeniero en Industrias Alimentarias (IIA)
  • Ingeniero Industrial y de Sistemas (IIS)
  • Ingeniero Mecánico Administrador (IMA)
  • Ingeniero Mecánico Electricista (IME)
  • Ingeniero en Producción Musical Digital (IMI)
  • Ingeniero en Mecatrónica (IMT)
  • Ingeniero Químico Administrador (IQA)
  • Ingeniero Químico y de Sistemas (IQS)
  • Licenciado en Ciencias Químicas (LCQ)

Carreras en el área de Tecnologías de Información y Electrónica
  • Ingeniero en Negocios y Tecnologías de Información (INT)
  • Ingeniero en Sistemas Computacionales (ISC)
  • Ingeniero en Sistemas Digitales y Robótica (ISD)
  • Ingeniero en Tecnologías Computacionales (ITC)
  • Ingeniero en Tecnologías Electrónicas (ITE)
  • Ingeniero en Tecnologías de Información y Comunicaciones (ITIC)
  • Ingeniero en Telecomunicaciones y Microelectrónica (ITM)
  • Ingeniero en Telecomunicaciones y Sistemas Electrónicos (ITS)
En algún momento se decidió que debían haber dos versiones de la materia de introducción a la programación: una para las carreras de las TIEs y otra para las demás ingenierías. No estoy seguro donde quedan los LADs y los LCMDs, pero supongo que estarían junto con las TIEs.

El 17 de junio pasado nos llegó por correo electrónico una encuesta a varios profesores del sistema de parte del comité de carrera ITC. La encuesta iniciaba con el siguiente mensaje:
El nombre actual del primer curso de programación registrado en Vicerrectoría para el plan 2011 es "Programación". Con el propósito de definir un nombre más atractivo, y tal vez más innovador, estamos creando esta encuesta.
Y luego venía una lista con los siguientes nombres propuestos, a los cuales había que calificar con un número del 1 al 5, en donde 1 significa "es adecuado" y 5 significa "no es adecuado":
  • Solución de Problemas con Programación
  • Metodología de Programación
  • Metodología y Solución de Problemas con Programación
  • Pensamiento Algorítmico y Solución de Problemas utilizando Metodología de Programación
  • Programación para la Solución de Problemas
  • Programación como Herramienta para la Solución de Problemas
  • Pensamiento Algorítmico para la Solución de Problemas
  • Solución Creativa de Problemas con Programación
  • Metodología y Solución Creativa con Programación
  • Solución Eficiente de Problemas con Programación
  • Programación para la solución Creativa de problemas
  • Pensamiento Algorítmico para la Solución Creativa de Problemas
  • Fundamentos de Programación
  • Principios de Programación
  • Introducción a la Programación
  • Explorando la Programación
La encuesta incluía también un espacio para sugerir un nombre distinto a los explícitamente listados. De hecho, los profesores del departamento de computación del CEM nos pusimos de acuerdo para votar por otro nombre que nos sugirió la profesora Ma. de los Ángeles Junco: Soluciones Creativas con Programación. Intencionalmente quisimos eliminar la palabra "problemas" del nombre ya que nos sonaba potencialmente intimidante para alguien que casualmente leyera la tira de materias de alguna de nuestras carreras.

El 18 de junio nos llegó una nueva encuesta para realizar una segunda vuelta de votaciones considerando solamente los seis nombres más votados en la primera ronda:
  • Solución de Problemas con Programación
  • Programación para la Solución de Problemas
  • Soluciones Creativas con Programación
  • Fundamentos de Programación
  • Principios de Programación
  • Introducción a la Programación
La lista anterior aparecía dos veces: una vez para el nombre de la materia de las TIEs y otra para el nombre para las demás ingenierías.

Ese mismo día por la tarde nos dieron a conocer los resultados finales. El nombre más votado para el primer curso de programación de las TIEs fue:
Fundamentos de programación
Para las demás ingenierías, el nombre más votado fue:
Solución de problemas con programación
Personalmente no me desagradan estos nombres, sin embargo si el ejercicio buscaba "definir un nombre más atractivo, y tal vez más innovador" me parece que como academia nos vimos demasiado conservadores, sobre todo con el nombre de Fundamentos de programación, que es como actualmente se llama la materia en los planes 2009. Está difícil conservar nuestra posición de liderazgo en la educación superior de México si nuestra idea de ser innovadores consiste en dejar las cosas tal como están. Vale la pena reflexionar a este respecto.

Ya un poco tarde, seguí pensando en el nombre más adecuado para la materia y se me ocurrió el siguiente:
Cómo entrenar a tu PC
¿A poco no es atractivo e innovador? ;-)

Arte conceptual de Paul Shardlow para la películaCómo entrenar a tu dragón de DreamWorks Animation.

8 de julio de 2010

Python como primer lenguaje de programación

Hace unos días escribí un artículo algo extenso (16 páginas en total) el cual busca promover el uso de Python dentro del primer curso de programación a nivel licenciatura del Tecnológico de Monterrey. Procuro fundamentar de la mejor manera una propuesta que puede llegar a generar inicialmente cierto escepticismo y controversia.

Éste es el resumen del artículo:
El lenguaje de programación Python se ha convertido en años recientes en una herramienta muy valiosa para la enseñanza de la programación. Este documento propone utilizar dicho lenguaje en el primer curso de programación de los planes de estudio 2011 de las carreras profesionales del Tecnológico de Monterrey. Con el fin de justificar esta propuesta, se analizarán las características de Python que lo hacen una alternativa superior a otros lenguajes al momento de aprender a programar. Así mismo, se discutirán las investigaciones que se han hecho en diversas universidades sobre el uso de Python en la educación, así como las experiencias que ha tenido el Campus Estado de México en este mismo sentido.
El documento completo está disponible en formato PDF a partir de la siguiente liga:
primer_lenguaje_30_jun_2010.pdf
Invito a los lectores a que utilicen la sección de comentarios para compartir sus ideas, reflexiones, críticas y/o sugerencias respecto a la propuesta planteada.

7 de julio de 2010

print('¡Hola mundo!')

Bienvenidos al blog EduPython. Este es un espacio destinado a promover el uso del lenguaje Python para enseñar a resolver problemas.

En las universidades de México y gran parte del mundo, los maestros de los primeros cursos de programación nos hemos enfocado mucho a enseñar las idiosincrasias de lenguajes como Java o C++, pero poco a desarrollar la habilidad de resolver problemas. Esto es desafortunado, ya que los lenguajes se ponen de moda y luego unos años después son olvidados (¿alguien todavía usa o enseña Pascal?), pero la capacidad de resolución de problemas es una habilidad que sirve para toda la vida. Como educadores, debemos hacer lo que esté a nuestro alcance para remediar esta situación, y considero que usar el lenguaje Python es un paso importante en esta dirección. Y esta es la razón principal por la que me atrevo a asegurar lo anterior: Python impone una “baja carga cognitiva” en el estudiante. Esto significa que es relativamente fácil convertir a un programa las ideas necesarias para resolver un cierto problema.

Alan Kay, uno de los inventores de la programación orientada a objetos y del lenguaje Smalltalk, expuso este concepto muy claramente1:
Las cosas sencillas deben ser fáciles y las cosas difíciles deben ser posibles.
Veamos uno de los ejemplos más sencillos: el clásico programa que imprime ¡Hola mundo! en la pantalla. En Python se puede expresar en una sola línea de código:
print('¡Hola Mundo!')
En cambio en Java, el mismo programa es mucho más elaborado:
public class Hola {
   public static void main(String[] args) {
       System.out.println("¡Hola mundo!");
   }
}
Para un programa tan trivial, ¿realmente necesita un principiante saber qué es una clase, qué es un modificador de acceso público, qué es un arreglo de cadenas de caracteres, o dónde tienen que ir las llaves y los puntos y comas? Las veces que yo he tenido que enseñar Java en el primer semestre hago lo siguiente: les digo a mis alumnos que acepten este programa como “acto de fe”, y les prometo que todas las cosas se irán aclarando durante el transcurso del semestre. Y esto no es del todo cierto, ya que ni siquiera llegamos a cubrir lo que son los métodos estáticos.

La complejidad del código del lenguaje Java (o C++, C#, etc.) se puede justificar en el contexto de desarrollo de software a gran escala. Pero en programas pequeños, como los que hace un alumno que empieza a programar, tanto embrollo simplemente es contraproducente. Desde luego, los estudiantes de las carreras de TI deben conocer Java (o C++, C#, etc.) para ser competitivos en la industria, mas no necesitamos imponerles esta carga desde su primer curso. Si queremos que desarrollen la lógica para resolver problemas de programación, vale la pena considerar al menos lo que Python nos puede ofrecer.


Referencia:

1 http://en.wikiquote.org/wiki/Alan_Kay