martes, 30 de diciembre de 2014

¡Gracias, 2014... You rocked!

Se acaba, se acabaaaa, el año 2014. (8) ¡Un excelente año! A pesar de las dificultades y los tristes momentos, fue un año de alegrías, de éxitos y de inicio de proyectos futuros. Tenía un tiempo sin escribir algo en este blog, pero quisiera aprovechar hoy para compartir con ustedes algunas de las cosas por las que estoy agradecido este año.

This year was legen... wait for it... dary! Legendary!

En primer lugar y por mucho el logro más importante de este año. ¡Finalmente defendí mi tesis de maestría y me gradué! Al fin Magíster en Ciencias de la Computación. Fueron casi 5 años de arduo trabajo (bueno, hubo un año no tan arduo, pero de resto si, jajaja). Además la tesis ganó mención de honor sobresaliente, lo que me llena de orgullo y de ganas de seguir aprendiendo y trabajando.

Además, tuve el gusto continuado de ser entrenador de los equipos de la USB que participan en los maratones de programación ACM-ICPC. Tuvimos un excelente local, que aunque fue preparado corriendo salió realmente excelente. ¡Gracias a todos los que lo hicieron posible! Luego, con los tres equipos campeones fuimos a participar en el Super-Regional Sudamericano con sede en la UDO de Anzoátegui. Aunque no tuvimos nada de playa, regresamos a casa con una gran recompensa: ¡Una clasificación al mundial en Marruecos 2015! Es la primera vez que Venezuela clasifica en 5 años, El equipo Team Phoenix, conformado por Wilmer Bandres, José Sanchez y José Gregorio Piñero obtuvo su clasificación haciendo 6 de los 11 problemas. Una cantidad de verdad admirable. Y más aún que han seguido entrenando para dar la talla en el mundial. ¡Sé que dejaremos el nombre de Venezuela en alto!

Recientemente tuve el privilegio y el gusto de recibir un inesperado halago: un premio a la excelencia docente, otorgado por la Federación de Centro de Estudiantes de la USB, decidido en votación de todos los estudiantes (bueno, los que se enteraron por las redes sociales, jeje). No puedo describir con palabras lo agradecido que estoy con tal honor y lo mucho que me inspira para continuar mejorando y aprendiendo.

Este año tuve la oportunidad de ser tutor de 5 pasantes: Erick Dos Ramos, Domingo de Abreu, Oriana Gómez, Carla Urrea y Andrea Balbás. Ya uno de ellos defendió, otro entregó su libro y a las otras les falta poco (básicamente por mi culpa, pues les faltan mis correcciones, jajaja). Ahora comienzo con un pasante más: José Lezama; y nada menos que 4 tesistas: José Luis Jimenez, Joel Araujo, Matteo Ferrando y David Lilue; y 2 en proyectos a dedicación exclusiva: Johan Gonzalez y Gabriel Casique. (Seeeh, no perdí el tiempo. XD). Todos los proyectos en los que están trabajando me entusiasman muchísimo y tengo altas expectativas con sus aplicaciones. ¡De verdad es emocionante!

Además he tenido algunos otros éxitos en progreso que prefiero no compartir aún, hasta que sea seguro. Seguramente en Enero escucharán noticias de uno de ellos y en Febrero de otro. Pero si les adelanto que es algo emocionante. ¡Una oportunidad para aprender mucho más sin duda!

Por último, pero no menos importante. Este año tuve el gusto de continuar compartiendo con amigos excelentes, una bonita familia y conociendo a nuevas personas que son realmente geniales. ¡Me considero afortunado de conocer a tantas excelentes personas! Recibo una gran cantidad de cariño a diario y puedo retribuirlo de muchas formas, con mi amigos y familia o con el trabajo que amo. ¡Gracias a todos!

En fin, al 2015 le sale una seria competencia para ganarle al 2014, pero tengo un excelente presentimiento de que será aún más épico. ¡Gracias a todos los que formaron parte de mi vida este año! (Éste es como el "mi año en facebook" pero mucho más largo, detallado y empalagoso, jajaja). Nos seguiremos viendo y compartiendo en el 2015. ¡Feliz año nuevo a todos y hasta una próxima entrada! :D

martes, 14 de octubre de 2014

De aprender y enseñar

Como muchos que me conocen saben, me encanta mi carrera y me apasiona aprender siempre nuevas cosas y mejorar día a día. Pero hay una cosa que me mueve más que nada en el mundo: enseñar, compartir, ayudar a otros a crecer. Creo que en cada persona existe un potencial enorme de grandeza. Poder ser aunque sea una pequeña parte de lo que impulse a una persona a encontrar esa grandeza es un orgullo y un privilegio sin duda. Es la fuerza que me mueve y mi propósito de vida. :)

No podía dejar pasar este chiste malo, jajaja.

Desde que comencé a estudiar mi carrera, siempre me he preocupado por contribuir (de la mejor manera que mi limitada experiencia me permitiera) en ayudar a los demás y mejorar mi carrera. Fui preparador la mayor parte de mi pregrado y luego de eso, ayudante académico y finalmente profesor. Hasta donde la voz y el voto me permitieron en cada etapa, siempre intenté proponer nuevas herramientas que motivaran a aprender. Intentar mostrar un poco eso que siento al aprender algo nuevo, de la inspiración y el descubrimiento, para que otros puedan contagiarse quizá un poco y seguir aprendiendo y descubriendo por su cuenta.

Es por todo esto que muchas veces actúo como actúo. Soy el "profesor niño", aquel al que se confunde con un estudiante más si no fuera por la cara de viejo, jajaja. Muchos profesores creen que el camino al aprendizaje es a través del respeto y la distancia. ¡No estoy de acuerdo! Honestamente, creo que el mejor camino al aprendizaje es a través de la confianza, el humor y la automotivación constante. No sólo se crea el ambiente para que los demás aprendan más fácilmente, sino que a cambio terminas aprendiendo muchísimo más de tus estudiantes, tanto académica como personalmente.

Las responsabilidades de un profesor en una universidad, lamentablemente, no están centradas en la docencia y en la formación de los futuros gigantes. En cambio, está centrada en el descubrimiento y diseminación de nuevas ideas a través de la investigación. A pesar de que es algo que también me gusta y por lo que tengo un respeto enorme, no es realmente lo que me apasiona y es respecto a este único atributo que se mide la valía de un profesor e incluso de una universidad. He visto estudiantes de diferentes universidades que se enorgullecen al ver los rankings de universidades y ver sus propias casas en la delantera. Pero ese ranking lamentablemente no tiene nada que ver con la calidad de sus egresados, sino con la cantidad de publicaciones realizadas por profesores adscritos a ellas.

Creo que debería existir la figura del profesor docente, que pueda dedicarse a enseñar y no tanto a investigar. Así mismo la del profesor investigador, que sea justamente lo contrario. Conozco profesores a los que no les gusta enseñar, pero que son excelentes investigadores y eso es lo que les motiva. Eso está muy bien y tienen la suerte de vivir en un mundo donde ese talento es dado mayor importancia, pero deberían existir alternativas a ese filosofía. A su vez debería existir alguna medida, aunque sea difusa, de la calidad docente de una universidad (existen clasificaciones culturalmente aceptadas, pero ninguna formal o basada en argumentos sólidos). Y no lo digo por el reconocimiento involucrado, sino para que aquellos a los que nos apasiona enseñar tengamos la libertad de centrar nuestro trabajo y energía en justamente eso.

Y bueno, cuando comencé a escribir sobre esta entrada, en realidad se trataba de otra cosa pero me desvié, jajaja. Tengo en planes (aunque sin fecha de inicio estipulada) volver a estudiar mi carrera completa por cuenta propia y afinar los detalles que no comprendí por completo. De hecho, he estado haciendo eso ya por algún tiempo. Durante mis estudios, siempre que una materia me gustaba pero no la comprendía completamente hacía lo posible por dar la preparaduría en algún momento. Eso me pasó con una de mis materias favoritas: Traductores e Interpretadores. ¡Esa materia me encantó! Pero a duras penas la pasé (51/100 like a boss, jajaja). Y me fijé comprenderla, enseñándola. Y así fue. :)

¿Cómo planeo repasar mi carrera ahora? Leyendo más que todo, pero con un objetivo concreto en mente: Realizar un repositorio de guías y ejemplos de cada cosa que repase. De esa manera, no sólo aprenderé con mayor profundidad, sino que dejaré algo para que los demás puedan apoyarse en su aprendizaje también. Es un proyecto personal de gran escala y para el cual lamentablemente no cuento con tiempo ahora, pero me encantaría comenzarlo lo más pronto posible.

