Didáctica de la Informática

24 marzo 2006

Currículo alternativo

Éste es el currículo actual del CFGS de Desarrollo de Aplicaciones Informáticas:
  1. Primer curso:
    1. Programación en Lenguajes Estructurados: 11 horas
    2. Análisis y Diseño Detallado de Aplicaciones Informáticas de Gestión: 11 horas
    3. Sistemas Informáticos Multiusuario y en Red: 7 horas
    4. La Informática: Su Utilización en las Empresas de Andalucía: 1 hora
  2. Segundo curso:
    1. Desarrollo de Aplicaciones en Entornos de 4ª Generación y con Herramientas CASE: 13 horas
    2. Diseño y Realización de Servicios de Presentación en Entornos Gráficos: 11 horas
    3. Formación y Orientación Laboral: 3 horas
    4. Relaciones en el Entorno de Trabajo: 3 horas
El currículo data del año 1997, y los contenidos (además de obsoletos) están mal distribuidos (véase, por ejemplo, «Análisis...» en primer curso).

Éste es el currículo que propongo:
  1. Primer curso:
    1. Sistemas Informáticos Multiusuario y en Red: 8 horas
    2. Introducción a la Programación: 11 horas
    3. Introducción a la Tecnología Web: 2 horas
    4. Bases de Datos: 4 horas
    5. Formación y Orientación Laboral: 2 horas
    6. Relaciones en el Entorno de Trabajo: 2 horas
    7. La Informática: Su Utilización en las Empresas de Andalucía: 1 hora
  2. Segundo curso:
    1. Ingeniería del Software: 12 horas
    2. Programación Avanzada: 6 horas
    3. Programación Dirigida por Eventos: 5 horas
    4. Desarrollo de Aplicaciones Web: 8 horas
Los cambios fundamentales son:
  1. Introducción a la Programación: iniciación básica, basada en un lenguaje interpretado y dinámico como Ruby.
  2. Introducción a la Tecnología Web: aspectos básicos de la tecnología web, protocolo HTTP y lenguaje (X)HTML.
  3. Bases de Datos: contenidos extraídos de otras asignaturas (como «Análisis...» y «Desarrollo de Aplicaciones...») e integrados en una única materia.
  4. Ingeniería del Software: básicamente la antigua asignatura de «Análisis...», pero más práctica y basada en metodologías ágiles como eXtreme Programming.
  5. Programación Avanzada: profundización basada en un lenguaje compilado y estático como Eiffel o Java.
  6. Programación Dirigida por Eventos: básicamente los contenidos de Visual Basic de la antigua asignatura «Diseño y Realización...», aunque enfocada a tecnologías como .NET o generadores de interfaces como Glade.
  7. Desarrollo de Aplicaciones Web: en dos tecnologías: ASP.NET y PHP (o Ruby on Rails).

28 diciembre 2005

Ruby vs. Java

Ruby es el lenguaje que hemos seleccionado aquí como el más apropiado para enseñar Programación.

Java es el lenguaje que hemos seleccionado en el Ciclo Formativo de Grado Superior en Desarrollo de Aplicaciones Informáticas como el más apropiado para enseñar Programación en la asignatura Programación en Lenguajes Estructurados.

Veamos ahora cómo se comportarían en un combate cuerpo a cuerpo estos dos «pesos pesados» de la Programación:

  1. «Hola Mundo»

    • En Ruby:
    • puts "Hola Mundo"
    • En Java:
    • public class HolaMundo {
      public static void main(String[] args) {
      System.out.println("Hola Mundo");
      }
      }

  2. Calcular el enésimo término de la sucesión de Fibonacci:

    • En Ruby:
    • def fibrec(n)
      case n
      when 0..1 then n
      else fibrec(n - 1) + fibrec(n - 2)
      end
      end

      print "Introduce el número: "
      num = gets.to_i

      puts "El número que corresponde a la secuencia es: " + fibrec(num).to_s
    • En Java:
    • import java.io.*;

      class fiborecc {
      // Rosalía Gómez Rodríguez
      public static void main(String[] args) {
      int num;
      System.out.println("Introduce el numero");

      num = LeerEntero();

      System.out.println("El numero que corresponde en la secuencia es " + FibonacciRec(num));
      }

      static int FibonacciRec(int n) {
      if (n == 0)
      return 0;
      else if (n == 1)
      return 1;
      else
      return (FibonacciRec(n - 1) + FibonacciRec(n - 2));
      }

      static int LeerEntero() {
      try {
      return Integer.parseInt(Cadena());
      } catch (NumberFormatException e) {
      return Integer.MIN_VALUE;
      }
      }

      public static String Cadena() {
      InputStreamReader isr = new InputStreamReader(System.in);
      BufferedReader flujoE = new BufferedReader(isr);

      try {
      return flujoE.readLine();
      } catch(IOException e) {
      return null;
      }
      }
      }
