Un año “Realizando la idealidad” Junio 2, 2009
Posted by ravelus in Experiencias.add a comment
Vale, no he realizado ninguna idealidad, pero el título quedaba chulo, no me dirán que no.
Hace algo más de un año que abrimos las puertas por primera vez, nos trasladamos a WordPress, montamos el chiringuito, nuestro púlpito y ale, a disertar estupideces. Y si el tío de Kriptópolis, los de Microsiervos, el otro y el otro (vean más abajo la sección de Enlaces) hacen autopropaganda y falsa modestia publicando cada poco sus cientos de miles de visitas recibidas, vendiéndolas como un “gracias” cuando en realidad es un “cómo molo, molo muchísimo, si llegara a chupármela me la metería hasta el esófago, oiga”, pues yo no voy a ser menos. A partir de aquí toda comparación sería absurda, pues las visitas que he recibido en un año son menos de las que estos sitios reciben en un día, y su mérito tienen, sin duda alguna. Pero desde el punto de vista personal estoy más que satisfecho que cada día me siguan más de 40 personas, a pesar de las divagaciones y de las estupideces; hace que me sienta “alguien” en el inmenso mundo de Internet el tener 70 comentarios, que aunque las cifras son ridículas bien merecen mis más sincero agradecimiento. No espero más, no aporto nada original ni rompedor, simplemente escribo palabras, no nos equivoquemos.
Esto no es falsa modestia, es lo que hay. Es cierto que me gusta escribir y que probablemente aunque tuviera cinco visitas o ninguna lo seguiría haciendo, pero saber que probablemente hay unas veinte o treinta personas (como mínimo, calculo yo) que no conozco y que me siguen al menos una vez a la semana (se notan los picos a comienzo de semana), aparte de las que me conocen y me siguen, que unas veces me critican por tiquismiquis, cutre, sabelotodo y prepotente y otras veces me dicen que soy gracioso, sincero, o que están de acuerdo conmigo, eso para mí es mucho. Eso anima a seguir escribiendo. No soy nadie, no espero cientos de miles de seguidores; sólo espero que alguien, por pura casualidad, y buscando quién sabe el qué, se deje caer por aquí y le guste lo que vea, o que le disguste, y lo comente. Muchas gracias, de verdad. Estos son los números, y estoy muy orgulloso de ellos:





