web 2.0
Mostrando entradas con la etiqueta Ing de Software. Mostrar todas las entradas
Mostrando entradas con la etiqueta Ing de Software. Mostrar todas las entradas

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!!

domingo, 6 de junio de 2010

¡¡¡El cliente no sabe lo que quiere!!!

Cuando usted era un jovenzuelo (como yo al momento de escribir este artículo), cuando comenzaba a realizar su vida propia y comenzó a ganar un poco de dinero, seguramente por su mente paso el comprar un automóvil, cuentas bancarias, etc., y si usted al igual que yo, llego a la ciudad originario de provincia, al inicio muchas cosas le son desconocidas, usted sabía que quería tener un automóvil, pero no tenia muy claro que tipo de auto le convenía ni con que características.

  • ¿Qué tipo de motor?
  • ¿Que tipos de frenos? ¿de disco, de tambor, antiblockiersystem?
  • ¿Que tipo de suspensión? 
  • Velocidad máxima, tiempo de aceleración.
  • Costo de mantenimiento y refacciones.
  • Costo de tenencia (en México).
Usted disponía de un presupuesto, y para aclarar todas sus dudas, lo mejor era consultarlo con los expertos de las agencias o incluso con sus mismos amigos... Si usted estaba convencido que quería un Automóvil pero no tenia claro los tipos de características que hacen atractivo a un automóvil según su presupuesto, ¿podríamos concluir que usted no sabia lo que quería?... Pues SÍ, aunque también podría ser NO.

En el desarrollo de Software estamos muy acostumbrados a gritar la frase "El cliente no sabe lo que quiere" siempre que algo sale mal y desafortunadamente la indecisión en el desarrollo de software es más compleja que el ejemplo del auto. En un inicio el cliente sabe que necesita automatizar sus procesos de negocio y hacerlos más efectivos y dinámicos, que le permita una toma de decisiones más certera, pero pese a lo anterior, tiene muchas dudas de el alcance y hasta donde la tecnología le puede ayudar, y esto es parte de la naturaleza de trabajar con cosas abstractas e intangibles. 

Bajo la mirada de la filosofía ágil, el cambio de requerimientos es algo natural al cual debemos adaptarnos, de ahí que en Scrum se recomiende hacer entregas con valor de negocio mínimo cada 2 semanas hasta 1 mes como máximo, de esta forma el cliente podrá ir validando, refinando  y agregando nueva funcionalidad con una idea mucho más clara a lo largo de la duración del proyecto y de ningún modo tendrá que vaciar sus requerimientos en largos e inútiles documentos que inevitablemente cambiaran con el tiempo, además de crear una mala relación entre cliente-consultora.

Requerimos un cambio de filosofía, dejar de pensar que el cliente es quien comete los errores, el cliente al igual que nosotros no tiene muy claro lo que quiere, dado que no es experto en tecnología y en un principio no esta consciente de todas las cosas que la tecnología le puede ayudar, esto último lo va descubriendo conforme puede ir probando funcionalidad. La comunicación Equipo de Trabajo - Cliente es importante para el éxito de un proyecto, olvidémonos de la vieja comunicación Cliente - Líder/Gerente - Equipo de trabajo... En este ámbito, los puentes en la comunicación no sirven, bajo NINGUNA circunstancia, NO HAY EXCUSA para hacerlo.

Más vale el desarrollo iterativo y adaptarse al cambio, la frase "¡¡¡El cliente no sabe lo que quiere!!!" debe ser cosa del pasado, debemos saber convivir con el cambio, negociar tiempos de entrega, de esta forma tendremos a un cliente más contento que al estar culpándolo por los cambios.




sábado, 3 de abril de 2010

El giro positivo del UML

Sencillamente esta es una sátira genial que escribió ya hace algunos años Bertrand Meyer y que tradujo Javier Smaldone en su blog.

En el blog de Javier Smaldone, hubo una discusión entre el y Fernando Pinciroli.

Es muy importante ser fríos y objetivos, si bien Javier Smaldone comenta puntos muy ciertos sobre el UML, también cae en el exceso de desprestigiar totalmente no solo a UML sino a RUP.

