sábado, 6 de abril de 2019

¿Sueñan los androides con ovejas eléctricas?


El libro de “¿Sueñan los androides con ovejas eléctricas?” de Philip K. Dick me pareció bastante divertido de leer. La trama es bastante completa, hay momentos donde me quedé muy clavado leyendo y, aunque las lecturas semanales contemplaban un límite de capítulos por leer, a veces leía de más porque no podía quedarme con la duda. La idea, aunque ya un poco vieja, de los androides que pueden simular ser humanos hasta un cierto punto, me pareció intrigante desde el inicio del libro. Porque personalmente tengo interés en inteligencia artificial y me parece que la forma en que se aborda este tema en el libro va muy de la mano con los objetivos de la inteligencia artificial, la prueba de Turing, etc.
Una de las cosas más interesantes, a mi punto de vista, fue la caja empática junto con el Mercer. No terminé bien de comprender cómo se supone que funcionaba el compartir tu alegría con otros que pasaban por situaciones complicadas, cómo esto se relacionaba con el hombre subiendo la colina, pero, sobre todo, cómo era posible que recibieran daño físico de las piedras de la grabación si era precisamente eso, una grabación. Creo que podría darle una segunda leída al libro porque probablemente se me escaparon detalles que hicieron que me confundiera. En cuanto a los botones que te permitían inducirte un estado de ánimo desde la alegría inconmensurable hasta la más dura depresión, me pareció un tema muy interesante y me pregunto si alguna vez eso existirá en la realidad. Sería un invento completamente innovador, aunque dejaría sin trabajo a los psicólogos.
Sin embargo, he de admitir que esperaba un final un poco más intenso. Personalmente, el final que Dick le dio a su obra no me gustó porque creo que tenía potencial para más, esperaba alguna lucha con más androides, que él resultara ser un androide al final de todo, que sucediera algo con Rachel Rosen por el asesinato de su oveja, pero no.

sábado, 16 de marzo de 2019

Teaching Concurrency with Erlang


Erlang como lenguaje de programación me ha demostrado ser una cosa completamente maravillosa. Desde la primera vez que tuvimos el acercamiento en la clase de programación concurrente y paralela me di cuenta de que es un lenguaje con el total potencial para aprovechar los núcleos de un procesador para optimizar los tiempos de ejecución de casi cualquier sistema. Obviamente, y como lo dice el artículo, tiene sus ventajas y desventajas pues, hasta donde he podido notar, en los sistemas de cómputo no hay una bala de plata para nada, siempre existen distintas formas de alcanzar el mismo objetivo. Dicho esto, puedo asegurar que, aunque existen otros lenguajes de programación que permiten el cómputo paralelo y concurrente, Erlang ha demostrado ser de mayor facilidad y mejor aprovechamiento de los recursos que otros como C# o Java.
 
  Si bien es cierto que conocer otros lenguajes de programación nos permite tener más herramientas para seleccionar el más adecuado para determinada situación, creo que Erlang se acomoda bastante bien para un sin número de aplicaciones. Lo importante es conocer sus ventajas y desventajas, así como practicarlo lo suficiente para extraer su máximo potencial. He tenido la oportunidad de cursar la materia con el profesor Ariel y me parece que los ejercicios que nos ha dejado son lo suficientemente retadores para que aprendamos del potencial de Erlang y nos demos una idea de hasta dónde puede llegar. Pero para esto tenemos que tener bien claras las limitaciones del lenguaje, así como los conceptos de concurrencia, paralelismo y (aunque aún no hemos tenido oportunidad de utilizarlo) sistemas distribuidos.
 
  Finalmente quiero agregar que podría ser de mucha utilizar relacionar un poco más el lenguaje con aplicaciones más reales, adicionales a los ejercicios retadores que propone el profesor, de forma que podamos tener de primera mano la experiencia de utilizar este lenguaje para solucionar un problema real que nos permita verlo como algo funcional.

sábado, 9 de marzo de 2019

Joe Armstrong on Erlang


