Nuevos cursos interesantes en Coursera.org

Ayer me llegó un mail de Coursera.org anunciando nuevas 12 nuevas universidades que sumaron cursos a la oferta de la plataforma. Con un rápido vistazo identifiqué algunos cursos que me resultaron interesantes:

Lamentablemente, no tengo suficiente tiempo en este momento, pero en verdad que me gustaria tomarlos todos.

Si tienen tiempo, no lo duden, creo que no se van a arrepentir.

«Los ingenieros son la Victorinox de la sociedad»

Hace unos dias un colega me compartió este artículo del cual extracté el título de este post. La frase pertenece a Adolfo Guitelman, vicepresidente del Centro Argentino de Ingenieros.

Algunos datos estadísticos que aporta el artículo son:

  • En la argentina se estima que hay un ingeniero cada 6600 habitantes mientras que en paises como Israel y China hay 1 cada 1500.
  • Actualmente se reciben unos 6000 ingenieros por año, de los cuales el 32% egresa de la UTN
  • El tiempo promedio para que un ingeniero se reciba es de ocho o nueve años
  • En FIUBA, durante 2011, egresaron unos 450 ingenieros
  • En ITBA durante 2011, egresaron 240 ingenieros industriales

 

¿Incluiran esas cifras a ingenieros agronomos? No creo

¿E ingenieros en sistemas/informática/computación? Estimo que si

Me aceptaron un trabajo y no me avisaron

Esto es algo que nunca me habia pasado, mmm, en realidad puede que me haya pasado anteriormente y no me haya enterado, ja!

Resulta que a comienzos de abril me llegó un anuncio del VII Congreso de Tecnología en Educación y Educación en Tecnología. Cuando entré al ver sitio y ví las áreas de interés decidí enviar un trabajo. Tomé un trabajo que habia realizado el año anterior anterior para la materia Psicología Cognitiva, lo ajusté al formato solicitado y luego de validarlo con el compañero con quien hice el trabajo, lo envíe. El tiempo pasó y nunca tuve noticias.

Pero el sábado anterior al congreso,  me llamó mi compañero y tuvimos una charla que más o menos fué:

– El: ¿vas al congreso?

– Yo: no, ¿por?

– El: porque el trabajo fue aceptado y figuras en el programa del congreso

– Yo: no puede ser, nadie me notificó y solo restan dos dias para el congreso. ¿A vos te avisaron algo?

– El: no, yo me enteré cuando entre a ver el horario de presentación de otro trabajo que envié y del que sí me notificaron, si queres me encargo de presentar este trabajo también.

Y así era, el trabajo había sido aceptado y nunca que llegó notificación alguna. Inmediatamente escribí a los organizadores para pedirles confirmación, pero la respuesta llegó 3 días después de finalizado el congreso. El trabajo fue presentando por mi compañero. La respuesta de la organzación (como ya dije: 3 dias luego del evento) fue que habian notificado a mi compañero.

Desafio de diseño: objetos inteligentes (resolución)

(continuación de Desafio de diseño: objetos inteligentes)

Hay varias formas de atacar este problema de la “testeabilidad”.

La primera opción que muchas veces viene a la mente, es hacer públicos los métodos privados y testearlos unitariamente. Si desde el punto de vista práctico esta opción puede parecer viable, cuando la miramos desde el punto de vista conceptual resulta incorrecta, pues dichos métodos son conceptualmente privados y no seria correcto cambiar su visibilidad para solo probar la clase. Si estuvieramos trabajando con C# Visual Studio nos ofrece una alternativa basada en reflexion para acceder a miembros privados de la clase, pero conceptualmente esto sigue siendo incorrecto.

Si pensamos el problema un poco más, nos daremos cuenta que puede que la clase tenga algunos problemillas de responsabilidades. Para ser más explícitos, tiene demasiadas responsabilidades: decidir si moverse y en caso positivo hacerlo, decidir si disparar y en caso positivo hacerlo, etc, etc. Bueno, si asumimos este diagnostico entonces hemos dado el primero paso: identificar el problema.

Repensemos la cuestión una vez más. Una clase que toma muchas decisiones (si X, si Y, si X, etc) y hace muchas cosas (X, Y, Z, etc). Cada una de esas cuetiones las hemos encapsulado en un método privado de cara a tener un código más legible. ¿y si fueramos un paso más allá? ¿Que tal si convertimos cada uno de ese métodos privados en una clase? De esta forma tenenemos una clase con la lógica de movimiento, otra clase con la lógica de disparo y asi sucesivamente. Así nuestro objeto inteligente tiene mucho menos código y su responsabilidad está limitada a coordinar “las estrategias” de movimiento, disparo, etc, etc. Al mismo tiempo cada estrategia puede ser testeada independientemente.