Y bueno, esto era lo que quería compartir por ahora con ustedes. Solamente un desahogo personal. Cuento con la suerte y el honor de pertenecer a grupos de investigación conformado por algunas de las mejores personas y docentes que conozco, lo cual ha hecho todo muy divertido e interesante. Pero siempre me hace falta ese algo extra especial. El brillo en la mirada de una persona que no sólo acaba de comprender algo, sino que disfrutó aprenderlo y está listo para utilizarlo en su vida. El agradecimiento sincero, aunque sea tácito, de quien halló su vocación y camino en parte con tu ayuda. Ese rincón en el corazón de todas las personas que compartieron contigo y con quienes lograste crecer mutuamente. Son cosas como esa a las que no se les puede poner precio y llenan la vida de color (seh, momento cursi del día patrocinado por Ricardo, jajaja). Hasta una próxima entrada y gracias por seguir leyendo estas locuras ocasionales. n_n

sábado, 4 de octubre de 2014

Semana CoNCISa

Finalmente llegó el momento de colgar el distintivo y disfrutar de un merecido día de descanso. ¡Ha concluido la 2da Escuela Venezolana de Informática y Conferencia Nacional de Computación, Informática y Sistemas!

¡COnferencia Nacional de Computación, Informática y SistemAs!

Fue una semana de trabajo duro, pero que valió muchísimo la pena. Ambos eventos (EVI y CoNCISa) salieron super bien y creo que los asistentes salieron bastante satisfechos. Tuve el gusto y el privilegio de ser parte del equipo organizador del evento (aunque la invitación fue tardía, y no pude ayudar en el previo tanto como hubiera querido, pero igual pude dar mi todo para que el evento saliera bien, jeje). Tuve la oportunidad de compartir con queridos colegas ya conocidos y la dicha de conocer a otros más. Además, tuvimos la invaluable ayuda de un equipo de logística formado por estudiantes voluntarios de varias universidades. A la mayoría ya los conocía y son personas geniales. Los que no, pronto descubrí que también eran excelentes personas y pasamos una genial semana entre todos haciendo posible estos eventos (y haciendo Origami, jajaja).

Ambos eventos fueron con sede en la UCAB (Universidad Católica Andrés Bello). Como otras veces que esta universidad ha sido casa para eventos académicos, el lugar fue excelente y todas las cosas funcionaron muy bien. Además, para mi, la UCAB tiene un "no se qué" que me hace sentir muy a gusto. Siempre me ha parecido que tiene un ambiente muy relajante y unos jardines sumamente estéticos y bien cuidados. Después de mi adorada USB, creo que es uno de los sitios en donde me siento más a gusto. Además, estaba lleno de gente genial de muchas diferentes universidades, lo cual lo hizo aún mejor. :)

No pude entrar a muchas de las charlas, ya que estuve ocupado en la organización. Sin embargo, tuve el gusto de poder asistir a tres muy buenos subeventos:

  • En primer lugar, fui el moderador del tutorial "Herramientas para la Gestión de Eventos Académicos en Línea", dictado virtualmente por el prof. Raymond Marquina de la ULA (excelente persona y profesional, al menos en lo poco que tuve el gusto de compartir con él). A pesar de un inconveniente con la luz, que se fue en casa del presentador y tuvimos que sobrevivir con puro audio vía plan de datos (ese si es un plan de datos vale, jajaja), la charla estuvo buenísima y aprendí bastante.
  • En segundo lugar, pude asistir y ser chair de la 4ta (y última) tanda de ponencias del segundo día de CoNCISa. Hubo muchas buenas charlas de diferentes temas, en realidad muy interesantes. Además, aquí presenté yo mismo una charla llamada "Hacia la Verificación de Programas que Manipulan Estructuras Recursivas Generales Mediante Apuntadores", correspondiente al trabajo enviado en conjunto con Jesús Ravelo. Volví a leer el artículo preparando la presentación y sigo enormemente orgulloso del resultado y agradecido por toda la ayuda, guía y amistad de Jesús. ¡Es en verdad invaluable! Y la presentación creo que salió bastante bien, aunque quedaría de la audiencia constatarlo, jajaja.
  • En tercer lugar, pude asistir a la presentación del premio a la destacada trayectoria para mi amigo y profesor, Jorge Baralt. Además de emotivo, todo el acto fue en realidad super gracioso, por diversas razones. Nada más la exposición del curriculum fueron casi 10 minutos, jajaja. Y el discurso de aceptación fue lo máximo: "Me dijeron que tengo solo dos minutos... El primero y el último me imagino." y "Seré breve entonces: Gracias... ¿Ahh? ¿Un poco menos breve? Muy bien... Muchas gracias", jajaja. Después de ahí si se enserió un poco el discurso y dijo algunas excelentes e inspiradoras palabras. ¡Qué gusto y qué privilegio conocer a una persona tan valiosa en verdad! :)

Fue una semana interesante y entretenida, aunque fuerte. Una cosa divertida es que los últimos dos días y medio estuve encargado de las ventas de souvenirs del evento. He descubierto mi don y gusto de venta, jajaja. La apodaron "La tiendita de Ricardo" y se pudo vender unas cuantas franelas, chemisses y hasta libros con las memorias de CoNCISa del año pasado. Además, vendimos tantas membresías a la Sociedad Venezolana de Computación que nos quedamos sin facturas. Fue divertido eso, jajaja. Cuando no estuve en la tiendita, estuve más que todo en la mesa de registro. ¡Ese trabajo me encanta! Tengo la oportunidad de tratar y conocer a mucha gente nueva, y ayudarlos a tener la mejor experiencia posible. Recibí a cada uno con una sonrisa, no sólo por que es lo indicado, sino por que estaba genuinamente feliz de estar ahí ayudando y conociendo nueva gente.

El acto de clausura también estuvo buenísimo, con una agrupación tributo de Les Luthiers llamada "Los Experimentados" (o algo así). ¡EXCELENTE! Hicieron dos obras originales que estuvieron realmente buenas. Es una lástima que sean prácticamente invisibles en la web. No he podido encontrar nada sobre ellos posterior al evento, pero fue realmente genial. ¡Ojala logren surgir y triunfar como grupo!

En fin, excelente semana. Tuve el gusto de conocer a mucha gente nueva y compartir con viejos y nuevos amigos. Me encantó la hermandad que vi entre las diferentes universidades. Sin las competencias, ni los delirios de superioridad, ni discriminaciones. Tan sólo un grupo de gente unida por su pasión por la computación y las ganas de ayudar a realizar un gran evento. ¡Qué orgullo haber formado parte de este gran equipo! Espero poder colaborar nuevamente el año que viene y en cualquier otro evento de este estilo. Fue una gran experiencia en verdad. ¡Gracias a todos! :D

Y esto era lo que quería compartir por ahora. Tenía bastante tiempo sin escribir, jeje. He estado realmente ocupado, con mil cosas que hacer. Estas semanas venideras ya deberían ser un poco más ligeras, pero ya veremos, jajaja. ¡Hasta una próxima entrada!

sábado, 23 de agosto de 2014

El épico origen de "bulda e' bien"

Hoy quiero compartir con ustedes una historia graciosa y épica, de como nació el alias que uso para un montón de cosas en Internet: bulda e' bien.

Cuenta la leyenda...

Como toda buena historia... comienza en la biblioteca de la USB (ahh?). Antes de comenzar la universidad nunca vi la necesidad de abrirme un correo electrónico (super material computista yo, jajaja.) Y cuando llegué a la universidad me abrieron automáticamente mi correo con el USB-ID (el carné) y comencé a usarlo. Pero los límites de ese correo eran ridículos, aún para la época y decidí probar una nueva página que ofrecía servicio de correo electrónico. Todo el mundo tenía uno y ya era hora de que me hiciera una cuenta. (Botando la cédula en 3... 2... 1...) Me abrí un Hotmail.

¿Y que tiene que ver todo esto con la biblioteca de la USB? Bueno, en esa época (yo entré a la USB en el 2003) uno podía anotarse en una lista para tener 45 minutos de Internet gratis en el 3er piso. ¡Y era lo máximo! Biblioteca abría a las 8:30am. y ya a las 7:00am. había gente esperando y haciendo cola. ¡Pero era Internet y GRATIS! Como cambian los tiempos, jajaja. Lo peor es que el Internet que ofrecían era leeento, pero era mejor que nada (y más aún, realmente no conocíamos el Internet rápido aún, jajaja). ¿Descargar una película? LOOOL, nope!