Como en uno de los artículos que escribí titulado El Fracaso de los proyectos de Software, apoyado en uno de los artículos más interesantes de Martín Fowler, comento que el modelado en UML debe manejarse con cuidado, pues la idea de "primero modela y luego construyes" encaja perfectamente en la Ingeniería Civil y Mecánica donde la naturaleza de sus problemas son suceptibles de un análisis matemático para determinar el comportamiento de una entidad bajos ciertas circunstancias y esto en definitiva obliga casi a un modelado previo.
Desafortunadamente en el Software la idea de realizar primero un "Diagrama de clases" e invertir mucho tiempo en ello para diseñar una Arquitectura es realmente absurda!


Es importante aclarar que no estoy del todo de acuerdo con Javier y Bertrand Meyer, por el contrario, pienso que algunos diagramas UML son útiles siempre y cuando se tomen como una ayuda para aclarar cuestiones de diseño y no como documentación base del proyecto ya que esto último desvía la atención de las organizaciones en lo que es realmente importante... dejar un valor de negocio al cliente! En breve publicaré la traducción de "La Fiebre del UML" que hace un tiempo leí.

Sin más que comentar, lean este artículo, disfrútenlo, diviértanse y sobre todo, tómenlo con mesura, más aún si son estudiantes!

viernes, 26 de marzo de 2010

¿Problemas?... Ese no es mi problema!!

La burocracia es uno de los problemas existentes en muchas organizaciones, principalmente en Gobierno! Desafortunadamente las empresas privadas no están exentas de esto!

El siguiente vídeo nos ilustra de una forma cómica lo que ocurre en muchas de las organizaciones! En el desarrollo de software por ejemplo, es muy común encontrarse con programadores egoístas que no comparten su conocimiento y cuando un integrante del equipo de trabajo tiene problemas, no faltara quien se niegue a ayudarle!... "Ese no es mi problema!!" pensamos rápidamente.

No solo programadores, sino todos los involucrados en el proyecto de desarrollo, nos corroe la envidia y buscamos únicamente que lo que nosotros hagamos este bien hecho, lo que hace el de al lado o el de frente no nos interesa. Se nos olvida que los objetivos requieren de una responsabilidad compartida y solo esta suma de esfuerzos harán que podamos obtener resultados cuantificables, es decir, metas!


lunes, 15 de marzo de 2010

El Fracaso en los Proyectos de Software

Última revisión: 17 de Marzo 2010
Antes de comenzar, debo aclarar que yo no tengo nada en contra de las metodologías tradicionales, al contrario, creo que su aplicación es muy eficiente en algunos tipos de proyectos, pero sin duda en la mayoría de proyectos empresariales, han demostrado ser ineficientes. Por esta razón, debemos dar una mirada a una nueva alternativa que lleva utilizándose con éxito en Europa desde hace más de 10 años!


Esta serie de articulos bajo el nombre “El fracaso en los proyectos de Software” es simplemente una recopilación de ideas que muchos expertos realmente involucrados en el desarrollo de software han vertido durante los últimos años:


Y a tantas otras personas que directa o indirectamente han influido en la filosofía ágile. (ver).

Esta primera parte, da solamente un acercamiento del entorno actual en el que se vive en muchas partes del mundo, principalmente, en México. En la segunda parte que comenzaré a escribir en breve, hablaré más especificamente sobre la filosofía de las metodologías ágiles y sus bondades.
Durante mi corta experiencia, he podido ver muchos Sistemas de Software de mediana escala con una calidad increíblemente pobre, con un mantenimiento que resulta un tormento y un tiempo de desarrollo cada vez más corto. Cuando lo anterior no sucede, el proyecto se termina, pero no cumple con las expectativas del cliente y termina siendo muy poco utilizado. Por ejemplo, una de las casas de préstamo de efectivo en México recientemente ha iniciado un nuevo proyecto para migrar su sistema de cobranza en .NET a una plataforma Java! Indudablemente la razón de esta migración no es por que .NET se haya quedado “corto”, más bien habla de una pésima aplicación que a estas alturas ya es inmantenible por su terrible calidad, derivado de una mala administración!

