martes, 29 de septiembre de 2009

Desarrollar software usando energías limpias

Una idea que vengo trabajando desde hace un tiempo es la de hacer algo para revertir el calentamiento global. Cómo dice el dicho popular "mejor empezar por casa", asi que me propuse estos objetivos:
  • Desarrollar software usando energías limpias. Creo que un objetivo más genérico sería el de minimizar el impacto ambiental.
  • Crear un emprendimiento donde la responsabilidad ambiental sea tan importante como el corazón del negocio. Me gustaría llamarlo algo así como la organización sustentable ideal.
  • Servir de ejemplo / modelo a otras organizaciones y personas. Ayudar a otros a hacer lo mismo.
Si simplificara la actividad de desarrollar software actual, podría decir que consiste en usar una computadora durante 8 hs, 5 días a la semana. Un primer paso para conseguir lo anterior sería imaginar qué cosas podría hacer para que esa computadora funcione con energías limpias.

Algunas ideas:
  • Usar paneles solares.
  • Mudarme a un lugar donde haya viento para usar energía eólica.
  • Idem, pero hidraúlica.
  • Usar una notebook en lugar de una pc, ya que tiene menor consumo. Y dentro de las notebooks, una con bajo consumo.
  • La rueda del hámster, pero para mi perro (un bóxer incansable).
  • Generar electricidad con bicicleta fija o cinta de correr (además entrenaría).
  • Ser más productivo, o que el software sirva a más personas y optimice recursos (lo tengo en la punta de la lengua: cloud computing + software as a service).
  • Trabajar en los horarios de mayor luz solar. Trabajar los días de la semana de mayor luz (si está nublado, trabajo menos). Trabajar más en verano que en invierno (interesante para los que les gusta el montañismo invernal). Trabajar más cerca del sol (delirante...)
De todas, creo que las más aplicables son la notebook, cloud computing, software as a service, mejorar la productividad (metodologías ágiles, TDD, etc.) y las relacionadas con la energía solar… Otras ideas son bienvenidas!

domingo, 27 de septiembre de 2009

1ros pasos con Spring Security

Spring Security es uno de los mejores framework de seguridad web del mundo java. Esta basado en Acegi, un proyecto que luego paso a formar parte de spring. Para mi, una de sus mejores caracterísitcas es que no es invasivo, es decir, no me obliga a modificar mi código o tener alguna consideración para usarlo.

De hecho, yo empecé a construir la aplicación sin tener en cuenta ninguna cuestión de seguridad y ahora agrego este framework sin modificar el código existente. Es probable que tenga que crear código, como un provider de autenticación para que acegi pueda validar usuario y password, pero gracias al principio de diseño "programar hacia interfaces, no implementaciones" y al DI container (spring) no tengo que modificar el código ya existente, lo cual me recuerda otro principio "cerrado para modificación, abierto para extensión".

Configurar acegi era una tarea compleja, la primera vez que lo hice me llevo tiempo. Pero estos tutoriales me ayudaron mucho:

Para entender como funciona acegi:

Ahora, unos años después, leo que spring security facilitó esta tarea:

Paso a paso para configurar spring security:
1. Bajar spring security

2. Copiar spring-security-core.jar a WEB-INF/lib

3. Configurar web.xml. En este caso configuré el http filter (chain of responsability) de spring security para que verifique seguridad solamente sobre los request a /services y a *.html. El resto son recursos estáticos que no requieren seguridad:

4. Configurar spring security context:

Con esto tenemos una aplicación web con seguridad básica basada en spring security. El framework provee muchas más funcionalidades:

Saludos!

jueves, 24 de septiembre de 2009

Creatividad según Einstein

Hoy encontré una nota sobre uno de los creativos más grandes de la historia, Einstein. Casualmente estoy leyendo un libro llamado "Cómo pensar cómo Einstein", donde habla principalmente de romper las reglas y encontrar nuevas soluciones fuera de las restricciónes.


Muy inspirador... Algo interesante para agregar a la creatividad y trabajo en equipo es el de sumar un desafío al equipo.

sábado, 19 de septiembre de 2009

Refactoring como estrategia de construcción

Hace unos años me encontré con un libro muy interesante: Refactoring to Patterns de Joshua Kerievsky

Si bien este libro presenta un catálogo de escenarios o casos sobre los que es un código poco sano se refactoriza a un patrón de diseño, lo más interesante para mi es el enfoque con el que se trata el tema. Cuando construimos software muchas veces no se tiene claro cual es el alcance. Las metodologías ágiles, XP, asumen esto como una regla del juego y se organizan en función del cambio. Una frase muy conocida al respecto es "Lo único constante en el desarrollo de software es el cambio".