Un día de esos fui con un pana a nuestros 45 minutos de internet en la biblioteca y él nota que no tengo Hotmail. Ya yo estaba pensando abrir una cuenta, pero el insistió en que la creara ahí mismo. ¡Bueno, si va! ¿Pero que nombre habría de ponerle? Pensé muchas cosas geeks y de cero buen gusto, que si con Darth Vader, Goku y cosas así, pero todas estaban ocupadas (¿Qué pasa con la humanidad? Jajaja). Y ya acabándose el tiempo le digo al pana "Coye, no quiero usar mi nombre y ya. ¡Qué aburrido! Me gustaría algo divertido, un nombre bulda e' bien" (seh, yo era un tuki total, jajaja). Los dos lo pensamos al mismo tiempo... ¡Ese era el nombre perfecto! "bulda_e_bien@hotmail.com" y estaba disponible.

¡Tenía un nuevo correo! :D Sólo hacía falta llenar la información personal. Pero había un pequeño detalle: En esa época todo el mundo sufría de una paranoia horrible de no compartir nunca su información real por Internet y confieso que yo no era la excepción (y ahora la gente hasta hace "check in" en los lugares donde está para que los que quieran secuestrarlos no pasen tanto trabajo; tan considerados vale). Pero en esa época ni el nombre se acostumbraba poner a la ligera. Como era un servicio nuevo, pues desconfiaba de él y decidí inventarme un nombre ficticio. Me puse de nombre "Helketeko" y de apellido "Jioanoche" (seh seh, era extremadamente tuki, jajajajja).

Por un tiempo dejé eso así y todo relajado. A veces conseguía correos cómicos y se los quería reenviar a mi papá, pero aparentemente no le estaban llegando. Un día le pregunto y efectivamente me dice que no le llegaban. Hmmm... Voy a revisar con él y veo un poco de correos sin abrir. El me dice que está molesto por que le han estado mandando spam o virus o que se yo y siempre es desde el mismo correo. Un tal "Helketeko Jioanoche". Y yo LOOOOOOOOOL (en esa época no se decía tanto LOL, pero ustedes entienden, jajaja). ¡Ese soy yo! Jajajajja. Se me había olvidado completamente que le había puesto eso en la información personal y no sabía que se mostraba. ¡Que risa!

Pero, ya va. Entonces recordé que también había usado ese correo para cosas de la uni y mandar correos con dudas y eso. ¡Que pena! Debo haberle regalado horas de risas y pena ajena a mis profesores, jajaja. En seguida fui al correo y cambié la información personal con la verdadera.

Igual ese correo no duró mucho. Hotmail pasó de moda rápidamente en lo que nacieron otros servicios muy superiores. En especial cuando me invitaron a Gmail (fui uno de los primeros que conozco en tener una cuenta Gmail, ajem ajem, jajaja) y ahí me quedé hasta ahorita. El nombre "bulda e' bien" ha sobrevivido de varias maneras. Los cómics, mi usuario en páginas como Topcoder, Spoj y hasta Instagram, incluso en el nombre de este blog. Pero todo empezó un día en la biblioteca de la USB.

Y esta era la historia épica que quería contarles. ¡Todavía me mata de la risa! Espero les haya gustado, jajaja. ¡Hasta una próxima entrada! :D

jueves, 21 de agosto de 2014

Retomando un viejo proyecto: Guerra de Clases

Como muchos saben (y los que no pueden inferir de que a cada rato comparto cosas de este blog, jajaja), me gusta escribir. Además de este blog y del blog para mis cómics ( Bulda-E-Bien - A Web Comic ), también llevo un blog para cosas que escribo ( Ideas Nada Mas ), tanto ideas locas como mini-relatos. Aunque confieso que no escribo tanto como antes o como quisiera en ese blog, jeje.

O quizá P = NP. ¿Quién sabe? :D

En el 2010 escribí un cuento llamado "Guerra de Clases" ( Guerra De Clases ), que trataba de una guerra entre los clanes P y NP (seh, las clases de complejidad computacional, jajaja). Al final me había gustado bastante el resultado, pero lo dejé hasta ahí.

En el 2012 pensé que ese cuento podría expandirse y volverse quizá un mini-libro completo con bastantes referencias gallas a teoría de lenguajes. Realicé una planificación para la expansión del cuento y escribí el capítulo 0: "Igualdad" ( Guerra de Clases: Capítulo 0 - Igualdad ). Peeeero, también quedó hasta ahí. Realmente no continué con el proyecto.

En estos días decidí revisar las cosas que tenía en un disco duro viejo y encuentro una carpeta con cuentos e ideas para cuentos. ¿Con que me consigo? ¡La guerra de clases! Y pensé que quizá sea hora de retomar ese proyecto. Así que saqué papel y lapiz (o más bien teclado y LaTeX, jajaja) y comencé a actualizar lo que ya tenía. ¿El resultado? Una nueva versión para el primer capítulo, más pulida y organizada (creo yo).

Pueden leerla en el siguiente enlace:

¿Qué opinan? :D

El plan es que tenga unos 10 capítulos, lo que en promedio lo haría como de 40 páginas (no muy largo). Aunque quizá llegue una inspiración brutal y se extienda un poco más, jajaja. ¿Quién sabe? XD

Y bueno, eso es lo que quería compartir por ahora, quizá pronto vuelva a escribir sobre el siguiente capítulo. ¡Hasta una próxima entrada! :D

Capítulos posteriores:

( Capítulo 2 - Un nuevo y grandioso poder )

jueves, 14 de agosto de 2014

Discreto, Funcional, Implacable...

Como algunos ya saben, desde hace un tiempo he estado interesado en aprovechar las facilidades que trae un lenguaje funcional puro en la enseñanza de las matemáticas discretas. La primera entrada al respecto en este blog está aquí: ( Discretamente hablando: Haskell ). En esta ocasión quiero continuar con esa discusión, planteando una implementación directa del primer tema que se toca en el curso de Estructuras Discretas III de la USB: Los números enteros.

Like a sir, indeed!

Para este curso se usan las muy completas guías que realizó el profesor Yriarte (disponibles en: http://ldc.usb.ve/~yriarte/d2index.html). Que plantean muchos de los conceptos y propiedades importantes en un lenguaje fácil de entender (además que esté en Español, lo cual ayuda mucho a quien no maneja del todo el Inglés). Sin embargo, creo que se puede ir mucho más allá de una guía estática y convertirlo en una ayuda interactiva y flexible mediante el uso de un lenguaje como Haskell.

¿Por qué Haskell? Porque es un lenguaje funcional puro, de muy alto nivel, en el que las definiciones matemáticas abstractas son casi directamente plasmables de forma clara y compacta. Además, el sistema de tipos estático ayuda en gran medida a la correcta definición de las funciones y los tipos de interés. ¿Por que no algo más especializado como Coq o Idris? (Excelente sugerencia de Manuel Gómez en la entrada anterior) Las únicas razones válidas hasta el momento: tiempo y falta de experiencia. Estos lenguajes/herramientas tienen sistemas de tipo mucho más elaborados y rigurosos que permitirían mucha más confianza en las definiciones hechas. Incluso, permitirían la elaboración de pruebas simbólicas en el contexto del mismo lenguaje (ver: Idris: verifying a monoid). Sin embargo, explorar las capacidades de estos lenguajes y de como acotarlas a un nivel que sea a la vez correcto, pedagógico y práctico, es algo que tomaría tiempo y por tanto estaría sujeto a una próxima iteración de cambios.

Antes de comenzar con los temas correspondientes a Estructuras Discretas III, hacen falta algunos preliminares (idealmente, ya se hubiera usado un lenguaje como Haskell al menos en Estructuras Discretas II, pero no es el caso en esta ocasión). En particular: lo que quiere decir poder hacer aritmética sobre un tipo determinado y el tipo de los números naturales. Nótese que hablo de tipos en vez de conjuntos. ¡Esa es una de las principales ventajas del enfoque funcional! Se desliga de la fundamentación en conjuntos (heterogénea y complicada) a una fundamentación en tipos (homogénea y constructiva). Para una discusión mucho más elaborada de esto basta ver cualquier libro de teoría de tipos básica y empezar a notar todas las ventajas. Teorías de tipos más complejas dan aún más comodidades, a expensas de claridad en la presentación y por tanto se intentará mantener la presentación lo más sencilla posible (por ejemplo, la igualdad será considerada una proposición, no un tipo como es costumbre en teoría de tipos).

A continuación un archivo Haskell con la implementación de los preliminares necesarios hasta el momento:


A continuación un archivo Haskell con la implementación de los números naturales como números de Church:


Una vez se han establecido los preliminares, se puede comenzar a tocar temas de Estructuras Discretas III. La primera guía de Yriarte (ver: Capítulo Uno) se trata de los números enteros. En particular, la sección 1.2 los define y plantea algunas propiedades sobre los mismos. A continuación un archivo Haskell con la implementación de los números enteros, según la guía antes mencionada:


Es notable como poco a poco aumenta el nivel de abstracción hasta el punto que, en la definición de la función valor absoluto (abs), la implementación interna y complicada de números enteros se vuelve completamente transparente. ¡Esta es la belleza de una teoría constructiva!

Desventajas: Hay una inconsistencia entre la definición formal de los números enteros y la que plantea el tipo en Haskell. Los enteros son clases de equivalencia (conjunto cociente del producto N x N con respecto a la relación planteada en la ecuación 1.1). En Haskell, son tratados simplemente como miembros del producto N x N. Esto por varias razones: La guía tiene la misma inconsistencia con respecto a la definición, pues plantea las propiedades y definiciones posteriores en términos de N x N y no del conjunto cociente. Pero la más importante de las razones sería que realmente no encuentro una manera fácil e intuitiva de construir un tipo que corresponda a clases de equivalencia, sin entrar en temas muy oscuros como para una materia introductoria. (Se aceptan sugerencias en este punto).

A través de las definiciones en Haskell se puede notar una falta de estandarización en los nombres. Por ejemplo, a veces las variables son x, y, z... otras son m, n, p... y otras son a, b, c... sin motivo aparente.  Estas son importadas directamente de la guía, para no chocar con los nombres ahí utilizados. Además, algunas proposiciones son "propiedades" y otras son "teoremas". Ambas son demostrables a partir de las definiciones dadas. ¿Por qué la distinción? Ese tipo de detalles y muchas otras cosas más que me parece que faltan me hacen pensar que quizá sea más interesante, en vez de implementar un apoyo a las guían que ya existen, hacer un reboot y reescribir las guías desde un punto de vista funcional. ¡Quizá hasta un libro! Independiente del curso y general para cualquiera interesado en hacer matemáticas discretas desde un punto de vista funcional. Hasta les tengo el nombre ya (hint: el título de esta entrada es un spoiler). Se llamaría "Discreto, Funcional, Implacable..." y me imagino que la portada sería algo como un James Bond sosteniendo un arma que en realidad es un lambda. Pero esos ya son detalles no tan importantes (aunque divertidos. XD).

¿Qué opinan? ¿Va por buen camino? Gracias a muchos comentarios de diversas personas la cosa ha ido tomando forma. Me gustaría seguir recibiendo opiniones con respecto a esto para enriquecerlo y terminar con una propuesta sólida, implementable y divertida. ¡Muchas gracias a todos los que han ayudado (y a los que ayudarán. XD)!

Hasta una próxima entrada. :)

