Como ocurre con la escritura o cualquier otro sistema de comunicación, la programación es un lenguaje para definir objetos y otorgarles un valor, a partir del cual se comportan.
El escritor afirma que el mundo y los personajes de ficción creados tienen vida propia, al existir en un marco definido previamente.
Ocurre algo similar con la programación orientada a objetos (POO, OOP en sus siglas en inglés): el mundo creado se comporta con la consistencia que se le ha otorgado.
Orígenes de los algoritmos actuales
Seamos o no conscientes de ello, estamos inmersos en un mundo con automatismos, desde los más sencillos a los más sofisticados, creados usando construcciones de símbolos que, como el lenguaje humano, contienen significado a distintos niveles.
Entender su funcionamiento básico nos permite transitar desde el papel de usuarios pasivos y a merced de imposiciones o errores, a usuarios críticos y -quién sabe- creadores.
Los precursores de la programación moderna –Ramon Llull y su Ars Magna, que partía de la cábala y la astrología árabe; Atanasio Kircher y su actualización del método lógico de Llull; Gottfried Leibniz y su análisis matemático de la realidad a partir del trabajo de los anteriores; Ada Lovelace y su invención del algoritmo- intuyeron el potencial de idear una “máquina lógica”, o dispositivo que interpreta y modifica secuencias de datos a partir de respuestas lógicas definidas por el programador.
El primer algoritmo
Siglos después, la intuición de Llull, Kircher, Leibniz o Lovelace ha dado forma a los algoritmos modernos y las primeras aproximaciones a la inteligencia artificial.
Ningún programador sensato pretende traer a la luz una criatura como Frankenstein o el moderno Prometeo, concebida por Mary Shelley, pero sí alumbrar sofisticadas creaciones con representación virtual o incluso con vistas a aplicaciones robóticas.
(Imagen: Ada Lovelace retratada en 1836 a los 21 años; concibió el primer algoritmo traduciendo del italiano una obra sobre la máquina analítica de Charles Babbage)
Ada Lovelace, fundadora de la ciencia computacional al describir el potencial de las máquinas analíticas a partir de algoritmos o secuencias de órdenes personalizables, conoció seguramente la obra de Mary Shelley antes de su publicación, ya que la escritora era amiga de la familia. Lovelace era hija de Lord Byron.
Los inicios emergentistas de la informática moderna
Los inicios románticos de la informática moderna evocan el concepto de emergentismo, o aquellos resultados de un sistema que no pueden reducirse a la suma de las propiedades de las partes constituyentes: un hormiguero es más inteligente que la suma de sus hormigas.
Esta mentalidad romántica o concepción orgánica (¿mística?) de la realidad fue necesaria para convertir una máquina analítica anodina, como la diseñada por Charles Babbage, en una computadora en potencia (Ada Lovelace estudiando el dispositivo de Babbage y concluyendo que servía para mucho más de para lo que había sido diseñado).
De ser posible, la inteligencia artificial surgirá a partir de una mejora emergentista de los algoritmos actuales: el todo deberá tener una inteligencia superior a la suma de las partes.
Primeros pasos en el mundo de la programación
El potencial de la programación es tal que padres, tutores y escuelas de todo el mundo se preguntan si la programación orientada a objetos, o versión moderna e interdisciplinar de la programación lógica, es la lingua franca de las próximas décadas.
Con el surgimiento de placas base y placas computadora programables, así como todo tipo de sensores modulares, padres y niños de todo el mundo tienen a su alcance las herramientas para concebir sus propios algoritmos informáticos y robots; no obstante, la curva de aprendizaje se mantiene pronunciada y cualquiera que pretenda idear en su rincón de programación o cacharreo su “moderno Prometeo” particular, deberá eludir la frustración de infinidad de lenguajes y métodos para hacer cosas similares.
Otra opción menos enriquecedora es optar por métodos comerciales de programación orientada a objetos y aplicaciones prácticas de este aprendizaje (tanto en forma de programas informáticos -juegos, aplicaciones, etc.- como en robótica).
Marcas como LEGO han desarrollado sus propios sensores básicos para una introducción limitada a la programación y la robótica.
Opción simplificada, lenguaje genérico o apuesta por un lenguaje concreto
Como ocurría con el latín en la era de la imprenta, no todos las personas cultivadas del futuro sabrán programar, pero deberán contar con, al menos, las nociones básicas que les permitan interpretar o personalizar algoritmos.
Expertos en ciencia computacional y pedagogos dirimen si lo mejor es:
- enseñar programación básica usando un lenguaje simplificado (Smalltalk es un lenguaje de programación en toda regla -un entorno con objetos comunicándose entre sí- diseñado para niños y entornos educativos, creado en 1980 en el PARC de Xerox, en Silicon Valley, el mismo lugar donde se inspiraron Steve Jobs y Bill Gates);
- mostrar nociones básicas que comparten todos los lenguajes de programación orientada a objetos (algo así como un esperanto de este tipo de programación, que permitiera luego aprender con facilidad Python, Ruby o cualquier otro lenguaje);
- u optar desde el principio por un lenguaje de programación concreto (corriendo el riesgo de elegir un sistema que cayera en desuso o fuera superado por otros): el educador y programador informático Nicholas Tollervey aboga por el uso en educación del lenguaje Python, apreciado por la claridad y consistencia de su estructura, sin necesidad de pasar primero por Smalltalk (Tollervey es autor del libro Python in education).
La importancia de las nociones básicas
La idea de enseñar programación avanzada en la educación primaria no es nueva. Ya en los 80 del siglo pasado, cuando la Internet comercial no había aparecido y apenas despegaba la informática personal, escuelas y padres apostaron por enseñar BASIC y lenguajes de programación similares, en desuso poco después.
Antes de ser capaces de crear algoritmos y aplicaciones propias, o de programar las acciones de un robot sencillo, es preferible empezar por las nociones esenciales de un lenguaje de programación que se comporte como los lenguajes modernos que propulsan hoy todo tipo de aplicaciones, desde los mayores portales de Internet hasta aviones y factorías automatizadas.
La programación orientada a objetos se ha impuesto al paradigma de programación por procedimientos o funcional, basado en rutinas y estructuras de datos.
Programar por objetos: libertad para crear
La programación orientada a objetos no se obsesiona con el uso de complejas rutinas y sub-rutinas aplicadas sin espacio para ningún margen de error, sino que concibe una tarea de programación como un contexto (interfaz, entorno) que contiene objetos, cada uno de los cuales combina:
- un comportamiento (métodos);
- e información (atributos).
Entre las ventajas de esta orientación a objetos, en lugar de optar por la opción por procedimientos o funcional, destacan:
- va más al grano: se centra en información, en lugar de obsesionarse en el procedimiento;
- los programas se dividen en tantos objetos como uno quiera;
- la información de cada objeto está oculta y no se comparte con funciones externas;
- los objetos se pueden comunicar entre sí a través de funciones;
- facilidad para añadir nuevos datos y funciones a medida que es necesario;
- fácil mantenimiento: como ocurre con un texto, es sencillo corregir y “mejorar” cada párrafo, manteniendo su significado esencial.
Procedimientos vs. objetos
La programación por procedimientos usa módulos para comunicarse con una estructura de datos general, mientras que la programación orientada a objetos es más flexible y se comporta de un modo más similar al lenguaje humano, ya que cada objeto tiene su propia “semántica” y opera su propia estructura de datos.
Código (secuencias de instrucciones) y datos (información con la que operan las instrucciones) se mantienen de forma separada en la programación por procedimientos, pero conviven en la programación orientada a objetos.
Esta diferencia estructural explica el ascenso de los lenguajes orientados a objetos, más flexibles, personalizables y sencillos de modificar, ya que en ellos se pueden “importar” objetos que el programador sitúa en el contexto más conveniente, con atributos o clases que equivalen a la “receta” o definición de cada objeto.
Una programación platónica
La ventaja de iniciarse en programación usando un lenguaje orientado a objetos es su paralelismo con el mundo físico. Esta modalidad de programación imita la realidad, priorizando información y acciones concretas, en lugar de repetir rígidos y complejos procesos lógicos.
En el mundo real, estamos rodeados de objetos con unas determinadas características genéricas. Definimos al ser humano por unas características comunes (bipedismo, lenguaje, etc.), así como atributos y comportamientos propios de distintas etnias y culturas. La “clase” ser humano permite definir el “objeto” ser humano.
Los seres humanos conviven en el mundo real con otras “cosas” u “objetos”, ya sean otros humanos, organismos vivos u objetos inanimados, que interactúan entre sí a partir de unos patrones que pueden describirse a partir de una lógica o categorización básica.
Un reloj genérico (“clase”) y un reloj concreto (“objeto”)
La POO es el método de representación computacional de estos conceptos del mundo real (“objetos”) y sus atributos o comportamiento (a partir de la “receta” o “clase” que los define). Cada objeto combina datos y procedimientos, con librerías para añadir más funcionalidad si fuera necesario.
Esta capacidad para heredar atributos permite crear cualquier aplicación imaginable.
Para crear un reloj concreto (objeto), hay que definir primero el código del reloj genérico o “clase” que representa a todos los relojes (proceso de recopilación de código conocido como “encapsulamiento”); si queremos añadir una alarma a este reloj y hacer que ésta suene (proceso de “herencia”) o tenga un determinado aspecto (“polimorfismo”), hay que usar librerías y atributos para otorgar al objeto el comportamiento deseado.
No es casual que la POO remonte sus orígenes a conceptos filosóficos como la distinción entre un objeto particular y su forma ideal o universal.
En otras palabras, Smalltalk, Python, Ruby o PHP, entre otros, son lenguajes inspirados en el método platónico de interpretación de la realidad (realismo platónico): se invoca primero un ideal de objeto genérico, para luego crear cuantas modificaciones sean necesarias invocando atributos de distintas librerías.
Propiedades y métodos
Un objeto (u objeto genérico, algo así como su ideal platónico, llamado “clase”) tiene propiedades (datos) y un comportamiento definido en posibles acciones (“método” o “mensaje”).
El objeto “ventana” tiene métodos que definen funciones como “abrir” y “cerrar”. Hay métodos, como el área o superficie, que se pueden usar en distintas clases u objetos: por ejemplo, método “área” (superficie) de los objetos “rectángulo”, “círculo”, etc.
Además de un comportamiento definible a través del atributo “método”, las clases y objetos incluyen “variables” o “campos”, que definen la información encapsulada en una clase u objeto. Por ejemplo, la clase “alumnos” tendría la variable “nombre”, donde cada objeto (alumno) tendría su propio valor (nombre) en esta variable.
Clases (ideales platónicos) y objetos (cosas definidas a partir de la “receta” que incluye “clases”) aumentan su precisión y flexibilidad con su “método” (comportamiento, definido por una serie de “funciones” o acciones posibles) y “variables” (cada atributo tiene su descripción encapsulada).
Un camión es un vehículo, pero no todos los vehículos son camiones
Para idear un camión de gran tonelaje, es necesario contar primero con el “encapsulamiento” de un vehículo a motor (el código que define este tipo de objetos), para luego recurrir a los conceptos de “herencia” y “polimorfismo” que permitirán definir el tipo y potencia del motor, el tamaño, el número de ruedas, la estética, etc.
El “polimorfismo” permite que cada vehículo sea distinto, manteniendo la “clase” o atributos esenciales que definen “vehículo”. Los atributos “hereditarios” explican por qué un camión o un auto pertenecen a la clase “vehículo”, pero un “vehículo” no es sólo el objeto “camión”.
Finalmente, el camión se comportará como tal a partir de las funciones y métodos definidos (“acciones”).
Partiendo desde el ideal genérico o universal, moldeamos el objeto personalizado y sus acciones como si fuéramos un demiurgo dentro de un universo perfectamente delimitado: el programa, aplicación, juego, etc.
POO para niños y principiantes
Este universo o contexto, la interfaz en la que actúa el objeto u objetos con el resto del programa, se comporta según los atributos especificados, de tal manera que el camión reacciona a cada función o llamada de manera apropiada: girar a la izquierda o derecha, frenar, acelerar.
Los programadores, en esencia, modelan objetos a partir de ideales y destreza para personalizar estos ideales:
- los objetos tienen un estado (definido con variables e información);
- los objetos desarrollan acciones (a partir de métodos, cada uno de los cuales expresa una función);
- los objetos se crean a partir de objetos previos o clases (herencia).
Cualquier método de programación para niños o principiantes en ciencia computacional debe tener en cuenta el contexto y objetivo básico de la programación orientada a objetos: identificar todos los objetos que hay que manipular, definir las relaciones que éstos tienen entre sí, y modelar su comportamiento.
Una respuesta inequívoca… o un algoritmo
Estudios para aplicar cursos de programación orientada a objetos en educación primaria argumentan que nociones básicas de este tipo de lenguajes reforzarían el proceso de pensamiento abstracto.
Como si se tratara de una aplicación práctica, adaptada a las necesidades actuales y ampliada del realismo platónico, la POO permite estructurar ideas complejas, historias o discursos coherentes desde lo concreto a lo general.
(Imagen: primer algoritmo publicado, obra de Ada Lovelace, hija del poeta romántico Lord Byron)
A diferencia de la necesidad de concreción matemática de cualquier proceso puramente lógico, la programación con objetos no se conforma con invitar al pupilo a resolver un problema buscando una única respuesta, sino que requeriría el diseño de un “método para resolver todos los problemas similares al presentado”.
En otras palabras, el alumno aprendería a diseñar un algoritmo para resolver todos los problemas similares al presentado.
Sobre entender el valor de la tecnología que nos rodea
El diseño del algoritmo requeriría:
- reflexionar sobre la metodología: describir procesos con precisión y de manera abstracta, razonar sobre el nivel de precisión y las posibles alternativas, analizar su eficiencia, etc.;
- y definir la información de los objetos y la relación entre ellos: tipologías -con jerarquías, composición, etc.-, estructuras -relaciones jerárquicas, mapas de ideas-, patrones -flujo de datos, comportamiento de la aplicación-, etc.
Contar con nociones básicas de programación orientada a objetos trasciende las fronteras de la propia programación, y aprender ciencia computacional básica no implica que todos los alumnos de hoy aspiren a ser ingenieros de programación en el futuro.
Sobre el papel, explica Irena Krajnović, Ljubica Bakić-Tomić y Vesna Markovac, firmantes de un estudio de la Universidad de Zagreb que analiza el impacto de la programación por objetos en educación primaria, “ciudadanos y cargos electos con incluso un entendimiento limitado [de la materia] tomarán mejores decisiones sobre el uso de la tecnología”.
La vertiente polímata de la programación
Crear un programa básico (sea un juego, una aplicación web o de teléfono, etc.) demanda el uso de varias disciplinas, explican los autores del estudio:
- atributos lingüísticos (desarrollo de un relato, uso correcto de distintos registros del lenguaje, comprensión de la importancia de ser precisos y optar por palabras y expresiones que digan más con menos, etc.);
- empleo de artes visuales: dibujo, animación, etc.;
- música: sonidos, interacción entre personajes en el caso de juegos, etc.;
- física: en juegos, interacción en un mundo consistente, sometido a leyes;
- educación física;
- filosofía -cultivo de la lógica y la retórica-, historia, geografía, química, biología, etc.
La programación orientada a objetos es, por tanto, una puerta para completar el desarrollo intelectual, con oportunidades para estimular el espíritu polímata y el pensamiento abstracto, útiles durante el resto de la vida.
La candidatura de Python
Pese a los beneficios potenciales, la curva de aprendizaje necesaria para enseñar y aprender programación orientada a objetos evita, de momento, que esta disciplina se integre en el currículo de los niños que empiecen el equivalente al segundo grado estadounidense (inicios de la educación secundaria obligatoria en la mayoría de países).
Los argumentos del experto en programación en entornos educativos Nicholas Tollervey para optar por el lenguaje Python sobre cualquier otro rival tienen suficiente peso como para ser considerados.
En su opinión, Python es estructurado, intuitivo y se ahorra símbolos complejos para anotar la sintaxis relacionada con funciones (métodos) y otras acciones, que se indican con una simple sangría (margen adicional con la tecla de tabulación).
Asimismo, la disciplina requerida para escribir código con un lenguaje como Python es compatible y refuerza el uso de gramática y sintaxis.
La Python Software Foundation ha recopilado una lista de recursos sobre Python en educación.
Lenguajes POO para niños
Nicholas Tollervey: “En síntesis, ya que uno no debe concentrarse para leer código Python, uno puede depositar mayor esfuerzo en entenderlo. Cualquier cosa que reduzca el esfuerzo requerido para captar el interés en programación es positivo en un contexto educativo (de hecho, uno podría argumentar que esto es así en cualquier contexto)”.
Conociendo las nociones básicas y ventajas potenciales de la programación orientada a objetos en educación primaria y secundaria, ¿qué recursos existen para valorar una asignatura basada en estas técnicas de computación?
Desde el surgimiento de Smalltalk en 1980, el primer lenguaje de programación sobre objetos para contextos educativos, han surgido otros lenguajes concebidos para reducir la curva de aprendizaje:
1. Scratch
Concebido por programadores del MIT para crear aplicaciones, juegos, animaciones e historias interactivas. Recomendada para niños de 8 a 16 años.
Compatible con Windows y Mac OS X e interfaz para programar los robots de la serie LEGO Mindstorms.
2. Squeak
Adaptación de código abierto de Smalltalk para actualizarlo y facilitar su aprendizaje, debido a la evolución de la informática desde que el proyecto fuera concebido a inicios de los 80 para los primeros ordenadores de Apple (antes de que en 1984 surgiera el primer Macintosh).
Compatible con Windows, Mac OS X, Linux/Unix e incluso OS/2 Warp.
3. Alice
Toma el nombre de “Alicia en el país de las maravillas” y, como el mundo de Lewis Carroll, el lenguaje pretende erigirse en contexto para crear cualquier experiencia, desde juegos interactivos a animaciones y vídeos.
El lenguaje fue creado por un equipo de la Universidad de Virginia y posteriormente mantenido por la Universidad Carnegie Mellon.
El entorno permite manipular y probar los objetos durante el proceso.
Compatible con Windows, Mac OS X y Linux.
4. Go
Creado por Google como proyecto de código abierto como lenguaje sencillo más allá de la distinción por edades.
Go es un esfuerzo para lograr el equilibrio entre compilación eficiente, rapidez de ejecución y facilidad de programación.
El proyecto tiene una mayor curva de aprendizaje, aunque el respaldo de Google garantiza su mantenimiento y popularidad a largo plazo.
Su uso doméstico o en las aulas carece, de momento, de la sencillez de las tres alternativas anteriores.
Aplicaciones web para aprender nociones básicas de programación
Varios sitios web muestran algunas nociones de programación orientada a objetos, aunque a menudo priorizan la expresión gráfica de la actividad de programar por encima de las nociones educativas interdisciplinares.
- Code.org (web, gratuita): muestra nociones básicas de JavaScript (un lenguaje para aplicaciones dinámicas en Internet que no puede considerarse orientado a objetos) a la vez que se crean dibujos;
- Tynker (web, versión gratuita y de pago): plataforma web con nociones de programación orientada a objetos y recursos para padres, tutores y maestros;
- Otras alternativas menos flexibles que incluyen nociones básicas de programación orientada a objetos: GameStar Mechanic (web, 2 dólares por estudiante, 7-14 años); Daisy the Dinosaur (iOS, gratuita); Cargo-Bot (iOS, gratuita); Hopscotch (iOS, gratuita); Move the Turtle (iOS, 2,99 dólares).
Recursos para considerar en estudios de viabilidad y planes educativos
Maestros y responsables educativos tienen al alcance varios ensayos y recursos que (mayoritariamente en inglés) exponen las ventajas de los principales lenguajes de programación orientada a objetos.
La mayoría de los lenguajes de programación son de código abierto y están disponibles para la descarga e instalación gratuita.
También existe amplia documentación, debidamente mantenida y promovida tanto por individuos como por empresas tecnológicas, principales valedoras (y a menudo promotoras) del avance de los principales lenguajes.
Descodificar la realidad
Del mismo modo que hay razones de peso para considerar la candidatura de Python como lenguaje de programación en las aulas, otros lenguajes, simplificados para niños o no, son igualmente viables.
Go es, además de la apuesta de Google, un lenguaje concebido estructuralmente para facilitar la tarea de programar.
Filosofía, lógica, matemáticas y lenguaje están más interrelacionados de lo que pensamos.
Contar con nociones básicas de programación es el primer paso para despertar la curiosidad intelectual desde un ámbito más y convertirse en consumidores críticos y creadores, en lugar de sujetos pasivos de un mundo tecnológico cada vez más tupido, urdido con estas herramientas.