Una vez leídos los capítulos 1 a 4 del libro de Joe Armstrong pude entender, en su mayoría, cómo funciona el lenguaje Erlang, pero en su podcast hace algunas afirmaciones que me dejan intrigado. Una de las cualidades más relevantes del sistema es la concurrencia manejada por el mismo lenguaje de programación, pero no por el sistema operativo, esto se lleva a cabo a partir de una implementación del System Runtime muy pesada y completa. Básicamente el sistema operativo se encarga de manejar archivos y sockets, pero todos los procesos que se crean y el manejo de mensajes de un proceso a otro lo hace el mismo sistema.

   Es interesante que a Joe y su equipo de trabajo se les ocurriera hacer el sistema utilizando la visión que tienen del mundo concurrente, sabiendo que las tareas que realizamos en el día a día son concurrentes y no secuenciales. Se dedicaron a definir los procesos como objetos y manejar la transmisión de información a través de mensajes, de la misma forma en que se hace en el mundo real. Esto les permitió eliminar los problemas de deadlocks, starvation, race condition y el acceso a memoria, porque ya no existe la memoria compartida en este lenguaje de programación, en su lugar de utiliza información inmutable. Todas las variables son declaradas una sola vez y no pueden cambiar su valor, lo que permite que sea más fácil manejar la información entre procesos.

   Ahora bien, la simplicidad con la que se desarrolló el sistema utilizando como base que los programadores saben lo que están haciendo, me impresionó. Saber que solamente hay que programar el happy path y que el programa automáticamente funcionará de manera concurrente me parece maravilloso. Nos facilita el trabajo a los programadores para hacer uso de los nuevos procesadores que salen ya con multinúcleo. Aprovechamos estas herramientas para crear código más entendible, más corto, más funcional, más eficiente y que requiere menos tiempo y esfuerzo.

martes, 26 de febrero de 2019

El código enigma


El código enigma aborda muchos temas de relevancia, algunos relacionados con los sistemas computacionales, otros con derechos humanos, igualdad de género e inclusión. A mi punto de vista es una película que deja ver la realidad de la naturaleza humana y nos permite tener una comparación del ahora con el antes sobre cada uno de estos aspectos.

  Primero, relacionado con los sistemas de cómputo, me parece que la máquina de Turing es importante por ser uno de los primeros modelos de cómputo diseñados. Creo que el nivel de abstracción y la inteligencia de Alan Turing le permitieron diseñarla, pero tan sólo tener la idea de que algo como eso era posible me parece impresionante.

  Segundo, la igualdad de género ha sido un tema que genera polémica desde hace ya varios años. En la película podemos ver cómo las mujeres tienen tareas designadas en las que no requieren hacer algo que requiera ingenio, son actividades más mecánicas y simples. Incluso, cuando Joan Clarke llega a hacer el examen para incorporarse al proyecto se puede ver cómo, por ser mujer, asumen que es simplemente una secretaria e incluso la consideran incapaz de haber resuelto el crucigrama que se presentó en el periódico. Lo que me llamó mucho la atención y me gustó fue que Alan no pensó dos veces en tratarla como una igual; sin embargo, creo que la razón por la que lo hizo está relacionada con su homosexualidad. Este es otro de los temas relevantes de la película para mí.

  La homosexualidad de Alan Turing fue suficiente para que, a pesar de sus aportes para detener la segunda guerra mundial, su intelecto superior, sus aportaciones a la computación, entre otras cosas, le fuera despojada su dignidad. La lucha por los derechos humanos y en específico los derechos de la comunidad LGBTTTIQ+ se ha llevado a cabo desde hace ya varios años, pero el mundo ha vivido acostumbrado a ver las diferencias como símbolo de lo antinatural en lugar de un símbolo de diversidad. Incluso hoy, que existe una mayor apertura y protección hacia la comunidad, se siguen hablando de crímenes de odio hacia ese colectivo, existen personas que usan la religión para atacarlo e incluso el gobierno les tiene prohibidos algunos derechos como lo es el matrimonio igualitario. Considero que Alan Turing es uno de varios ejemplos de que la homosexualidad no es una limitante para nadie, es simplemente una característica más de una persona y no define de lo que es capaz. Indirectamente ha sido un promotor de la lucha por la igualdad.

jueves, 21 de febrero de 2019

The State of Parallel Programming


Nuevamente nos encontramos con el conflicto del avance tecnológico que está dejando detrás las habilidades de quienes trabajamos con estas tecnologías. Es importante recalcar que se vuelve inútil que la tecnología avance tanto si las personas que la utilizan no saben hacerlo para aprovechar su potencial al máximo, que es justo lo que está sucediendo con la creación de procesadores multinúcleo. Hoy existe un rezago educativo tremendo en tema de programación paralela, lo puedo decir desde mi perspectiva como estudiante de ISC que siempre se me enseñó a programar de forma secuencial y de vez en cuando, como una herramienta semi-útil, me decían que podía usar múltiples hilos de ejecución, pero no se le daba la importancia que merecía. En mi octavo semestre de la carrera, a menos de 1 año de titularme, es cuando por fin me entero de que la programación paralela es tan importante y apenas empiezo a especializarme en ella. Un poco tarde, a mi parecer.

  Ahora bien, tal y como lo menciona el artículo, no solamente la educación es un problema sino las herramientas que nos permiten generar código paralelo con menos errores y más eficiencia. Desde que aprendimos a programar, al menos en mi generación, hicimos uso de herramientas IDE’s que nos facilitaban acceder a librerías, paquetes, clases, métodos, funciones y muchas otras herramientas de un lenguaje en particular para facilitarnos la escritura del código y que nosotros sólo nos enfocáramos en que el algoritmo se ejecutara de manera correcta. Esto es prueba de que las herramientas permiten que se escriba código mejor estructurado, con menos errores y mayor eficiencia. Entonces, ¿por qué no utilizamos herramientas para generar cómputo paralelo también?, pues porque no es tan sencillo desarrollar estas herramientas.

  Yo creo que una gran parte de los programadores deberíamos poner atención en esta nueva oportunidad que se presenta, de trabajar en herramientas o lenguajes de programación nuevos que nos permitan aprovechar el hardware al 100% y generar aplicaciones más eficientes, sin errores de concurrencia y que, además, no requieran esfuerzo innecesario con trivialidades como mantener la consistencia en la información o el acceso a los datos.