martes, 12 de agosto de 2014

Coursera... ¡Nostalgia Épica!

Mi hobby preferido, como mucho saben, es aprender (seh, la oración más galla ever, jajaja). ¡Pero es así! Me emociona aprender de muchos diferentes temas, tanto en computación como en otras áreas. Por eso, cuando descubrí la página Coursera, hallé un verdadero nuevo amor. Claro, eso hasta que la nación del fuego atacó (entiéndase la nación del fuego como la tesis de la maestría, jajaja).

¡Coursera Rocks! \m/

El primer curso que hice en Coursera fue "Natural Language Processing" de Stanford, en Marzo del 2012. ¡Excelente curso! Y el sistema de aprendizaje online de Coursera me pareció extraordinario. A partir de ese momento tomé un montón de otros cursos, cada uno mejor que el anterior. En ocasiones podía estar viendo de 3 a 6 cursos simultáneamente y fabricaba el tiempo para cumplir con eso y con todas mis demás responsabilidades. Claro, llegó un momento en que las demás responsabilidades se hicieron demasiadas y de carácter urgente, por lo que tuve que abandonarlo. El último curso que logré terminar fue "An Introduction to Functional Analysis" de École Centrale Paris, en Enero del 2014. Este curso NO JUGÓ CARRITOS. Fue sin duda uno de los más difíciles, pero también uno de los más interesantes. :)

Ahora que terminé la maestría finalmente, aún no he tenido tiempo de volver a Coursera, ya que tengo muchas otras responsabilidades pendientes. Recordando todas las cosas interesantes que he aprendido en esa página, me da nostalgia. Me gustaría volver a tener todo el tiempo para seguir aprendiendo aquí, pero seguramente pronto se podrá nuevamente aprovechar ese conocimiento tan disponible y de excelente calidad.

Y bueno, como para dar una idea de la calidad de fiebre que tuve con Coursera entre 2012 y principios de 2014, pongo aquí una lista con todos los cursos para los cuales gané un certificado, clasificados por el área del curso:
  • Computación:
    • "Natural Language Processing"
      • Universidad: Stanford
      • Marzo de 2012
      • Más información: (Enlace)
    • "Functional Programming Principles in Scala"
      • Universidad: EPFL
      • Septiembre de 2012
      • Más información: (Enlace)
    • "Compilers"
      • Universidad: Stanford
      • Octubre de 2012
      • Más información: (Enlace)
    • "Algorithms: Design And Analysis, Part 1"
      • Universidad: Stanford
      • Julio de 2013
      • Más información: (Enlace)
    • "Algorithms: Design And Analysis, Part 2"
      • Universidad: Stanford
      • Septiembre de 2013
      • Más información: (Enlace)
    • "Artificial Intelligence Planning"
      • Universidad: Edinburgh
      • Enero de 2014
      • Más información: (Enlace)
  • Física:
    • "Quantum Mechanics and Quantum Computation"
      • Universidad: Berkeley
      • Julio de 2012
      • Más información: (Enlace)
    • "Introduction to Astronomy"
      • Universidad: Duke
      • Noviembre de 2012
      • Más información: (Enlace)
    • "Volcanic Eruptions: A Material Science"
      • Universidad: LMU
      • Julio de 2013
      • Más información: (Enlace)
    • "From The Big Bang To Dark Energy"
      • Universidad: Tokyo
      • Septiembre de 2013
      • Más información: (Enlace)
  • Matemáticas:
    • "Linear and Discrete Optimization"
      • Universidad: EPFL
      • Febrero de 2013
      • Más información: (Enlace)
    • "Introduction to Mathematical Thinking"
      • Universidad: Stanford
      • Septiembre de 2013
      • Más información: (Enlace)
    • "Calculus Two: Sequences and Series"
      • Universidad: Ohio State
      • Septiembre de 2013
      • Más información: (Enlace)
    • "An Introduction to Functional Analysis"
      • Universidad: École Centrale Paris
      • Enero de 2014
      • Más información: (Enlace)
  • Psicología:
    • "Gamification"
      • Universidad: Pennsylvania
      • Agosto de 2012
      • Más información: (Enlace)
    • "Introduction to Psychology"
      • Universidad: Toronto
      • Mayo de 2013
      • Más información: (Enlace)
    • "Social Psychology"
      • Universidad: Wesleyan
      • Agosto de 2014
      • Más información: (Enlace)
    • "Introduction to Communication Science"
      • Universidad: Amsterdam
      • Enero de 2014
      • Más información: (Enlace)
  • Filosofía:
    • "Introduction to Philosophy"
      • Universidad: Edinburgh
      • Enero de 2013
      • Más información: (Enlace)
    • "Introduction to Mathematical Philosophy"
      • Universidad: LMU
      • Julio de 2013
      • Más información: (Enlace)
    • "The Ancient Greeks"
      • Universidad: Wesleyan
      • Septiembre de 2013
      • Más información: (Enlace)
  • Misceláneos:
    • "Writing in the Sciences"
      • Universidad: Stanford
      • Septiembre de 2012
      • Más información: (Enlace)
    • "History of Rock, Part One"
      • Universidad: Rochester
      • Mayo de 2013
      • Más información: (Enlace)
    • "History of Rock, Part Two"
      • Universidad: Rochester
      • Julio de 2013
      • Más información: (Enlace)
    • "Undestanding Media By Understanding Google"
      • Universidad: Northwestern
      • Septiembre de 2013
      • Más información: (Enlace)
Nada más y nada menos que 25 cursos, sin contar los que hice sin recibir certificado (ya sea por que no ofrecían o por que no tuve la oportunidad de terminarlos), jajaja. Cada uno fue excelente, aunque si tuviera que hacer un top 5 de los que más me gustaron sería el siguiente:
  1. "Quantum Mechanics and Quantum Computation"
  2. "Social Psychology"
  3. "Introduction to Astronomy"
  4. "Introduction to Psychology"
  5. "An Introduction to Functional Analysis"
Es notable que no coloco alguno en computación, pero no porque hayan sido malos. Como computista, los cursos que hice de computación fueron más un repaso que otra cosa y como tal no se hicieron tan interesantes como los demás. Sin embargo los cursos de diseño de algoritmos son realmente excelentes y recomendables para cualquier computista que quiera ser íntegro como profesional. :)