El fracaso de estos proyectos se atribuye a diferentes perspectivas, desde un nivel meramente técnico (personal mal capacitado), hasta una mala visión de negocio entre los niveles gerenciales. Mi intensión en este artículo no es hablar sobre los errores o aciertos que cometen los niveles gerenciales ya que en estos momentos no tengo injerencia en este campo por mi nula experiencia, así que me enfocaré más al problema derivado de una mala Ingeniería de Software y abrir la pregunta que Tom DeMarco lo plantea en uno de sus artículos…. La Ingeniería del Software es ¿Una idea obsoleta?

Esta serie de artículos, involucran a estudiantes y académicos y a profesionistas del mundo laboral.
A los estudiantes, para que conozcan lo que se viene trabajando en reino unido y países europeos con éxito desde hace más de 10 años. Además con esto espero que sepan que no todo en la vida de los sistemas es un conjunto de tablas, relaciones, frameworks y lenguajes de programación! Quienes me conocen, saben muy bien que mi formación ha sido eminentemente técnica, así que en definitiva no podrán decir que me intereso en este tipo de proyectos por que “no se programar”.

Al sector académico es una llamada de atención para que dejen a un lado sus ideas obsoletas sobre la Administración de Proyectos de Software, se haga una revisión a las retículas académicas y se actualice a la planta docente. Es hora de que los catedráticos sepan que hay otras cosas que el modelo en cascada (muchos ni siquiera enseñan algo de RUP) y peor aún ¿Por qué seguimos perdiendo el tiempo en hacer que el alumno domine un Microsoft Project para hacer bonitos pero inútiles diagramas de Gantt? Es hora que el sector académico se pregunte ¿Realmente todas estas prácticas están agregando un valor real al producto?… En México la educación es obsoleta, mientras en otras partes del mundo se enseña PSP/TSP, RUP, Ágile, Testing, etc., en México seguimos encerrados con nuestros diagramas de flujo, diagramas de contexto, y tantas otras prácticas obsoletas. Mi antipatía por el sector académico siempre ha sido notoria para todos aquellos que me conocen en persona y he sido un crítico muy duro con ellos. Yo mismo he vivido la ineptitud de muchos catedráticos, mi asesor de titulación quería diagramas de flujo y de contexto argumentando que los Casos de Uso eran para personas técnicas y no para los usuarios!!! Lo más triste era ver que se encontraba en el departamento de Posgrado pues era un Maestro en Ciencias!

Finalmente, a los profesionistas de hoy, a los desarrolladores que aún no conocen a los métodos ágiles, es seguro que ustedes estarán con muchas cosas de acuerdo.

Sin más que esperar una mentalidad abierta por parte de ustedes lectores, es hora de ver algunas de las razones por la que los proyectos de Software fracasan y ver bajo una filosofía agile una alternativa, aunque no  necesariamente una solución completa a los problemas existentes en el desarrollo de SW, pero Ágile puede influenciar aún más los conceptos de la Ing de Software tradicional!


SITUACIÓN ACTUAL
En el año 2006, John Avellanet utilizó un estudio realizado por Accenture para establecer los puntos necesarios que se requieren para alcanzar el éxito de un proyecto. Los datos sobre el entorno en el desarrollo de proyectos de TI era desalentador, desafortunadamente del 2006 a la fecha, las cosas no han cambiado en mucho.

  • Solo el 27% de los proyectos de TI puede ser considerado un éxito. 
  • Los proyectos de TI sobrepasan su costo en un 56%. 
  • Se estima que los proyectos sobrepasan su calendario en un 84%. 
  • El 31.1% de los proyectos son cancelados antes de que sean terminados. 
Lo anterior son números rojos alarmantes, que sin embargo, no son nada nuevos , estos números han existido desde un inicio.

Este proyecto es extremadamente importante.
No hay calendario, ni guias, ni el personal necesario…
Y su fecha de entrega es mañana!! Así que esta es su oportunidad
de impresionar realmente a todos!



