Mostrando entradas con la etiqueta docencia. Mostrar todas las entradas
Mostrando entradas con la etiqueta docencia. Mostrar todas las entradas

jueves, 28 de julio de 2016

En la variedad está el gusto

¡Hola! Tenía algún tiempo sin escribir por acá, jeje. Hoy quisiera compartir otra de esas características extrañas que me hacen atípico en mi entorno profesional. Como saben, muchos de mis colegas profesores son excelentes investigadores y lo hacen con una pasión inigualable. Sin embargo, muchas veces dejan de lado la docencia y descuidan los cursos que dictan, en aras de continuar publicando artículos y realizando su investigación. No es el caso siempre, pero es bastante común. Esto es natural, ya que su pasión es la investigación y no la docencia. Sin embargo, nuestro trabajo como profesores nos fuerza a trabajar en ambas cosas.

¡Mario sabe! xD

Como ya les he mencionado (y muchos que me conocen sabrán), soy el caso justamente contrario: me apasiona la docencia y bueno, hago investigación en segundo plano (confesando que la tengo análogamente descuidada). Es difícil trabajar en algo que lleva tanta disciplina y concentración, cuando no es algo que apasiona completamente.

¡Pero eso no es lo único! Aunque quizá pueda verse como una consecuencia de lo anterior, la mayoría de mis colegas prefieren dar siempre las mismas materias, casi que con los mismos horarios. Me han dicho que de esa forma pueden "perder menos tiempo" preparando clase y reutilizar evaluaciones viejas. Respetable, entendible, pero totalmente en contra de mi filosofía. En primer lugar, preparar clases es un gusto y una manera excelente de continuar aprendiendo. También creo firmemente en publicar todas las evaluaciones como una ayuda para las generaciones venideras. ¿Es más trabajo? Si, pero vale la pena. Las personas están cada vez mejor preparadas, aprenden más y saben que esperar de las evaluaciones (incluso se puede aumentar gradualmente el nivel de los cursos).

Si pudiera elegir, daría una materia distinta cada trimestre. Eso me daría la oportunidad de aprender cosas nuevas y de ayudar de diferentes maneras. ¡Además, sería divertido! Dar siempre la misma materia enfrasca en los mismos tipos de problemas, pensamientos y soluciones. En la variedad estaría el verdadero potencial del conocimiento y su aplicación creativa. Afortunadamente, las materias que doy usualmente (Traductores e Interpretadores y Lenguajes de Programación I) abarcan un amplio espectro de la computación en general, pero incluso esas materias (mis materias favoritas) pueden cansar después de dictarlas una gran cantidad de veces. A mi me encantaría dar las Matemáticas Discretas, Ingeniería de Software, Organización del Computador o incluso Bases de Datos. Creo que me costaría más atreverme con Redes (sería muy falso de mi parte, jajaja), pero aún así lo intentaría con gusto.

Claro, sería genial dar muchas distintas materias. Sin embargo, con la creciente fuga de profesores en las universidades, cada vez estamos más estancados en nuestros propios nichos. Es virtualmente imposible dar una materia distinta, ya que eres necesitado para cubrir las materias de tu especialidad (ya que no hay nadie más que pueda o quiera). Creo que es una tristeza, pero es la realidad. Agradezco que al menos mi especialidad terminó incluyendo a las materias mas entretenidas y retadoras de la carrera (en mi opinión) y me divierto un montón dándolas siempre.

Y bueno, esto era lo que quería compartir por ahora. Un pequeño desahogo, sabiendo que el tiempo que siga en la universidad, seguiré ayudando lo más que pueda, pero probablemente en las mismas materias de siempre. xD

¡Gracias por leer y hasta una próxima entrada! :D

viernes, 24 de junio de 2016

El camino del bien