Y bueno, habiéndome desahogado un poco de mi nostalgia épica, me despido. ¡Hasta una próxima entrada! :)

lunes, 11 de agosto de 2014

Semana de descanso y lectura

La semana pasada me desaparecí del planeta (o al menos de la porción digital del mismo) desde el Martes hasta el Sábado. Estuve toda una semanita playando en Puerto La Cruz. :D La verdad, hacía falta un pequeño escape de la rutina para recuperar energía y motivación, más con todo el trabajón que he tenido últimamente, jeje.

No creo que sea tan comodo, pero ¡palantemarik! XD

Fue una semana apartado, más que todo en un hotel con la piscina y eso. Pero además pude hacer algo que no suelo hacer muy a menudo: ¡dormir! XD Siesta tras siesta tras siesta (sé que suena a gente vieja lo de dormir, pero estoy seguro que cualquier computista me entiende, jajaja). Además, tuve la oportunidad de leer un par de libros: uno de literatura y uno técnico.

El libro de literatura que leí fue nada menos que el primero de la trilogía en cinco partes de "The Hitchhikers Guide To The Galaxy" de Douglas Adams. ¡Excelente libro! (y seeeh, debí haberlo leído hace tiempo pero no había tenido realmente la oportunidad hasta ahora.) Lo leí en inglés - como se debe ya que es su lengua original - aunque su inglés es complicado. Sin embargo dibuja escenas bastante detalladas y absurdamente cómicas. ¡Mil veces mejor que la película aquella que ni a los talones le llega! Aunque es gracioso como se le quedan algunos adjetivos pegados al autor como "mind-bogglingly" (viejo, existen otros adjetivos, jajaja), pero estuvo excepcionalmente bueno. Ahora me toca seguir y leer los libros que le suceden. :)

El libro técnico que leí fue "Basic Category Theory for Computer Scientists" de Benjamin Pierce. En realidad fue una relectura, ya que lo había leído ya en otras ocasiones. Pero fue muy valioso releerlo con la aumentada formación formal que tengo ahora y comprendí muchas cosas que no había captado del todo las otras veces. ¡Es una excelente referencia! Recomendado para cualquier computista.

Además, leí una buena parte del "Programming Challenges" de Steven Skiena y Miguel Revilla. Sin embargo, es un enfoque un tanto básico y la lectura se hace tediosa rápidamente. No sé si lo recomendaría para un principiante, pero al menos los problemas propuestos son buenos retos para alguien que esté empezando en esto de los maratones de programación. También comencé a leer un poco del libro de "Homotopy Type Theory" que había dejado en espera. El tipo de escritura de ese libro no es muy clara en ocasiones, pero es comprensible ya que es un compendio de diversos trabajos y diversos autores. Sin embargo, lo que plantean es sumamente interesante y continúo leyéndolo a ver que cosas se pueden utilizar para hacer una mejor computación. :)

Y bueno, no puede faltar la gordura épica durante la semana. Nada más gordito que bufé de desayuno incluido, jajaja. Y en la noche salíamos a comer cada cosa mejor que la otra. Desde parrilla, hasta hamburguesas gourmet y shawarmas callejeros. ¡Todo épicamente bueno!

Y bueno, esto es lo que he de compartir en este momento, jeje. Una semana relax. ¡Hacía falta! Y ahora a volver a la rutina, que hay papers que sacar. XD ¡Hasta una próxima entrada!

viernes, 1 de agosto de 2014

Las ventajas de una mente positiva

Los que me conocen saben que soy insoportablemente feliz y optimista casi todo el tiempo (incluso sé que a algunos eso hasta les molesta, jajaja). Pero es verdad, así soy. Y creo honestamente en que tener una actitud positiva hacia la vida siempre trae buenas cosas y experiencias. Saber apreciar las pequeñas cosas de la vida y esperar siempre una nueva sorpresa hace a la vida mucha más llevadera y divertida. Hoy me ocurrió una de esas de optimismo insoportable que terminó saliendo mejor de lo que me esperaba. :D

¡Tooodo es increíbleee! (8)
(A que les pegué la canción otra vez. XD)

Hoy se me hizo un poco tarde para salir de mi casa. El bus que tomo para venir a la uni pasa por la redoma de San Antonio entre 6:20am. y 6:40am. y mi casa no queda tan cerca de la redoma. Después de bañarme, vestirme, desayunar, etc. terminé saliendo como a las 6:10am. de mi casa. ¡Tardísimo! Las posibilidades de que me dejara el bus ya eran considerablemente altas. Así que salí pensando: "a menos que vea el autobús llegando (el que baja de mi casa a la redoma), me tocará agarrar un taxi hoy".

En lo que salgo de mi casa me asomo por la ventana de mi edificio y ¿que veo pasando? ¡El autobús que necesitaba! Jajaja. Estoy seguro que una persona "normal" estaría molesta y lanzaría frases tipo "a mi y al pato Lucas", "siempre tengo mala suerte" o alguna alusión a que su sufrimiento es similar en magnitud al de una chica llamada Precious. XD Capaz lo "lógico" era devolverse, ya que podía ser una señal de que no era buena idea salir o algo por el estilo. Pero como soy insoportablemente optimista me montó en el ascensor y pensé "nah, seguramente no tenía que agarrar ese bus hoy por alguna razón, seguramente todo saldrá bien".

Me voy de lo más tranquilo a donde se agarran los taxis y veo que me toca uno que maneja como si estuviera en la fórmula 1 (aunque hoy se controló un poco) y me monto igual. Como a mitad de camino pasamos el bus que había visto desde la ventana, que estaba dejando pasajeros. Llegando ya a la redoma veo llegando también el bus de la uni. Ya tenía la plata preparada del taxi (y exacta, no tenía que esperar vuelto), me bajé corriendo y logré alcanzar montarme en el bus.

Al principio pensé "que fino, lo alcancé en la raya" y no le di mas vueltas. Pero después me puse a pensar... "Ya va, si hubiera salido un par de minutos más temprano hubiera tomado el bus en vez del taxi y no hubiera alcanzado el bus de la uni". ¡Qué nivel de suerte over 9000! XD

Finalmente llegué a la uni, a eso de las 7:00am. ¡Ni una hora después de haber salido de mi casa! Algo que es casi irreal, aún para alguien con carro. Haber hecho ese tiempo en transporte fue sencillamente lo máximo, jajaja.

Y bueno, sé que tampoco es la graaan cosota. Pero me parece genial como al final todo sale bien si se mantiene una actitud positiva y se disfruta de las pequeñas cosas de la vida. Y esto era lo que quería compartir por ahora. Momento cursi y enfermamente feliz del día patrocinado por Ricardo, jajaja. ¡Hasta una próxima entrada! :D

jueves, 31 de julio de 2014

La falacia del testing y algo más

Hoy quiero hablarles de una de las más aceptadas metodologías de desarrollo en el ámbito industrial (e incluso en el académico), aquella conocida como "test driven development". En este enfoque, lo primero en diseñarse son los casos de prueba que se desea que pase exitosamente un cierto programa y luego se implementa dicho programa de forma que satisfaga estas expectativas. El proceso puede ser iterativo, incorporando nuevos casos y posiblemente alterando la implementación realizada acorde a estos. Esta estrategia tiene una grandiosa ventaja: Permite al programador estar más claro desde el principio en lo que quiere implementar y las propiedades que cumple. Además le otorga un mecanismo para descubrir fallas en su implementación o en su intuición (siempre puede haber errores en la definición de casos de prueba también). Incluso hay muy buenas herramientas que permiten realizar pruebas unitarias con facilidad. Lo que es una lástima... es que está severamente limitado.

Ni tan exagerado. XD

¿Cómo que está limitado? El enfoque del "test driven development" está basado en un conjunto de prueba que sirve como heurística para la totalidad de las posibles entradas al sistema implementado. ¿Pero como asegurar que es una buena heurística? Un programa tan sencillo como un factorial tiene como dominio a la totalidad de los números enteros. Incluso restringiendo el mismo a un lenguaje de programación con enteros de 32 bits, existen 2^32 posibles entradas para el programa. Hacer 100 o hasta 1000 pruebas es totalmente insignificante. Para programas apenas un poco más complejos, las posibilidades se hacen completamente inmanejables. Claro, estas pruebas pueden diseñarse para englobar características de un gran conjunto de posibles entradas que, junto a la "buena intención" del programador, pueden dar una confianza aceptable en la calidad de la solución. ¿Pero cómo asegurar que se considera la totalidad de las opciones? Esto puede mejorarse incluso haciendo que el diseño de pruebas sea realizado por un equipo diferente e independiente del equipo implementador (de lo contrario, las pruebas estarán influenciadas por las propias expectativas de la solución ya planificada). Pero aún con todo esto, no parece ser suficiente.

