miércoles, agosto 01, 2018

Mundos físicos y mundos digitales

A veces pienso que empezamos a tener, como nunca antes, un serio problema epistemológico para poder definir qué es "real" y  qué es "virtual". Porque, a fin de cuentas, nuestro vínculo con la realidad es básicamente sensorial. Las simulaciones son una ilusión, es cierto, pero que lo sean o no, no depende exclusivamente de su virtualidad. Al menos no necesariamente. En este sentido creo que los nombres que se van imponiendo para nombrar a estas tecnologías resultan un poco confusos. 

De todas formas, no estoy muy segura de que valga la pena polemizar sobre los términos que se van instalando. Se me ocurrió, en cambio, generar un esquema gráfico con algunos ejemplos que permitan pensar a estos recursos tecnológicos como un flujo continuo entre lo físico y lo digital. Esto es, describir toda esta gama de aplicaciones y herramientas tecnológicas como dimensiones que se complementan incluyendo en mayor o menor medida las posiblidades disponibles tanto en el entorno físico como en el entorno digital.

Les comparto mi trabajo:

miércoles, junio 20, 2018

El pensamiento computacional

WING, J. M (2006) Computational Thinking. Communications of the ACM Viewpoint, March 2006, pp. 33-35.

Versión original en inglés: https://www.cs.cmu.edu/~15110-s13/Wing06-ct.pdf

Traducción propia


El pensamiento computacional

Refiere a actitudes y habilidades de aplicación universal no sólo para científicos informáticos sino para todos aquellos interesados
en aprenderlas y utilizarlas.

El pensamiento computacional se construye sobre el potencial y los límites de los procesos informáticos ya sea que estos sean ejecutados por un ser humano o por una máquina. Los métodos y modelos computacionales nos dan el ímpetu necesario para resolver problemas y sistemas de diseño que nadie podría ser capaz de abordar por sí solo. El pensamiento computacional nos enfrenta al enigma de la inteligencia artificial: ¿Qué pueden hacer los humanos mejor que las computadoras? ¿Qué pueden hacer las computadoras mejor que los humanos? Y, fundamentalmente, nos lleva a preguntar: ¿Qué es calculable? Hoy solo podemos responder parcialmente a esas preguntas.

El pensamiento computacional es una habilidad importante para todos, no solo para los informáticos. A la capacidad analítica de cada niño, además de la lecto-escritura y la aritmética, deberíamos agregar el pensamiento computacional. Así como la imprenta facilitó la generalización de las tres Rs [1] resulta muy apropiado, por la similitud de la perspectiva, considerar que la informática y las computadoras puedan facilitar la difusión del pensamiento computacional.

El pensamiento computacional supone resolver problemas, diseñar sistemas y comprender el comportamiento humano tomando como base los conceptos fundamentales de las Ciencias de la Computación. El pensamiento computacional incluye una gama de habilidades mentales que reflejan la amplitud del campo de la informática.

Al tener que resolver un problema en particular, podríamos preguntarnos: ¿Qué tan difícil es de resolver? ¿Cuál es la mejor forma de resolverlo? El marco teórico en el que se basan las Ciencias de la Computación permite responder, con precisión, preguntas como esas. Permite expresar la dificultad de un problema teniendo en cuenta el potencial subyacente de la máquina —el dispositivo electrónico— que ejecutará la solución. Para ello, deberemos considerar el conjunto de instrucciones para la máquina, sus recursos, sus restricciones y el entorno operativo.

Al resolver un problema de forma eficiente podemos seguir preguntándonos si la solución alcanzada es lo suficientemente buena como para poder sacar ventaja de lo aleatorio o si podríamos estar permitiendo falsos positivos y negativos. El pensamiento computacional está así reformulando un problema aparentemente difícil en otro que se sabemos cómo resolver, tal vez por reducción, incrustación, transformación o simulación.

El pensamiento computacional es pensar recursivamente[2]. Se trata de un procesamiento paralelo. Es interpretar al código como datos y a los datos como código. Es una forma de chequeo como el análisis dimensional generalizado. Es reconocer tanto las virtudes como los peligros de utilizar pseudónimos o dar a alguien o a algo más de un nombre. Es reconocer tanto el costo como el potencial del direccionamiento indirecto o la llamada de procedimiento remoto. Es no solo juzgar un programa por su corrección y eficiencia sino por su estética, su elegancia y por la simplicidad de su diseño.

