domingo, 27 de septiembre de 2015

Lambda no sólo significa "longitud de onda"...

Como se menciona en el podcast que Freddy Guime realizó, las expresiones lambda no son cosas que resulten recientes, ya que se han utilizado desde que se empezaron a diseñar los lenguajes de programación de los años cincueta. Sin embargo, este concepto para mi resulta nuevo, ya que muy pocas veces me he encontrado con una expresión lambda en todos los archivos de código que he realizado desde que comencé a programar, e inclusive en los libros de lenguajes que me han encargado que lea.
Resulta “mágico” que una pequeña sentencia sea tan útil como escribir una línea, o inclusive un bloque de código completo, en unos cuantos caracteres, además de utilizar el token “->”. Esto, al principio, resultó un tanto confuso para mí. Lo primero que pensé fue “¿apuntadores en Java? Interesante…”. Pero, claramente, no hay tal cosa en Java. Al menos no de manera explícita en el lenguaje.
Hasta como hemos visto en clase, y dándole crédito a lo que comenta Freddy Guime en su podcast, las expresiones lambda se pueden ver como una expresión “mutable”. Es como una función que puede cambiar de comportamiento, de acuerdo a lo que le solicitemos en la misma expresión lambda.  Y es mucho más sencillo y más rápido que estar creando nuevas clases, o inclusive andar sobreescribiendo la funcionalidad del método run() de la clase Runnable, lo cual tiene un impacto admirable en la simplicidad que le dá al escribir un código en un lenguaje tan verboso como lo es Java.
Una de las “limitantes” que tiene el uso de expresiones lambda en Java, es que el programador debe declarar interfaces funcionales. Estas interfaces, por definición, son aquellas que únicamente contengan un método en ellas. Sin embargo, el hecho de tener que escribir una interface de una línea en lugar de una clase completa (la cual puede tener muchísimas líneas de código para poder funcionar correctamente), es un pequeñísimo “sacrificio” que se debe realizar para poder ahorrarnos tiempo de programación, y en cierta forma tiempo de cómputo en la implementación que estemos programando.

Espero tener la oportunidad de ver una implementación real con expresiones lambda, para poder comprender de mejor manera su funcionamiento, tanto a nivel código como a nivel de desempeño, y tenerlas siempre en cuenta para futuras implementaciones que yo realice, ya sea en Java o en cualquier otro lenguaje de programación que las utilice.

lunes, 14 de septiembre de 2015

La perseverancia es clave para el éxito, incluso para terminar Super Mario Bros.



En el video documental, se plantea perfectmente el caso de 3 proyectos. Estos proyectos son un tanto singulares, ya que no son “proyectos” como los que normalmente llamamos así: son videojuegos. Sí, los videojuegos también son proyectos de, al menos, mediano plazo, ya que requieren una buena cantidad de tiempo y esfuerzo para poder realizarlos. Además de un poco de dinero, claro. Estos tienen la particularidad de que fueron desarrollados por “agentes libres”; es decir, personas que no trabajan para una empresa, sino para sí mismos.

Estos tres proyetos en paticular ilustran varios aspectos con los que siempre lidiamos en nuestra vida diaria. Sin embargo, si realizamos un trabajo o algo que nos apasiona con tanto ahínco, realmente plasmamos todo nuestro pensar y nuestras emociones en el proyecto. No cabe duda de que estos 3 videojuegos son geniales, no sólo por sus temas o por la manera original de jugarlos, sino porque se ve que están buenos, los 3 tienen características únicas (tanto de jugabilidad como de temas) con respecto a otros juegos que ya están en el mercado), y sobre todo porque los 3 tienen plasmados en ellos los ideales y sueños de los desarrolladores.

En el video se muestra que, lejos de tener un beneficio económico por el juego, los desarrolladores están más preocupados porque la gente de verdad se divierta jugando los juegos, que recuerden los buenos tiempos de los juego que eran extremadamente difíciles, y sobre todo que la gente entendiera el mensaje que estaba plasmado en los juegos: sus emociones y sus sueños.