Me imagino dos reacciones razonables al párrafo anterior: "Si, la estrategia tiene fallas, pero es mejor que nada" y la clásica "Bueno, ¿y tu que propones?" (no pude evitarlo, jajaja). La primera tiene toda la razón. Una estrategia que haga consciente al programador de lo que quiere implementar antes de empezar a echar código es mucho más responsable que la alternativa "dale play y si explota ahí vemos". Pero hay una opción que es mucho mejor y con eso aprovecho y respondo a la pregunta de la segunda reacción: el "contract driven development" o "design by contract" como lo llamó Bertrand Meyer (el pana que creó el lenguaje Eiffel). Sin embargo esto no es nuevo, viene de una larga línea de grandes pensadores de las ciencias de la computación en donde destacan personalidades como Edsger Dijkstra, Tony Hoare y hasta el mismísimo Alan Turing.

Este enfoque de diseño por contratos está basado en la filosofía de que todo programa puede especificarse formalmente. Esto es, las condiciones que se esperan al inicio, al final e invariantemente durante la ejecución del mismo pueden ser descritas por medio de alguna lógica formal. Esto se extiende a instrucciones, expresiones, tipos de datos, subrutinas, etc. Estas especificaciones o contratos se establecen antes de comenzar a implementar las soluciones y cumplen con dos objetivos importantes:
  • Los programadores tienen una idea clara de lo que deben implementar, las garantías con las que cuenta su programa (la forma del dominio) y lo que se espera del mismo al finalizar su ejecución. Esto guiará una implementación mucho más sólida y clara.
  • Una vez implementada la solución, la misma puede verificarse formalmente vía una demostración rigurosa que asegura, sin cabida a dudas, que la implementación cumple con lo establecido en su contrato.
¿Y que pasó con los lenguajes funcionales, que están en un nivel de abstracción tan alto que el programa mismo es su propio contrato? ¡Mejor aún! Tal nivel de abstracción es ideal para hacer pruebas simbólicas sobre los programas escritos directamente y finalmente tener la misma calidad y confianza (quizá hasta más que en un contexto imperativo). Más aún, pueden especificarse propiedades adicionales apoyadas por el sistema de tipos (la firma de una función es un contrato para la misma).

Sin embargo, esta solución tampoco es perfecta y tiene una buena cantidad de fallas significativas:
  • El contrato aún es tan bueno como la intuición de quien lo diseñó. Lo que se quiere puede estar mal especificado o, incluso, puede que no se esté claro siquiera cuál problema quiere resolverse realmente.
  • El tiempo dedicado para diseñar contratos y la posterior verificación de los mismos es mucho más grande que en otras estrategias de desarrollo. Los resultados tangibles pueden verse sustancialmente atrasados.
  • El contrato, similar a los casos de prueba, debe ser elaborado por un equipo independiente al implementador. La diferencia reside en que un contrato requiere de mucha más experiencia y formación que un caso de prueba, lo cual eleva las exigencias académicas y de personal necesarias para llevar a cabo un proyecto.
La primera falla es inevitable. Programar es una actividad humana y como tal está susceptible a tener fallas siempre. Lo que uno puede intentar es reducir estas fallas lo más posible y contenerlas de forma tal que los resultados sean suficientemente confiables. La segunda falla no es tanto una falla como más bien una inversión. Sí, un proyecto que pudiera haber tomado 3 meses, tomó quizá 6 a 8. ¡Pero se ahorraron los potenciales años reparando bugs, con una solución de calidad! La tercera falla es real y difícil; mucho más cuando una gran cantidad de programadores y profesionales de la computación están completamente desligados y desinformados en lo que concierne a métodos formales. Los que si los conocen están usualmente confinados a la academia o pueden llegar a ser muy costosos. Es mi opinión, y la de algunos otros que conozco, que todo profesional de la computación debería tener una formación sólida en métodos formales y hacerlos parte de sus herramientas de trabajo en su día a día. Eventualmente, especificar un contrato será natural para muchos, tanto como lo es diseñar casos de prueba actualmente y tendremos sistemas mucho más confiables, seguros y mantenibles.

¿Pero entonces todo hay que demostrarlo? No necesariamente. Idealmente, si, eso daría el 100% de confianza. Pero el tiempo es un factor innegable y a veces de verdad no alcanza para todo el rigor involucrado en una prueba completa. Existen herramientas de verificación que permiten hacer algunas demostraciones de forma automática. Estas herramientas no son generales, ya que el problema de hacer una correspondencia de una implementación con un contrato se sabe indecidible. Sin embargo, pueden ahorrar bastante tiempo y esfuerzo en un principio y dar ciertas garantías sobre el comportamiento de un programa.

Hay que tomar en cuenta que tampoco es la intención que se elimine el testing por completo. Las máquinas no se comportan exactamente igual a la teoría; hay fallas inherentes a la implementación física de sus componentes. Además, pruebas concernientes al desempeño, a la resistencia ante muchas consultas simultáneas e incluso a la aceptación de la solución son aún necesarias, pero se delegarían a un siguiente paso del desarrollo.

Esto era lo que quería compartir por ahora (otro post más gallo aún, jajaja). Esto de los métodos formales no sólo es una rama fascinante de la computación, sino una que creo necesaria conocer para ofrecer soluciones confiables y de calidad. Como siempre, cualquier opinión es más que bienvenida. ¡Hasta la próxima! :)

sábado, 26 de julio de 2014

Discretamente hablando: Haskell

Desde hace ya un tiempo he pensado que la enseñanza de las Matemáticas Discretas puede aprovechar muy positivamente usar un lenguaje funcional puro como Haskell. Claro, no se usaría a efectos de las demostraciones (quizá como notación, pero no más), pero si sería muy útil para mostrar conceptos y propiedades de diferentes construcciones interesantes. En particular, sería sencillo mostrar que una cierta colección de objetos admite alguna estructura algebraica como un monoide, un grupo, etc.

¡Alabado sea Haskell, todopoderoso!

Tradicionalmente, estas estructuras algebraicas se construyen a partir de un conjunto llamado "carrier". Es mi opinión que tal construcción sería mucho más clara y útil si se hiciera a partir de tipos. Esto es, el carrier sería un tipo y las operaciones serían funciones sobre este tipo. ¡La cláusula de operación cerrada desaparece! Ya no hace falta, pues la declaración de tipos no permite operaciones mal formadas.

Por ejemplo, se podría definir un monoide como una tupla (T, +, e), donde:
  •  + : T → T → T
  •  e : T
  • ∀ a, b, c : T (a + (b + c) = (a + b) + c)
  • ∀ a : T (a + e = a ∧ e + a = a)
Y no hizo falta mencionar que el operador (+) es cerrado, ya que es obvio por su tipo (creo que el uso funciones currificadas da más flexibilidad a la hora de continuar explicando los conceptos en un futuro).

A continuación les dejo un enlace a un programa en Haskell que escribí con los conceptos básicos de grupoide, semigrupo, monoide y grupo implementados como clases de tipos. Así como 3 ejemplos: enteros, Z4 (hecho a mano) y grupos de permutaciones.

Enlace: algebra.hs

Creo que quedó bastante bonito y claro, aunque quizá sea que ya estoy acostumbrado a leer Haskell, jajaja (que no es muy lejano a leer matemática). ¿Que opinan? Mi intención es que algún día se incorporen nociones así a la práctica de las materias Estructuras Discretas I, II y III de la USB (y equivalentes de otras universidades, si se animan). Esto, creo yo, cumpliría dos objetivos fundamentales:
  • El estudiante tendrá un mejor entendimiento de los conceptos al tener la oportunidad de jugar con ellos, equivocarse y contar con un entorno de compilación/ejecución que lo ayude y motive a mejorar.
  • A veces los conceptos en Matemáticas Discretas quedan muy en el aire, demostraciones secas sin ningún motivo aparente. Claro, forman el pensamiento, pero realmente es mucho más que eso. Muchas de las construcciones que se ven en estas materias son la base de estructuras de datos complejas y sumamente eficientes usadas actualmente. Ver la relación desde temprano puede ayudar a que se le vea el queso a la tostada y haya una mayor motivación por entender y aprender.

Y bueno, esto es lo que quería compartir por ahora. Otro post gallito como para que no digan, jajaja. Cualquier sugerencia u opinión es más que bienvenida. ¡Hasta una próxima entrada! :D

lunes, 14 de julio de 2014

Magíster en Ciencias de la Computación

¡Hoy fue el gran día! Finalmente, hoy a partir de las 10:00am. se celebró el acto de graduación en donde obtuve el tan anhelado título de Magíster en Ciencias de la Computación. ¡Que emoción! Me sentí igual de nervioso que en el acto cuando me dieron el título de Ingeniero (quizá hasta un poco más, jajaja). Mas ahora no cabe en mi la felicidad, el orgullo y la motivación para seguir aprendiendo y creciendo.

