3 de agosto de 2016

Ada Lovelace: Pionera de la programación

Esta entrada del blog de EduPython fue elaborada por mi buena amiga y ex-alumna Samantha Montserrat Ponce Aparicio, quien se tomó el tiempo para leer y escribir sus impresiones del libro titulado “Ada, the Enchantress of Numbers: Poetical Science” de Betty Alexandra Toole, publicado por Critical Connection en octubre del 2010.
Samantha es una de las mujeres programadoras más talentosas que he conocido. Actualmente estudia la carrera de Ingeniero en Sistemas Computacionales en el Tecnológico de Monterrey, Campus Estado de México, y está por graduarse en unos pocos meses.
Es un gran gusto y honor tener a Samantha como la primera autora invitada del blog de EduPython. 
Ariel Ortiz.
Agosto, 2016.


Antes de leer sobre la vida de Ada Lovelace, lo único que sabía es que era considerada la primera programadora. Nunca se me ocurrió averiguar qué programó, en qué computadora, cómo era su vida y si realmente había sido la primera persona en programar.

Los primeros años de vida de Ada

La vida de Ada Lovelace fue verdaderamente complicada. Fue hija de Lord Byron, sí, el poeta romántico, y Lady Byron quienes se separaron unos meses después de su nacimiento por las diferencias de pensamiento que tenían, ella pensaba en números y él en versos.

Ada de niña, retrato en exhibición
en Somerville College, Oxford.

Augusta Ada Byron nació en Londres el 10 de diciembre de 1815. Después de la separación, Lady Byron se quedó con la custodia de Ada y decidió educarla promoviendo en ella el gusto por la ciencia y las matemáticas, con la esperanza de que no fuera a seguir los malos pasos de su padre en el mundo del arte y la poesía. Ada aprendió a concretar ideas en forma de bloques en lugar de simplemente seguir la teoría, a pesar de que en ese tiempo solamente se utilizaban conceptos intangibles, incluso para enseñar a los niños.

El poeta George Gordon Byron, padre de Ada.

Uno de los datos tristes sobre Ada es que nunca conoció a su padre. Él murió en abril de 1824 y ella solamente lo vio en un retrato poco antes de cumplir 20 años. Por eso resintió a su madre durante toda su vida.


Al no tener hermanos, decidió enfocarse en observar a su gato Mrs. Puff, porque todos sabemos que la vida con gatos es mejor. A los 12 años decidió que quería volar, así que después de investigar e imaginar, escribió todo lo que encontró en un libro llamado Flyology, pero como su madre se burló de ella, abandonó el proyecto, a pesar de que sus teorías eran bastante acertadas. William Henson utilizó las mismas ideas para el diseño de su Aerial Steam Carriage, también llamado Ariel, como un profesor que conozco ☺.

Sus tutores se quejaban porque ella cuestionaba todo lo que enseñaban. Siempre buscó aplicar conceptos matemáticos en juegos, diagramas y metáforas, pues esa era la forma en la que ella aprendía mejor.

Después de haber estado enferma y en cama por tres años, decidió que además de estudiar matemáticas, quería aprender música y equitación. Cuando leí sobre esto me sentí identificada con ella, porque toda la vida me han gustado las matemáticas y las computadoras, pero también me gusta cantar, bailar y probar artes nuevas, por ejemplo, hace pocos meses empecé a tomar clases de danza aérea en telas.

La máquina analítica

Cuando Ada tenía casi 18 años conoció a Charles Babbage, y la vida de ambos cambió. Charles Babbage es conocido por haber inventado la primera computadora mecánica, que se programaba por medio de tarjetas perforadas. Su único y gran problema es que el gobierno no le daba los fondos necesarios para sus proyectos.

Charles Babbage, matemático,
filósofo, ingeniero e inventor.

Es ahí cuando Ada se ofreció a hacer notas sobre su invento, la máquina analítica, para conseguir fondos para toda la investigación de Babbage. En esas notas, Ada incluía diagramas, tablas y párrafos enteros sobre el poder de la máquina analítica. Por primera vez se utilizaron conceptos tales como: ciclo, índice y paralelismo, los cuales son básicos en la programación hoy en día.

Máquina analítica de Charles Babbage.
Ejemplar en exhibición en el museo de ciencia de
Londres. Solo una parte de esta máquina
se construyó antes de su muerte en 1871.

Como era muy importante destacar sobre invenciones anteriores, incluyendo la máquina diferencial diseñada también por Babbage, Ada se dio a la tarea de buscar un problema que solo pudiera resolverse con la máquina analítica. El problema que finalmente escogió y programó fue el de los números de Bernoulli, por esto se dice que ella fue la primera programadora. Lo cierto es que Babbage fue el primer programador, ya que tenía algunos ejemplos para poder probar su máquina, pero Ada fue quien documentó un programa computacional completo por primera vez.

El legado de Ada