CAUSAS DE TAN DESALENTADOR PANORAMA
Las causas son diversas. El Dr. Daniel Tapia, Profesor Investigador del Centro de Investigación en Tecnologías de la Información (CITIS) de la Universidad Autónoma del Estado de Hidalgo, atribuye el fracaso de un proyecto de TI a las siguientes razones;

  • Se daba mayor atención a las cuestiones operativas que a la planificación. 
  • Planeación deficiente. 
  • Los objetivos del proyecto no estaban alineados con los objetivos de la organización. 
  • El entorno global hace que la planeación tradicional ya no sea suficiente. 
  • Una mera planificación de actividades y recursos no sirve de nada. 
  • Se requiere una gestión estratégica. 

Existen puntos interesantes en las presentaciones del Dr. Tapia que recomiendo leer (ver al final de este artículo), aunque en algunas cuestiones, no concuerdo del todo, como por ejemplo donde hace mención que se requieren procesos bien definidos y una documentación extensa. Fuera de esto, el Dr. Tapia concluye que un simple enfoque de Ing. de Software ya no es suficiente, lo cuál es extremadamente cierto, sin embargo, en este artículo nos enfocaremos en dicho aspecto.
A los puntos anteriores, voy a agregar uno que seguramente puede ser causa de polémica por ser tan directo y acusador.


Durante muchos años, el sector académico ha tenido erróneamente mucha injerencia en el desarrollo de software cuando su papel no es precisamente ser el protagonista en este ámbito. Las universidades estan más interesadas en crear pequeñas fábricas de software, que en preparar de forma adecuada a los alumnos. Las empresas por su parte, se están enfocando en capacitar en cuestiones básicas a los alumnos que egresan en lugar de desarrollar software, es decir, los papeles se estan invirtiendo!! Las universidades están desarrollando software y las empresas están capacitando!!.

Hace poco más de un año, escuche al Director General de QuarkSoft, Cesar Montes de Oca, decir todo lo anterior! Ellos como empresa tenían que capacitar a los recién egresados sobre temas tan sencillos como realizar una simple conexión a base de datos con Java! Sin duda que algo muy pero muy grave esta fallando con las Universidades, pero bueno, afortunada o desafortunadamente no es tema de análisis en este estudio.

