Siempre he sentido una inmensa fascinación por las formas y figuras que se encuentran en la naturaleza. El darme cuenta de los intrincados patrones presentes en los árboles, las hojas, el pelaje de los animales y las puntas de nuestros dedos fue lo que me llevó a querer investigar estos patrones desde un punto de vista matemático-computacional.
Uno de mis artículos científicos preferidos fue escrito por Alan Turing en 1952: The Chemical Basis of Morphogenesis (“La base química de la morfogénesis”). En este artículo, Turing presentó un conjunto de ecuaciones para modelar cambios en el tiempo y el espacio que nos permiten describir y descubrir patrones que se asemejan a muchos de los que podemos encontrar en la naturaleza.
A este tipo de modelados se les conoce como sistemas de reacción-difusión y pueden utilizarse para estudiar el comportamiento de distintos fenómenos, como pueden ser los cambios de concentración de una o varias sustancias químicas.
Y como creo que la diferencia entre escribir y programar es como la diferencia entre decir y hacer, ¡vamos a implementar estos modelos y a crear algunos patrones con el poder de la computabilidad!
Reducir el sistema a una sola sustancia
Cuando se dejan caer unas gotas de tinta en el agua, la tinta se traslada de los puntos de mayor concentración a los de menor concentración. Este proceso se llama difusión, y normalmente se considera un proceso gradual y fluido que busca la “estabilidad de las concentraciones” en los distintos puntos del espacio. Se puede modelar matemáticamente con la siguiente ecuación:
Comprender la fórmula a medida que la implementamos
Lo que la ecuación está tratando de hacer es definir un valor de concentración para cada punto en el espacio, que cambiará con el tiempo. Es decir, este valor depende de la posición x y de un tiempo t.
C(x, t)
Ahora imaginemos que el tiempo es discreto: t
puede tomar valores en [0 1 2 3 4 5 6 7 ...]
Para cada momento t
y para cada punto en el espacio x
, definimos C
, la concentración de tinta.
C se define de acuerdo a una constante que representa la velocidad de difusión D
y el valor obtenido de cómo la concentración en x
se modificó respecto a su entorno en el instante de tiempo anterior N(x, t-1)
; por ejemplo, tomando la diferencia entre el valor de C
en x
y el promedio de su entorno en t-1
.
Entonces, la interpretación discreta de la fórmula se vería así:
C(x, t) = D * N(x, t-1)
Implementación con Three.js + WebGL
Para crear una visualización de este sistema, es importante tomar en cuenta que se necesita conocer el estado anterior para poder calcular los valores actuales. Dicho de otra manera, los valores de salida (concentraciones) del último tiempo computado serán utilizados como los valores de entrada del tiempo actual. A esto se le conoce como sistema de feedback o retroalimentación, y puede ser considerado como una secuencia de frames:
Cada frame o cuadrado blanco muestra los valores de color en cada posición de la pantalla (píxel) representados por un valor numérico, y las flechas negras son el algoritmo necesario para actualizar dichos valores.
En un proceso de difusión, a cada píxel se le asigna un valor que representa la concentración o saturación del color. Volviendo al ejemplo de la tinta: los espacios negros no tienen concentración de tinta, cualquier otro color representa cuanta tinta hay en dicha posición.
Usé WebGL para implementar el algoritmo de difusión, y Three.js para renderizar cada frame. Utilicé la técnica de renderizado llamada ping pong, que nos permite “guardar” el frame anterior y usar sus valores para definir los del siguiente.
Así es como estructuré un script de Three.js:
Definición de escenas:
var camera,renderer,scene;
function setupMainScene(){
...
}
var bufferScene ,ping ,pong, renderTargetParams;
function setupBufferScene(){
...
//initialize textures ping and pong
}
Se inicializan las escenas:
var bufferUniforms, bufferMaterial, plane, bufferObject;
function initBufferScene(){
bufferUniforms = {
...
};
bufferMaterial = new THREE.ShaderMaterial({
//uniforms, and shaders involved
});
plane = new THREE.PlaneBufferGeometry( 2, 2 );
bufferObject = new THREE.Mesh( plane, bufferMaterial );
bufferScene.add(bufferObject);
}
var finalMaterial,quad;
function initMainScene(){
finalMaterial = new THREE.MeshBasicMaterial({map: ping});
[*]
quad = new THREE.Mesh( plane, finalMaterial );
scene.add(quad);
}
Se renderiza la escena:
function render(){
requestAnimationFrame( render );
//Ping to buffer scene
renderer.setRenderTarget(ping);
renderer.render(bufferScene, camera);
renderer.setRenderTarget(null);
renderer.clear();
//Swap ping and pong
let temp = pong;
pong = ping;
ping = temp;
//Update uniforms
...
//Draw to screen
renderer.render( scene, camera );
}
Comprender cómo funciona la técnica ping pong
- STEP 0: Se configuran las dos escenas, la principal y la “buffereada” (la que almacena los datos de la escena principal en una instancia anterior). Se inicializan ambas texturas, ping y pong, cada una para su respectiva escena.
- STEP 1: Se guarda la textura ping en la escena buffer.
- STEP 2-3-4: Se intercambian las texturas.
- STEP 5: Se actualizan los materiales de ambas escenas.
Para experimentar con el algoritmo de difusión y las visualizaciones, puedes consultar el código acá y probar la demo acá.
Profundizando en los sistemas de reacción-difusión
Ya tenemos una idea de lo que es la difusión, un sistema que involucra un único químico. Supongamos ahora que nuestro sistema tiene dos sustancias.
Imagina cómo se mueven estas sustancias en el espacio. Cada una se difundirá a distinta velocidad.
También van a existir áreas donde ambas sustancias estén presentes, y faltaría ver cómo interactúan o reaccionan entre ellas.
Volviendo al artículo de Turing: él describió un sistema con dos sustancias, e introdujo el nombre de morfógeno (“morphogen”) para designar a una sustancia en dicho sistema.
En la reacción, los morfógenos accionan en direcciones contrarias; esto se conoce como relación de crecimiento-decaimiento o activador-inhibidor. Si la velocidad de decaimiento es más rápida que la de crecimiento, uno esperaría que el sistema se comporte de manera uniforme y estable como en el proceso de difusión. Aquí es donde Turing introdujo la grandiosa idea de la “inestabilidad generada por la difusión”. En este caso, las distintas velocidades de difusión de las sustancias conllevan una asimetría en toda la solución, de modo que bajo ciertas condiciones estas inestabilidades generan la formación de concentraciones en forma de patrones.
Reacción-difusión en las conchas marinas
Reacción-difusión en un pez
Reacción-difusión en un pez
Para aprender más sobre este tema, sugiero leer este artículo sobre la formación de los patrones en los pelajes de los animales.
Implementación con Three.js + WebGL
Para visualizar los sistemas de reacción-difusión podemos usar la técnica *ping pong* explicada anteriormente; con la diferencia de que en cada cuadro puede haber varias iteraciones del algoritmo (flechas que bajan).
Uso del modelo de Gray-Scott
El modelo de Gray-Scott es una simulación de un sistema de reacción-difusión de dos sustancias químicas virtuales en una cuadrícula de dos dimensiones. En este tutorial de Karl Sims se explica cómo funciona el algoritmo; en él se describe la simulación en términos de las siguientes ecuaciones:
Para ser consistentes con nuestra interpretación de los sistemas de difusión, imaginemos de nuevo que el tiempo es discreto. Es decir, t
toma valores en [0 1 2 3 4 5 6 7 …].
Esencialmente, cada celda (x,y) en su cuadrícula tiene una concentración A
de una sustancia química y una B` concentración de la otra. En cada intervalo de tiempo ambos valores se actualizan de acuerdo a:
- Los valores de concentración anteriores.
- Cómo cada uno se difunde.
- Cómo reaccionan ambos.
La reacción depende de dos valores constantes: la velocidad de alimentación (“feed”) y muerte (“kill”). Sólo ciertas combinaciones de estos valores evolucionarán hasta formar un patrón.
Este es un gran recurso para explorar esos valores.
En el enlace de arriba encontrarás una cuadrícula como la siguiente:
El eje horizontal representa los valores de kill y el vertical el de feed. Al hacer clic sobre una celda {kill, feed}
se puede observar cómo el sistema evolucionará.
Es interesante observar que sólo el área verde representa las combinaciones de valores que conducen a la formación de patrones, y son éstas las que queremos explorar en nuestra simulación.
También se puede experimentar con diferentes valores usando la clasificación de Pearson.
En conclusión, terminé por implementar un entorno donde las matemáticas y el arte convergen, lo que permite enriquecer y descubrir nuevas prácticas creativas. ¡Fue una experiencia muy gratificante! Siempre me he sentido fascinada por ambas disciplinas, pero nunca había tenido la oportunidad de fusionarlas —¡hasta ahora!
¡Pruébalo tú!
Aquí puedes probar la demo!
Modelo de Gray-Scott
El código está disponible acá. Para la renderización de patrones el valor de interpolación tiene que ser 0. Hay que tomar en cuenta que para visualizar el modelo Gray-Scott yo cambié de MeshBasicMaterial a ShaderMaterial, ya que agregué un sombreador de color adicional.
Mapped on 3D surfaces:
Agregué un *vertex shader* que me permita mapear la geometría . Puedes consultar el código experimental acá.
Gray-Scott model mixed with video capture:
Una pedagogía analógica: enseñar programación en un centro de detención juvenil
Por Pedro Baumann
En 2016 creamos Vía Código, una organización sin fines de lucro establecida en Lima, Perú, que enseña programación a adolescentes privados de su libertad. Como pueden imaginarse, un entorno como éste plantea obstáculos importantes para cualquier proceso educativo. Uno de los desafíos a superar es que muchos de nuestros estudiantes han atravesado por experiencias traumáticas, y las consecuencias emocionales de éstas se ven exacerbadas bajo las condiciones de encarcelamiento. No se les permite llevar materiales impresos, cuadernos o herramientas de escritura de regreso a los pabellones donde pasan la mayor parte del tiempo, por lo que su experiencia de aprendizaje se limita al momento en que se encuentran en el salón de clases. Además, no tienen acceso a internet, ¡lo que representa en sí un inmenso reto cuando se trata de aprender a programar!
Sabíamos desde el principio que debíamos desarrollar un plan de estudios que tomara en cuenta estos factores y que fuera lo suficientemente riguroso para poder ayudar a los estudiantes a convertirse en desarrolladores de software competentes. Éste tendría que resultarles atractivo y útil desde el primer día. Con esto en mente, creamos un conjunto de principios básicos que guían nuestra estrategia pedagógica y que hemos seguido perfeccionando con el tiempo.
Primer Principio: Eres capaz de construir tu propio futuro
¿Recuerdas la increíble sensación de haber escrito por primera vez un pequeño pedazo de código? A la mayoría de nuestros estudiantes su familia, maestros y otras figuras de poder les han dicho repetidas veces que son tontos o violentos, que no existen muchas opciones para personas como ellos; o que simplemente no tienen lugar en el mundo exterior y ni siquiera tiene caso intentar formar parte de él.
De pronto, cuando comienzan a programar, se sienten poderosos. Pueden comunicarse con la computadora y ésta los entiende. Aprovechamos este efecto transformador para apoyarlos en el desarrollo de su autoestima y creamos con ellos una relación de confianza. ¿Por qué les otorgaríamos tanto poder si nuestra intención fuera aprovecharnos de ellos?
Segundo Principio: La computadora es estúpida
Durante la primera edición del programa nos enfrentamos a una inmensa frustración de parte de los estudiantes. Los Viacoders estaban acostumbrados a verse a sí mismos como malos estudiantes y a pensar que no eran suficientemente inteligentes como para aprender.
Decidimos incluir un módulo de introducción a las ciencias computacionales al inicio del curso. Inspirado en el programa de formación académica CS50 de Harvard, el módulo que implementamos constaba de tres unidades: Cómo funciona el sistema binario; Conceptos básicos del hardware (en un ejercicio para proponer maneras de optimizar el proceso del CPU, ¡uno de los alumnos llegó solo a la idea del Meltdown bug!) y, por último, Introducción a las redes.
Establecer estos conocimientos fundamentales como punto de inicio lo cambió todo. Ahora, en lugar de pensar que no eran suficientemente inteligentes para “hablar el lenguaje de la computadora”, los estudiantes se dieron cuenta de que tal vez la computadora no era lo suficientemente inteligente como para entenderlos y que necesitaban proporcionarle instrucciones mucho más sencillas.
Tercer Principio: Integrar el componente humano y el contenido técnico
Puesto que el proceso de aprendizaje está íntimamente ligado al de crecimiento personal, buscamos integrar las áreas técnica y socioemocional tanto como sea posible. En todo momento tenemos al menos un miembro del equipo en el salón, cuyo rol es ayudar a los estudiantes a manejar su frustración, mediar conflictos y encaminarlos a desarrollar estrategias de resolución de problemas.
Aprovechamos cada oportunidad que se nos presenta para introducir nuevas perspectivas dentro de este ambiente extremadamente tóxico. Por ejemplo, en el módulo sobre HTML semántico los estudiantes crearon un blog que abordaba temas como la vida de programadoras destacadas de la historia, el papel de las mujeres en la música trap o el proyecto Laboratoria (una ONG peruana que enseña desarrollo web a mujeres en situaciones vulnerables). Este ejercicio les alentó a ejercitar y desarrollar sus habilidades de pensamiento crítico.
Cuarto Principio: Entender el valor de tu conocimiento
Después de tres años, la mayoría del personal del Centro de Diagnóstico y Rehabilitación todavía cree que enseñamos Microsoft Office. Estar privado de la libertad en un entorno donde nadie entiende qué es la programación puede resultar alienante. Para combatir esta alienación, desarrollamos distintas estrategias que aportan algo de la “vida real” del exterior y brindan un reconocimiento que los alumnos no obtienen dentro del centro.
Empezamos a tener invitados especiales cada sábado que impartieron talleres a los Viacoders sobre temas como animación con CSS, desarrollo de juegos con Construct2, investigación en UX, branding, etc. Una respetada escuela de desarrollo web en Perú, Area51, aceptó evaluar a los estudiantes y ofrecer un diploma oficial a los que pasaran la prueba. ¡Todos menos uno lo lograron!
Invitamos a las estudiantes de Laboratoria a participar en una dinámica de programación en parejas dentro del centro de detención, ¡lo que resultó ser una de nuestras mejores ideas! Los Viacoders estaban entusiasmados porque habían investigado sobre Laboratoria, y las Laboratorians admiraban a los Viacoders por su habilidad para programar sin tener acceso a internet. También organizamos “Demo Days” en los que funcionarios gubernamentales y gerentes de contratación de compañías de software acudieron al centro de detención para conocer a los estudiantes y ver sus portafolios.
Por último, creamos un programa de amigos por correspondencia en el que a cada estudiante se le asignó un mentor con el que intercambiaría cartas. A algunos estudiantes les resultaba muy difícil escribirle a un completo desconocido; a otros les parecía increíble que una persona de otro país se tomara el tiempo para mandarles una carta, por lo que al principio dudaban que fueran reales. ¡Pero algunos de ellos se mantuvieron en contacto mucho después de que hubiera terminado el curso!
Nuestro mayor hallazgo fue que la programación en una excelente herramienta, no solamente para multiplicar las oportunidades económicas y las posibilidades de conseguir mejores empleos, sino también para desarrollar habilidades cognitivas y capacidad de liderazgo.Trabajar en este proyecto ha sido una experiencia increíble para todos en el equipo de Vía Código. Más importante aún, ha cambiado para siempre la vida de muchos de nuestros estudiantes. ¡Si quieren saber más sobre nosotros, sientanse libres de contactarme!
¿Qué pasó con las mujeres en informática?
Por Carolina Luz Hadad
A veces las personas me preguntan por qué Chicas en Tecnología, nuestra ONG, trata de “forzar” a las adolescentes a elegir una profesión que “no les interesa”. La realidad es que en el camino para descubrir la vocación propia, cada quien puede verse alentado (o desalentado) por distintos factores sociales y culturales. Mis socias cofundadoras y yo estamos escribiendo un libro sobre cómo todos estos factores afectan a las mujeres y a otros grupos excluidos (a través de la crianza, la educación, la presión social y la dinámica de los espacios de trabajo) de manera que les resulta mucho más difícil entrar, permanecer y crecer dentro del mundo de la tecnología. Hoy quiero contarles sobre un hecho poco conocido: las mujeres fuimos mayoría en los primeros días de la informática; sin embargo, hoy representamos menos del 20% en el mundo de la programación.
Desde la década de los 60, las mujeres desempeñamos papeles clave en el avance de la informática. Ada Lovelace es la primera persona que programó en la historia. Las programadoras dela ENIAC en los Estados Unidos y de Clementina en Argentina fueron todas mujeres. Gracias al trabajo que desempeñaron en la NASA, Katherine Johnson y Mary Jackson ayudaron a llevar a la humanidad al espacio por primera vez. Durante décadas, el porcentaje de estudiantes mujeres que ingresaban a carreras relacionadas con la tecnología creció mucho más rápido que el de los estudiantes hombres. Pero este porcentaje primero se estancó y luego se desplomó estrepitosamente.
El caso argentino muestra la misma tendencia, aún más pronunciada. Las mujeres llegamos a constituir el 75% de las estudiantes de Ciencias de la Computación; en la actualidad representamos sólo el 11%. ¿Qué pudo haber ocasionado este abrupto cambio?
En las décadas de los 60 y 70, la carrera de programación se anunciaba como una “profesión apropiada para señoritas”. En el libro ABC de la Chica de Hoy, publicado en España en 1973 y muy popular en Hispanoamérica, se habla de la programación como una buena opción profesional para las mujeres, y señala: “Hoy en día cualquier mujer puede tener cualquier profesión, si es capaz de adaptarse a ella. La frase ¿Para qué, si me voy a casar pronto? no debería influir en tu pensamiento porque, ¿qué ocurriría si un día tu marido se accidentara y no pudiera volver a trabajar? ¿Quién alimentaría entonces a los niños?”. De manera similar, en una entrevista con la Doctora Grace Hooper en la edición de abril de 1967 de la revista Cosmopolitan, ella compara la programación con “planear la cena”.
Sin embargo, cuando las computadoras ingresaron al mercado como artículos de uso personal y se convirtieron en herramientas cotidianas para el trabajo y el juego, la decisión comercial fue que los anuncios estuvieran dirigidos a… redoble de tambores... ¡Los varones! En el comercial de televisión de la primera computadora portable comercial, la IBM 5100, diez hombres explicaban cómo los ordenadores les ayudaban a trabajar de manera más eficiente y hacer crecer su negocio. Mientras tanto, la única mujer que aparecía en el anuncio hacía énfasis en lo difícil que le resultaba tomar decisiones y cuánto le ayudaba la computadora a pensar. Se observa el mismo fenómeno en los anuncios publicitarios de las computadoras domésticas (como la Commodore 64): se representaba siempre a niños (y no niñas) jugando con el ordenador.
A medida que la industria creció, el trabajo de programación se volvió cada vez más demandado y mejor pago. Las empresas necesitaban contratar más gente, rápido. Pero, ¿cómo definir qué habilidades debían tener los solicitantes, si el área era totalmente nueva? Gracias a una investigación realizada por el Washington Post se descubrió que, en un esfuerzo por desmitificar y mejorar el proceso de contratación, la compañía de software System Development Corp. (SDC) encargó a dos psicólogos que crearan un perfil de aptitudes para los candidatos óptimos. Los psicólogos entrevistaron a 1400 ingenieros (1200 de ellos varones) y desarrollaron un perfil de personalidad para predecir quienes tenían mayor probabilidad de convertirse en buenos programadores. La sesgada evaluación concluyó que los hombres eran los candidatos ideales para trabajos de ingeniería. Además, postulaba que las personas extrovertidas o empáticas eran peores candidatos.
Los medios de comunicación contribuyeron a potenciar este estereotipo. En la década de los 80, eran populares las series de televisión y las películas que retrataban a mujeres en diferentes profesiones: estrellas de rock, agentes del FBI, médicos y muchas otras. Pero prácticamente cada vez que una computadora aparecía en pantalla, era operada por un “nerd”: siempre varón, casi siempre blanco, tímido y extraño; inteligente pero poco hábil en lo social. El nerd a menudo se caracterizaba por tener buen corazón o buenas intenciones, lo que terminaba por escudar y justificar su comportamiento misógino. En muchas de estas historias, los nerds utilizan su conocimiento en computación para solucionar sus problemas y “ganarse” a una chica.
Un buen ejemplo de esto es la película de 1985 “Ciencia Loca” (Weird Science), en la que dos nerds de secundaria crean con ayuda de su computadora a una mujer despampanante que les enseña a relacionarse con las chicas. Los niños y jóvenes que crecieron mirando esas películas naturalizaron la representación de las mujeres como objetos y de las computadoras como herramientas para conseguirlas; tampoco cuestionaron que sus profesores les enseñaran el procesamiento de imágenes utilizando una portada de la revista Playboy.
El argumento de que las mujeres no se convierten en programadoras porque no les interesa no tiene respaldo histórico. La profesión nos ha atraído tanto que fuimos las pioneras en la informática. A lo largo de los años, hemos sido expulsadas de la profesión por razones sociales, políticas y económicas. Quienes permanecieron se enfrentaron a los enormes obstáculos de la discriminación, el acoso, la falta de respeto, los techos de cristal y la disparidad en la remuneración en entornos laborales hostiles. Conocer y entender cómo y por qué las mujeres fueron históricamente excluidas del campo de la tecnología puede ayudarnos a descubrir cómo revertir esta tendencia y a construir una industria tecnológica más inclusiva; no solo para las mujeres, sino para todes.