Desafortunadamente, muchas cosas pueden pasarle a cualquier proyecto que realicemos en nuestras vidas. Así, cada juego tuvo un resultado distinto. Uno de ellos fue exitoso, tanto en críticas como en ventas y en captación del mensaje plasmado. Uno de ellos sufrió complicaciones, pero logró obtener un colchón de tiempo para depurar defectos y mejorar la funcionalidad. Así mismo, uno de ellos sí tuvo venta, pero fracasó porque muy, muy pocos usuarios entendieron el trasfondo del juego, y lo tacharon de ridículo, aburrido y “choteante”.

Aun así, en los 3 juegos se demuestra un gran muy alto de perseverancia, ya que, apesar de los problemas legales, económicos, sociales, entre otros; todos los desarrolladores han puesto toda su energía en lograr algo que ellos quieren, con un nivel de perseverancia tal que unos estuvieron al borde de la locura por conseguir lo que querían: un proyecot funcionando.

Este ejemplo, en lo personal, me ha motivado a mejorar mi perspectiva con respecto a lo que hago en mi día a día, y que no importa qué tan trivial o difícil sea el reto, siempre hay que hacerlo con todo el esfuerzo que se requiera, con perseverancia y actitud positiva. Pero más aun, el hecho de vincularnos emocionalmente con algo que realizamos, nos mueve a hacerlo cada día mejor, y sobre todo, con las únicas ganas de dejar algo como legado en este mundo.

domingo, 6 de septiembre de 2015

La jungla: hogar de transistores, condensadores y procesadores salvajes que quieren devorarnos.


Como menciona Herb Sutter en su artículo de “Bienvenidos a la jungla”, el desarrollo del hardware ha sido de gran relevancia para la ciencia computacional en todos los campos. No solo es importante para alguien que utilice una computadora (ya sea un usuario común o un desarrollador reconocido) la velocidad con la que se desempeña el sistema, sino también que se puedan realizar diversas tareas al mismo tiempo. Esto se ha logrado por las dos vías principales: el aumento de la velocidad de procesamiento de un núcleo, y la capacidad de este para trabajar “en equipo” con otros núcleos.

El expresión “la unión hace la fuerza” adquiere relevacia en este rubro, tras la aparición de los procesadores multinúcleo; y su significado se vuelve definitivo con el desarrollo de los clusters, o servidores de nube. No sólo hay computadoras con más de un núcleo trabajando en tareas específicas, sino que hay muchas computadoras y dispositivos embebidos, comunicados entre sí a través de diferentes protocolos de comunicación (por hardware: Ethernet, WiFi, Bluetooth, Serial, I²C, SPI, entre muchos otros; y por software: Sockets, DNS, HTTP, FTP, OpenMP, MPI, entre otros).

Resaltando lo que mencionó Herb Sutter, y en lo que en particular estoy de acuerdo, la ciencia de la computación actual no puede quedarse estacionada en la programación secuencial; hay llegado su momento de evolucionar (irremediablemente), caer en la cuenta y adaptarse a su futuro: el paralelismo. El paralelismo actual, sin lugar a dudas, es un poco primitivo, ya que no se ha aprovechado el 100% de las capacidades que los ordenadores tienen hoy en día. Y mucho menos con la aparición de la tecnología contemporánea más importante de la era de la comunicación: la Internet. Con Internet, podemos realizar un sin fin de aplicaciones paralelas. Además, cuando guardamos archivos en la nube, los archivos no están estrictamente almacenados siquiera en el mismo disco duro. Pueden estar en más de uno. Con esto, se puede enfatizar el hecho de que el paralelismo no solo golpea al procesamiento en sí, sino también al almacenamiento de información.

Con el paralelismo aplicado 2 de los módulos principales de una computadora; el procesamiento y el almacenamiento de información; el hardware ya tiene la capacidad de realizar muchas cosas diferentes, y nos da nuevas posibilidades. Situación que no hubieramos alcanzado con el procesamiento tradicional de von Neumann. Es momento de aprender a programar de manera concurrente, y aprovechar lo que el hardware nos está brindando hoy en día. Aunque no lo parezca, si no nos forzamos como ingenieros en software a aprovechar esta oportunidad, no nos daríamos oportunidad como ingenieros en hardware a ver un nuevo reto y mejorar las arquitecturas con el paso del tiempo, ya que “un mejor desempeño que el actual” no va a ser requerido.