Tipos de equipos según su organización (II y final) Mayo 19, 2009
Posted by ravelus in Informática.add a comment
Feature Team
Consiste en pequeños equipos encargados de un área específica: desarrollo, calidad, documentación, gestión, interfaz de usuario… Cada grupo tiene un responsable que funciona como portavoz e interfaz de comunicación con los otros grupos. Las responsabilidades están claras y bien definidas. Funciona bien en proyectos tipo resolución de problemas (ver artículo anterior) porque tales problemas pueden ser divididos y focalizados en un grupo. También puede funcionar bien en proyectos de creatividad (ver artículo anterior), al enfocar cada grupo mejoras de calidad desde un punto de vista diferente. Proyectos de ejecución táctica (ver artículo anterior) no se ven favorecidos por este tipo de organización.
Search and Rescue Team
Actúa como un equipo de salvamento de montaña. Los miembros se centran en resolver problemas muy específicos. Requiere un profundo conocimiento del entorno y del modelo de negocio. Requiere una buena previsión de imprevistos (riesgos: planificación y resolución). Claramente favorable para proyectos tipo resolución de problemas. No es buena opción en otro caso.
SWAT Team
“Special Weapons And Tactics” se transforma en el mundo software en “Skilled With Advanced Tools“. Cada miembro es experto en el manejo de una herramienta o técnica específica, y la suma de todos ellos es sinérgica y hace que el equipo actúe como uno sólo. Debido a sus características son equipos permanentes, inamovibles. Especialmente útil en proyectos de ejecución táctica. Buena idea para proyectos de resolución de problemas.
Professional Athletic Team
Los miembros del equipo son seleccionados muy cuidadosamente. Son las estrellas. El gestor hace trabajo de “trastienda”, pues los fans no quieren verlo a él, quieren al equipo. El gestor hace posible que el equipo sea eficiente. El proyecto puede salir adelante sin el gestor, pero no sin el equipo. Cada miembro tiene un rol específico, el cual maneja perfectamente. El gestor está para dar soporte. Por si a alguien no se le ha ocurrido aún, esto es igual que un deporte de equipo. Útil en productos de interés general, y no de cliente.
Particularmente me parece que incentiva la creatividad y la resolución de problemas.
Theather Team
Fuerte dirección y mucha negociación acerca de los roles en el proyecto. El “director” manda: su opinión prevalece sobre la del resto. Cada rol no debe salirse demasiado de su cometido o papel. Los papeles son intercambiables entre proyectos, de manera que no hay especialistas en este sentido, pero en un proyecto dado el papel no cambia. El gestor hace trabajo de gestión puro: mucha gestión, poca técnica. Útil en proyectos multimedia.
¿Y vosotros? ¿En qué tipo de equipo trabajáis?
Referencias:
Rapid Development: Taming Wild Schedules, Steve McConnell
Tipos de equipos según su organización (I) Mayo 6, 2009
Posted by ravelus in Informática.1 comment so far
Introducción
En este artículo trataremos las diferentes formas que existen para organizar los miembros que conforman un equipo de desarrollo software y en qué consisten, qué rol desempeña cada miembro, etc.
Para entrar en calor, digamos que según sus objetivos existen tres formas de organizar un equipo según el tipo de proyecto a desarrollar:
- Resolución de problemas: casos en los que los requisitos son confusos, proyectos de investigación, etc.
- Creatividad: proyectos en los cuales es necesario explorar alternativas y evaluar distintas posibilidades.
- Ejecución táctica: proyectos que constan de un plan bien definido y conocido, con menor incertidumbre.
La elección de uno u otro enfoque dependerá del objetivo fundamental del proyecto. Es por esto que la definición de tal objetivo u objetivos es primordial, ya que seleccionar un enfoque no adecuado puede dañar en cierta medida la consecución de dicho objetivo.
Por otro lado, algunos aspectos a tener en cuenta a la hora de mantener equipos productivos son: roles claros (¿qué papel desempeña cada uno?), monitorización del desempeño individual (qué tareas tiene asignadas, qué tal lo hace, qué dificultades tiene cada miembro en la consecución de sus tareas, etc), comunicación efectiva (¿qué problemas tiene el desarrollo del proyecto en este preciso momento?) y toma de decisiones basada en hechos (conociendo el estado actual del desarrollo, ¿qué acciones tomar? ¿qué camino se seguirá a partir de ahora?).
Tipos de equipos
Business Team
Entre pares, cada miembro se especializa en un tema concreto. El equipo es dirigido por un líder técnico, que será un “par” con experiencia. Lo de par significa que existirá una serie de miembros que serán pares entre sí, en el sentido de iguales en cuanto a su liderazgo, experiencia y capacidades técnicas. Cada equipo será liderado por uno de estos “pares”. Este líder tomará decisiones finales en temas técnicos. Este rol no tiene por qué ser desempeñado por el propio gestor del proyecto. Funciona bien con equipos pequeños y/o estables. Es lo suficientemente adaptable como para funcionar bien en todo tipo de proyectos (ver introducción). Esta versatilidad es precisamente su principal debilidad, pues no ofrece un rendimiento neto excepcionalmente bueno en ningún tipo de proyecto específico.
Chief-Programmer Team
El equipo se comporta como el equipo de médicos de un quirófano: uno, el más productivo, es el cirujano jefe, el que desarrolla la mayoría del proyecto; el resto están para dar soporte y descongestionar al jefe de las tareas más sencillas. Estas tareas, de muy diversa índole, pueden ser desarrolladas por personal no informático. El jefe debe ser excepcionalmente bueno en lo que hace (lo cual restringe mucho el número de personas que pueden desempeñar este papel). Puede funcionar bien en proyectos creativos y de ejecución táctica.
Skunkworks Team
Consiste en aislar un grupo de desarrolladores con talento y creatividad en una sala donde nadie los moleste y darles libertad para trabajar e innovar. Desde el punto de vista de la gestión, el equipo se comporta como una caja negra: el gestor no conoce los detalles del estado del proyecto, y de eso se trata precisamente: el equipo trabaja y no es molestado ni coaccionado. Eventualmente surgirá un líder técnico en un cierto aspecto, tarea o tema a tratar; éste será elegido por el equipo. Esta organización maximiza la motivación, la responsabilidad y hace que los miembros se involucren en lo que hacen al máximo. Por otra parte, la falta de visibilidad externa puede ser un problema a tener en cuenta (véase como riesgo). Por todo ello, es fácil entender que este modelo es apropiado para proyectos de creatividad y muy desaconsejable para aquellos de ejecución táctica.
Referencias:
Rapid Development: Taming Wild Schedules, Steve McConnell
JAD (Joint Application Development) Abril 27, 2009
Posted by ravelus in Informática.add a comment
No, no. No se trata de JASP, aquel famoso eslógan publicitario de principios de los 90. Aquí voy a hablar de JAD, que es otra cosa bien diferente, si bien todo parecido sería pura casualidad a la par que absurdo. JAD es uno de esos inventos que hacen los americanos, que no tiene nada del otro jueves pero que le ponen unas siglas chulas, para que suene guay y la gente se quede con cara de papagallo cuando les dices que haces JAD, escribas libros y ganes dinero a chorretones. Y aunque yo no voy a ver un puto duro por hablar aquí de esto, escribo porque es una técnica más, interesante, y me gustaría que el lector se quedara con lo que le gustara, desechara lo que no, y de todo ello extrajera algo positivo, aunque sólo sea hacer tiempo hasta que termina de descargar algo en el eMule o en lo que carga un vídeo en YouTube.
¿Qué es JAD?
Dicho esto, comenzamos. JAD es una técnica de definición de requisitos y de diseño de la interfaz de usuario, basada en reuniones participativas entre clientes, directiva y desarrolladores. En dicha reunión los temas a tratar se centran más en el negocio que en el asunto técnico. Lógicamente está más orientado a proyectos de cliente (o bien sistemas a medida, como también se los conoce), y permite recolectar requisitos eficientemente.
Hay que tener cuidado porque estas reuniones pueden hacer ver a los clientes una falsa realidad en cuanto al progreso del proyecto o la productividad. Además, hay que prestar especial cuidado con las estimaciones tempranas, aquellas que entrañan un mayor riesgo por el mayor desconocimiento del sistema y que deben ofrecer una amplitud de rango mayor entre mejor estimación y estimación pesimista.
Esta técnica sale beneficiada si se utiliza en modelos incrementales, ya que permite pulir poco a poco el sistema en función de las necesidades del cliente. Para su buen funcionamiento es fundamental que cada grupo o rol que participa en las reuniones se implique al máximo. Bien utilizada, esta técnica permite ver conflictos entre requisitos y eliminar aquellos menos útiles (costosos, poco beneficio o rendimiento logrado, etc.).
Estructura de la técnica
JAD consta de dos fases: planificación y diseño. Ambas tratan los requisitos, pero a distinto nivel de abstracción. Si bien en planificación se tratan los requisitos a un nivel más alto, estudiando sobre todo la utilidad y la viabilidad de los mismos, en la fase de diseño se realiza un uso intensivo de prototipos y se diseña la interfaz de usuario, el presupuesto, la calendarización y el esquema de la base de datos (en caso de que esto último sea aplicable al sistema a tratar). Cada una de estas fases llevaría en torno a entre uno y diez días. No confundir la fase diseño-JAD con la fase de diseño del proyecto; JAD es una técnica que se aplicaría en fase de planificación y análisis.
Cada fase, además, consta de tres partes: preparación (decidir quién asistirá a cada reunión), sesión o reunión propiamente dicha y conclusión, donde se extraen los principales puntos consensuados durante la sesión y se plasman en algún soporte permanente. El papel está bien, no caigamos ya en la tecnofilia, siempre que sea un soporte permanente, accesible por todos y, sobre todo, refleje un consenso aceptado por todas las partes. Algo así como un contrato.
Una vez terminado el proceso de JAD, se sigue con el modelo de desarrollo elegido. Es decir, JAD es independiente del modelo de desarrollo, con lo cual es aplicable siempre.
Las sesiones
Las sesiones tendrán lugar en lugares apartados, neutrales (sí, esto es la guerra: tú junta clientes, directivos y desarrolladores y no dejes a mano armas de fuego ni blancas o presenciarás una cutre película gore). Además se facilitará todo lo necesario para centrarse en el trabajo: piscolabis, refrescos, nolotiles, aspirinas, etc.
Los roles son los siguientes: moderador, ejecutivo cliente, usuario final, desarrollador, secretario y especialistas en determinados campos de interés para el producto. Estos últimos son los únicos personajes que no necesitan estar presentes todo el tiempo que dure la sesión. Es importante recalcar que cada rol debe ser desempeñado por gente clave, y no debería asistir más de ocho personas (como número orientativo).
Temas a tratar en las sesiones
En el JAD de planificación, que dura entre 1 y 5 días, se trata lo siguiente:
1.- Conducir la orientación. Introducción.
2.- Definir los requisitos de alto nivel.
3.- Limitar el alcance del sistema.
4.- Identificar y estimar las fases del diseño JAD.
5.- Identificar los participantes del diseño JAD.
6.- Planificar la sesión de diseño JAD.
7.- Documentar las decisiones tomadas.
8.- Conclusión.
En la reunión llevada a cabo durante la fase de diseño JAD se tratarán los siguientes puntos:
1.- Conducir la orientación. Introducción.
2.- Refiniar y limitar los requisitos de alto nivel identificados en la fase de plan JAD.
3.- Desarrollar un flujo de trabajo (workflow).
4.- Desarrollar la descripción de dicho workflow.
5.- Diseñar la interfaz de usuario.
6.- Especificar requisitos de procesamiento.
7.- Definir interfaces.
8.- Identificar grupos de datos y funciones.
9.- Documentar las decisiones consensuadas.
10.- Conclusión.
Para terminar…
Como hemos podido ver, tras las siglas JAD se esconde un conjunto de directrices, técnicas y consejos que no son nada nuevas. Aquél que esperaba oír hablar de filostros y forlayos (véase Memorias de un Ingeniero, de Alfredo de Hoces) se ha llevado un chasco. Sin embargo no nos confundamos: JAD reúne un compendio de buenas técnicas de demostrada utilidad, que pueden mejorar el tiempo de desarrollo y aumentar la visibilidad del proyecto. Además utilizada de forma regular, esta técnica puede aportar una mejora en el desarrollo de proyectos en general que la puede hacer muy útil. Finalmente señalar que, utilizada con inteligencia, puede hacer que la satisfacción de los clientes se vea incrementada.
Fuentes bibliográficas:
Rapid Development: Taming Wild Schedules, Steve McConnell
Patrones en Gestión de Configuraciones Software (VI y final) Abril 7, 2009
Posted by ravelus in Informática.add a comment
Release-Prep Codeline
Este patrón trata de estabilizar un baseline para un release inminente, permitiendo paralelamente el desarrollo del proyecto sin afectar a tal release. Preparar un release implica pasar un buen número de pruebas, solucionar errores, preparar instaladores, documentación, etc. Si se realizan cambios importantes en este periodo crítico, pueden aparecer, de forma accidental, nuevos errores. Por otra parte, si congelamos el desarrollo por pulir el release, perdemos productividad.
Una posibilidad es crear una rama para tal release (al lector avispado que ha llegado hasta aquí leyendo los anteriores post seguramente ya se le había ocurrido tal solución antes de empezar a leer este párrafo), pero si bifurcamos demasiado pronto tal rama se pueden encontrar luego muchos errores en desarrollo que corregir en la release. Por consiguiente habrá que realizar muchas operaciones de fusión o merge, y tales operaciones sabemos bien que son complicadas. Aun así, es una buena solución, y es la que hemos ido adelantando en anteriores patrones.
¿Cómo solventar, entonces, los problemas de dicha solución? Crea la rama cuando el código se aproxime a la mayor estabilidad posible. De este modo el número de errores detectados (y consiguientes merges) será menor. Pero ojo: no esperes demasiado a crear tal rama de release o congelaras el desarrollo paralelo… en resumen: control, visibilidad máxima del progreso, y ojo al dato.
Task Branch
De este patrón podría hablar largo y tendido, y todo serían alabanzas; no en vano es el que usamos en la empresa donde trabajo y los resultados no pueden ser mejores: facilita el control de los cambios, la localización de dichos cambios y a qué afecta, facilita además la integración de dichos cambios en la rama principal, y favorece la productividad, junto con un software de control de tareas competente (Jira, OnTime, y en menor medida Bugzilla, Mantis…).
¿Cómo podría el equipo realizar múltiples cambios a largo plazo y que se solapan en una línea base sin comprometer la consistencia ni la integridad? No vale renunciar al uso de un control de versiones común, por descontado. El problema ya se propuso en otra ocasión: cómo controlar una tarea grande sin interferir en el trabajo de los demás.
La solución, una vez más: ramificar. Y es que el uso de ramas es tremendamente positivo, siempre que se usen con sentido, claro. Utiliza una rama diferente para cada actividad que represente cambios significativos en la línea base. Por tanto este patrón ya necesita un elevado soporte de políticas de desarrollo: definir tareas, asignar tareas, con un determinado tamaño, etc.
De este modo, disminuímos los riesgos (sus efectos, su probabilidad de ocurrencia). Una vez terminada tal tarea, la uniremos, junto con las demás, a la línea de desarrollo principal. Este merge deberá realizarse cuidadosamente para no romper nada que ya estuviera hecho (el lector ya debe estar pensando en otros patrones, como test unitarios, de smoke o de regresión…).
Este enfoque es muy útil cuando hay varias personas compartiendo un trabajo que debe integrarse en un todo. Por tanto, como hemos dicho, este patrón facilita la integración (si algún compañero lee esto se reíra de mí, pero tendrá que reconocer que si integrar es complejo y doloroso, sin este patrón sería una tarea bastante infernal…). Es importante integrar cada cierto tiempo cada rama (que representa a cada tarea) en la rama principal, sino la operación de fusión al final será muy trabajosa. Sin olvidar los riesgos que conlleva trabajar durante mucho tiempo con código desactualizado, lo cual ocurriría en ramas que se bifurcaron hace mucho y que han tardado mucho en integrarse. Solución: tareas cortas. ¿A alguien se le ha ocurrido ya que este patrón funciona de maravilla con metodologías ágiles, como Scrum?
Named Stable Bases
¿Con qué frecuencia integrar? Es importante estabilizar interfaces cuanto antes y que el resto de cambios, más frecuentes, tengan que ver con el cuerpo del código. Etiqueta claramente y de forma coherente aquellos puntos del desarrollo más estables. Son un seguro de vida…
Daily Build & Smoke Test
Control sobre los cambios: contener el potencial de errores en cada compilación del código. Solución: al menos una vez cada día, construir el proyecto (compilarlo) y ejecutar una ristra de Smoke Test. Sobre este patrón Steve Mc Connell sabe mucho, así que si desea obtener más información, el lector puede consultar Code Complete, donde se habla del asunto de forma somera, y Rapid Development: Taming Wild Schedules, donde se trata esta estrategia con mayor profundidad.
Con esto terminamos los patrones. Espero que hayan disfrutado de la serie tanto como yo.
———————————————————-
Referencias:
Steven Berczuk, Brad Appleton: “Software Configuration Management Patterns, Effective Teamwork, Practical Integration“
Patrones en Gestión de Configuraciones Software (V) Marzo 29, 2009
Posted by ravelus in Informática.add a comment
Regression Test
En esta ocasión, el problema a plantear es cómo conocer si el código en un momento determinado durante el desarrollo no habrá empeorado desde los últimos cambios mientras se realizaban otras tareas. La solución pasa por utilizar otros test complementarios a los Smoke Test que tengan otras características diferentes. ¿Cómo son estas pruebas a realizar? ¿Qué politica seguir para su utilización?
Un problema que surge una vez podría darse más veces. Esto es lo que llamamos regresión. Con esta premisa construiremos unos test que tratarán de asegurar estabilidad en el desarrollo: antes de cada release, antes de un cambio particularmente arriesgado, realizaremos unas pruebas que nos permitan tener un cierto nivel de seguridad de que no hemos desandado parte del camino. Estos test se generarán a partir de cambios que ocurrieron en el pasado: hitos, funcionalidades especiales, etc. Se trata de unos test de caja negra que pueden no identificar qué es lo que falla, con lo cual necesitaremos apoyarnos en otros tipos de test, como por ejemplo los unitarios. Son de grano grueso porque prueban funcionalidades completas, comprueban la integración entre diferentes partes, etc.
Los casos que componen estos test pueden ser antiguos fallos detectados por estos mismos test, fallos informados por clientes, fallos detectados por otros tipos de pruebas… Al final habrá un gran número de casos, que nos ayudarán a comprobar que el sistema avanza. Si el sistemas no pasa las pruebas habrá ocurrido una regresión. Nunca se eliminan casos de prueba de este tipo, porque los errores pueden volver. Debido a su tamaño, estos test podrían ejecutarse por la noche, que suele ser cuando menos carga de trabajo se da. Si es posible ejecutarlos en cada operación de protección o check-in (lo cual es complicado debido al tamaño que van adquiriendo estos test) podremos ver exactamente el punto en el cual el sistema retrocede.
Private Versions
¿Cómo evaluar un cambio complejo, beneficiándose del control de versiones, sin hacer ese cambio público? Pongámonos en el caso de querer probar un cambio localmente, sin correr el riesgo de romper el sistema global. Para ello, podemos establecer checkpoints en ciertos períodos del camino de tal cambio. Recordar que cuando se sube un cambio al control de versiones, el resto de ítems asimila tal cambio al actualizar sus propias revisiones para formar nuevas versiones. Por tanto, es necesario proveer un mecanismo para hacer checkpoints de cambios con la granularidad adecuada que el desarrollador estime conveniente. Esto podría proveerlo un área local de control de revisiones. Sólo los cambios estables van a parar al control de versiones público. Este sistema debería proveer también de un modo de integración para esos cambios inestables con el estado actual del proyecto. El funcionamiento de este área local funcionará como el control de versiones: una vez estabilizados los cambios, éstos se integran en la línea principal del proyecto siguiendo las políticas adecuadas.
Puede utilizarse, para esto, un repositorio local, una rama privada para el desarrollador en cuestión, etc. Algunas herramientas software de gestión de configuraciones proveen mecanismos para esto mediante, por ejemplo, sistemas de permisos del estilo de ACLs (Access Control List o listas de control de acceso, que vigilan el acceso a determinado elementos de un todo; en este caso, artefactos generados en un proyecto y gestionados por el control de versiones). Lo importante es que el programador pueda trabajar cómodamente subiendo los cambios cuando él considere apropiado, sin entorpecer el trabajo de los demás.
Release Line
¿Cómo realizar el mantenimiento de versiones publicadas (releases) sin interferir con el trabajo propiamente de desarrollo? Debería aislarse lo uno de lo otro. Una versión de producción o release evoluciona de forma totalmente diferente a una de desarrollo, ya que necesita mejoras y mantenimiento. Los problemas surgen cuando se detecta un problema en la versión de desarrollo que hay que actualizar urgentemente en la versión de producción: las operaciones de fusión (merge) son complejas.
Para evitar estas situaciones, es recomendable mantener cada versión de release en una línea de producción diferente. Esto permite que tal línea avance a medida que se solucionan errores. Para ello, se podría crear una rama (o repositorio) para cada versión de producción. Posteriormente se actualizarán las mejoras y repararciones realizadas en la rama o repositorio de cada release de forma periódica, mediante una operación de merge. La línea de desarrollo (línea principal) será la guía, la cual recibirá los resultados de los merge fruto de las mejoras realizadas release a release.
———————————————————-
Referencias:
Steven Berczuk, Brad Appleton: “Software Configuration Management Patterns, Effective Teamwork, Practical Integration“


