web 2.0

lunes, 30 de agosto de 2010

Aprendiendo Lean Software: Eliminar el Derroche

ANTECEDENTES
Cuando estudiaba el 6to Semestre de la carrera, entré a laborar a una pequeña fabrica de software en Pachuca, Hidalgo (México). De 2 años para acá comencé a interesarme en temas más específicos de Ingeniería de Software pasando por la Administración de Proyectos, Casos de Uso, hasta metodologías y procesos como MoProSoft y Personal Software Process. Confieso que desde un inicio nunca pude comprender al 100% estas prácticas de métodos formales, sin embargo las acepte en un inicio. Más adelante la relación entre estas prácticas y yo fue insostenible y las abandone para dar paso a la filosofía ágil de la cual sencillamente estoy encantado.

A partir de aquí, inicia una serie de comentarios que expresan mi opinión personal (muy posiblemente equivocada) sobre bibliografía y material que voy estudiando con el objetivo de crear notas y compartirlas principalmente con estudiantes de carreras afines.

¿QUÉ ES LEAN SOFTWARE DEVELOPMENT?
Comparto con ustedes un video-presentación que realizó Emilio Osorio donde explica lo que es Lean Software y sus principios básicos. Debajo de la presentación, comparto mi poca experiencia, opiniones personales y posiblemente no tan acertadas pero que eso es lo que hace tan valioso a la filosofía ágil, que no existe una receta a seguir y que el proceso se debe amoldar según el entorno.



PARA INICIAR...
Debo comenzar diciendo lo que digo siempre que hablo de metodologías formales. 

Martín Fowler, un Gurú en el mundo de Java comenta en su artículo The New Methodology, que las metodologías formales basan sus principios en otras Ingenierías como la Civil y la Mecánica, en donde la mayoría de sus problemas, son susceptibles de un análisis matemático y modelado previo a la construcción. Los métodos formales y nuestros maestros nos enseñaron que en el Software la mejor forma de hacer las cosas bien, son hacerlas a la primera! El error de la Ingeniería de Software tradicional es tratar al desarrollo de Software como un fenómeno predictivo de otras ingenierías, entendiendo como predictivo aquello que es susceptible de un modelado y de un análisis matemático para predecir el comportamiento de un Sistema al aplicar una fuerza.

Pueden leer este otro artículo que escribí titulado ¿Por qué fracasan los proyectos de SW?... Este artículo lo considero bien documentado, y es sencillamente una recopilación de ideas que varios autores a nivel mundial han escrito. 

PRINCIPIO 1: ELIMINAR EL DERROCHE
Como desarrolladores estamos tentados a comenzar por desarrollar aquellos módulos más fáciles o más bonitos ó con más reto personal, aunque éstos no agreguen un valor de negocio al usuario, , peor aún, desarrollamos cosas que el cliente no pide. Por ejemplo si debemos desarrollar un Sistema de Reporte de Ventas, muchas veces como desarrolladores comenzamos desarrollando la funcionalidad que grafique los datos, aunque quizá el cliente solo pidió tabularlos, peor aún, desde la filosofía ágil, nosotros debemos entregar funcionalidad cada 2 o 3 semanas, desde esta perspectiva quizá hemos omitido el desarrollo de la autenticación y autorización al sistema y hemos dado paso a desarrollar funcionalidades que no son prioridad en ese momento.

Alguien podría preguntarse ¿Y el desarrollar la funcionalidad para que grafique datos no es algo bueno?... Seguro que sí, pero si el cliente inicialmente no lo pidió, debemos mejor entregar una pieza de software funcional y usable con el que el cliente/usuario comience a trabajar. El usuario, al ver el sistema en funcionamiento seguramente pedirá los datos graficados y más funcionalidad extra, pero en ese momento, él ya estará sacando provecho al Sistema.

Finalmente en este momento puede venir una pregunta más para el lector, con lo anterior ¿no estamos propiciando a que el cliente pida y pida de forma insaciable nuevos requerimientos?... Desde luego,... Pero entonces el proyecto no será costeable para la empresa!... Bueno, desde la perspectiva tradicional efectivamente el proyecto no será costeable, saldrá de sus límites y no será un buen negocio para la empresa que desarrolla el Software, pero desde la perspectiva ágil sencillamente se pagara justo lo que se desarrolla con el plus de que tendremos a un cliente bastante contento. A diferencia de los métodos formales, los métodos ágiles te impulsan a entregar funcionalidad cada 2 o 3 semanas, de tal forma que el costo del desarrollo no se va sobre el proyecto, sino sobre funcionalidad. El cliente no pagará un Sistema, más bien pagará funcionalidad hasta completar un Sistema, de esta forma, si el cliente posteriormente agrega más requerimientos sobre algo ya desarrollado, podremos justificar más fácilmente un costo extra con el plus que el cliente al estar contento no tendrá tantos inconvenientes en pagar por mejorar o agregar funcionalidad extra de algo que ya esta usando. En el caso de una mejora, incluso la misma empresa que desarrolla, puede pensar en no realizar un cobro extra.