Bueno, este ha sido el primer desafio, próximamente vendrán algunos más.

Titiritero Reloaded

Titiritero es un mini-framework que desarrollamos para Algo3 de cara a ocultar algunas complejidades técnicas como manejo de componentes Swing, threads y otro, que los alumnos suelen enfrentar al realizar sus trabajos prácticos. De esta forma, los alumnos pueden concentrarse en el modelado de objetos que es el principal objetivo de la materia.

Este framework lo comencé yo mismo como ejemplo de implementación de un gameloop siguiendo premisas de diseño MVC. Más tarde algunos otros docentes y alumnos de materia hicieron algunos aportes. De esta forma la base de código fue creciendo de forma medio caótica.

El fin de semana pasado estaba preparando la clase de MVC e introducción a Titiritero para lo cual me puse a desarrollar un nuevo ejemplo basado en Titiritero. Me crucé con un par de comportamientos inesperados y cuando intenté arreglarlos no hice más que sumar más inestabilidad. Claro, esto no me sorprendió porque titiritero tenia una cantidad mínima de pruebas y su cobertura no superaba el 20 %.

Entonces decidí cortar por lo sano y reescribir el framework completo usando TDD y contemplando algunas mejoras que tenia en mente desde hacia ya un tiempo. Para tener un mejor control de los aportes de código realizados por terceros, decidí hostear el proyecto en GitHub para asi poder usar el modelo fork-pull request.

Ttiritero v2.0 está publicado en GitHub y tiene una cobertura superior al 90% 😉

Un ejemplo de cómo usarlo puede descargase desde aqui, para correrlo es necesario Java JDK 1.6+ y Ant.

Taller sobre motivación: saliendo de la zona de confort

Ayer fui facilitador de una taller de actualización pedagógica sobre motivación realizado en el contexto de la iniciativa «El aula y el trabajo«, un proyecto de extensión de la Universidad Nacional de Quilmes. Llegué por invitación de Mara Dalponte y Daniel Palazzo.

El taller se llevó acabo en la EEST N° 4 de Berazategui y contó con 25 asistentes entre los que habia docentes de docentes nivel medio, docentes de TPI y algunos otros referentes sociales de la zona.

La actividad comenzó con una bienvenida a cargo de Mara, quien repasó brevemente el objetivo del proyecto y del  taller en particular. Luego llegó mi turno. Me presenté brevemente y propuse una actividad para romper el hielo (al mejor estilo agiles@baires). Una vez entrados en confianza utilicé la ideas de Dan Pink sobre motivación como disparadores del debate y les sumé algunas ideas/técnicas surgidas de mi propia experiencia.

Facilitar esta actividad fue un gran desafio para mi, pues el cambio de audiencia me obligó a salir de mi zona de confort. Sinceramente disfruté la actividad y quedé muy conforme con como se desarrolló. Es más, creo que en un punto es más lo que me llevé yo que lo que les dejé a los asistentes, ja!

Bueno, esto es todo por ahora, me despido no sin antes darle las gracias a Daniel y Mara por haberme dado la oportunidad de participar.

Nueva carrera de informática

Ayer el Consejo Superior de la Universidad Nacional de Quilmes, el pleno, por unanimidad aprobó la propuesta de creación de la carrera y el plan de estudios propuesto para la Licenciatura en Desarrollo de Software.
Personalmente participé de algunas de las discusiones de plan de estudios de esta carrera y puedo decir que el plan está muy bien (al menos para mi gusto). Un detalle a destacar es el nombre de la carrera, el cual refleja claramente el foco: Desarrollo de Software. Esto marca un diferencia respecto de la mayoria de las carreras de informática que suelen hacer referencia a Análisis de Sistemas, Sistemas de información, Informática, Computación, etc,. etc.
Esta licenciatura comprende 10 semestres, con un total de 41 materias semestrales (de distintas cargas horarias), los primeros 4 semestres serán de materias comunes a la TPI (16 en total). En los siguientes 6 semestres, hay 4 materias obligatorias y 3 optativas que sirven tanto para la licenciatura como para TPI, 2 materias que se cursan con la Diplomatura en CyT, y 16 materias nuevas, exclusivas de la Licenciatura.
¡Mis felicitaciones a Fidel a todo el equipo de TPI por este gran hito!

Desafio de diseño: objetos inteligentes