El libro introduce 2 ideas que dan claridad al problema de diseñar una aplicación: la sobre ingeniería, que vendría a ser como matar un mosquito con un misil tele dirigido, y la sub ingeniería, donde el problema radica en que la complejidad del código pasa a ser una limitación importante a la hora de modificar una aplicación. De alguna manera, diseñar implica encontrar un equilibrio entre estos dos caminos para lidiar con la complejidad y el cambio. Por lo que es necesario diseñar a lo largo de todo el proyecto.

Qué es refactorizar?

Refactorizar es mejorar el diseño de un código existente. Y también una estrategia de construcción muy eficaz. Podemos comenzar a construir una aplicación, de la manera más simple posible, y refactorizarla a medida que entendemos mejor su contexto y alcance. Esta idea, tomada del mundo XP, fue para mi en un proyecto pasado, una estrategía que resultó clave para llegar a buen puerto. Por lo general no se encuentra el diseño adecuado en el primer intento. De hecho, es bueno darse un tiempo para probar una idea y aprender.

Para qué Refactorizar?
  • Para simplificar el código y responder mejor a los cambios.
  • Para aprender a lidiar con la complejidad en un entorno cambiante.
  • Para hacer el esfuerzo justo.
  • Para potenciar al equipo, es muy didactico refactorizar de a pares, mejora los skills de programación de todos.
  • Para simplificar. Lo simple es mágico, todo es más fácil cuando es más simple.
Cuando refactorizar?

Esta es quizás la pregunta más difícil de responder, ya que depende del caso. Si se refactoriza demasiado tarde, puede ser muy costoso. Demasiado temprano, puede ser que todavía no conocemos suficiente del problema. Pero hay ciertas cosas que podemos oler, que nos dan una idea sobre piezas de la aplicación que no son sanas:
  • Esto es difícil de entender (complejo).
  • Siempre lleva mucho tiempo modificar esto (rígido ante cambios).
  • Cuando tocamos esto, surgen bugs que no detectamos.
  • Es difícil de testear.
Una lista de cosas que huelen mal en el código:

Refactorizar es como invertir en la salud de la aplicación. Tiene un efecto que mejora las condiciones de éxito. Una buena práctica es ir agregando los casos encontrados al backlog y priorizarlos junto como un ítem más en función de las necesidades del negocio.

Cómo refactorizar?

Hay muchas técnicas que ayudan a hacer refactoring efectivamente, como TDD, inyección de dependencias, patrones de diseño, herramientas de refactoring (resharper, eclipse), catálogo de refactoring, etc. Además es importante entender porqué el código no es sano y cómo lo mejoraremos, invirtiendo el esfuerzo justo.

Un enfoque muy interesante del libro, es que para evaluar la solución de refactoring, propone distintos puntos de vista.
  • Comunicación: De que manera el código comunica lo que hace.
  • Duplicación: La duplicación hace que sea más fácil cometer errores. El código duplicado es más difícil de mantener => evitar la duplicación.
  • Simplicidad: Cómo se puede hacer más simple? Para esto es muy importante encontrar el patrón de diseño adecuado.
Se me ocurren otros puntos de vista que se podrían agregar:
  • Testeabilidad: Que tan fácil es de testear?
  • Flexibilidad: Que tan fácil es de cambiar?
  • Esfuerzo: Como llevaría menos esfuerzo?
Más links en delicious

saludos!

lunes, 14 de septiembre de 2009

Grupo Estudio Patrones Diseño

Hace unos años tuve la inquietud de compartir con otros lo que había aprendido acerca de patrones de diseño. Lo primero que pensé fue que no quería hacerlo de manera convencional, es decir, una persona expone un tema y el resto escucha pasivamente. Asi que buscando información sobre como enseñar efectivamente, encontré este link muy interesante que explica cual es la dinámica de un grupo de estudio:

Bien cierto es que uno aprende más cuando lee, escucha, hace y habla, que cuando solo escucha.

Básicamente en un grupo de estudio se forma por gente con interés sobre un tema, de distintos niveles de conocimiento (la diversidad es un factor importante que mejora el aprendizaje del grupo). Un moderador organiza las sesiones (por ej. semanales), comparte con el grupo un material de lectura que todos deben leer previamente antes de asistir y luego durante el transcurso de cada sesión plantea al grupo preguntas abiertas. En este punto la diversidad es importante, porque permite que los que menos saben aprendan y aporten preguntas al grupo. Y los que más saben, que aprendan mientas comparte su conocimiento.