El pensamiento computacional utiliza la abstracción y la descomposición al enfrentar una tarea sofisticada o al diseñar un sistema complejo y grande. Es separar las preocupaciones. Es elegir la representación más apropiada para un problema o modelar los aspectos relevantes para que el problema sea posible de abordar. Es utilizar invariantes[3] para describir de forma sucinta y declarativa el comportamiento de un sistema. Es tener la confianza de que podremos utilizar, modificar e influir de manera segura en un sistema complejo sin conocer todos sus detalles. Es modelizar algo anticipándose a lo que harán múltiples usuarios o recuperar y almacenar datos previendo usos futuros.

El pensamiento computacional supone pensar en términos de prevención, protección y recuperación del escenario en el peor de los casos a través de la redundancia, el control de daños y la corrección de errores. Es un hacer un llamado en un interbloqueo (deadlock)[4] y acuerdos de interfaces (contracts interfaces)[5]. Es aprender a evitar una competencia de condiciones cuando se necesita sincronizar encuentros coincidentes.

El pensamiento computacional utiliza el razonamiento heurístico para descubrir una solución. Es planear, aprender y organizar en un marco de incertidumbre. Es búsqueda, búsqueda y más búsqueda, resultados en una lista de páginas web, una estrategia para ganar un juego o descubrir un contraejemplo. El pensamiento computacional utiliza, actualmente, cantidades masivas de datos para acelerar el cálculo. Realiza compensaciones entre el tiempo y el espacio y entre el poder de procesamiento y la capacidad de almacenamiento.

Consideremos estos ejemplos cotidianos: cuando tu hija va a la escuela por la mañana pone en su mochila las cosas que necesita para el día; eso es recuperar previamente (prefetching) y almacenar en caché. Cuando tu hijo pierde los mitones le sugieres que vuelva sobre sus pasos; eso es realizar un rastreo dando marcha atrás (backtracking). ¿En qué momento dejas de alquilar esquíes y te compras un par ?; eso es un algoritmo en línea (on line algorithm)[6]. ¿Estás en el supermercado? ¿En qué fila estás?; ese es un modelo de rendimiento para sistemas multi servidor. ¿Por qué tu teléfono sigue funcionando todavía en un corte de energía?; esa es la independencia de la falla y la redundancia en el diseño. ¿Cómo hace un Test de Turing completamente Automatizado (Completely Automated Public Turing Test(s) o CAPTCHAs) para contar por separado a las máquinas y validar a los humanos?; eso es explotar la dificultad para resolver problemas complejos de Inteligencia Artificial con el objetivo de frustrar a los agentes informáticos.

Pensar como un científico informático es más que
dotar de un programa a una computadora.
Requiere saber pensar en múltiples niveles de abstracción.

El pensamiento computacional se habrá arraigado a nuestras vidas cuando palabras como algoritmo y precondición sean parte del vocabulario de todos; cuando la indeterminación o la recolección de basura adquieran el significado que le dan los informáticos y cuando los árboles se dibujen boca abajo[7].

Hemos sido testigos de la influencia del pensamiento computacional en otras disciplinas. Por ejemplo, el aprendizaje automático (machine learning) ha transformado las estadísticas. El aprendizaje estadístico (statistical learning) se usa para problemas en una escala, en términos del tamaño y la dimensión de datos, inimaginable hace solo unos años. Los departamentos de estadísticas en todo tipo de organizaciones están contratando científicos informáticos. Las universidades en las que se estudian las Ciencias de la Computación están asimilando los departamentos de estadísticas existentes o fundando nuevos.

El interés reciente de los científicos informáticos por la biología ha sido impulsado por la creencia de que los biólogos pueden beneficiarse del pensamiento computacional. La contribución de las Ciencias de la Computación a la biología va más allá de la capacidad de búsqueda de patrones secuenciales a través de grandes cantidades de datos. La esperanza es que las estructuras de datos y algoritmos — nuestras abstracciones computacionales y métodos— puedan representar la estructura de las proteínas de modo tal su función logre ser esclarecida. La biología computacional está cambiando la forma en que los biólogos piensan. Del mismo modo, la teoría computacional del juego está cambiando la forma en que piensan los economistas; la nano computación, la manera en que lo hacen los químicos y la computación cuántica, la de los físicos.

