Alan Kay: la historia perdida de la programación orientada a objetos

Hace poco vimos un top de 10 leyendas de la informática, muchos de ustedes se enojaron porque no aparecieron hoy en día grandes figuras de la revolución informática como Steve Jobs, Bill Gates, o Mark Zuckerberg.

Y en mi opinión, ellos no son leyendas de la informática, sino que son leyendas comerciales. Steve Jobs tomó cosas que ya existían y las volvió irresistibles!, Bill Gates tampoco inventó nada, pero puso un computador personal y la copia de un sistema operativo que ya existía en casi todos los hogares del mundo y Mark Zuckerberg no inventó las redes sociales, estas ya existían de hace mucho tiempo. Y en mi opinión, tomar cosas que ya existen y encargarse de distribuirlas de la manera que lo hicieron ellos es un mérito legendario, pero comercial, no informático.


Antes de continuar, puedes leer este post o ver y escuchar esta información en formato de video en nuestro canal de Youtube, te dejamos el link por si prefieres este formato. 😃 👍


PERO!, una de las personas que aparece en este listado es Alan Kay, el creador de la programación orientada a objetos, pero también mencionó que la programación orientada a objetos que implementa C++ y Java no es reconocida por Alan Kay, dándole incluso el calificativo de penoso a java.

Alan Kay
Alan Kay

Entonces, ¿a qué se refería Alan Kay con programación orientada a objetos? La respuesta a continuación.

Historia de la Programación Orientada a Objetos

Hola mundo, y bienvenidos a este post. La programación funcional e imperativa que es utilizada hoy en día tiene años de existir, y ambas fueron exploradas en 1930 con el cálculo lambda de Alonzo Church y la máquina de Turing de Alan Turing. En la tesis de Church Turing, se demuestra que el cálculo lambda y la máquina de Turing son completamente equivalentes, donde todo lo computable por la máquina de Turing es también computable por el cálculo lambda y viceversa.

El cálculo lambda representa una visión de alto nivel, con un enfoque de aplicación de funciones para la computación. Mientras que la máquina de Turing representa una visión de bajo nivel, paso a paso de computación, o en otras palabras, imperativa.

Acá me voy a detener un poco, el cálculo lambda se utiliza para poder representar a nivel humano y matemático el funcionamiento de un código pero sin necesariamente ver la implementación de este. El cálculo lambda tu lo puedes hacer con papel. Es un sistema formal en matemática lógica para expresar computación basado en funciones y variables.

Es un modelo universal que puede ser utilizado para simular máquinas de Turing. Utilizando la matemática en lugar de código de máquina.

Lenguajes de bajo nivel como código de máquina y el lenguaje assembly aparecieron en 1940, y para finales de 1950 aparecieron los primeros lenguajes de alto nivel, como lisp, fortran y COBOL.

Fortan y Cobol fueron desplazados por las familias de C y dialectos de Lisp aún son utilizados hoy, como Clojure o Scheme.

Ambos, programación funcional y programación imperativa tienen sus raíces en las matemáticas y teoría de computación. Pero la programación orientada a objetos fue un término acuñado por Alan Kay en 1966 o 1967, el año no es el claro, porque no hay un registro exacto, pero fue mientras Alan Kay asistía a la universidad.

El término de programación orientada a objetos tuvo su inspiración en Sketchpad, un programa de computación escrito por Ivan Sutherland en 1963, mientras él desarrollaba la tesis para su doctorado, por el cual recibió el Premio Turing en 1988 y el Premio Kyoto en 2012.

Ivan Sutherland usando Sketchpad

Sketchpad fue el primer software que se creó de la familia CAD, donde se podían ver estructuras de objetos en pantallas. Estos objetos podían ser considerados un máster, y sus instancias o más copias de este se llamaban ocurrencias.

El primer lenguaje que se reconoce hoy en día como «orientado a objetos» fue Simula, especificado en 1965, como Sketchpad, Simula tenía objetos, y eventualmente introdujo clases, herencia, sub-clases y métodos virtuales.

Ya que tenemos un poco del contexto histórico, ahora vamos a ver que tenía Alan Kay en su mente.

¿Cómo estaba pensada la Programación Orientada a Objetos?

Su principal idea era encapsular mini-computadoras en software y que estas se comunicaran a través de mensajes para compartir sus datos y de esta manera romper el esquema de estructuras de datos y procedimientos.

Si tuviésemos que dibujar la programación orientada a objetos de Alan Kay sería algo como esto:

Dibujo 1, Programación Orientada a Objetos

Donde tenemos 3 sistemas que pueden ser construidos incluso en distintos lenguajes de programación y estos se envían mensajes para comunicarse entre ellos.

Smalltalk fue desarrollado por Alan Kay, Dan Ingalls, Adele Goldberg y más desarrolladores en Xerox. Este era más considerado orientado a objetos que Simula, tenía objetos, clases, enteros y closures. Las primeras versiones de smalltalk no soportaban las subclases, estas fueron introducidas más adelante por Dan Ingalls.

Logo de SmallTalk
Logo de SmallTalk

Incluso Smalltalk teniendo clases y eventualmente subclases, Smalltalk no se trataba de clases, era un lenguaje funcional inspirado en Lisp y también en Simula y Alan Kay considera que las subclases son una distracción al verdadero beneficio de la orientación a objetos.

Más adelante en su vida, Alan Kay pidió disculpas públicas diciendo que se arrepentía de haber utilizado el término OBJETO, ya que confundió a toda una industria hasta el día de hoy. La idea general que él quería transmitir era mensaje.