Como lo dice Emilio en su presentación, el derroche será todo aquello que no agrega valor al negocio del cliente. No debemos confundir "Eliminar el derroche" con no desarrollar o proponer requerimientos que tengan un valor agregado al negocio del cliente, por el contrario, siempre es buena idea dar un valor agregado al negocio del cliente, una ventaja competitiva que lo ponga un paso adelante sobre sus competidores. Debemos eliminar documentación innecesaria como Diagramas UML, planeaciones en gantt, decenas o cientos de hojas de Casos de Uso.

Lo anterior resulta muy delicado dado que el RUP y las herramientas como UML son tan aceptadas en nuestra industria, sería muy difícil de entender y aceptar que el 90% de los diagramas de UML son en su mayoría inútiles.  ¿Qué tan similares son los diagramas de clases realizados al inicio con las clases que se tienen al término del proyecto? La verdad es que son muy diferentes. Si alguien en este punto esta pensando que el Diagrama de Clases es útil por que nos da una vista rápida de como esta construido el sistema, obviamente que desconoce de las herramientas de Ingeniería inversa que nos ayudan a generar diagramas en base a las clases de un Sistema. Existen numerosos autores que ponen en duda la utilidad de UML, muchos otros autores reconocidos como Craig Larman conscientes de los puntos débiles del RUP pero convencidos de su utilidad defienden su utilización desde un punto de vista ágil. Para efectos de este punto, podemos leer un artículo de Bertrand Meyer (el creador del Lenguaje Eiffel) titulado "UML: The Positive Spin" donde verdaderamente se burla de lo absurdo que puede resultar el UML. De igual forma, podemos leer "Death by UML Fever" donde se explica que verdaderamente tenemos una Fiebre de UML. En conclusión podemos decir que UML puede resultar una buena herramienta de modelado post-development, como base para generar documentación para el mantenimiento del Sistema, pero no resulta tan bueno para generar documentación de requerimientos y análisis.

Son muchísimas cosas que agregan un derroche a nuestros proyectos, y considero yo que para este punto, solo falta un poco de sentido común para detectarlo.

Más adelante continuaré con los principios restantes de Lean Software, mientras tanto debí seguir leyendo el libro de Mary Poppendieck que me regalaron.

Saludos!


domingo, 29 de agosto de 2010

Material: Lean Software Development

Les comparto algunas presentaciones con audio que realizo el buen Emilio Osorio. Emilio es una de las personas que más fuerte evangeliza los principios ágiles en México, especialmente encantado por los principios de Lean Software Development.



¿Qué es y por qué funciona el Lean Software Development? from SG Campus on Vimeo.



Las cinco practicas esenciales del Desarrollo Lean-Agile from SG Campus on Vimeo.




Cómo hacer de tu grupo de desarrolladores un Equipo de Alto Desempeño from SG Campus on Vimeo.

lunes, 23 de agosto de 2010

Requerimientos de SW, ¿Cuántos kilos le damos?

El domingo anterior a escribir este post, fui a comer a un mercado de la ciudad de Pachuca, Hidalgo. Todavía iba caminando, aún ni me sentaba cuando ya me estaban preguntando si deseaba sopa o arroz, además de decirme la lista completa de guisados. Luego pues, decidí parar y sentarme a comer. Lo primero que hicieron fue darme como 1/2 kilo de tortillas. Al inicio todo iba bien ya que entre más tortillas me daban, más rápido comia y más pedia. Conforme fui avanzando en la comida, me fui dando cuenta que las muchas tortillas que me dieron en un inicio se acumularon, se estaban enfriando, que sencillamente eran innecesarias tantas en un inicio, pues termine pidiendo que me las cambiaran por otras menos frias.

Termine por darme cuenta que lo que me estaba pasando, era un ejemplo muy burdo de lo que pasa en el Desarrollo de Software (burdo pero muy cierto).

Yo era como el cliente/usuario que desea un Sistema de computo, usuario que desde un inicio sabe que necesita de algo que satisfaga sus necesidades, pero al poco tiempo se dejan escuchar miles de voces que te ofrecen una amplia gama de funcionalidades, opciones, mejoras, etc., muchas veces innecesarias. Ya habiendo entrado en el juego, el usuario se sienta a la mesa listo para definir sus requerimientos, sin embargo, los expertos Consultores, Project Managers, PMI, etc., comienzan a invadir al usuario con kilos de requerimientos, decenas y decenas de Casos de Uso, diagramas, diccionarios de datos, Interfaces, etc., requerimientos que con el paso del tiempo se van "enfriando", perdiendo así su valor original y el usuario termina por cambiar dichos requerimientos por algunos más refinados.

La dinámica del software es cambiante, su ámbito no es del todo predecible, sin embargo esto es algo de lo que aún no entendemos, nos aferramos a utilizar técnicas y metodologías predecibles que basan sus principios en otras ramas de la Ingeniería como la Mecánica y/o Civil en donde la mayoría de sus problemas son susceptibles de un análisis matemático, modelado y simulación, sin embargo, en el desarrollo de Sw no podemos forzar y modelar una Arquitectura detallada del Sistema mediante diagramas UML que en papel se ven bien, pero al momento de implementarlo es donde comienzan los problemas.