No hay más preguntas, señoría.

26 noviembre 2005

Ruby

¿Existe algún lenguaje de programación que sea didáctico y al mismo tiempo práctico? A lo largo de los años he descubierto algunos. No resulta fácil, por cierto, y el motivo es que, por lo general, los lenguajes más didácticos son precisamente los menos conocidos. Parece existir una regla universal no escrita que dice que los lenguajes más raros, menos naturales y menos elegantes son precisamente los más utilizados, los más nombrados. Los mainstream, como dirían los ingleses.

Un lenguaje de programación didáctico debe ser:

  • fácil de aprender (es evidente)
  • potente (capaz de hacer de todo con muy poco código)
  • elegante (claro, que se entienda a la primera)
  • expresivo (que el código exprese su significado de manera natural)
  • ortogonal (que todo funcione donde se supone que deba funcionar)
Por supuesto, esta lista no está completa ni mucho menos. Cabría hablar mucho sobre las características de un buen lenguaje de programación didáctico, pero bajo mi punto de vista, éstas son las imprescindibles.

De entre todos los lenguajes (que tampoco son muchos) que cumplen tales requisitos, mi favorito es Ruby. Todo aquel interesado debería visitar su página principal, así como la página del grupo Rubies (la comunidad hispana del lenguaje Ruby). En todo caso, sus características más interesantes de cara a su utilización como primer lenguaje son:

  • Es un lenguaje moderno y evolutivo: nació en 1995 y es mejorado cada día.
  • Es un lenguaje orientado a objetos puro: en Ruby todo son objetos, incluyendo los datos básicos como el número 5 o la cadena "hola". No existen dos modos de trabajo (tipos y clases) como en Java o C++.
  • Es un lenguaje dinámico: no hay necesidad de declarar las variables y sus tipos.
  • Es un lenguaje fuertemente tipado: los objetos son instancias de una determinada clase (siempre conocida), y sobre ellos se pueden aplicar tan sólo una serie de operaciones bien definidas por sus clases (por tanto, sólo responden a determinados mensajes, siempre bien conocidos).
  • Es un lenguaje interpretado: los programas no se compilan, por lo que se acorta el ciclo clásico de «edición - compilación - enlace - ejecución». Además, se puede acceder directamente al intérprete en modo interactivo.
  • Tiene una sintaxis sencilla: heredada de otros lenguajes extraordinarios como Eiffel, pero al mismo tiempo compatible en cierta forma con la de otros más conocidos como C.
  • Es un lenguaje real: Ruby se utiliza para resolver todo tipo de problemas, pero es particularmente interesante en el tratamiento de cadenas y la administración de sistemas. Además, recientemente ha sufrido una explosión de popularidad gracias a la plataforma de desarrollo web Ruby on Rails, que ha supuesto un fuerte shock entre todos los desarrolladores de aplicaciones para Internet, y que ha dado lugar a imitadores basados en otros lenguajes (como el proyecto Django para Python).
Bajo muchos aspectos, creo que Ruby es el lenguaje de programación perfecto para aprender a programar. Ese aprendizaje puede luego complementarse con la adquisición de otras prácticas tan recomendables como el diseño por contrato, o el tipado estático (técnicas en las que el lenguaje Eiffel brilla con luz propia), pero las primeras tareas de programación pueden orientarse perfectamente hacia la claridad y la sencillez con herramientas tan adecuadas como Ruby.