Una de las materias que doy en la USB es Lenguajes de Programación I, en donde se discuten las diferentes características de un lenguaje de programación de forma tanto general (conceptos abstractos) como específica (ejemplos concretos con lenguajes existentes). Es una materia sumamente entretenida, tanto de impartir como de escuchar, y es central al conocimiento de todo buen profesional de la computación.

¡El poderoso camino del bien! :D

Esta ya es la tercera vez que he dado esta materia, con una separación de 2 años entre cada ocasión. La última vez, fue en Enero del 2014. Ese trimestre, como muchos recordamos, fue el trimestre de las marchas y las guarimbas. El trimestre se extendió, durando casi medio año. Sin embargo, durante el mismo preferí aprovechar el tiempo para crear material que ayudara a las personas a prepararse mejor para la materia. Fue así como creé una serie de guías, sobre alcances y asociaciones, composición de máquinas (diagramas de T), iteradores y recursión de cola. Estas guías se caracterizaban por contener una sección llamada "El camino del bien", que mostraba procesos paso a paso para resolver problemas relacionados al contenido que cubrían.

El trimestre en que fueron creadas las guías, el grueso del salón salió muy bien. Me dijeron además, que las guías les habían ayudado mucho a prepararse. Esto me llenó de alegría y me inspiró para hacer otras guías en otras materias, como Traductores e Interpretadores, Algoritmos I y II, etc. Aún en trimestres posteriores he escuchado de personas que se han beneficiado de estudiar usando estas guías. ¡Pero hace falta más!

Como proyecto personal, quisiera crear una serie de guías de nombre "El camino del bien" (en honor a esas primeras guías del curso de Lenguajes de Programación I). Estas guías cubrirían una gran parte de la carrera, al nivel que pudiera manejar alguien con un conocimiento bastante limitado (como es mi caso). La idea de crear estas guías cumpliría varios objetivos puntuales:
  • Ayudar a las personas a preparase mejor y a comprender mejor esta genial área del conocimiento que es la computación.
  • Dejar material de apoyo que sirva como base para dictar cursos de alta calidad.
  • Apoyar el aprendizaje de personas que no dominan completamente el idioma Inglés, sirviendo como una primera referencia que luego podría profundizarse con otro material.
  • Reforzar los conocimientos propios. ¡Enseñar es aprender dos veces! :D
  • Inspirar a otras personas a seguir iniciativas similares y juntos aumentar la cantidad de material y conocimiento disponibles.

Este es un proyecto en el cual quiero trabajar desde hace un tiempo, aunque confieso que no he conseguido el tiempo para hacerlo. Aún así, un buen amigo y profesor una vez me dijo: "La diferencia entre 'sería fino que existiera' y 'existe', es el momento en el que decides hacer algo al respecto" y definitivamente, eso haré. Tengo como objetivo a corto plazo comenzar a escribir algunas guías. Sin embargo, aún estoy decidiendo sobre cuál tema. ¡Cualquier recomendación es bienvenida!

Las guías no serían exhaustivas, claro está. Sería arrogante pensar que puedo explicar todo mejor que cualquier otra persona. La idea de las guías sería sentar una base y luego hacer referencia a material más profundo disponible en línea.

Y bueno, éste es uno de tantos proyectos que me encantaría llevar a cabo y es lo que quería compartir por ahora. ¡Hasta una próxima entrada! Sigan siempre el camino del bien. :D

sábado, 10 de enero de 2015

Sobre Docencia y Didáctica

¡Me encanta dar clases! En verdad es mi mayor pasión y satisfacción. Y la verdad es que no sólo es dar la clase, sino el poder compartir, ayudar, aprender y, por supuesto, hacer nuevos y geniales amigos en el proceso. :)

¡Y todos tenemos algo que enseñar! :D