Esta clase de pensamiento formará parte del conjunto de habilidades no solo de otros científicos fuera del campo de la informática, sino de cualquiera. La computación ubicua es a la actualidad lo que pensamiento computacional será al futuro. La computación ubicua era un sueño hasta ayer y se convirtió en la realidad de hoy, el pensamiento computacional será la realidad del mañana.

Lo que es y lo que no es

Las Ciencias de la Computación conforman el estudio de la computación — lo que puede ser computado y cómo puede computarse—. El pensamiento computacional posee, por lo tanto, las siguientes características:

Conceptualización, no programación. Las Ciencias de la Computación no equivalen a programación de computadoras. Pensar como un científico informático es algo más que se capaz de programar una computadora. Requiere pensar en múltiples niveles de abstracción.

Habilidades básicas, no rutinas memorizadas. Son habilidades básicas aquellas que, en una sociedad moderna, todo ser humano debe conocer. La memorización implica rutinas mecanizadas. Irónicamente, hasta que las Ciencias de la Computación no resuelvan el gran desafío de hacer a las computadoras pensar, las computadoras serán las que pensarán rutinariamente.

Una forma en la que los humanos —no las computadoras— piensan. El pensamiento computacional es una de las formas en que los humanos podemos resolver problemas. No es tratar de que los humanos pensemos como computadoras. Las computadoras son torpes y aburridas; los humanos, inteligentes e imaginativos. Somos nosotros, los humanos, los que hacemos emocionantes a las computadoras. Equipados con dispositivos informáticos, utilizamos nuestra inteligencia para abordar problemas que no podíamos asumir antes de la era de la computación y construir, solo con nuestra imaginación, sistemas de funcionalidad limitada.

Complementa y combina el pensamiento matemático y la ingeniería. Las Ciencias de la Computación son inherentes al pensamiento matemático dado que, como en toda ciencia, sus fundamentos formales descansan sobre las matemáticas. Y son inherentes a la ingeniería porque los sistemas que se diseñan interactúan con el mundo real. Las limitaciones subyacentes de las computadoras obligan a los científicos informáticos a pensar computacionalmente, no solo matemáticamente. Ser libres para construir mundos virtuales permite diseñar sistemas más allá del mundo físico.

Ideas, no artefactos. No es solo que el software y el hardware que producimos está físicamente presente y es tangible constantemente en nuestras vidas, se trata de los conceptos computacionales que utilizamos para aproximarnos a los problemas y resolverlos, de conducir nuestras vidas diarias y de  interactuar con otra personas; y

Para todos, en todas partes. El pensamiento computacional será una realidad cuando esté tan integrado al pensamiento humano que desaparecerá como una filosofía explícita.

Mucha gente equipara a las Ciencias de la Computación con la programación de computadoras. Algunos padres, ven solo una estrecha gama de oportunidades laborales para su hijos si estudian informática. Muchas personas piensan que la investigación básica en informática está concluida y que solo resta lo que compete a la ingeniería. El pensamiento computacional supone una visión más amplia que puede orientar a profesores en Ciencias de la Computación, investigadores y profesionales mientras trabajamos para cambiar la imagen del campo en la sociedad. Necesitamos, especialmente, llegar a la audiencia preuniversitaria, incluyendo maestros, padres y estudiantes, enviándoles dos mensajes centrales:

Quedan retos científicos y desafíos intelectuales por comprender y resolver. El dominio del problema y la solución solo están limitados por nuestra creatividad y curiosidad; y

Uno puede estudiar Ciencias de la Computación y trabajar en otros campos. Uno puede estudiar inglés o matemáticas y luego trabajar en una variedad de ámbitos diferentes. Lo mismo vale para las Ciencias de la Computación. Uno puede estudiar  Ciencias de la Computación y luego seguir Medicina, Derecho, Administracioń de Negocios, Política o cualquier otra ciencia o ingeniería, incluso artes.

Los profesores de Ciencias de la Computación podrían dictar un curso llamado “Cómo pensar como científicos informáticos” para estudiantes universitarios ingresantes, haciéndolo accesible para los no especialistas, para los que no vayan a estudiar Ciencias de la Computación. Nosotros deberíamos acercar también a los estudiantes pre universitarios a los métodos y modelos computacionales. En vez de lamentar el declive del interés en la informática o la disminución de los fondos para la investigación en Ciencias de la Computación, deberíamos buscar inspirar el interés del público en la aventura intelectual del campo. De esta forma, difundiremos la alegría, el respeto y el poder de la informática con el objetivo de hacer que el pensamiento computacional se transforme en moneda corriente.