En el próximo envío veremos algunos ejemplos de por qué Ruby es el candidato perfecto para nuestros propósitos.

19 noviembre 2005

El mejor primer lenguaje

¿Cuál es el lenguaje de programación más adecuado para aprender a programar? Esa es una de las grandes preguntas que todo profesor de Programación se ha planteado, al menos, una vez durante su actividad laboral. Yo mismo me he hecho esa pregunta innumerables veces, y creo que aún no dispongo de la respuesta correcta. Todo lo más, me aproximo.

Empecemos por concretar el nivel educativo del que estamos hablando. No es lo mismo enseñar a programar a un alumno de ESO o de Bachillerato, que a uno del Ciclo Superior de Informática, o a un universitario. Los objetivos a plantear son distintos. Y, aunque en un principio pudiera parecer lo contrario, eso nos supone una limitación sobre todo en el caso de los Ciclos. Efectivamente, los objetivos de una asignatura de Programación en la Enseñanza Secundaria resultan ser más generales, nos ofrecen mayor flexibilidad y, sobre todo, nos da mayor capacidad de maniobra por cuanto en los Ciclos nos vemos en la «obligación» de tener en consideración al mercado laboral. A fin de cuentas, los Ciclos Formativos tienen como finalidad conseguir la incorporación de esos futuros profesionales en el mercado de trabajo, y las expectativas aumentan enormemente si su formación se basa en un lenguaje que el mercado demanda.

Ahora bien: ¿debemos basar la didáctica de la Programación exclusivamente en las demandas del mercado? ¿Debe la enseñanza de la Informática en general convertirse en una campaña de marketing al servicio de las grandes compañías de software? ¿O por el contrario debemos seleccionar en cada caso la opción más adecuada en base únicamente a criterios objetivos y pedagógicos?

Todos hemos oído más de una vez (sobre todo si nos dedicamos a ésto) aquello de «hay que enseñar Visual Basic, porque es lo que se pide», o algo como «¿Eiffel? ¡Pero si eso no sirve para nada!». Son claros ejemplos de selección artificial. Las opciones se evalúan no en base a su calidad intrínseca o a su aptitud pedagógica, sino a criterios externos a menudo desvinculados de su uso como herramienta de aprendizaje. A menudo, los que piensan así olvidan los tiempos en los que ellos mismos eran absolutos novatos en la materia, y en los que cualquier ayuda, por pequeña que fuese, era bien recibida. Olvidan que un buen lenguaje no tiene por qué ser un lenguaje didáctico, y que, a menudo, esos dos conceptos resultan antagónicos.

Hay un viejo refrán que dice: «cuando lo único que tienes es un martillo, todos los problemas te parecen clavos». No perdamos nuestro norte: no se trata de formar a profesionales que de la noche a la mañana sean capaces de construir complejas aplicaciones conociendo únicamente la herramienta que le enseñaron. No existe la solución perfecta, única y válida para todos los casos («no silver bullet», dicen los ingleses), así que no debemos esperar que con un sólo curso de Programación en un sólo lenguaje o método vamos a lograr una formación integral y completa de nuestros alumnos. Bajo esa perspectiva, escoger el primer lenguaje en base a su utilidad práctica o su penetración en el mercado resulta poco acertado.

Pero hay más: se conocen pocos mercados tan dinámicos, cambiantes e incluso «traicioneros» como el mercado informático. Lo que hoy es ampliamente utilizado, mañana puede quedar obsoleto por la aparición de otros productos. Existen innumerables ejemplos de soluciones, productos y herramientas que parecían enormemente prometedores al nacer, pero que resultaron rotundos fracasos. Aquellos profesionales que invirtieron tiempo, dinero y esfuerzo en aprender a usarlos no obtuvieron ninguna recompensa. Esa inversión no proporcionó ninguna rentabilidad. En cambio, otros métodos o tecnologías que en su momento no parecían tan prometedoras resultaron ser éxitos colosales.