¡El título mesmoooh! :D

Fue un día repleto de emociones. Todo comenzó alrededor de las 4:30am., hora a la que nos tuvimos que levantar para llegar a tiempo al acto (a eso de las 7.30am.), y resulta que los de protocolo llegaron casi a las 9:00am., jajaja. En el acto me conseguí a muchísima gente que se graduaba también y que ahora puedo llamar colegas con orgullo y alegría. ¡Un privilegio compartir acto con tantos amigos y gente tan genial!

El acto estuvo muy bueno. El discurso de la graduando (Diosángeles) estuvo bastante bien, aunque quizá un poco lento y centrado en la experiencia IQ más que todo. Sin embargo, el mensaje se transmitió y realmente mereció dar ese discurso después todo lo que hizo por hacer posible esta graduación extraordinaria. El discurso del vicerrector lamentablemente dejó mucho que desear, ya que no tuvo casi nada que ver con el acto y además pintaba una escena muy negativa, incongruente con el ambiente de júbilo y celebración que debería ser propia de una acto de grado. Pero bueno, no todo puede ser perfecto, jajaja.

¡Que emoción cuando llamaron mi nombre! Y que orgullo escuchar tantas expresiones de apoyo de mi familia, amigos y colegas. ¡Un momento incomparable sin duda, fugaz pero eterno! Con orgullo aplaudí a todos los que vinieron después de mi (aunque debo confesar, que mucho más a los computistas, jajaja). Las canciones del orfeón estuvieron excelentes. El corte hacia el final de Barlovento y el arreglo armónico de la segunda canción quedaron buenísimos. Algo que me sorprendió era la poca cantidad de gente que cantaba el himno de la USB con el orfeón, aunque bueno, no siempre se oye ese himno, jeje. ¡Yo lo canté con orgullo! :D

Saliendo del acto, estuve un rato con mi familia y algunos amigos geniales hablando un rato y tomando fotos. Ahí fue que me dijeron que el porta-título tenía otra cosa (yo no la había visto). ¡Resulta que había una constancia de Mención Sobresaliente por el Trabajo de Grado! Que genial ver eso ahí, jajaja.

De ahí, a comer en Mokambo Caffe (en las Mercedes). Lo gracioso, es que habían otros graduandos ahí también. Pedimos ceviche y carpaccio de lomito como entrada, seguido de un risotto de cebollas gratinadas para mi (el resto de mi familia pidieron risottos de otros sabores, jajaja). ¡Que excelente estuvo! Y de poste una torta de queso, que estuvo simplemente mundial. Luego, fue tiempo de ir a visitar a la familia extendida (abuelos y tíos). Hicimos un brindis por el nuevo logro y pasamos un rato chévere (por supuesto, no podía faltar el "regaño disfrazado de felicitación" de todos los días con la familia indirecta de uno, pero la intención es buena que es lo que cuenta, jajaja).

Y bueno, después de un día fuerte pero genial (seguido de varios días de diligencias heavy metal), heme aquí escribiendo este post. ¡Estoy sumamente orgulloso y feliz! Y necesitaba compartirlo nuevamente por esta vía. ¡Gracias a todos los que me han acompañado, apoyado y alentado! Es un privilegio y un honor contar con su amistad y cariño. ¡Un abrazo gigante a todos! Será hasta una próxima entrada. :D

domingo, 6 de julio de 2014

Electiva Hipotética: Programación Cuántica

Siguiendo con la serie de electivas hipotéticas, continúo con un área que falta en nuestro departamento: la computación cuántica. Claro, los modelos físicos que intentan hacer realidad una computadora cuántica competen es a los físicos. Sin embargo, los algoritmos que han de ejecutarse sobre dichas máquinas hipotéticas y el razonamiento formal sobre los mismos compete a las ciencias de la computación.

¡Este tema me encanta!

El curso que propongo a continuación está inspirado en el curso "Quantum Mechanics and Quantum Computation" que fue ofrecido por Coursera en 2012. Seguramente le faltarán muchas cosas interesantes de las que podrían hablarse, por lo que cualquier comentario es siempre bienvenido. :)

Asignatura: Programación Cuántica 
Créditos:
Objetivo Principal: Introducir al estudiante a conceptos básicos de la mecánica cuántica, circuitos cuánticos y su uso en la implantación de algoritmos eficientes sobre máquinas cuánticas hipotéticas. Así mismo el razonamiento formal sobre estos algoritmos y de las clases de complejidad a las que pertenecen. 
Contenido:
  • Semana 1: Introducción al pensamiento cuántico. Axiomas de la mecánica cuántica.
  • Semana 2: Bases matemáticas: Números Complejos. Notación BraKet. Eigenvectores. Matrices Hermitianas. Productos de tensores.
  • Semana 3: Qubits. Entrelazamiento cuántico. Paradoja EPR. Experimento de Bell.
  • Semana 4: Compuertas cuánticas. Transformaciones unitarias.
  • Semana 5: Sistemas de N-qubits. Compuertas universales. Computación reversible.
  • Semana 6: Repaso y 1er parcial.
  • Semana 7: Algoritmo para muestreo de Fourier y Algoritmo de Simon.
  • Semana 8: Algoritmo de Shor y Algoritmo de Grover.
  • Semana 9: Clases de complejidad. BQP. Tesis de Church-Turing extendida.
  • Semana 10: Exposiciones
  • Semana 11: Exposiciones
  • Semana 12: Repaso y 2do parcial
(Nota: Las exposiciones serán sobre investigación actual en programación cuántica. Por ejemplo, en nuevos algoritmos que resuelven eficientemente otros problemas o lenguajes de programación cuánticos de alto nivel, etc.) 
Evaluación:
  • 4 Tareas - 5% cada una, para un total de 20%.
  • 1er parcial - 30%.
  • 2do parcial - 30%.
  • Exposición - 20%.

Y esto concluye la segunda de la tanda de electivas hipotéticas. Me encantaría poder investigar en esta área, ya que es algo diferente y sumamente interesante. Ya he leído algunos artículos y tesis doctorales en mi tiempo libre (que no es mucho, jajaja), pero me encantaría seguir trabajándolo. :)

sábado, 5 de julio de 2014

Electiva Hipotética: Introducción a la Programación Competitiva

Actualmente mucho departamentos de la USB han sufrido una fuga importante de personal docente, lo que ha supuesto una reducción significativa en la cantidad de cursos electivos que se ofrecen. ¿Por que? Las cargas docentes de los profesores restantes se cubren en materias obligatoria y básicas. Aún así, es cada vez más difícil cubrir todas las necesidades docentes en estas materias. Esto supone un buen grado de frustración a los profesores, ya que no les es posible dictar cursos en sus diferentes áreas de especialización y tener acceso a estudiantes interesados en dichas áreas para futura investigación y proyectos de grado.

En mi caso, tengo la fortuna de que mi principal área de especialización (lenguajes de programación) tiene tres materias obligatorias en el pensum de Ingeniería de la Computación en la USB:

  • Lenguajes de Programación I.
  • Laboratorio de Lenguajes de Programación.
  • Traductores e Interpretadores.

Por lo tanto, suelo estar asignado al menos a una de ellas por trimestre. ¡Son asignaturas que me encantan! Pero como todo, puede volverse monótono. En el caso de traductores, la he dado ya 2 veces como preparador, 3 veces como ayudante docente y 3 veces como profesor (con miras a una más, el trimestre que viene). Sería interesante poder trabajar algunas de las otras áreas que me interesan e incluso comenzar a investigar nuevas áreas. Con esto en mente, comenzaré una serie de artículos en este blog con "electivas hipotéticas". Esto es, con materias electivas que podrían comenzar a abrirse algún día cuando la USB vuelva a su antigua grandeza y haya mayor libertad para ser creativo.

Mundial ACM-ICPC 2010 en Harbin, China.
(Aquí participó un equipo de la USB)

De estas electivas hipotéticas plantearé un contenido y un plan de evaluación tentativos, de los cuales me encantaría tener feedback. ¿Quién sabe? Quizá se pueda abrir alguna de estas en un futuro no tan lejano (soñar no cuesta nada, jajaja). A continuación entonces, la primera de la serie de electivas hipotéticas.