Nosotros como desarrolladores, líderes de proyecto, analistas, etc., debemos entender bien lo anterior y ayudar al usuario en el camino a descubrir que cosas son las que Él realmente desea, en lugar de abrirle un abanico de opciones desde un inicio. Si desde un inicio le ofrecemos kilos y kilos de tortillas, corremos el riesgo de que al paso del tiempo el usuario nos las devuelva y pida algo más reciente!

Los métodos ágiles nos proporcionan sencillos pero sólidos principios que nos ayudan a tener un cliente/usuario satisfecho pues generalmente tienen lo que realmente quieren, ya que lejos de hacer una toma de requerimientos detallada, la vamos refinando conforme avanzamos en el camino, evitando así trabajar "en valde" o innecesariamente ya que con las constantes reuniones y entregas rápidas de funcionalidad al usuario, éste puede ir descubriendo más fácilmente lo que realmente quiere y necesita.

¿Y tú cuántos Kilos de Requerimientos le ofreces a tu cliente/usuario?

Saludos!!

jueves, 19 de agosto de 2010

Introducción a los WebService I: Práctico y Fácil

Nivel: Intermedio
Se requieren conocimientos de programación. Este tutorial es meramente didáctico y se ha desarrollado a modo de ser entendible para usuarios sin experiencia en el tema, de tal modo que se pudieron omitir configuraciones.

INTRODUCCIÓN

¿Alguna vez se han preguntado de que manera los Sistemas de Banca en Línea por Internet pueden ofrecer a sus usuarios servicios tales como, recarga de tiempo aire, pago de tarjeta de crédito, pago de recibos de luz y agua, etc?

En primera instancia quizá esto sea poco importante, irrelevante, pero si nos detenemos y pensamos un poco en que las diferentes compañías como Telmex, CFE, Bancomer, Sky, Movistar, etc., tienen sus Sistemas desarrollados en diferentes plataformas (.NET y Java generalmente) ¿Como es que podrían comunicarse plataformas diferentes?


Pago de Servicios de la Banca en Línea de Banco Azteca.


¿Como podrían comunicarse dos personas que hablan un idioma diferente?...

La respuesta a esto son los WebService! Los WS publican unos descriptores XML llamados WSDL que definen una interfaz de comunicación para que otros WS Cliente puedan hacer uso de ellos e invocarlos. Para entender de mejor forma lo anterior, podemos imaginar a dos personas que hablan idiomas diferentes y sin embargo desean comunicarse entre si de forma efectiva, así que uno de ellos publica una interfaz que la otra persona pueda entender como por ejemplo una serie de dibujos (escritura pictográfica) o de movimientos (mimica) y a esta interfaz es a lo que llamamos el WSDL. De esta forma ambas personas aunque hablen un idioma diferente podrán comunicarse.

Mediante los WS, por ejemplo, la Banca en Línea de Banco Azteca puede ofrecer a sus clientes el pago de diversos servicios, pues sencillamente hace uso de los WS que otras compañías publican, crea un cliente para consumir esos WS y listo! tendremos a Sistemas desarrollados en diferentes plataformas comunicandose.

Existen diversos "tipos de WebService", dos de los más comunes son los:

  • Basados en el protocolo SOAP
  • Basados en Rest
En este tutorial dividido en 2 partes veremos los más clásicos, los que utilizan el protocolo SOAP.

HERRAMIENTAS UTILIZADAS



Nota --> La instalación de Tomcat es muy sencilla y funcional siguiendo este tutorial.

DESARROLLO

Para iniciar debemos desplegar el WAR de Axis en Tomcat e invocar la siguiente URL



Debemos validar que tenemos las librerías esenciales para el correcto funcionamiento de axis, para ello basta con dar click al botón de Validate.

Ahora mediante Eclipse vamos a crear un proyecto Java común y corriente y una clase llamada Saludo:


Posteriormente crearemos un archivo xml al que llamaremos services.xml en una carpeta a la que llamaremos META-INF y estará en la raíz del proyecto, de tal forma que debe lucir algo así:





Así pues, vamos ahora a exportar dicho archivo a un JAR que los WS conocen como AAR. En eclipse damos click derecho sobre el proyecto y damos click a export. Seleccionamos JAR File y escribimos un nombre poniendo la extensión ".aar".

Finalmente vamos a la consola de Administración de Axis. Nos pedira un Usuario y Password, así que tecleamos "admin" y "axis2" respectivamente. En la parte de Upload Service podremos subir el archivo que generamos.





Si todo sale bien, en Available Service tendremos el WS que hemos subido.



Si damos click sobre el nombre del WS, nos abrirá una página en blanco, pero si vemos su código fuente, veremos el famoso archivo WSDL que será el que utilizaremos en la segunda parte de este artículo para generar un cliente que consuma este WS.




En esencia, los WS son sencillos de implementar, aunque como toda tecnología, tienen sus puntos complicados.

Saludos!!