Las preguntas abiertas no son cualquier clase de pregunta. Son preguntas que nos hacen pensar y nos ayudan a tener un mejor conocimiento del tema. Por ejemplo "cuantos patrones de diseño hay?" no es una pregunta abierta. Una pregunta abierta sería algo como "qué patrones de diseño aplican el principio encapsular lo que varía?". Las preguntas abiertas invitan a la reflexión y al debate.

Lo siguiente que tuve que buscar fue un buen material de lectura, que sea fácil de leer y que requiera poco tiempo. Por suerte me encontré con este libro, que tiene una muy buena pedagogía para enseñar:

Finalmente, armar una agenta orientativa sobre los temas a tratar en cada sesión. Comparto los grupos en los que participé:

Algo que creo fue valioso es usar la primera sesión para explicar la dinámica del grupo de estudio, presentar el material, los objetivos y sensar las expectativas de los participantes. Como este tipo de capacitación requiere participación activa, es muy importante aprovechar la 1ra sesión para romper el hielo. En nuestro caso hicimos un juego donde 2 equipos debían construir una casa con rastis. Luego agregar una ventana. Y finalmente explicar que patrón de diseño de casas hubieran aplicado al construir la casa para luego agregar una ventana más eficientemente. Más allá de la analogía con la construcción de software, que puede ser cuestionable, sirvió para introducir el concepto de qué es un patrón y para crear un ambiente que favorezca la participación.

No menos importante fue la última sesión, donde como ejercicio integrador jugamos al pattern poker:

En está última cada participante dio su valioso feedback sobre el grupo de estudio e hicimos el cierre del grupo de estudio.

viernes, 11 de septiembre de 2009

Creatividad y trabajo en equipo

La creatividad es un concepto que está muy ligado al trabajo en equipo, ya que es en las personas donde reside la chispa capaz de crear la idea buscada.

Si bien a nivel individual podemos encontrar personas creativas y con ingenio, el verdadero potencial creativo existe en el equipo. La idea de una persona, por más insensata o incompleta que sea, puede ser el disparador de una nueva idea en otra persona. Es en este mecanismo donde se esconde el gran potencial de trabajar en equipo para resolver problemas con creatividad.

Un aspecto clave para que el equipo funcione de manera creativa, es el de generar las condiciones de éxito necesarias. En este punto creo que lo más importante es generar el espacio de comodidad, distención y respeto, en donde cada uno pueda decir lo que sea, sin ningún tipo de miedo, verguenza o prejuicio. Esto que parece tan simple, muchas veces no es fácil de lograr. Pero hay varias maneras de conseguirlo, como ejercicios de integración, jugar juegos para romper el hielo, etc.

Generalmene conviene empezar plantenado el problema sin demasiadas restricciones y luego generar en equipo un gran abanico de posibilidades. En un primer momento evitamos las restricciones para no limitar ninguna idea tempranamente. En esta fábrica de ideas, es fundamental el respeto entre los compañeros, hablar 1 por vez y escuchar con atención lo que cada uno tiene para decir. Este simple ritual mejora las condiciones de éxito de las que hablamos anteriormente. El juego es uno de los mejores disparadores de ideas, por lo que jugar es una actividad muy recomendable en cualquier proceso creativo.

Luego de generar el abanico de soluciones, es tiempo de bajar a tierra, agregar las restricciones, volver a refinar y combinar las ideas para generar nuevas soluciones. Si bien hay varias técnicas para hacer esto, la herramienta más poderosa es la pregunta. Muchas veces, resolver un problema de manera simple pasa por hacer las preguntas correctas. A esta altura, si durante el desarrollo de la actividad se generó participación, compromiso y ganas, el equipo va contestando y generando las preguntas casi naturalmente.

Estas son algunas técnicas que pueden servir para llegar a una posible solución.

Encontrar las restricciones auto impuestas / romper las reglas

Como personas estamos limitados por nuestra manera de ver las cosas. Nuestra educación / cultura nos dió un marco desde el cual vemos todo. Sin darnos cuenta, podemos caer en la trampa de una restricción impuesta por nosotros mismos. Quizás el ejemplo más famoso de esto sea la teoría de la relatividad de Einstein. Durante años la física clásica explicó los muchos de los fenómenos que vemos. Para nosotros es muy intuitivo pensar que el tiempo fluye siempre de la misma manera. Einstein, al romper esta regla, descubrió una nueva dimensión de soluciones que le permitió explicar fenómenos que hasta el momento eran inexplicables.