sábado, 16 de febrero de 2019

Welcome to the Jungle


Hemos visto desde hace ya varios años que el crecimiento del poder de procesamiento de las computadoras es exponencial, siempre atendiendo a la Ley de Moore; sin embargo, también es claro desde ya bastante tiempo que esta ley no continuaría siendo vigente por mucho más y tendríamos que buscar una forma diferente de seguir aumentando esta capacidad de procesamiento. La solución la encontramos en el procesamiento multinúcleo y la programación paralela.

  Un punto importante que se aborda en este artículo son los núcleos heterogéneos y la elasticidad del cómputo en la nube. Si bien es cierto que los procesadores llegarán a un número “máximo” de transistores debido a las limitaciones físicas de espacio y tamaño, no es lo único que se puede explotar para seguir aumentando las capacidades de las computadoras. Esta especialización de núcleos para escenarios y tareas específicas permitirá que los programadores diseñemos aplicaciones enfocadas en explotar esta infraestructura y, a su vez, generará nuevas metodologías de desarrollo y nuevas oportunidades tecnológicas.

  Finalmente, es de suma importancia considerar, para efectos de adquisición de tecnología, el impacto que tendrán estos nuevos dispositivos y sus capacidades. Digamos que, como lo menciona el autor en su artículo, llega un punto en que los dispositivos móviles tienen igual o mayor capacidad de procesamiento que las computadoras de escritorio, debería existir un diferenciador bastante grande para optar por una computadora de escritorio que, desde hoy en día, no está siendo una de las mejores opciones debido a sus limitaciones de movilidad. La principal razón por la que hoy se compran equipos de escritorio es precisamente porque los móviles no cumplen con los requisitos para llevar a cabo ciertas tareas, pero cuando puedan hacerlo es posible que estos equipos dejen de ser útiles o, en su defecto, se abra un nuevo nicho de mercado con alguna idea innovadora que los ponga a la altura de los dispositivos móviles.

domingo, 3 de febrero de 2019

Parallel Computing on any Desktop


Como hemos visto desde que empezó el semestre, el paralelismo en el cómputo se ha vuelto algo más que útil, necesario. Esto debido al incremento de potencia que se necesita en las computadoras para resolver los problemas que se presentan hoy en día, y más en específico a la cantidad de información que se tiene que procesar para generar resultados. Hemos visto en los últimos años que las computadoras se han optimizado en cuanto al hardware, vemos procesadores que salen con mayores núcleos físicos y lógicos, con mayor velocidad del reloj, incrementando el caché, etc. Sin embargo, es poco el uso que realmente se le da a esta capacidad de los procesadores debido a que la mayoría de los programas y aplicaciones están escritas en código secuencial y no aprovechan los multinúcleos.

  Creo que las directivas del modelo de programación OpenMP serían bastante útiles para tratar de convertir programas secuenciales en programas que usen multithreading; sin embargo, al menos con la explicación del artículo, no me parece especialmente útil para generar programas muy complejos y que requieran, además del multithreading, utilizar distintos dispositivos para procesamiento. Pues la sincronización de los dispositivos y la memoria a la que se accede corre por cuenta del programador, por lo que el modelo OpenMP no sería de mucha ayuda en estos casos.

  Ahora bien, si bien es cierto que pensar en un paradigma de programación concurrente es bastante más complejo que pensar en uno secuencial, se está volviendo una necesidad para los desarrolladores hoy en día. Por tanto, me parece de suma importancia que desarrollemos esta habilidad haciendo uso de las herramientas que tenemos hoy en día, pero sobre todo tomando en cuenta que en el futuro el multithreading será obligatorio y por tanto deberemos saber aprovecharlo al máximo. Este será un diferenciador en la calidad y rendimiento de las aplicaciones que se desarrollen después, y será un pilar en el desarrollo de los nuevos desarrolladores.