Vamos a mencionar ahora qué cosas son esenciales, según Alan Kay, para que un lenguaje tenga una orientación a objetos según su perspectiva:

  • No puede tener un estado mutable compartido, La única forma que el estado de tu aplicación sea mutado es a través de un mensaje. El estado de tu aplicación es controlado solo de manera local.
  • Desacoplado: Los sistemas solo pueden estar acoplados por un emisor y receptor de mensajes y estos sistemas se comunican solo a través de este emisor y receptor.
  • Es adaptable y flexible o resistente a los cambios.

Estas ideas tuvieron su origen en las células debido a la experiencia que tenía Alan Kay en biología y también en los primeros diseños de la Arpanet, que era una versión anterior al Internet que conocemos hoy en día.

Alan Kay también vio que los objetos poseían estructuras algebraicas por lo que se podían esperar algunas garantías de estos objetos sobre el comportamiento que tendrían y esto último se demostró ser cierto, algunas de estás leyeks que él vio hoy en día, les llamamos promesas y lenses, ambos inspirados en la teoría de categorías.

Paremos otro poco más que acá, ya hemos visto varios nombres que podrían ser un poco confusos, y vamos a explicarlos: las promesas son objetos que funcionan como un proxy para un resultado que tiene un valor inicialmente desconocido.

En otras palabras, una promesa es un objeto que se desconoce su valor hasta que esta obtenga el valor que se estaba esperando. En otros lenguajes se llaman futuros, tareas, defer, la implementación de estos puede variar un poco, pero el objetivo es el mismo, obtener un valor en el futuro.

Los lenses te permiten obtener y asignar valores, pero en un estilo funcional.

Teoría de categoría es la formalización de estructuras matemáticas y sus conceptos. Donde tienes grupos de objetos llamados la categoría y tienes distintas transformaciones para llegar de un objeto al otro llamado morfismos.

morfismos

Volviendo al tema principal, con estas cosas, Alan Kay se dio cuenta de que podía realizar verificaciones matemáticas formales con resultados esperables, realización de pruebas superior, ya que con álgebra él podía llegar a los resultados que él quería.

En este aspecto, cuando nos referimos a álgebra, nos referimos a las abstracciones creadas con funciones, las cuales son soportadas por leyes matemáticas y por tests unitarios que estas funciones deben pasar.

Todos estos conceptos fueron olvidados por décadas, pero están volviendo a incluirse hoy en día en los lenguajes modernos, como JavaScript o Python.

¿Entonces… que es un objeto?

¿Qué es un objeto?

Los objetos han tenido una connotación muy diferente a la que Alan Kay se refería, en JavaScript un objeto es un tipo de dato, no tiene implicancias de un lenguaje basado en clases ni tampoco la programación orientada a objetos de Alan Kay.

En general, un objeto hoy en día significa muchísimo menos que lo que le significaba a Alan Kay.

Pero para Alan Kay, la verdadera programación a objetos significa lo siguiente:

  1. Programar con objetos
  2. El estado de estos objetos debe estar encapsulado y no puede ser accedido libremente.
  3. Se deben utilizar mensajes para comunicarse entre los distintos objetos
  4. Y los objetos pueden ser agregados, cambiados y reemplazados en el runtime de nuestra aplicación.

Vamos a hacer un pequeño ejemplo de programación orientada a objetos de Alan Kay, para nuestro emisor y receptor de mensajes utilizaremos la convención de «despachar».

Ejemplo de como se veria la programación orientada a objetos de Alan Kay

Vamos a tener acá una vista, la cual posee un botón, este botón al ser presionado este despachará un evento que dirá guardar.

Mientras tanto, en otro lado, otro objeto tomará este mensaje y cambiará el estado interno de sí mismo, luego de actualizar el estado, este objeto despachará la acción de estado actualizado, y esto será interceptado por otro objeto encargado de actualizar la vista de nuestra aplicación.

A su vez, en la red existe un servidor que recibe este mensaje con los datos que debe guardar, el cual se encargará de despachar un mensaje indicando que hay datos que deben ser guardados, en otro lado se encuentra el servidor de base de datos que recibe este mensaje y así… bueno yo creo que ya entendiste el punto.

Estos componentes ni siquiera tienen por qué estar en la misma máquina, el sistema puede estar completamente descentralizado e incluso en distintas partes del mundo.

Lo bueno que tiene esto es que cualquier objeto o componente de nuestro sistema puede ser reemplazado en caliente sin necesariamente afectar el correcto funcionamiento de este.


Ahora que ya sabes lo que es la orientación a objetos de verdad, como dijo Eric Elliot: es momento de hacerle saber al mundo que su experimento de herencia por clases ha fracasado, y ya es momento de volver a abrazar las matemáticas y las ciencias de la computación para resolver los problemas, ya que en estos principios se fundó el espíritu de la verdadera orientación a objetos.

Eric Eliott
Eric Eliott

Y esto ha sido todo de este post, si te ha encantado, ¡golpea al botón de me gusta!, dejanos un comentario, y visita nuestra Academia Hola Mundo, donde encontrarás todos los cursos para formarte como un desarrollador o desarrolladora.

Y para no perderte nada, no olvides suscribirte a este blog, seguirnos en todas las redes como Youtube, Twitter e Instagram, y por último, te invitamos a escuchar nuestra música «Hola Beats«, diseñada para ayudarte a concentrarte y acompañarte en tu aprendizaje o trabajo, la puedes encontrar en Spotify, Apple Music, Amazon Music, Youtube Music y Deezer.

¡Hasta la próxima!, y chao mundo

Comments (3)

Deja un comentario

Press ESC to close

Descubre más desde Hola Mundo

Suscríbete ahora para seguir leyendo y obtener acceso al archivo completo.

Seguir leyendo