La autora:

Jeannette Marie Wing es una teórica informática, profesora en Ciencias de la Computación e ingeniera estadounidense. Formada en el Massachusetts Institute of Technology, se encuentra vinculada a las universidades de Columbia, Carnegie Mellonm y la Universidad de California del Sur.

[J. M. Wing en Wikipedia]


Notas:

[1] Las tres Rs se refieren a los fundamentos de un programa educativo básico orientado a las habilidades en las escuelas conformado por la lectura, la escritura y la aritmética (en inglés: reading, writing and arithmetic). Aunque hay otros antecedentes la frase es atribuida a Sir William Curtis, político inglés y miembro del Parlamento, en su discurso durante la cena del Board of education en 1795 (N del T)

[2] La recursividad es una técnica muy utilizada en la programación informática que se basa en la capacidad que tienen las funciones de invocar a versiones similares de ellas mismas. El ejemplo clásico es la función que calcula el factorial de un número. Un factorial consiste en multiplicar un número natural por el número anterior, y este a su vez por el anterior, y así sucesivamente hasta llegar al número 1. Para calcular el factorial de 8, se necesita llamar a la función factorial, pero aplicada al número 7. Al calcular el de 7 la función factorial invocara a la función factorial, pero del número 6, la de 6 a 5, 5 a 4 y así sucesivamente hasta llegar al número 1. Como el factorial de 1 es 1, al aplicar la función factorial al número 1, no será necesaria ninguna llamada adicional a otra función factorial ya que la respuesta es inmediata. El fin de llamadas recursivas de funciones, como en este caso, se suele denominar condición de salida, y es esencial porque sin ella el proceso se torna infinito lo cual es una gran fuente de errores en muchos programas informáticos. (N del T)

[3] En la informática se conoce como invariante a una condición que se sigue cumpliendo después de la ejecución de determinadas instrucciones. Se cumple tanto antes como después de estas instrucciones, permaneciendo sin variación (N del T)

[4] Se llama interbloqueo, bloqueo mutuo, traba o abrazo mortal, al bloqueo permanente de un conjunto de procesos o hilos de ejecución en un sistema concurrente que compiten por recursos del sistema o bien se comunican entre ellos. A diferencia de otros problemas de concurrencia de procesos, no existe una solución general para los interbloqueos. (N del T)

[5] El diseño por contrato es una metodología para el diseño e implementación de aplicaciones y componentes que consiste en considerar los elementos de diseño como participantes de una relación similar al contrato de negocios. Así, se pueden diseñar los componentes asumiendo que se cumplirán ciertas condiciones de entrada (pre-condiciones), mientras que se deberán garantizar ciertas condiciones de salida (post-condiciones), así como la invariante de clase (propiedades que se mantienen invariantes a pesar del procesamiento realizado por el componente). (N del T)

[6] En informática, un algoritmo en línea es uno que puede procesar su entrada pieza por pieza de manera serial de modo tal que la entrada alimenta al algoritmo sin tener toda la entrada disponible desde el principio. (N del T)

[7] Se refiere a mapas conceptuales, árboles lógicos que organizan categorías jerárquicamente. Para entender este concepto se sugiere ver:  https://www.quora.com/Why-are-trees-in-computer-science-generally-drawn-upside-down-from-how-trees-are-in-real-life (N del T)

jueves, agosto 03, 2017

Programar el robot desde el celular

Se agrega a la buena noticia que hace poco traía a “Expediciones Virtuales” respecto a que MakeBlock estaba disponible para Linux, que ya se existe, también, la versión para Chromebook que funciona de maravillas (algún día escribiré un post sobre mi maravillosa experiencia con esta eficiente y económica maquinita basada en Chrome OS más que ideal para usar en educación cuando se cuenta con buena conectividad).
Pero hoy les quiero contar sobre otra forma de programar MBot: a través del celular. Les contaré de una de las aplicaciones (disponibles para Android e iOS) que permiten programar con un código más simplificado pero ideal para iniciarse en la programación de robots, con la ventaja adicional de ofrecer un tutorial para aprener los comandos antes de zambullirse en la creación de nuevos programas. Esta aplicación se llama simplemente MBlock.