Estaba preparando un ejemplo para algo3 cuando me surgió esta cuestión.

Como ya he mencionado en algo3 solemos programar juegos. En general los juegos tienen ciertos personajes que van actuando autonomamente con el paso del tiempo, a estos objetos es a lo que llamo objetos inteligentes. Por poner un ejemplo, tomemos el clásico juego de naves Gálaga, donde las naves enemigas actuan autonomamente con cierta lógica interna.

Cuando llevamos esto a código siguiendo el paradigma orientado a objetos, estas naves solo debieran tener un método público del tipo actuar, el cual seria invocado desde el GameLoop. Dentro de dicho método, cada nave decidiria si moverse en una determinada dirección, o si disparar, o si hacer ambas cosas al mismo tiempo, etc. Con el fin de que dicho método no quede demasiado largo, generalmente extraeremos varios métodos privados: uno con la lógica de movimiento, otro con la lógica de disparo, etc, etc.

Ahora la cuestión es: ¿como escribir pruebas unitarias para esta clase cuando tiene un solo método con tanta lógica? Es claro que es posible escribir pruebas unitarias para estos casos, pero si intentan hacerlo verán que no les quedará código muy feliz, pues el código de arrange de cada prueba podria resultar bastante largo y engorroso de escribir debido a todos los caminos posibles dentro del método bajo prueba. Una opción para evitar esta situación podria ser hacer públicos los métodos privados y asi escribir pruebas por separado para la lógica de movimiento, para la lógica de disparo, etc, etc, pero esto implicaría poner públicos ciertos métodos que naturalmente seria privados, con el solo fin de hacer pruebas. Definitivamente esta opción me hace ruido.

¿Entonces? Tengo una propuesta, pero será parte de otro post, mientras tanto, los invito a lo que piensen.

Continuará….

Adopción de C# en aumento

Desde hace ya un par de años el Algo3, les permitimos elegir el lenguaje de programación a utilizar en el TP grupal. En un comienzo la elección estaba restringida a Object Pascal (Delphi) o Java y en la actualidad es Java o C#. Históricamente la mayoría de los alumnos se han inclinado por Java en una proporción de 4 a 1 (y estoy siendo generoso con C#).

Pero resulta que este cuatrimestre, particularmente en el curso JT (que es en el que estoy yo) ha habido una adopción masiva de C#, de 9 grupos, al menos 6 han elegido C#. La única explicación que se me ocurre para esta situación particular del curso JT es la influcia de los docentes.

En este curso somos 4 docentes: Pablo, Gabi, Diego y yo. Este cuatrimestre, desde que comenzamos a estudiar lenguajes de tipado estático, la mayoría de las clases las dieron Gabi y Diego, ambos afines a C#, por lo cual casi todos los ejemplos en nuestra clase fueron mostrados en C#. Esto, sumado al buen manejo de Gabi y Diego del Visual Studio, resulta una influencia considerable para los alumnos.

Pero la verdad recien la sabremos al final del cuatrimestre cuando hagamos la clase de cierre.

Mi enfoque hacia la arquitectura de software

Cuando me tocó estudiar este tema formalmente como alumno, recuerdo que lo hice desde la perspectiva del proceso unificado. Luego por iniciativa propia estudié el tema desde otras perspectivas/fuentes. Pero creo que lo que realmente me hizo entender el tema fue poner manos a la obra. Con esto en mente, hace unos dias me senté a preparar mis clases sobre este tema para mi materia de UNQ. Revisé algunas fuentes tradicionales, notas personales  y algunas fuentes más recientes y pensé algunos ejercicios para hacer con lo alumnos de cara a intentar bajar a concreto algunas cosas que pueden llegar a resultar abstractas.

Como mencioné en un post anterior, decidí encarar el tema presentando un problema, el cual nos fue guiando por los atributos de calidad hacia la arquitectura como disciplina. Luego en una segunda clase, vimos algunas definiciones formales y estilos de arquitectura con algunos ejemplos concretos razonando sobre código las implicancias de cada estilo. La tercer clase la decicamos a ver algunas técnicas concretas para atacar la definición de arquitectura de una aplicación. Finalmente en una cuarta clase, los alumnos realizaron presentaciones de ciertos estilos de arquitectura utilizando el mismo enfoque que habiamos utilizando previamente para presentar otros estilos.

Como material de estudio complementario a lo visto en clase elegí:

En algunas clases posteriores volveremos sobre algunas temas de arquitectura (por ejemplo para analizarla en el contexto de distintas metodologias de desarrollo), pero ya como cuestión colateral y no como tema central de una clase.