domingo, octubre 19, 2008

TDD desde una perspectiva arquitectural

La semana pasada di una conferencia por teléfono para todos los arquitectos que trabajan para proyectos internos de IBM y que con planes de utilizar metodologías ágile y/o ya están utilizando. Fue una linda y desafiante experiencia debido a que había gente de muchas partes del mundo (USA, Francia, India, Sudamerica, etc), nunca había dado una charla técnica en inglés (sacando las presentaciones de arquitectura de la aplicación) y yo pongo un 4, creo que aprobé, pero tengo mucho que mejorar. Independientemente de esto, creo que lo más interesante que quiero comentar en el post es sobre las influencias que tiene TDD en lo arquitectural, esto es el resultado a una pequeña investigación que vengo haciendo para APIT sobre Arquitecturas y Metodologías Agiles. El contenido básicamente fue el siguiente.

Facts acerca de TDD
  • TDD se compone de, Unit Test, Test Automation, Test First y Enfoque iterativo con refactoring
  • TDD es una técnica de diseño y es utilizada por Desarrolladores (Código).
  • TDD incrementa la calidad en el código facilitando el cambio en el software
  • TDD reduce defectos y permite tener un testeo de regresion constante
  • El manejo de dependencias es la parte más dificil de TDD
Requerimientos no funcionales impactados por TDD
Como siempre digo, las decisiones arquitecturales habilitan los atributos de calidad, pero obviamente no siempre los garantizan, hay otros aspectos y decisiones que entran en juego y el arquitecto no siempre puede manejar. Pero inevitablemente, la Arquitectura es la principal responsable de garantizarlos, y como arquitectos debemos buscar las formas, y TDD es una de ellas, con lo cual considero que TDD permite lograr los siguientes atributos de calidad:
Maintainability: Siguiendo las guías de Feathers, primero haciendo fallar el test case y luego corregirlo, la mantenibilidad se vuelve un detalle, lo mismo pasa con lo simple que queda el código y con la no necesidad de perder tiempo en un debugger. No nos olvidemos del regression test aca.
Extensibility / Modifiability: Esto es básico, como excelente técnica de diseño, al tiempo de aplicarla la productividad aumenta y el código queda mucho mas simple.
Reliability: Tiene que ver con la robustez en lo que respecta a las reestructuraciones o cambios en la arquitectura, un codigo que se construyo utilizando TDD, difícilmente sea complicado de modificar a cambios inesperados
Geographic (including Localization): TDD es una excelente técnica de comunicación, para equipos distribuidos es fundamental, tener bien claro y definido cual es el comportamiento esperado, no se paga con mastercard
Time: Ya hablé de la Productividad que trae aparejada el Test First, aca hay un paper que habla de los estudios que aumenta la productividad, hasta que lo leí fue solo un feeling mio y personal, ahora se ve que está probado.

Decisiones Arquitectónicas para Soportar TDD
Ahora, como (re) diseñamos nuestra arquitectura para soportar el uso de TDD, bueno, lo encaré desde el punto de vista de "Tácticas y Principios de Diseño" y "Estilos Arquitectónicos y Diseño Estratégico":
Tácticas y Principios de Diseño
  • Separation of Concerns.
    Una correcta separación de módulos, permite un mejor manejo de la complejidad y también permite el reuso del lado de los Test Cases (que no es poco)
  • Separación de la interface de la implementación.
    Hace falta explicar esto? Bueno, principalmente es para el manejo de dependencias y el trabajo en paralelo

  • Design by Contract
    Dos técnicas complementarias en el bajo nivel, desde un punto de vista arquitectural, definir los pre/post conditions entre módulos es básico
  • Informacion hiding
    Previene cambios no deseados
  • Prevent Ripple Effects
    Con 8 tipos de dependencias entre módulos, nos ayuda a no tener dependencias ocultas entre módulos, esto es muy importante, muchas veces hay modulos que dependen en variables de contexto y está oculta, TDD ayuda a evitarlo.
Estilos Arquitectónicos y Diseño Estratégico
Mas allá de cosas específicas, hay estilos arquitectónicos que ayudan muchísimo al uso de TDD en aplicaciones empresariales, estos son algunos:
  • Inversion of Control/Dependency Injection
    Aca no hay nada que discutir, por excelencia permite permite el uso de TDD, sumado a esto la separación de interface de la implementación.
  • Hierarchical Layers
    Estilo super conocido, con un modelo sencillo de dependencias, permite el coverage de una layer solo mockeando una layer inferior. Obviamente este patrón tiene cosas malas aparejadas, como la dificultad por encontrar las abstracciones y la modificabilidad.
  • Domain Driven Design
    Un estilo muy interesante para dominios complejos, se lleva muy bien con el Dependency Injections y la Iteratividad.
  • Transaction Scripts
    Modelo sencillo, en donde se puede lograr una completa de cada servicios a testear.
Acá estuve hablando como 30 minutos, es un poco difícil plasmarlo en un post, pero obviamente es la parte más interesante de la charla (al menos para mi)