Instalar el Firmware
La app de MBlock para el celular se comunica con el robot utilizando Bluetooth, por lo cual es necesario, antes de utilizalo, que sea actualizado el firmware de Arduino, lo cual se debe hacer desde la PC o la Chromebook con MakeBlock. El firmware es un software que establece la lógica de más bajo nivel que controla los circuitos electrónicos de un dispositivo de cualquier tipo. Como el firmware está muy integrado con la electrónica del dispositivo tiene directa interacción con el hardware y es el encargado de controlarlo para ejecutar correctamente las instrucciones externas. Esto significa que sin la actualización correcta del firmware, el robot no podrá recibir las órdenes por bluetooth.
Esto puede parecer complicado pero no lo es. Actualizar el firmware de Mbot es muy fácil: solo hay que conectar el robot por USB y luego elegir la opción de actualización. Esto carga el programa y el robot ya queda listo para recibir instrucciones desde el celular.


1) Conectar el robot


2 - Seleccionar el board (Mbot)


3 - Cargar el firmware

Eso sí: es muy importante tener en cuenta que cada vez que carguemos otro programa desde dispositivos diferentes al celular, el firmware se borrará y será necesario actualizarlo nuevamente repitiendo el procedimiento para volver a programar el robot desde el celular.


Conexión vía bluetooth
Una vez que hemos actualizado el firmware, lo que sigue es activar la conexión entre el celular y el robot. Para ello, habiendo activado la opción bluetooth en el teléfono, tendremos que acercar el dispositivo a fin de que se establezca la conexión, lo cual, si todo está en orden sucederá muy rapido.


El celular buscando la señal del robot (que, obviamente, debe estar encendido)


Tutorial por niveles o creación libre
Apenas se confirma la conexión, la app ofrece dos opciones.





La primera de ellas, el tutorial, es una secuencia de desafíos secuenciados que permite aprender rápidamente los comandos que controlan el robot.


Cada vez que el pequeño código está resuelto de acuerdo al problema planteado en el desafío, el programa invita a testear el programa.



Si la resolución fue correcta, el robot "festeja" permite avanzar con el siguiente desafío.



En la segunda opción, creación libre, el usuario tiene disponibles todos los comandos y permite programar al robot sin ninguna secuencia limitante. Simplemente se escribe el código deseado utilizando los bloques necesarios para luego transmitir el programa al robot bluetooth mediante para ejecutar el programa. Por supuesto, esta es la parte que más potencial tiene para experimentar y aprender.







lunes, junio 05, 2017

Siga la línea (lo mejor que pueda)


Quizá una de las funciones más interesantes de los robots creados para robótica educativa es la que involucra los sensores de línea a los que había presentado en un viejo post hace ya algún tiempo.

El sensor de líneas permite dectectar "blanco" o "negro" sobre el suelo, lo cual resulta ideal para que el robot circule de acuerdo a un camino (o pista). Un programa básico para hacer funcionar al robot sobre una pista sería el siguiente:



En esta versión, el sensor detecta si se aleja de la línea blanca para corregir el curso con un giro según corresponda. El programa parece funcionar muy bien cuando lo probamos:



Pero... ¿si en vez de utilizar una línea blanca, utilizáramos una línea negra como pista? El desafío parece ser simple: invertimos los colores de detección y los correspondientes giros. Sin embargo, al probar el código en otra pista el robot pierde el curso y en curvas más exigentes se despista. Esto nos pone frente al desafío de intentar un programa más preciso. Veamos este intento:



Este es otro modo de pensar el código en el cual se coloca como condición a la eventual situación en la que se encontrarían ambos sensores para decidir giros y nivel de velocidad. El resultado es más preciso. El robot ya no pierde la línea tan facilmente como con la versión anterior.



Sin embargo, subsiste una falla... si el robot pierde la línea comienza a girar sobre sí mismo, lo cual reduce sus posiblidades de volver a encontrar la línea por la cual circulaba. ¿Cómo podría solucionarse esto?


Preguntas como esta se sucederán una y otra vez al probar el programa en pistas distintas. Y así es como el desafío se renueva y puede volverse más exigente. Porque no hay una única solución. No sirve con que funcione "teóricamente", el robot tiene lograrlo, hay que identificar el problema y proponer una hipótesis para corregirlo. Y cada vez que lo volvemos a pensar, hay algo nuevo que aprender.