Pensamiento Computacional [1]

Jeannette M. Wing

Representa una actitud universalmente aplicable y un conjunto de habilidades que toda persona, no solamente científicos de computación, debe estar dispuesta a aprender y usar.

El pensamiento computacional se construye sobre la capacidad y límites de los procesos computacionales, sean ejecutados por humanos o máquinas. Los métodos y modelos computacionales nos dan el coraje para resolver problemas y diseñar sistemas que ninguno de nosotros podría enfrentarlo solo. El pensamiento computacional nos enfrenta al acertijo de la inteligencia mecánica [2]: ¿qué cosas pueden hacer los humanos mejor que las computadoras? y ¿qué cosas pueden hacer las computadoras mejor que los humanos? Más fundamentalmente se trata la pregunta: ¿qué es computable? Hoy en día conocemos solamente parte de las respuestas a esas preguntas.

El pensamiento computacional es una habilidad fundamental para toda persona, no solamente para científicos de computación. A la lectura, escritura y aritmética debieramos añadir el pensamiento computacional como habilidad analítica de todo niño. Así como la imprenta favoreció la divulgación de las tres R, es propiamente incestuoso que la computación y las computadoras faciliten la divulgación del pensamiento computacional.

El pensamiento computacional involucra resolver problemas, diseñar sistemas y entender el comportamiento humano basandose en los conceptos fundamentales de las ciencias de la computación. El pensamiento computacional incluye un rango de herramientas mentales que reflejan la amplitud de las ciencias de la computación.

Teniendo que resolver un problema particular, nos podemos preguntar: ¿cuán difícil es resolverlo? y ¿cuál es la mejor forma de resolverlo? Las ciencias de la computación se basan en fundamentos teóricos sólidos para responder a esas preguntas con precisión. El planteamiento de la dificultad de un problema toma en cuenta la capacidad de la máquina -- el dispositivo computacional que ejecutará la solución. Debemos considerar el conjunto de instrucciones de la máquina, las restricciones de recursos y el entorno operativo.

En la solución eficiente de un problema, debemos preguntarnos adicionalmente si una solución aproximada es suficientemente buena, si podemos sacar ventaja de la aleatoriedad, y si se permiten falsos positivos o falsos negativos. El pensamiento computacional es reformular un problema aparentemente difícil en uno que sabemos resolver, tal vez por reducción, empotrado [3], transformación o simulación.

El pensamiento computacional es pensar recursivamente. Es procesamiento paralelo. Es interpretar datos como código y código como datos. Es el chequeo de tipos como la generalización del análisis dimensional. Es reconocer ambos, las virtudes y peligros del aliasing, o dar a alguien o algo más de un nombre. Es reconocer el costo y el poder del direccionamiento indirecto y las llamadas a procedimientos. Es juzgar un programa no solamente por su correctitud y eficiencia, sino también por su estética y la simplicidad y elegencia de su diseño (del sistema).

El pensamiento computacional es usar abstracción y descomposición cuando se enfrentan tareas grandes y complejas o se diseña un sistema grande y complejo. Es la separación de preocupaciones [4]. Es elegir una representación adecuada de un problema, o modelar los aspectos relevantes de un problema para hacerlo tratable. Es usar invariantes para describir el comportamiento del sistema sucinta y declarativamente. Es tener la confianza que se puede usar con seguridad, modificar e influenciar un gran sistema complejo sin entenderlo en cada detalle. Es modularizar algo anticipandose a múltiples usuarios o realizar prefetching y caching anticipandose a futuros usos.

El pensamiento computacional es pensar en términos de prevención, protección y recuperación de escenarios pesimistas usando redundancia, aislamiento del daño y corrección de errores. Es llamar a los gridlocks, deadlocks y a los contratos, interfaces. Es aprender a evitar las race conditions cuando se sincroniza encuentros de unos con otros.

El pensamiento computacional es usar el razonamiento heurístico para descubrir una solución. Es planificar, aprender, cronogramar en la presencia de incertidumbre. Es buscar, buscar y seguir buscando, obteniendo como resultado una lista de páginas web con la estrategia de ganar un juego o un contraejemplo. Pensamiento computacional es usar grandes cantidades de datos para acelerar el cómputo. Es hacer compromisos entre tiempo y espacio, y entre capacidad de procesamiento y la de almacenamiento.

Consideremos estos ejemplos diarios: cuando tu/su hija va a la escuela en la mañana, ella pone en la mochila las cosas que necesita para su jornada escolar; eso es prefetching y caching. Cuando tu/su hijo pierde sus guantes, sugieres recordar sus pasos previos, eso es backtracking. ¿En qué momento dejas de alquilar skis y te compras unos? Esos son algoritmos on-line. ¿En qué cola del supermercado esperas? Eso es modelamiento de rendimiento en sistemas de múltiples servidores. ¿Por qué el teléfono todavía funciona cuando se corta la electricidad? Eso es independecia de fallas y redundancia en el diseño. ¿Cómo un CAPTCHA (Completely Automated Pulic Turing Test(s) to Tell Computers and Humans Apart) identifica humanos? Eso es explotar la dificultad de resolver problemas difíciles de inteligencia artificial para tornarse en agentes computacionales.

El pensamiento computacional habrá calado en la vida de todos cuando palabras como algoritmos o precondiciones sean parte del vocabulario de cualquier persona; cuando no determinismo y recolección de basura se entiendan en su significado computacional y los árboles se dibujen de arriba hacia abajo.

