Tuesday January 23rd 2007, 6:48 pm
Filed under:
Agile
Ultimamente, he leÃdo varios posts quejándose de las metodologÃas ágiles, como por ejemplo éste. Creo que el problema pasa por que hay gente que no termina de comprender Agile, quizá piense que es algo muy complicado1, muy extremista. Pero no lo es.
Primero, creo que malinterpreta el significado del precepto #2 del Manifiesto Agil :
“Software funcional antes que documentación extensiva”.
Yo interpreto que la prioridad esta en hacer que el software funcione como tiene que funcionar antes que ponernos a escribir toneladas de documentación. Pero no quiere decir que no escribamos nada de documentación. Para mi no es un falso dilema, no es una disyunción exclusiva.
Es mas bien como lo escribe mas abajo:
“Aceptamos la documentación, pero no cientos de páginas que nadie mantiene y casi nunca se consultan”.
Personalmente, creo que un Wiki, con breves artÃculos explicando las diferentes partes de una aplicación, más algunos comentarios en el código, es lo ideal.
Luego, el autor del post dice (traduzco):
“Los equipos cambian de integrantes, los proyectos se migran, y la gente se pregunta qué quizo hacer Joe con sus tres mil treinta y tres lineas de código antes de irse de la empresa.”
Acá es donde veo que no comprende bien la filosofia Agile. 3033 lÃneas de código juntas simplemente no es Agile. Primero porque violarÃa el principio de testabilidad, seria imposible de testear. Segundo, porque carece de sentido común, sobre lo que se basa todo lo que es Agile. Un método o clase de 3033 lÃneas no solamente va a ser inentendible para cualquier otra persona, sino para el mismo autor luego de un mes.
Recuerdo que hace varios años, cuando aún no habÃa ni siquiera escuchado hablar de metodologÃas ágiles, y lo mas común era el modelo en cascada, le comentaba a un amigo: “Es imposible desarrollar buen software de esta manera. Todo cambia demasiado rápido, tiene que haber una manera mejor”.
Obviamente, no fui tan brillante como para inventar una metodologÃa ágil, pero sà lo suficiente como para darme cuenta que se necesitaba algo asÃ, y como para adoptar las prácticas ágiles cuando me enteré que existÃan.
1Me recuerda los problemas que mucha gente tenÃa en la facultad en Análisis Matemático I (yo mismo al principio), para poder entender el concepto de lÃmite. Realmente es algo muy simple, pero a veces lo presentan de una manera que parece algo complicadÃsimo.
Lately, I’ve been reading a few posts complaining about agile methodologies, such as this one. I think the problem is some people don’t quite understand Agile, maybe they think it’s too complex1, or too extremist. But it’s not.
First, I think he misunderstands the meaning of Agile Manifesto precept #2:
“Working software over comprehensive documentation“.
My understanding is priority lies in making a functional software under the customer requirements, rather than writing tons of documentation. But that doesn’t means no documentation at all. To me it’s not a false dilemma, is not an exclusive disjunction.
It’s more like he writes later:
“We embrace documentation, but not hundreds of pages of never-maintained and rarely-used tomes.“.
Personally, I think a Wiki, with brief articles explaining different applications parts, plus some comments in the code, would do.
Then, the author says:
“Teams will change staff and projects will migrate and people will be left wondering just what Joe meant and just where he was going with his three thousand and thirty three lines of code before he left the company and the department he worked in was disbanded.”
Here, I can see he doesn’t understand Agile very well. 3033 continous lines of code is not agile. First, because it violates the testability principle, it would be impossible to test. Then, it lacks any common sense, which is the foundation of Agile. A 3033 lines method or class no only will be incomprehensible for any other person, but also for the very author if he/she comes back to the code a month later.
I remember something I told a friend many years ago, when I didn’t even hear about agile methodologies yet, and the most common model was the waterfall model: “It is not possible to write good software this way. Everything changes too fast, there should be a better way“.
Obviously, I wasn’t bright enough to invent agile methodologies by myself, but bright enough to realize that something like that was needed, and to embrace Agile when I learned about it.
1It reminds me of the trouble a lot of people had in university Calculus 101 (myself at first) to understand the concept of limit. It’s actually very very simple, but sometimes it’s presented in a way that it seems very hard.
Wednesday January 17th 2007, 6:58 am
Filed under:
General
Mi aplicación necesita bajar información casi en tiempo real de otras aplicaciones de otras empresas. Por el momento, se conecta con 5 otras aplicaciones.
El proceso no es exáctamente igual con cada aplicación, pero es similar, básicamente cada tantos segundos les pido que me manden un documento XML con nuevos datos. Esto lo hacemos con un simple POST sobre HTTP (con SSL para que viaje todo encriptado). Las otras empresas usan tecnologÃas diversas. Dos usan Java, una usa PHP y dos más usan .net
Ahora, lo extraño es que la mayor cantidad de problemas los tenemos con aquellas empresas que usan .net.
Con la primera de ellas, una empresa de UK con la que empezamos a trabajar hace ya algunos meses, cada tanto tenÃamos problemas de timeouts, que finalmente terminamos resolviendo usando HTTP/1.0 en lugar de HTTP/1.1. También tuvieron problemas con las fechas y horas cuando se terminó el horario de verano y se atrasó una hora.
Con la segunda, una empresa de USA estamos terminando la implementación ahora mismo. TodavÃa no puedo asegurar que funcione bien, despues de algunas horas de funcionamiento, su servidor se empieza a tomar demasiado tiempo en responder (hasta 60 segundos en algunos casos). Anoche simplemente dejó de responder de un instante a otro.
También, les tuve que pedir que me manden la fecha en UTC o al menos incluyendo el timezone, ya que ellos mandaban alegremente la hora local y sin timezone, por lo tanto yo no tenÃa una referencia para poder convertir esa hora a otra. Y el gran problema hubiera aparecido cuando comience el horario de verano. Todo esto me pareció extraño viniendo de personas que viven en un paÃs con 5 zonas horarias distintas y con horario de verano.
Soy 99.99% ignorante sobre .net y todas las tecnologÃas de Microsoft (la última vez que hice algo con Microsoft debe haber sido en 1995 cuando hice una aplicación de IVR en VB 5, que si bien tenia funcionalidades muy interesantes, no estoy particularmente orgulloso de como fue hecha internamente), pero esto me lleva a preguntarme… tiene .net el mismo problema que tantas otras aplicaciones Microsoft, que funcionan bien la mayor parte del tiempo, pero en algún momento fallan? O es un problema de la gente que trabaja con Microsoft? Hay alguna relación entre el uso de .net y la calidad de sus desarrolladores? Quizá son ex desarrolladores VB?
Update: creo que en realidad hay algún problema con la implementación del protocolo HTTP en .net, especÃficamente en el manejo de 100 Continue, no serÃa la primera vez que una implementación de Microsoft no cumple 100% con el standard. Los problemas de ambas aplicaciones con .net estan relacionados con esto. Igualmente, les tuve que indicar donde estaba el problema.
A consecuencia de haber leido este post, me puse a pensar que fue lo último que hice tratando de buscar la mejor solución, y no la que hubiera usado sino me ponÃa a investigar 5 minutos.
Y encontré este simple caso:
Como decÃa en un post anterior, estuve haciendo un programador (scheduler) de reportes. El requerimiento era que fuera flexible y fácil de usar, ya que los mismos usuarios finales lo van a utilizar para programar los reportes. Para el caso de la periodicidad, obviamente no podia simplemente poner un campo donde ingresar una expresión Cron, porque entonces nadia iba a ser capáz de usarlo. Se me ocurrió entonces poner una serie de opciones, que el usuario podÃa elegir: Una vez, Diario, Semanal, Quincenal, Mensual, etc.
Para la parte de interface del usuario, ya habia decidido usar Stripes para todo lo nuevo (e ir lentamente migrando lo antiguo de Struts). Stripes se basa fuertemente en Java 5, y por lo tanto trae algo muy interesante que es un tag de JSP stripes:enumName() , que sirve para mostrar los valores de una enumeración. Esto está buenÃsimo, porque me hago un loop y muestro todos los valores de un Enum como radio buttons:
<c:forEach var=”freq” items=”<%= ReportFrequency.values() %>”>
<s:radio value=”${s:enumName(freq)}” name=”definition.frequency” id=”definition.frequency.${s:enumName(freq)}” class=”radio”/>
<s:label for=”definition.frequency.${s:enumName(freq)}”>${s:enumName(freq)}</s:label>
</c:forEach>
Lo mejor de todo esto, es que cuano el valor llega a mi Action de Stripes, me llega como un Enum del tipo ReportFrecuency (gracias al maravilloso binding de Stripes). El detalle acá, es que los Enum de Java 5 no son simples constantes, sino que también pueden tener comportamiento.
Mi Enum ReportFrecuency esta definido asi:
public enum ReportFrequency {
Once(TriggerUtils.makeImmediateTrigger(0, 0)),
Hourly(TriggerUtils.makeHourlyTrigger()),
Daily(TriggerUtils.makeHourlyTrigger(24)),
//etc
private Trigger trigger;
ReportFrequency(Trigger trigger) {
this.trigger = trigger;
}
public Trigger getTrigger() {
return trigger;
}
}
O sea que luego, lo único que tengo que hacer cuando creo el Trigger para el Scheduler, es:
Trigger trigger = definition.getFrequency().getTrigger();
FacilÃcimo. Y agregar una nueva frecuencia solo implica agregar un nuevo valor al Enum, no hay que tocar absolutamente nada más!.
Ahora, cómo hubiera hecho sino hubiera usado Enums y Stripes? Lo mas asqueroso que se me ocurre es todo hardcodeado, con los valores en strings repetidos en la vista y en el action, y una serie de ifs para elegi el Trigger. Algo un poco mejor podrÃa haber sido usar constantes static final String (pero igualmente hubiera tenido que escribir cada radiobutton individualmente), y después haber usado algún factory para obtener el Trigger correspondiente.
Creo yo que esta es la mejor solución posible (por lo menos a mi no se me ocurrió nada mejor), y además es extremádamente fácil de mantener. Las otras soluciones implican escribir mas, y son difÃciles de mantener, porque hay que cambiar varias cosas en varios lados, y mantener esos cambios sincronizados. Es cierto, quizá haya tardado un poco más en implementar esta solución porque tuve que investigar un poco sobre Enums y Stripes, pero el resultado es mucho mas robusto, agregar alguna frecuencia en el futuro es una pavada, y además aprendà algo nuevo.
Y la satisfacción de haber hecho las cosas bien, es impagable.