Ya tengo el gusto de haber sido profesor durante 3 años, ayudante académico 3 años más y preparador durante mi pregrado, por unos 4 años (seh, ya estoy ancianito, jajaja). En ese tiempo he intentado ir mejorando poco a poco, aprendiendo a ser mejor docente y persona. Aún me queda muchísimo por aprender y mejorar, pero hoy quisiera compartir algunas de las cosas que he aprendido y que intento aplicar siempre que puedo.

  • El centro es el estudiante, no el profesor: Puede llegar a ser tentador hacer alarde de lo que uno ha aprendido e intentar exaltar la propia imagen. Pero esto está mal. ¡Muy mal! Un buen docente no es el que logra mostrar lo grande que es él, sino lo grande que pueden llegar a ser sus estudiantes. No se trata de enseñar para impresionar, sino de enseñar para motivar e inspirar.
  • El respeto ayuda a aprender, pero más aún la confianza: Desde siempre he estado en contra de la tradicional y socialmente arraigada "distancia alumno/profesor". En parte, por eso no me gusta que me digan profesor, profe, o cualquier otro "título" impersonal. Es verdad que en un salón donde el profesor es magnánimo e intocable, el aprendizaje puede darse bien. Pero sólo eso, sólo "bien".

    Pienso que si el profesor se presenta como sólo una persona más, con sus fallas y ganas de aprender, se crea un ambiente de confianza que es mucho más propicio para un aprendizaje excelente. ¿Quién no ha tenido pena de preguntar algo en clase? Pero... ¿Y si no se sintiera como una clase? ¿Y si más bien fuera como un grupo de personas estudiando y discutiendo? Las dudas fluyen mucho más libremente y se aprende con mayor gusto. Además, la recompensa es poder aprender mucho más en cambio de las personas a las que enseñas e incluso, muchas veces, llegar a hacer buenas amistades.
  • Ser positivo siempre es preferible: Al encontrar fallas en el conocimiento de una persona, no es correcto ni útil atacarlo por esas fallas. Al contrario, es preferible concentrarse en lo que tiene bien y reforzarlo, llevando poco a poco aquello que no se entiende bien hasta el punto en que es asimilado naturalmente y con gusto.

    Esto no quiere decir que no se pueda decir que alguien esté mal en su conocimiento, sino cuidar la forma de decirlo. Cosas como "Si no sabes de X tópico entonces realmente no sabes nada" o "Si sólo sabes manejar Y concepto, entonces eres un mediocre". Actitudes que lamentablemente he visto pasar frecuentemente y en muchos contextos. ¿No es preferible hacer ver las relaciones de ese X tópico que se considera importante, con lo que la persona ya conoce y maneja, o incluso con lo que le gusta? Incluso si toma tiempo y no pareciera ser fácil, al final todo está relacionado. Honestamente, creo nunca, NUNCA, se debe ser despectivo con el conocimiento ajeno, pues eso bloquea por completo la oportunidad de aprendizaje futuro.
  • Saber hallar el balance entre el "como" y el "para qué": Inevitablemente (y afortunadamente), existen personas de mentalidad práctica y personas de mentalidad metódica. Sin embargo, en el balance entre ambas está el potencial para un mayor aprendizaje. Si se es demasiado práctico, y sólo se muestran las aplicaciones de un concepto, lucirá como un mágico agitar de manos y ningún conocimiento será realmente transmitido. A la vez, si se es demasiado metódico y se intenta mostrar cada detalle teórico necesario antes de pasar a las aplicaciones, el proceso se hará tedioso y aburrido, perdiendo el foco fácilmente y dejando de transmitir conocimiento igualmente.

    Creo que en el balance está la respuesta. Saber mostrar los detalles más fundamentales, sin dejar a un lado aplicaciones tempranas que hagan interesante y motivador lo que se enseña.
  • Complementar con material adicional. no-exhaustivo: No todo el mundo aprende a la misma velocidad y siempre habrá quienes capten inmediatamente en clase y quienes tardan un poco más. Es importante que la información que se enseñe esté respaldada en algún medio persistente, de la manera más didáctica posible. Pero con cuidado... El material no debe ser exhaustivo, o hará completamente aburrida y redundante la clase. Debe funcionar como un método para recordar y reforzar, no como un reemplazo. Sólo se debe poner detalle en los conceptos más difíciles o importantes. Además, es bueno que ese material incluya adicionales a lo que se haya dado en clase, para mantener la lectura interesante (aunque sean sólo hechos de cultura general, totalmente tangentes y sin evaluación).
  • Compartir las huellas: Siempre que esté en poder y decisión de uno, los parciales/tareas/proyectos de cada período deberían ser publicados y disponibles para el futuro. Esto ayuda a los estudiantes actuales de la materia a ver sus fallas. Pero, más importantemente, ayuda a futuros estudiantes a poder practicar y prepararse. Claro, esas evaluaciones ahora no serán reutilizables y se tendrá que trabajar mucho más en crear más y más evaluaciones originales. Pero ese es problema (o más bien gusto, para algunos) del profesor, no del estudiante. Y vale la pena sacrificar esa comodidad por ayudarlos a ellos a aprovechar mejor el curso y aprender más.

    Podría decirse que no es necesario, ya que con que estudien todo el material es suficiente y no necesitan de exámenes modelo para practicar. ¡Pero eso es falso! Un parcial no es sólo reflejo del contenido de una materia, sino de la manera en que el profesor entiende esa materia. Aunque intente hacerse lo más objetivamente posible, siempre habrán cuestiones de estilo particulares de cada profesor. Es buena idea ayudarlos a practicar, a entender lo que esperas de ellos, para que puedan concentrar su esfuerzo en eso. Poco a poco se refina el estilo hacia lo que se considere más importante y eso es criterio de cada profesor, pero hay que darles la oportunidad de prepararse en todo caso.
  • Dudar siempre de lo establecido: No quedarse con lo estipulado o tradicional en cada curso. Dudar de todo lo que se supone que debes enseñar y buscar siempre mejores maneras de hacerlo. Incluso si uno se equivoca, será un gran avance. Nada daño tanto el avance conjunto de la humanidad como el enfoque conservador de la enseñanza. ¡Siempre hay que buscar nuevas ideas, nuevos métodos y nuevas estrategias!

