lunes, septiembre 10, 2018

Habilidades que se ejercitan al programar

Últimamente se ha difundido la idea de incluir la enseñanza de la programación entre los contenidos que forman parte de la enseñanza básica. Los fundamentos para esta transformación se alinean tanto detrás de cuestiones orientadas a una mirada macroecónomica (el desarrollo de la industria del software) y social (la igualdad de oportunidades, la brecha de género) hasta aquellos que consideran, de forma más abstracta, que el tipo de aprendizajes que promueve el aprendizaje de la programación desarrolla el pensamiento computacional y que, por lo tanto, sería mucho más valioso por su posiblidad de ser transferido a otras situaciones o disiplinas. Quizá esta última, sea todavía una afirmación, aunque sugestiva, algo controversial.

Pero más allá de esta última afirmación, es cierto que hay poco dicho sobre ejemplificar este tipo de habilidades (a excepción del magnifico articulo de Wing que tradujimos en este blog) por lo que no siempre resulta claro de qué estamos hablando cuando invocamos los beneficios de aprender a programar. A fin de subsanar esta cuestión, les comparto algunos ejemplos identificados en la plataforma didáctica Scratch de situaciones en las que se ejercitan una serie de habilidades que son propias de pensamiento computacional.

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)