Lo que más me encanta de Ada es su forma de pensar. Siempre cuestionaba todo y no se quedaba callada si no entendía algún concepto o no le parecía correcto. Quería aprender los principios y saber porqué las cosas eran como decían ser. Su pensamiento artístico le ayudaba a ver las matemáticas desde otro punto de vista y eso fue su gran colaboración con el trabajo de Babbage. Estoy segura de que sin las notas de Ada, la máquina analítica de Babbage hubiera pasado desapercibida, ya que ni el mismo Babbage sabía el poder de su invento hasta que Ada comenzó a ayudarlo.

Ada era, a mi parecer, bastante popular, o por lo menos se juntaba con personas muy reconocidas. Su tutor por un tiempo fue Augustus De Morgan, quien hizo las leyes de De Morgan, su mejor amigo fue Charles Babbage, sus amigos fueron Sir David Brewster, el inventor del caleidoscopio, Andrew Crosse, conocido por la electrocristalización, Charles Dickens, Michael Faraday y Florence Nightingale.

Se casó con William King en 1835 y en 1838 se volvieron conde y condesa de Lovelace, de ahí su nombre. Durante toda su vida se enfermó bastante y terminó muriendo en 1852 a la temprana edad de 37 años.

Daguerrotipo de Augusta Ada King,
Condesa de Lovelace, 1844.

Me parece importante que las personas en el mundo de la programación conozcan sobre Ada Lovelace, en especial las mujeres, para que se den cuenta que una mentalidad diferente puede lograr grandes cosas. Ada, a pesar de haber tenido una vida corta, hizo una contribución tan grande que incluso existe un importante lenguaje de programación que lleva su nombre.


Es sorprendente lo que se puede lograr con una forma diferente de pensar, puede que con eso logremos cosas aún más grandes, superando incluso a la invención de la computadora.

Apéndice: Los números de Bernoulli

El siguiente diagrama podría ser considerado el primer programa computacional publicado. Describe la manera de calcular los números de Bernoulli utilizando la máquina analítica de Charles Babbage:

Diagrama para calcular los números de Bernoulli.


Los números de Bernoulli se utilizan en algunas series de expansión para diferentes funciones (trigonométricas, hiperbólicas, gamma, etc.) y son extremadamente importantes en el análisis y la teoría de números.

De manera simplificada, para evitar meternos en demasiados detalles, el k-ésimo número de Bernoulli \(B_k\) se define usando la siguiente relación de recurrencia: \begin{equation} B_k = \left\{\begin{matrix} 1 & \textrm{si} \;\; k = 0\\ - \sum\limits_{i = 0}^{k - 1} \binom{k}{i} \frac{B_i}{k + 1 - i} & \textrm{si} \;\; k > 0 \end{matrix}\right. \end{equation} La fórmula anterior utiliza el coeficiente binomial, el cual se define de esta manera: \begin{equation*} \binom{k}{i} = \frac{k!}{i! \;(k-i)!} \end{equation*} El siguiente código es la traducción directa a Python 3 de estas dos fórmulas:

from math import factorial

def binomial(k, i):
    """Regresa el coeficiente binomial C(k, i),
    es decir, el número de formas distintas de
    seleccionar i elementos a partir de un
    conjunto de tamaño k.
    """
    return (factorial(k) //
            (factorial(i) * factorial(k - i)))

def bernoulli(k):
    """Regresa el k-ésimo elemento de la
    secuencia de números de Beroulli.
    """
    if k == 0:
        return 1
    else:
        return -sum([binomial(k, i) * bernoulli(i)
                     / (k + 1 - i)
                     for i in range(k)])
Con esto podemos usar el siguiente ciclo for para imprimir los números de Bernoulli B0 al B20:
for i in range(21):
    print('B({:2}) = {:10.5f}'.format(i, bernoulli(i)))
El uso del método format() permite que la salida aparezca adecuadamente alineada y con exactamente cinco dígitos después del punto decimal. La salida es la siguiente:
B( 0) =    1.00000
B( 1) =   -0.50000
B( 2) =    0.16667
B( 3) =   -0.00000
B( 4) =   -0.03333
B( 5) =   -0.00000
B( 6) =    0.02381
B( 7) =    0.00000
B( 8) =   -0.03333
B( 9) =   -0.00000
B(10) =    0.07576
B(11) =   -0.00000
B(12) =   -0.25311
B(13) =    0.00000
B(14) =    1.16667
B(15) =   -0.00000
B(16) =   -7.09216
B(17) =    0.00000
B(18) =   54.97118
B(19) =   -0.00000
B(20) = -529.12424
Vale la pena notar que Bk = 0 para todos los valores de k impares, con la excepción de k = 1.

Es conveniente comentar también que nuestra implementación es extremadamente ineficiente. Entre más grande sea el valor de k el programa se vuelve perceptiblemente más lento. Alternativamente, el algoritmo de Akiyama–Tanigawa permite calcular los números de Bernoulli de manera optimizada. El sitio de RosettaCode.org muestra cómo implementar dicho algoritmo usando Python y otra treintena de lenguajes de programación.