Quejas de otros profesionales para implementar TDD y como solucionarla
No siempre es fácil convencer el uso del TDD, hay muchas quejas que hay que afrontar, aca puse las que fui recolectando, en algún otro post voy a poner lo que dije verbalmente, así que por ahora se lo dejo a uds para que piensen :)
Project Managers
  • Toma mucho tiempo para escribir test y termina impactando en la productividad.
  • Me siento mal por dejar afuera del proyecto a Testers y gente de QA
Architects
  • No me importa TDD, es una técnica de bajo nivel para programadores
  • No es necesario to test drive el código, la arquitectura cubre todas las posibilidades
Application Developers
  • Toma mucho tiempo en correr los test cases
  • No es mi trabajo testear mi código
  • Pero compila!
  • A mi me pagan por escribir código, no para escribir tests
  • Las dependencias son difíciles de manejar y toman mucho tiempo
Esto es todo, espero que les guste y espero feedback! realmente quiero escribir un paper con esto

jueves, octubre 02, 2008

Visión Visión Visión

Y si, según mechi cada 3 palabras que digo, menciono la palabra "visión"4 veces, al igual que "abstracción" o sus derivadas. En fin, son dos palabras que me sientan muy bien y creo que son básicas en los dos laburos que más me gusta hacer, "Liderar" y "Arquitecturar".
Hace un tiempo en IBM, vengo cumpliendo un nuevo rol de liderazgo desde un aspecto técnico como líder de la práctica Web (Java, .NET, Notes, etc) con implicancias en todos los proyectos que usen dichas tecnologías, y esta semana estoy teniendo una serie de reuniones con todos los profesionales, son como 80. Lo que quiero compartir en este Blog es la visión que tengo sobre la organización que quiero armar. Está claro que se aceptan críticas, insultos, etc...
  • Quiero convertir a Argentina en un Centro de Excelencia para IBM de todo el mundo en lo que el desarrollo Web respecta. Le explico el contexto, IBM tiene 8 centros de desarrollo globales, uno de ellos es Argentina, y un poco la idea es de que cada uno se especialice en una o más plataformas como para que cualquier IBM mundial (USA, España, Francia, etc) pueda requerir servicios de desarrollo de software y poder particionar de acuerdo a la especialidad. Con lo cual si Argentina se especializa en Web, cualquier proyecto que IBM (en todo el mundo) venda a sus clientes, Argentina sería el principal referente, esto posibilidad tener una estructura paralela de investigación, innovación y generación de conocimientos financiada por IBM Mundial que podría ser más que interesaante. Osea un area de investigación para la generación de metodologías, frameworks, componentes, buenas prácticas, etc que permitirían diferenciarse en calidad y en productividad. Está claro que Argentina está muy bien parado en cuando a skills en RIA (JS/AJAX o FLEX) creo que por ahi debería venir la mano.
  • Quiero formar una "Organización que Aprende", obviamente focalizándome en los profesionales que la componen. No quiero hacer un post sobre esto, pero realmente estoy muy alineado con la idea de Peter Sengue, y sus 5 disciplinas. Sobre todo en el desarrollo de software que es una actividad que depende 80&% en la gente y 20 en vaya a saber quien. No concibo pensar en una organización con gente que realice tareas automáticas, prefiero tener menos personas y más programas. La capacidad y los procesos de selección de personal son claves, y realmente no importa el volumen sino la calidad de los profesionales.
  • Quiero fomentar el Ease @ Work. La idea es buscar un ambiente confortable de trabajo para generar los resultados deseados. No quiero perjuicios, quiero que los profesionales se sientan libres de hablar, sin perjuicios, sin pensar en el "que diran" cuando expresamos nuestras ideas. Es fundamental intentar concebir un ambiente de trabajo que fomente la creatividad, soy un apasionado de eso, cuando uno se siente confortable, sabiendo que solo se tiene que preocupar de su trabajo y los objetivos del equipo las posibilidades de fracasos son mínimas, como así tambien la capacidad de innovar es infita. Este es un concepto que vengo ideando y fue llevado a la practiva por Kent Beck, please google it.
  • Sigo insistiendo, el diferenciador de Argentina es la Calidad, y no el Costo. No podemos depender en la economía con picos tan bajos cada 10 años. Lamentablemente es asi, el costo es una variable ajena al software y la tenemos que dejar fluctuar, nunca depender del costo. Tenemos que focalizarnos en vender soluciones/servicios que dependan totalmente en la calidad, y que generen un valor agregado al negocio. Si logramos brindar servicios con calidad, vamos a ser siempre una potencia en el desarrollo de software, pero si solo pensamos en la paridad cambiaria, es muy "cortoplacista", hay que entender que por más que pensemos en el cambio, la inflación termina impactando tambien.
  • Y por último, el 5to item de visión que tengo para mi organización es en la innovación constante. La innovación a esta altura no se discute, obviamente esto es un cambio de mentalidad y dejar de pensar un poco en el corto plazo, pero esta claro que los proyectos son finitos y siempre se piensa a corto plazo, y es por eso que quiero pensar en formas de fomentar la innovación y que eso sirva como retroalimentación a los proyectos.
En fin, esa es la visión que quiero para la organización que estoy liderando... todavía estoy en proceso de comunicación y delineamiento de como llegar a cumplirla, pero estoy seguro que voy a ser muy feliz cuando lo haga y muchas personas van a verse beneficiadas.