Hemos sido testigos de la influencia del pensamiento computacional en otras disciplinas. Por ejemplo, el aprendizaje mecánico [5] ha transformado la estadística. El aprendizaje estadístico se está usando en problemas en una escala, en términos del tamaño de datos y dimensión, inimaginable solamente hace algunos años. Los departamentos de estadística de todo tipo de organizaciones están contratando científicos de computación. Las escuelas de ciencias de la computación fortalecen sus lazos o inician departamentos de estadística.

El interés reciente de científicos de computación en la biología está guiado 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 habilidad de buscar patrones en grandes cantidades de datos de secuencias. La esperanza es que estructuras de datos y algoritmos -- nuestras abstracciones y métodos computacionales -- puedan representar las estructuras proteicas en formas que aclaren su función. La biología computacional está cambiando la forma de pensar de los biólogos. De forma similar, la teoría de juegos computacional está cambiando la forma de pensar de los economistas; la nanocomputación la forma de pensar de los químicos; y la computación cuántica la forma de pensar de los físicos.

Este tipo de pensamiento formará parte del conjunto de habilidades no solamente de los científicos sino de todos. La computación ubicua es hoy a la realidad del pensamiento computacional de mañana.

Lo que es y lo que no es

Las ciencias de la computación estudian la computación -- qué puede ser computado y cómo computarlo. El pensamiento computacional tiene entonces las siguientes características:

Conceptualización y no programación. La ciencia de la computación no es programación de computadoras. Pensar como un científico de computación significa más que solamente ser capaz de programar una computadora. Requiere pensar en múltiples niveles de abstracción;

Habilidades fundamentales y no memorísticas. Una habilidad fundamental es algo que todo ser humano debe conocer para funcionar en la sociedad moderna. Memorística significa rutina mecánica. Irónicamente, no será hasta que las ciencias de la computación resuelvan el Gran Desafío de la Inteligencia Artificial de hacer que las computadoras piensen como humanos, que el pensamiento será memorístico;

Una forma en la que los humanos, y no las computadoras, piensan. El pensamiento computacional es una forma en la que los humanos resuelven problemas; no es intentar hacer que los humanos piensen como computadoras. Las computadoras son apagadas y aburridas; los humanos son inteligentes e imaginativos. Los humanos hacemos que las computadoras sean apasionantes. Equipados con dispositivos computacionales, usamos nuestra inteligencia para abordar problemas que no nos atrevíamos a enfrentar antes de la era de la computación y construir sistemas con funcionalidad solamente limitada por nuestras imaginaciones;

Complementa y combina el pensamiento matemático e ingenieril. Las ciencias de la computación recurren inherentemente al pensamiento matemático, dado que, como todas las ciencias, sus fundamentos formales están cimentados en las matemáticas. Las ciencias de la computación recurren inherentemente al pensamiento ingenieril, ya que construimos sistemas que interactúan con el mundo real. Las restricciones del dispositivo computacional subyacente fuerzan a los científicos de computación a pensar computacionalmente, no solamente matemáticamente. La libertad para construir mundos virtuales nos permite construir sistemas más allá del mundo físico;

Ideas, no artefactos. No es solamente el software y los artefactos de hardware que producimos que estarán físicamente presentes en todas partes todo el tiempo, serán los conceptos computacionales que usamos para abordar y resolver problemas, administrar nuestras vidas diarias, y comunicar e interactuar con otras personas; y

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

Mucha gente iguala ciencias de la computación con la programación de computadoras. Algunos padres solamente ven un rango reducido de oportunidades laborales para sus hijos que estudian ciencias de la computación. Mucha gente piensa que la investigación fundamental en ciencias de la computación está terminada y que solamente queda la ingeniería. El pensamiento computacional es una gran visión que guía a educadores del ciencias de la computación, investigadores y practicantes mientras actuamos para cambiar la imagen del área que tiene la sociedad. Necesitamos especialmente llegar a la audiencia de colegiales, incluyendo a los profesores, padres y estudiantes, enviandoles dos mensaje principales:

Los problemas científicos intelectualmente desafiantes y atractivos todavía pueden entenderse y resolverse. El dominio del problema y el de la solución están limitados solamente por nuestra curiosidad y creatividad; y

Uno puede seguir una carrera universitaria en ciencias de la computación y hacer otra cosa. Uno puede estudiar una carrera universitaria en idiomas o matemáticas y hacer carrera profesional en otra área. Lo mismo para ciencias de la computación. Uno puede estudiar ciencias de la computación y hacer carrera profesional en medicina, leyes, empresas, política, cualquier tipo de ciencia o ingeniería, aún en arte.

Los profesores de ciencias de la computación debieran dar un curso de Formas de Pensar como un Científico de Computación en los colegios y niveles iniciales universitarios, haciendolo disponible también a los no especialistas, no solamente a los especialistas en ciencias de la computación. Debemos exponer a los colegiales a los modelos y métodos computacionales. En cambio de quejarnos del poco interés en ciencias de la computación o la disminución de disponibilidad de fondos para investigación en ciencias de la computación, debemos ver como inspirar el interés público en la aventura intelectual del área. Así vamos a difundir la alegría, sobrecogimiento y fuerza de las ciencias de la computación, apuntando a lograr que el pensamiento computacional sea una cosa corriente.


Notas de la traducción:

1. Artículo publicado en Communications of the ACM, Marzo 2006. Volumen 49, Número 3. (versión original). Traducido por Pablo Azero con la colaboración de Marcelo Flores y Vladimir Costas. Publicado con el consentimiento de la prof. Wing.

2. machine intelligence traducido a inteligencia mecánica.

3. embedding traducido a empotrado.

4. separation of concerns traducido a separación de preocupaciones.

5. machine learning traducido a aprendizaje mecánico.


Modificado: 20060804PRA
Sugerencias y observaciones: pabloazero arroba memi punto umss punto edu punto bo