Asignatura: Introducción a la Programación Competitiva
Créditos:
Objetivo principal: Familiarizar al estudiante con las destrezas técnicas necesarias para participar en competencias de programación al estilo ACM-ICPC
Contenido:
  • Semana 1: Introducción a las competencias de programación, sus herramientas y reglas. Medición general del nivel de los estudiantes previo al curso. Dinámica individual y grupal.
  • Semana 2: Problemas ad-hoc: Saber interpretar bien un enunciado, la especificación de entradas y salidas, restricciones de las mismas y tiempos límite.
  • Semana 3: Algoritmos voraces (greedy): ¿Como reconocerlos? Los peligros de confiar en una solución voraz. Criba de Eratóstenes. Búsqueda binaria. Potenciación logarítmica y Fibonacci.
  • Semana 4: Programación dinámica (básica): Los peligros de la fuerza bruta. Principio de optimalidad de Bellman. Top-Down vs. Bottom-Up.
  • Semana 5: Programación dinámica (avanzada): Inicialización virtual. Máscaras de bits.
  • Semana 6: 1ra competencia y discusión.
  • Semana 7: Grafos (básico): Búsqueda en grafos. Flood fill. Árboles cobertores. Componentes conexas.
  • Semana 8: Grafos (avanzado): Máximo flujo, mínimo corte y apareamiento bipartito.
  • Semana 9: Cadenas de caracteres: Suffix trees. Tries. KMP. Expresiones regulares.
  • Semana 10: Consultas en árboles. Segment trees. BIT. RMQ. LCA.
  • Semana 11: Algoritmos aproximados y heurísticas. Primalidad. Coloración de Grafos. Geometría y probabilidades.
  • Semana 12: 2da competencia y discusión.  
Evaluación:
  • 10 Tareas - 5% cada una, para un total de 50%.
  • 1ra Competencia - 20%.
  • 2da Competencia - 30%.
(Nota: Las competencias no se evaluarán por posición alcanzada, sino por la aplicación de los conocimientos adquiridos a los problemas presentados y dinámica de equipo. Sin embargo, habrán puntos adicionales para los ganadores de cada una.)

Y esto concluye la descripción de la primera electiva hipotética. Estoy seguro que me faltaron cosas por incluir, así que cualquier comentario es bienvenido. Hasta una próxima entrada. :D

viernes, 4 de julio de 2014

¡Se acabó el trimestre/semestre!

Finalmente, ha llegado el final de la semana 13 (o 21, si se cuenta desde el principio en Febrero). Ha sido un trimestre difícil en la USB, envuelto en una situación nada fácil para Venezuela, desde muchos puntos de vista. Sin embargo, poco a poco y con el mayor esfuerzo logramos dar buen final a este período académico.

Bueno, ni tanto... Pero más o menos. XD

Este trimestre estuve en dos cursos. En primer lugar, tuve a mi cargo un total de 61 estudiantes en la teoría de Lenguajes de Programación I. ¡Muy buen grupo! Dispuestos a aprender y trabajar. El primer parcial vio muy buenos resultados y el segundo fue un éxito sin precedentes (aún me siento orgulloso por el excelente desempeño de todos). El tercer parcial tuvo resultados no tan alentadores, lo cual debo admitir que supuso una gran frustración para mi. Después de todo, si todo un grupo sale mal es culpa del profesor, no del grupo. Pero varias personas me han convencido de que la situación de cansancio, de que estamos en pleno mundial de fútbol y de la falta de práctica de los temas que correspondían al laboratorio (que algunos tienen incluso años sin ver) fueron los principales motivos del empeoramiento de los resultados. Finalmente, casi un 80% del salón aprobó la materia y sin una pizca de regalo. ¡Todos se lo merecen y me siento sumamente orgulloso por eso!

Notas definitivas: Notas.pdf

El segundo curso en el que estuve fue en un Miniproyecto de Desarrollo de Software, en el que junto a Leonid Tineo, Rosseline Rodriguez, Soraya Carrasquel y David Coronado, servimos de guías y evaluadores a un grupo de tres estudiantes que desarrollaron una extensión de PostgreSQL para tratar con datos difusos de tipo 3 (así como consultas con ORDER BY y GROUP BY sobre los mismos). ¡Excelente trabajo y merecido 5 para todos!

En fin, fue un trimestre laaaargo y difícil, pero con excelentes resultados. Esto únicamente desde el punto de vista docente, que se agrega a otros eventos académicos importantes. Como... no sé... que me gradúo... por ejemplo. XD Eso y muchas otras cosas más.

Al finalizar el curso de lenguajes, decidí hacer una encuesta para ver como mejorar la experiencia del curso para futuras ocasiones. A continuación lo que mandé en el correo:

Hola a todos, 
   Ya se encuentran disponibles en la página las notas definitivas, con revisión y rezagados incluídos. Las notas que aparecen ahí ya fueron pasadas a DACE y... ¡con esto concluye oficialmente el curso de Lenguajes de Programación I! 
   Ante todo quiero agradecerles a todos por el empeño que pusieron en aprender y asimilar esta materia. No es una materia fácil y eso creo que ya nos consta bastante a todos, jejeje. Además el trimestre/semestre tampoco fue el más cómodo para cursarla, pero finalmente pudimos darle buen final. ¡Todo gracias a ustedes! Incluso para algunos de ustedes que no lograron aprobar, el empeño que pusieron y el conocimiento que adquirieron les servirá muchísimo para una próxima vez (incluso yo mismo reprobé lenguajes la primera vez que la vi. XD). Sigan todos así, con la iniciativa, curiosidad y empeño que mostraron este trimestre y les espera nada menos que la grandeza en sus futuras vidas profesionales. :) 
   También quería disculparme por todas las cosas malas que pudiera haber tenido el curso, asegurándoles que yo también aprendí mucho este trimestre y me gustaría seguir aprendiendo. Por esto, me gustaría pedirles en la medida de lo posible que me respondan a este correo las siguientes preguntas: 
   1) ¿Cuál fue tu impresión general de la materia?
   2) ¿Qué fue lo que se te hizo más dificil?
   3) ¿Qué cosas te ayudaron a aprender/avanzar con el material?
   4) ¿Qué cosas sientes que falten y que podrían haber ayudado a entender mejor la materia?
   5) ¿Qué recomendaciones tienes para una próxima vez que se abra la materia? 
   Es algo como una encuesta de opinión (pero más útil, jajaja). La idea es tomar sus recomendaciones y adaptar el curso como sea necesario para asegurar que los futuros estudiantes aprovechen la materia y puedan aprender más e incluso salir mejor. :) 
   Por ùltimo, me toca hacer publicidad. Muchos de los que están viendo la materia ya vieron Traductores. Para los que no, en traductores se muestra un lado más técnico de los lenguajes, concentrándose más que todo en la implementación de los mismos. La teoría de la materia presenta los conceptos y algoritmos abstractos que fundamentan todo esto, finalizando con el estudio formal de la computación misma. En este curso, el laboratorio trata de implementar un lenguaje de programación relativamente sencillo (usualmente un interprete). Seguido de Traductores y Lenguajes, lo que continúa es la Cadena de Lenguajes de Programación. En esta cadena unimos las interpretaciones de Lenguajes de Programación I y Traductores. ¡Les toca diseñar su propio lenguaje! Para implementarlo hace falta traductores, pero para diseñarlo bien hace falta lenguajes. Es una cadena sumamente interesante y donde se aprenden muchas técnicas que son útiles incluso más allá de la implementación de lenguajes. Si les gustó este curso y más aún, si les gustó/gustará traductores, les recomiendo muchísimo esa cadena. Mitos urbanos: ¿Es muy dificil? Realmente no tanto, hay cadenas más dificiles. ¿Lleva mucho trabajo? OHHHHH SI!!! XD Es el proyecto más grande y complejo que harán en la uni y posiblemente afuera de ella también, pero vale muchísimo la pena. :) 
   Con esto me despido, totalmente agradecido por compartir con ustedes esta experiencia y quedando totalmente a la orden (ya sea que quieran sólamente pasar a discutir algun tema interesante o incluso si buscan talleres de desarrollo o tesis en lenguajes de programación). *come to the dark side, we have cookies* :D 
Saludos a todos y felices vacaciones,
Ricardo
Recibí algunas respuestas sobre la encuesta (algunas hasta graciosas) que confluían en que lo que más ayudó fue las guías que se hicieron y las consultas. Las recomendaciones se centraron en hacer más guías para algunos de los otros temas que son difíciles de entender (como tipos de pasaje de parámetros, mezclado con orientación a objetos) e intentar de alguna forma compensar la falta de práctica de quienes vieron el lab hace tiempo (si bien sea insistiendo en que vuelvan a entrar o al menos practiquen con tiempo). ¡Gracias a todos los que me ayudaron son sus comentarios! Tomaré en cuenta sus consejos e intentaré hacerlo aún mejor una próxima ocasión que pueda dar la materia.

Y esto era lo que quería compartir por ahora. ¡Será hasta una próxima entrada! :D