Grandes universidades que sin duda han hecho grandes aportes a la Ing. del Software, como por ejemplo la University Carnegie Mellon (en conjunto con el SEI), han desarrollado varios de los modelos y procesos para el desarrollo de Software como por ejemplo (CMM/CMMI, PSP/TSP., etc., “Avances” mismos que al día de hoy han demostrado ser ineficientes para la mayoría de los casos reales. Aquí en México por ejemplo, se ha creado MoProSoft como un modelo de desarrollo de software para las empresas mexicanas, modelo que ha sido lidereado por la Dra. Hanna Oktaba, académico del IMAS en la UNAM.


Es importante hacer un pequeño paréntesis y aclarar todo lo anterior para no crear malos entendidos. El sector académico ha hecho no solamente grandes aportes, más bien ha hecho todos los aportes de la actualidad en cuanto a las Ciencias Computacionales [Ver Ing de Software de Ian Somerville para una diferencia entre las Ciencias Computacionales y la Ing de Software]. Debemos agradecer a nuestros maestros de la universidad por enseñarnos aquellas estructuras de datos, por hacernos entender el algoritmo de Dijkstra, por explicarnos la notación O, por aquellos difíciles proyectos en lenguaje ensamblador y por aquellas Series de Fourier, etc., sin embargo, han olvidado que mucho de su trabajo es eminentemente teórico que puede demostrarse y realizarse en laboratorios, pero un proyeto de desarrollo de software no puede ser simulado y demostrado fácilmente.


¿Cuál es el problema de las Metodologías actuales?
La filosofía que siguen los métodos formales están basados en procesos aplicados en otras ingenierías como la ingeniería civil y mecánica en donde se requiere una planeación detallada antes de construir! Este es el punto medular de este artículo… “La planeación detallada“… Martín Fowler un verdadero gurú a nivel mundial, escribió un muy interesante y famoso artículo donde habla sobre “La nueva metodología” y da unas pautas generales que describen el error de las metodologías tradicionales y los aciertos que han tenido las metodologías ágiles.

Ha sido un error tomar casi al pie de la letra la filosofía de otras ingenierías y aplicarlas al desarrollo de software. En la ingeniería civil por ejemplo, los problemas importantes son suceptibles de un análisis matemático que determina por ejemplo, la fuerza a aplicar a ciertos elementos, la resistencia de los materiales, etc. En pocas palabras, los métodos que se utilizan en otras ingenierías son “predictivos” [entiéndase por predictivo que es posible "predecir" el comportamiento de un Sistema bajo ciertas condiciones]y funcionan muy bien en ese ámbito. Sin embargo, en el mundo del desarrollo de software comercial, ¿Como es posible predecir un cambio de requerimientos? ¿Es posible predecir la duración de un proyecto?… Muchas personas podrían argumentar que si es posible predecir lo anterior, quizá sí, pero no bajo modelos matemáticos como en otras ingenierías y por ende esta filosofía debería desecharse.

Lamentablemente, esta predicibilidad es muy usada en procesos tales como el PSP [Ver Personal Software Process del Dr. Watts Humprhey] , en donde debes ir haciendo todo un registro de tus tiempos, de tus distracciones, e ir sacando promedios de cada actividad a la que te dedicas para que de esta forma, en actividades similares posteriores, puedas predecir el tiempo que llevaras en construir cierto componente de software, aunado a esto, toda una serie de procesos formales intentan mejorar tu productividad y calidad en tus desarrollos. Los principios del PSP pueden ser aun muy discutidos, yo mismo me encuentro aún valorando sus bondades en ciertos tipos de proyectos.

Las metodologías tradicionales, al ser meramente predictivas, dicen que debemos hacer una toma completa y detallada de requerimientos al iniciar un proyecto, posteriormente asentar en documentos y diagramas UML la arquitectura del sistema a utilizar, después comenzar la construcción del sistema y finalmente una etapa de pruebas. Nótese la gran similitud con la ingeniería civil, en donde primero se diseña y después se construye!

Cuando se trabaja con metodologías tradicionales, existe una resistencia nativa al cambio. Las personas que trabajan en el proyecto se resisten a cualquier cambio de requerimientos, cosa contraria a lo que pasa con los métodos ágiles, en donde se piensa que los cambios son bienvenidos, se trata sencillamente de convivir con ellos y transformar una debilidad en una fortaleza.
La toma de requerimientos tradicional, indica hacer una detallada documentación y casos de uso donde se plasmen los requerimientos. Hoy en día ya sabemos que un desarrollo iterativo es mejor, en donde al inicio del proyecto se de solo un panorama general de todo lo que el usuario quiere y en cada iteración se desglosen un poco más los requerimientos.

El diseño de una arquitectura antes de la codificación es otro problema fundamental! Teóricamente lo anterior suena bien e incluso lógico, pues a final de cuentas, esto mismo se hace en otras ingenierías! Pero la práctica nos ha demostrado que el definir una arquitectura anterior a la codificación resulta muy problemática a la hora de codificar. La filosofía agile, nos indica que la mejor arquitectura que podemos definir en un inicio son cuestiones generales como la plataforma de programación, la BD y los frameworks que utilizaremos, pero la arquitectura detallada, ira fluyendo durante la codificación!


La etapa de pruebas es un asunto discutido. Por un lado, los tradicionalistas opinan que debe haber un equipo aparte del equipo de desarrollo que se encargue de probar el sistema, además de esto, nos indica que la etapa de pruebas se realiza al final de la etapa de codificación! En el lado ágil, tenemos que no existe un equipo aparte del equipo de desarrollo, los desarrolladores son y deben ser los mejores testers, además de esto, la práctica de TDD, nos dice que primero debemos crear la prueba unitaria antes de crear el módulo! Es decir, debemos crear primero una prueba unitaria para algo que aun no existe!! Esto es raro al inicio, pero aporta muchas ventajas!


El error de las personas que practican metodologías tradicionales
Son muchos los errores que siguen los project manager tradicionales. Desde el hecho de que las empresas gastan o se desviven en piratear licencias de sofisticados programas para elaborar diagramas de Gantt y hacer un detallado calendario de todo el proyecto con fechas de entrega, personas que realizarán cada una de las tareas y/o módulos existentes, plan de trabajo que desarrollo una noche antes el departamento de ventas para poder vender un proyecto de miles de pesos etc., hasta el hecho de designar un equipo especializado en “pruebas de software” que sea diferente al del equipo de desarrollo que realizará las pruebas al software en base a un detallado análisis en casos de uso de 100 páginas.


Otro error que cometen frecuentemente los administradores de proyectos es,

Yo Administrador de Proyectos, soy el único que puede dialogar con el cliente! Tu programador, tienes prohibido hablar con el cliente de cosas relacionadas con el proyecto, cualquier duda que tengas en los requerimientos debes dirigirte a mi, cualquier duda que tenga el cliente en la estimación de tiempo debes indicarle que se dirija conmigo.
Acaso al construir una casa, el maestro de obra habla con nuestros papás en lugar de hablar directamente con nosotros que somos los clientes??

Algo más irónico es por ejemplo, cuando una vez que el departamento de ventas diseñó nuestro plan de trabajo y decidió que nos llevaríamos 2 días en construir la interfaz que comunicaría nuestro módulo de consultas de proveedores externos con la tabla que existe en DBASE y que la transmición de datos se haría mediante un certificado digital de seguridad web SSL, además claro esta, de tener la opción de enviar un correo electrónico a los directivos cuando el monto de las facturas exceda el monto planeado que se tiene en SAP. Una vez que en la primer reunión que tuvo el depto de ventas con el cliente y entrego dicho plan de trabajo, el cliente quedo asombrado ante la rapidez de desarrollo y le dijo al departamento de ventas que entonces comenzaran ese mismo día con el proyecto! Entonces el departamento de ventas, corre inmediatamente a darle la excelente noticia al equipo de desarrollo que tiene 2 días para mostrar un primer entregable, que de el plan de trabajo y las estimaciones de tiempo, que ya ni se preocupen, que ellos muy amablemente ya lo hicieron por nosotros!

Entonces el equipo de desarrollo, manda rápidamente a su analista estrella a la toma de requerimientos. Este llega al siguiente día con unas 30 hojas de las cuales unas 25 contiene información redundante! Entonces el equipo de desarrollo tiene ya solamente 1 día para terminar el primer entregable!!!!

Lo anterior, obviamente es una descripción subjetiva que no esta muy alejado de la realidad. Por un lado, tenemos a muchosStakeholder como el cliente, el depto de ventas, gerencia, etc., que piensa que hacer software es como manufacturar algo o hacer enchiladas, que en cuestión de horas estará listo para funcionar!!

Por otro lado, tenemos a métodos formales que nos exigen hacer una detallada toma de requerimientos en extensos casos de uso y más importante aún, estar persiguiendo al cliente para que firme dichos requerimientos y así “asegurar” que estos no cambien en un futuro y si cambian entonces tenemos a un “cliente que no sabe lo que quiere” y nos negaremos a realizar el cambio y si lo realizamos, será con un costo adicional sobre lo planeado. Por si esto fuera poco, se nos ha enseñado que antes de iniciar la etapa de codificación, debemos elaborar una detallada arquitectura del sistema y plasmarla en muchos diagramas UML y documentos que puedan servir como referencia “más adelante”.

Esta idea de una Arquitectura detallada y modelado UML, funciona bien en la Ingeniería Civil, pero no en el desarrollo de software… Incluso, el hecho de que muchos catedráticos piensen que el UML es la octava maravilla del mundo, es debido a que los diseños en papel o en una herramienta UML son consistentes y se ven bien! De la misma forma en el mundo real y productivo, los diseños UML en un principio parecen ser correctos y el modelo parece ser lo suficientemente bueno para generar una buena arquitectura, pero los problemas surgen a la hora de la codificación, y es cuando vemos que los diagramas UML solo nos han servido para perder el tiempo!! Cuando lo anterior pasa, es entonces que vociferamos a todo mundo que el cliente tiene la culpa por no saber lo que quiere, que nuestro analista no “predijo” como si lo hubiera hecho Walter Mercado lo que el cliente iba a querer más adelante y que nuestro arquitecto de software no supo diseñar una arquitectura escalable y preparada para el cambio!! Y es que aún si suponemos un modelo exitoso con UML, el constante cambio de requerimientos hará que sucedan dos cosas posibles:

  • Se actualiza toda la documentación existente y además se procede con dicho cambio a nivel de codificación. Al actualizar los cientos de documentos existentes y dejarlos actualizados y acorde a los nuevos requerimientos, hemos perdido tiempo valioso en aquello que realmente aporta un valor o ventaja competitiva a nuestro cliente! Por lo tanto, ya tenemos un retraso de más de un 50% y no entregaremos a tiempo la funcionalidad o si la entregamos, estará llena de errores por la premura del tiempo. 
  • Dejamos de lado la documentación y nos enfocamos a lo que realmente aporta un valor al cliente! Desafortunadamente, a mitad del proyecto, este enfoque resulta triste, ya que hemos perdido la mitad de tiempo en elaborar documentación que, conforme el proyecto fue avanzando y evolucionando ha quedado obsoleta y ya no sirve de “base” para el mantenimiento del sistema, pues lo que comenzó como un simple sistema de facturación, terminó acercándose más a lo que es un ERP. Finalmente, la documentación pasa a ser un bonito recuerdo! 


No faltara quien a estas alturas pueda argumentar algo a favor del modelado detallado en UML y pueda decir:

“Uhmm, pero un diagrama de clases o de componentes, nos da una visión general de la estructura del sistema y esto es muy útil para saber como interactuan los componentes del sistema, así que es necesario realizar estos diagramas. Además los diagramas de despliegue por ejemplo son muy útiles cuando tratas con un cliente técnico.”

Lo anterior, es una idea desesperada por encontrarle un sentido a la existencia del modelado excesivo en UML. Bastaría hacer un refactoring a nuestro código fuente para obtener un diagrama siempre actualizado de clases o de componentes del sistema! Y todo en cuestión de minutos!!… ¿Para que perder el tiempo diseñando y planeando algo de naturaleza intangible que con el tiempo irá cambiando y evolucionando? Ahora bien, no todo en el UML es malo, los diagramas de despliegue por ejemplo son útiles, los diagramas de actividades son una versión más bonita de los diagramas de flujo, en un momento dado podrían ser útiles 2 o 3 diagramas de secuencia, etc. El punto aquí es el “exceso” que se comete con UML.
Aunado a lo anterior, todavía podemos decir mucho más….


  1. Los líderes y clientes, piensan que el hacer software es tan sencillo y rápido como introducir una fórmula en excel, por esto mismo, obligan a los desarrolladores a trabajar jornadas mayores a las 8 horas! 
  2. Los líderes de proyecto no están dispuestos a perder su autoridad! Es común que en los equipos, siempre exista una autoridad que tome todas las decisiones [programadores extrella, líderes absolutos]. Cuando un desarrollador sugiere o habla algo con el cliente, el líder siente perder autoridad, reacciona y entonces prohíbe una comunicación con el cliente! 
  3. Los equipos de trabajo siempre están a la espera de recibir órdenes, a que se les asigne una tarea, muchas veces a que se les diga como hacerla, etc. Mientras en la forma tradicional perdemos el tiempo esperando recibir ordenes, en las metodologías ágiles se fomenta a equipos auto-dirigidos! 

¿Es importante estar certificado en una norma ISO, CMM/CMMI/, MoProSoft, etc?
Muchas empresas no ven lo anterior como una posibilidad para realizar un cambio y mejora en sus procesos, en vez de eso, lo ven como algo superficial del cual pueden alzar el cuello y presumir ante sus clientes que tienen una certificación ISO xxxx-xxxx y que entonces son la mejor opción ya que sus competidores hacen software basura y ellos al tener una ISO, hacen desarrollos de calidad!

Yo mismo he vivido lo anterior. En mi primer trabajo profesional que tuve en el desarrollo de software, yo aún era estudiante y me toco vivir como la empresa para la que trabajaba, se preocupaba más por dar a conocer a los clientes que se contaba con la certificación MoProSoft nivel 1, cuando internamente no se conocía muy bien la forma de aplicar efectivamente dicho modelo.

El presidente de la empresa, siempre aseguraba que no podíamos presumir nuestras miserias al cliente! Ciertamente algo muy cierto, el problema era que nunca se preocupo por hacer un verdadero cambio de fondo. Pero bueno, el asunto original es si realmente es importante estar certificado en alguna de las anteriores normas y procesos formales para tener éxito en el desarrollo de software! Me permito citar nuevamente al Dr. Tapia:

No existe interés por métodos formales de aseguramiento de la calidad del software. Las empresas mexicanas están más preocupadas por conseguir la certificación de sus procesos con un distintivo de calidad, aunque dicha certificación no garantice la satisfacción de sus clientes.
Finalmente…
Para terminar esta primera parte del artículo “El fracaso en los proyectos de Software”, debemos sacar las concluciones más relevantes.

  • Los métodos tradicionales, siguen un enfoque utilizado en otras ingenierías como la Ingeniería Civil y Mecánica, en donde, sus problemas son susceptibles a un análisis matemático que determinará el comportamiento de un sistema bajo ciertas condiciones. En el desarrollo de software, no es posible determinar con exactitud el comportamiento de los sistemas de software. 
  • Los métodos tradicionales y las personas que trabajan con ellos, siguen un riguroso esquema, en donde se aleja mucho al equipo de desarrollo y al cliente. El desarrollo ágil fomenta la comunicación desarrollador/cliente e invita al cliente a ser parte del equipo, mientras que los tradicionalistas sostienen que el líder de proyecto debe ser el responsable de hablar con el cliente. 
  • Cuando los proyectos fracasan, se cree que todavía debe agregarse una capa más detallada de procesos aún más formales y definidos, de planes aún más detallados, de más documentación, de más juntas de 3 horas, de una mayor vigilancia al equipo de desarrollo y de más horas de trabajo, cuando en realidad los principios deben ser muy sencillos. [ver el artículo de Emilio Osorio] 
  • Las empresas se preocupan más por tapar hoyos superficiales, por presentar un mundo de caramelo en sus desarrollos con el cliente y de obtener certificaciones aunque no entiendan como aplicarlas. 
  • En muchas empresas, la gerencia toma decisiones que no le corresponden y debe dejarlas a los verdaderos expertos. Muchas veces son estos niveles los que fijan el costo de un proyecto de software y la duración del mismo. Cuando menos lo esperamos, ya nos entregan un plan de desarrollo con fechas ya establecidas!. 
  • Durante más de 10 años, los métodos formales no han dado tantos resultados positivos. Lo preocupante de esto, es que al no dar los resultados esperados, día a día se piensa en agregar más formalidad y rigidez a su proceso. Los métodos ágiles tampoco son la solución a todos los problemas, pero si dan unas buenas pautas para reformular las actuales ideas de la Ingeniería de Software. 
En la segunda parte de este artículo, comenzaremos a ver a la filosofía de los métodos ágiles y veremos en ellos una mejor herramienta para tratar de resolver los problemas actuales en la administración y desarrollo de software.

Visita el blog próximamente para leer la segunda parte que será mucho más interesante! No olvides vertir tus comentarios que serán muy útiles para enriquecer este artículo! Tanto si eres un estudiante con o sin experiencia, un académico dando o no dando clases de Ing de Software, o un profesionista desarrollador o líder de proyecto! Todos los comentarios, buenos o malos, pero constructivos, son bienvenidos!


REFERENCIAS BIBLIOGRÁFICAS