La moraleja del cuento: «no debemos basarnos en lo que el mercado solicita, espera o desea». El mercado cambia, se equivoca, rectifica (a veces)... El mercado evoluciona con el tiempo, y su evolución es tan rápida y a veces tan sorprendente que resulta imposible predecir su tendencia.

Por todo ello, debemos elegir la tecnología, la herramienta o el producto que mejor se adapte a nuestro objetivo, y dejar a un lado los compromisos mercantilistas o las consideraciones de cualquier otra índole. Debemos enseñar a programar, y para ello debemos usar la mejor herramienta para aprender a programar. Punto.

Eso sí; no cabe duda de una cosa: si podemos usar una herramienta que, además de ser didáctica, resulta ser práctica (es decir, que no es un mero juguete educativo, sino que se puede usar para crear programas reales), entonces mejor que mejor. ¿Existe esa herramienta? Yo creo que sí, pero eso es algo que discutiremos en el siguiente envío.

17 noviembre 2005

Profesores de Informática

Me gusta mi profesión.

Soy profesor de Informática en un Instituto de Educación Secundaria. Desde hace cinco años me dedico a impartir clases en un Ciclo Formativo de Grado Superior en Desarrollo de Aplicaciones Informáticas. Son éstas unas enseñanzas interesantes y bastante especializadas. En unas escasas 2000 horas lectivas (incluyendo prácticas en empresas y la elaboración de un proyecto integrado), el alumno adquiere las capacidades necesarias para convertirse en un desarrollador de aplicaciones. Un programador.

Recuerdo cuando la Informática se confundía con la Programación. Cuando usar un ordenador equivalía a programarlo. No se hablaba de usuarios, sino de programadores. No se hablaba de procesadores de textos, ni de hojas de cálculo... ni siquiera de sistemas operativos. Se hablaba de BASIC, de Ensamblador, de código máquina. Se hablaba de Programación.

Yo viví plenamente aquella época. De hecho, mi contacto con la Informática empezó en aquella época. Yo viví plenamente aquel tiempo en el que los ordenadores se usaban con el teclado. Escribiendo. Leyendo crípticos mensajes de error en Inglés. Con la única ayuda de un sucinto manual, aprendí a escribir mis propios programas con números de línea, editándolas una a una. Y disfrutaba... ¡ya lo creo!

A día de hoy, veinte años mal contados después de aquello, veo en mi profesión una manera de rememorar esos instantes inolvidables. Me veo reflejado en mis alumnos. Veo en ellos a chavales que quieren aprender Informática (con I mayúscula), que desean conocer cómo funcionan los ordenadores, que ansían crear algo que otros (o ellos mismos) puedan usar. Ellos saben que para aprender el paquete Office ya hay otras opciones. Hay una complicidad como de camaradas integrantes de una misma hermandad.

Por todo lo dicho, no puede caber ninguna duda de que me tomo mi profesión bastante en serio. Puesto que ellos son yo, deseo ofrecerles la mejor formación que puedan recibir, con los mejores medios de los que dispongamos. Ese es el interés de todo profesor mínimamente comprometido con su trabajo, pero en mi caso es algo más. Ellos son yo, así que no sólo les ayudo a ellos. También me ayudo a mí mismo.

A lo largo de este blog pretendo ir dejando constancia de mis pensamientos, mis ideas, mis inquietudes, mis experimentos, mis hipótesis y mis diseños acerca de cómo debemos enseñar Informática. Más concretamente, me dedicaré a las disciplinas que forman las enseñanzas de Desarrollo de Aplicaciones Informáticas: Programación, Ingeniería del Software, Sistemas Informáticos, Entornos de 4ª Generación, Herramientas CASE, Entornos Visuales... pero ello no impide que de vez en cuando deba plantearme cómo enseñar otros aspectos de la Informática. La Informática para principiantes (enseñar Informática a quien nunca ha tenido contacto con ella) es también un área apasionante, así como el uso de la Informática como herramienta pedagógica (no enseñar Informática, sino enseñar con la Informática). Espero que todo tenga cabida en este blog.

O, más bien, espero que algo tenga cabida. El tiempo lo dirá.