Hay muchas otras cosas sobre las cuales podría conversar acá, pero creo que ya está bastante tl;dr, jajaja. Seguir este tipo de didáctica no es fácil y toma mucho más esfuerzo y tiempo de lo que podría parecer. ¡Pero al final la recompensa es enorme!

Me han dicho que pongo demasiado esfuerzo en esto de la docencia y que debería concentrarme en otras cosas, como publicar artículos de investigación y subir en el escalafón académico (cosa para la cual la USB te presiona increíblemente), pero mis reales metas lo contradicen. La investigación es chévere, pero nada me motiva como lo hace la docencia. Poco a poco he tenido que ir soltando otros compromisos, para poder volver a concentrarme en enseñar. El año pasado hubo cursos que no atendí como les era justo, por estar muy ocupado. ¡Pero no se repetirá! Tengo que dar prioridad a lo que realmente me mueve y en donde soy más útil. Me han dicho también "es que no se puede ser papá de todo el mundo" y estoy totalmente de acuerdo... Prefiero ser su amigo y como un buen amigo, preocuparme por que estén bien y que les vaya de la mejor manera posible en sus vidas. Creo que la mejor manera de ponerse uno primero es pensando en los demás y siempre buscar de que formas puedes ayudar a otros.

Y bueno, esto es lo que quería compartir hoy. Un poco de lo que he visto y aprendido en estos años. Quizá esté equivocado y aprenda en el futuro otros caminos, pero me gustaría pensar que las cosas van bien y que puedo seguir reforzando este estilo extraño de enseñar que me encanta. ¡Hasta una próxima entrada! :D

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

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. :)

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

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: 4 
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: 4 
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