Los chicos, al tener mentes menos formadas y más libres, son grandes mentes creativas!

Preguntar, preguntar y preguntar

La pregunta nos permite llegar a zonas oscuras de soluciones que no podemos ver. Por lo que explorar estas zonas es un buen ejercicio para encontrar nuevas soluciones. Incluso puede llegar a ser muy divertido, si se aplica una buena dinámica.

Cada integrante puede tomar un rol y preguntar desde distintos puntos de vista. Un libro que resume muy bien esta técnica es "6 sombreros para pensar".

Otras preguntas que ayudan a encontrar nuevas ideas:
Que pasaría si..?
Y si pasara esto?
Y si en vez de A, pasara B?

Jugar con las dimensiones del problema

A veces pasa que un problema sin solución aparente, tiene solución cuando se consideran nuevos factores o dimensiones. Por ejemplo, el problema de las 3 lamparitas no parece tener solución. Hasta que agregamos nuevas dimensiones como la temperatura por calentamiento, la vida útil del filamento, etc. Lo mismo podemos hacer quitando dimensiones.

Pensar fuera del cuadrante / pensamiento lateral

Otras veces la solución está fuera de nuestra área de foco o dirección de pensamiento. Por ejemplo una posible solución para el problema del tráfico en la ciudad puede ser que en lugar de crear carilles exclusivos o mejorar la sincronización de los semáforos, simplemente la gente pueda trabajar desde su casa.

Cambiar la herramienta

No se si alguna vez escucharon la frase "Para el hombre que tiene sólo un martillo cualquier cosa es clavo". Sin darnos cuenta las herramientas que usamos para resolver problemas nos limitan en el abanico de posibles soluciones.


Resolver problemas con creatividad puede transformarse en una actividad muy sana y gratificante. Descubrí el encanto por este juego gracias a los profesores Juan Ramonet, Silvia Ramos y Diego Sadras que me enseñaron muchas de estas herramientas en una excelente materia que dan en la UBA. Una materia sobre la que sigo aprendiendo y practicando.

jueves, 10 de septiembre de 2009

Fin de semana con PilasBA

Este fin de semana fue algo atípico. La semana pasada me enteré graciar a @juancarloslucas sobre un evento Pilas BA. Lo primero que pensé fue "que bueno, van a empezar a reciclar pilas en Buenos Aires". Luego por otros tweets vi que era algo relacionado con emprendedores, asi que los busqué en google y me encontré en su sitio con 2 palabras clave para mi curiosidad: innovación y responsabilidad social. Un evento para emprendedores, con una dinámica de aprendizaje ágil y orientado a esta problemática, no me lo puedo perder. Asi que sin dudar ni preguntar mucho, me inscribí.

Uno de los compañeros del evento, escribió un buen post con todo lo que hicimos:

Más allá del evento, que me sirvió mucho para derribar mitos, motivarme y establecer contactos, me gustaría destacar algunas particularidades, relacionadas con el grupo de personas.

Lo primero es la diversidad, tuvimos la suerte de contar con gente de distintas provincias y paises. De distintas profesiones, edades y experiencia. Con distintas habilidades. Sin embargo, en toda esa diversidad encontré, y luego otros me comentaron lo mismo, un factor común. Ganas de aprender, de conocer nuevas personas, de participar. Algunos ya tenían un emprendimiento propio. Otros estaban creándolo, o tenían la idea, o la inquietud.

Esa fue una primera impresión... Pero luego de participar en actividades y entablar conversaciones, poco a poco empezábamos a entrar en confianza. Y descubrí gente con ganas de innovar, de espíritu inquieto, interesados por la responsabilidad social en un sentido amplio. Descontentos con algo pero con la idea de que se puede hacer mejor, que hay otras muchas maneras. Y esto lo vi en varios campos (educación, software, negocios, etc.). Con muchos me sentí identificado por poder hablar libremente de ideas locas, como buscar maneras de mejorar el medio ambiente y la comunidad, o mejorar la educación en las escuelas. Cada uno trajo sus ideas, algunas nacidas desde adentro, otras vistas con un lente de otro color. Diversidad y potencial, otras palabras clave que detonan mi curiosidad.