Archivo del Autor: Liarjo

Avatar de Desconocido

Acerca de Liarjo

....

Arquitectura de Software, ¿Qué estamos discutiendo?

Cuando escribí el post sobre “Arquitectos que andan a 10.000 metros”, lo hice para promocionar una conferencia para Developer que bajaba la propuesta de arquitectura en capas a directivas de diseño para Developer.

 

Diegum, ex arquitecto de Microsoft Chile lo tomó muy en serio y escribió un POST de comentario sobre el mío. No era mi intención pero creo que esto está siendo muy positivo porque genera dialogo sobre el verdadero rol de un arquitecto de software.

 

Primero,  creo que el concepto de arquitecto de software está sobre utilizado. Es algo similar al titulo de ingeniero, en Chile existe ingeniería en Marketing o ingeniería comercial, por ejemplo.

 

Coincido con diegum en su definición de Arquitecto cómo “El arquitecto de software es un administrador de la complejidad, lidia con ella todo el tiempo”. Ahora, en clases de arquitectura de software, en la universidad es posible encontrar cursos de cualquier cosa, me dijo mi profesor que la arquitectura de software “habla del software que se va ha hacer” y que el diseño “baja como esa arquitectura se implementa”.

 

Ahora, revisando la lista de tareas que nos propone diegum para los arquitectos de software tenemos:

 

  • Descomponer la aplicación en capas, al menos, lógicas
  • Descomponer cada capa lógica en componentes
  • Seleccionar tecnologías y/o frameworks de implementación
  • Realizar una Prueba de Concepto (Proof of Concept o PoC) de la arquitectura
  • Brindar algunos casos de uso de referencia

 

Si un Arquitecto de software hace eso, me sentiría muy contento. Ahora creo que esa felicidad sería máxima si agregamos lo siguiente:

 

En “descomposición lógica en componentes” apoyaran a los diseñadores dando directivas claras de cómo bajar la arquitectura del sistema a un diseño de software codificable por Developer.

 

Ocurre que muchas veces no existen diseñadores de software, por lo que nadie hace este trabajo. Esa es mi principal observación a los arquitectos  de "coloquios de café".

 

Yo no creo que sea importante para un Arquitecto de Software saber programar en la tecnología que se use en estos momentos, si es impórtate que tenga experiencia y habilidades de comunicación que le permitan hacer un “puente de plata” entre el negocio, Driver de toda empresa, y el equipo de desarrollo.

 

 

PD:

Como siempre, saber programar y gustarme mucho hacerlo, me trae problemas 😉

Santiago Rock & Batuta

Presentan….

Santiago Rock Fest, Tributo al Rock, Este Viernes 12 de Mayo, realizaremos en  Batuta,  una nueva fiesta SANTIAGO ROCK. En esta ocasión presentamos un clásico: ARKHAM VS SWEET ROSE    METALLICA VS GUNS & ROSES.

La entrada tiene un valor de $5.000 y se pueden comprar en forma anticipada a través del sistema Ticketmaster o el mismo día en la puerta del local.

Jorge Washington 52, Pza. Ñuñoa, 23:00 Hrs.

Fundamental: Desarrollo en Capas

La semana pasada, junto con David, dimos una conferencia técnica de un tema que no es de visión sino fundamental. Repasamos los conceptos necesarios en el desarrollo de aplicaciones en capas.

 

Nuestra apuesta es que todo el mundo habla en alto nivel de este tema pero que no existe un real entendimiento entre los Developer. Esto no por falta de interés o capacidades sino porque los Arquitectos de Software cercanos tienen facilidad para hacerse entender con los Stakeholder pero muy poca práctica en bajar en diseños concretos sus ideas hacia los Developer.

 

En esta conferencia mostramos una herramienta muy buena para generar código llamada CODESMITH (http://www.codesmithtools.com/ ). En particular el Script http://www.nettiers.com/  para generar un modelo ORM a partir de una base de datos.

 

 

Algunos de los links recomendados en la conferencia son los siguientes:

 

·         Arquitectura de aplicaciones de .NET: Diseño de aplicaciones y servicios

http://www.microsoft.com/spanish/msdn/arquitectura/das/guias/AppArchCh1.asp

 

·         Designing Data Tier Components and Passing Data Through Tiers

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/BOAGag.asp

 

·         .NET Data Access Architecture Guide

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/daag.asp

 

·         3-tier architecture in C# By Rahman Mahmoodi
http://www.codeproject.com/csharp/three_tier_architecture.asp

 

Enjoy

Santiago Rock

Santiago Rock  &  Batuta  Presentan….

Santiago Rock Fest, Tributo al Rock, Este Viernes 05 de Mayo, realizaremos en La Batuta,  una nueva fiesta SANTIAGO ROCK. En esta ocasión se presenta LEMON, Tributo a U2.

La entrada tiene un valor de $5.000 y se pueden comprar en forma anticipada a través del sistema Ticketmaster o el mismo día en la puerta del local.

Jorge Washington 52, Pza. Ñuñoa, 23:00 Hrs.

Referencias de Framework

El otro día me encontré con Alejandro Pacheco y me paso unos links que están muy buenos en los temas de Framework.

 

          [Rob96] Roberts D., Johnson R. (1996). Evolving Frameworks. Don Roberts Home Page. Tomado de http://st-ww.cs.uiuc.edu/~droberts/evolve.html en abril de 2006.

          [Yod97] Yooder J., Foote B. The Selfish Class. Conference on Patterns Languages of Programs. Monticello, Illinois, September 1996.  Tomado de http://www.joeyoder.com/papers/papers.html en Abril de 2006.

          [IBM97] IBM. Taligent. Building Object-Oriented Frameworks. LHCb Computing Home Page. Tomado de http://lhcb-comp.web.cern.ch/lhcb-comp/Components/postscript/buildingoo.pdf  en Abril del 2006

          [Chen04] Chen X. (2204) Developing Aplication Frameworks in .NET. APRESS 2004

          [Joh03] Johnson R. (2003). Expert One-on-One J2EE Design and Development. Wiley Publishing, Inc.

          [Rae06] Definición de Tecnología. http://www.rae.es

          [CMP06] Definición de API http://www.computer-dictionary-online.org

 

Desde una arquitectura muy conocida a una implementación caótica.

Todo el mundo habla de desarrollo en capas, los arquitectos de software en reuniones pomposas se llenan la boca con Acrónimos tales como SOA, Event Driven, AOP, OOP etc.

 

Los Developer escuchan esas conversaciones crípticas y piensan ufff que saben estos tipos, no soy digno de conversar con ellos.

 

Cuando terminan esas reuniones pomposas, los arquitectos se van para la casa y los Developer deben implementar todas esas maravillas,  muchas veces estos tipos de alta alcurnia computacional no bajan sus ideas cósmicas al nivel de la tierra, altura donde el software es construido y ejecutado.

 

Bajar de los 10.000 metros a tierra las arquitecturas, es el trabajo de la disciplina del diseño. Cómo implica trabajo, los arquitectos no lo hacen y muchas veces nadie lo hace y el Developer debe “asumir” esa responsabilidad.

 

Una de las principales falencias de la arquitectura en capas, es una guía clara de cómo manejar los datos de negocio entre esas capas. Por supuesto todos hablan de DALC, BLL, Entidades de negocio, CRUD, pero frecuentemente no se explica el escenario general y los criterios que se debe usar para las decisiones de diseño.

 

En este contexto aparecen preguntas como las siguientes:

 

  • ¿Cómo represento una entidad de negocio?
  • ¿Cómo represento una colección de entidades?
  • ¿Cómo represento la jerarquía?
  •  ¿Qué formato de datos usamos para acceder al DALC?
  • ¿Cómo me abstraigo de la capa de datos?
  • ¿Cuándo uso Store Procedure y cuándo no?

 

Estos temas son los en que la gente común, Developer y diseñadores, necesitan guías para hacer su trabajo del día a día. Por su lado los arquitectos pueden seguir en los 10.000 metros, repitiendo sus mantras y dibujando el futuro.

Próxima conferencia técnica.

Desarrollo basado en capas: lo que quieres saber del diseño y desarrollo de componentes de una aplicación dividida en capas.

 

Desde hace un tiempo todo el mundo habla de arquitectura en capas, esto es un patrón de programación en la que el objetivo primordial es la separación de las responsabilidades en diferentes capas para simplificar el entendimiento del sistema y su diseño; sin embargo, complica la implementación. Un ejemplo básico de esto es separar la capa de datos, negocio y de presentación al usuario. La ventaja principal de este patrón, es que el desarrollo de las capas puede ser hecho en paralelo y en caso de algún cambio sólo se modifica la capa en cuestión sin intervenir las otras.

Normalmente se explica sólo la importancia del aislamiento entre las capas y sus responsabilidades, pero ¿cómo hacerlo? Cuando se diseña una aplicación en capas es necesario definir cómo acceder y representar los datos de negocio de la aplicación. En esta conferencia mostraremos guías prácticas que ayudan a elegir la manera más apropiada de exponer, persistir y pasar los datos a través de las capas de la aplicación. Aclararemos la diferencia entre los datos de negocio y los procesos de negocio que los usan. Será una conferencia dónde se verán ejemplos prácticos y muchos casos del tipo “HOW TO”, basados en lecciones aprendidas en proyecto reales de desarrollo de software en Chile.

¿A que fui a Argentina?

Eso se preguntan varios, mi jefe entre ellos 😉

 

En esto andaba:

 

Encuentro Regional de MVPs

 

A comienzos de abril se realizó en Buenos Aires un encuentro de los MVPs del Cono Sur. Los Microsoft Most Valuable Professionals son personas reconocidas por su contribución a la comunidad, por dar charlas (en eventos MSDN o en universidades) o participar en foros respondiendo preguntas y compartiendo sus conocimientos. Una vez al año se reúnen representantes de todos los países para intercambiar entre ellos experiencias acerca de las comunidades de desarrolladores de cada país y así cada uno regresa con nuevas ideas y entusiasmo para seguir entregando más y mejor conocimiento. El título de MVPs es honorífico (no rentado) y refleja el esfuerzo anual por las contribuciones que realiza. Los MVPs suelen tener distintos niveles de intercambio con los grupos de producto de Microsoft y en más de una ocasión sus recomendaciones se transformaron en cambios concretos en las versiones siguientes.

¿Qué es el Testing de Software? Y ¿Por qué es esto tan difícil?

Todos los desarrolladores han sentido la frustración de recibir reportes de errores. ¿Por qué no descubrieron esos errores antes? ¿Qué paso con las pruebas unitarias y de integración? La respuesta a estas preguntas puede estar en  los siguientes aspectos:

 

  1. Los usuarios ejecutaron código que no fue probado.
  2. El orden de la secuencia de comandos ejecutados fue diferente a lo probado.
  3. El usuario ingreso una serie de datos no validados.
  4. El sistema está instalado en un ambiente donde no fue probado.

 

Plan de pruebas y Tester

 

Para crear un plan de pruebas efectivo se deben considerar múltiples aspectos relacionados con el sistema que se está probando. Por ejemplo funcionalidades, ingreso de de datos, ambiente de ejecución, etc.

 

Por eso, un Tester de profesional debe tener Skills en múltiples áreas para poder diseñar un plan de pruebas efectivo.

 

El proceso de pruebas, al igual que las fases de desarrollo de RUP, tiene 4 fases. Estas fases son:

 

  1. Modelar el ambiente del sistema.

La primera tarea del Tester es simular como el sistema se relaciona con su ambiente. Para esto se deben identificar todas las interfaces del sistema y los datos que pasan por las mismas.

 

Existen 4 tipos de interfaces en los sistemas:

 

·         Interfaces Humanas.

·         Interfaces de software (API)

·         Interfaces de Archivos (Datos)

·         Interfaces de comunicaciones (Redes y Device)

 

El siguiente paso que el Tester debe hacer es encontrar las acciones que el usuario puede realizar y que harían que el software deje de comportarse de manera consistente. Por ejemplo:

 

·         ¿Qué pasa si un cliente cambia los mismos registros que otro en el mismo tiempo? Esto es manejo de la concurrencia.

·         ¿Qué pasa si se baja el sistema en medio de una transacción?

·         ¿Qué pasa si dos sesiones del sistema acceden a la misma API?

·         Etc….

 

Dentro de las consideraciones que debe tener en mente un Tester se encuentran la forma en que se elogien los valores de las variables de entrada y la secuencia cómo ellas son ingresadas.

 

En la selección de las variables existe un método llamado BOUNDARY VALUE PARTITIONING. Básicamente es para buscar los valores esperados y las condiciones de borde de cada variable. Además de lo anterior se debe considerar la entrada concurrente de datos y la correcta aislamiento entre cada sesión que está manipulando los valores de las variables.

 

La segunda consideración tiene que ver con el orden en que se ingresan las variables. Tres técnicas son usadas para apoyar la definición del orden de ingreso de los datos. La más común es usar diagramas de estados (UML) para modelar el ingreso de datos y el estado en que el sistema debe quedar en cada movimiento.

 

Otra técnica es la que nos brindan las herramientas basadas en la teoría del lenguaje. Por ejemplo expresiones regulares y gramaticales. Un ejemplo de esto sería:

 

Filemenu.Open filename* (ClickOpen | ClickCancel)

 

Por último, las más desconocidas y complejas son las técnicas estocásticas y de algoritmos genéticos. Estos modelos combinan los valores a ingresar y su secuencia para producir palabras y oraciones Sintacticamente correctas.

 

  1. Elegir los escenarios de pruebas.

 

Muchos modelos de dominio y grupos de variables representan un infinito número de escenarios de pruebas, cada uno con sus costos y plazos de pruebas. Siendo realistas, en un proyecto de software los presupuestos son limitados por lo que debemos discriminar en que escenarios se probaran y cuales no.

 

¿Cuál es el criterio que se debe usar? Existen muchas respuestas para esta pregunta, siendo la más común entre los Tester el uso del criterio de Cobertura.  Este criterio dice que por lo menos una vez cada línea del código y las entradas del sistema han sido probadas. Esto es el criterio mínimo esperable para las pruebas de un sistema antes de ser entregado.

 

Si desarrollamos la idea de la cobertura del código, nos damos cuenta que esto es muy complejo porque además de considerar que todo el código haya sido ejecutado al menos una vez, caemos en el tema de las rutas de ejecución. Una ruta de ejecución es la secuencia en que las líneas de código son ejecutadas. Las rutas de ejecución para el mismo código pueden llegara a ser infinitas.

 

Para acotar estas infinitas posibilidades el Tester busca los escenarios más comunes de ejecución, lo típico que un usuario ejecutaría.

 

Existen tres criterios reconocidos para elegir las rutas de ejecución a ser probadas. El primer criterio es el que pone foco en la cobertura de las estructuras de control. La idea es que las pruebas hagan que la ruta de ejecución pase por todas las opciones que abren las estructuras de control. Por ejemplo IF, que en ambos casos se prueben.

 

El segundo criterio es DATAFLOW, esto es que todas las estructuras de datos sean iniciadas y usadas.

 

Por último, el criterio menos usado, en mi opinión, es FAULT SEEDING. La idea de está técnica es sembrar errores intencionalmente en el código los cuales son encontrados con los casos de pruebas, idealmente se encuentran también los errores originales.

 

Respecto a los criterios de selección de casos de pruebas para las entradas de datos son simplemente la cobertura de todas las entradas de datos del sistema y la técnica llamada DISCRIMINATION CRITERION, que consiste en probar aleatoriamente hasta llegar a cubrir las entradas posibles del sistema.

 

  1. Ejecutar y evaluar los escenarios de pruebas.

 

Después de tener definidos los escenarios de pruebas viene la labor de ejecutar lo que se definió. Hacer esto de manera manual es un trabajo arduo y puede generar nuevos errores.  Existen herramientas que ayudan al Tester a obtener información interna  del sistema para mejorar sus pruebas.

 

La evaluación del escenario de pruebas basado en las salidas del sistema no es fácil de automatizar. La evaluación pasa por el Tester que compara los valores esperados versus lo que realmente obtuvo. Para está sencilla tarea se asume que las especificaciones, valores esperados, son correctos. Actualmente esta evaluación es hecha por el Oráculo Humana, llamado Tester.

 

Dos aproximaciones para evaluar las pruebas

 

Existen dos opciones para ejecutar las pruebas:

 

·         Formalismo: poco usado en la práctica porque requiere especificaciones formales de buena calidad. En las especificaciones pueden haber errores, que serían traspasados al sistema.

 

·         Código embebido: Es software incrustado en el sistema que toma medidas de estados de objetos, valores de variables y datos internos. Esto ayuda al Tester porque entrega información desde el interior del sistema y no sólo de las salidas de pantalla.

 

Existen otro tipo de pruebas basadas en código embebido. Está segundo tipo de pruebas es mucho más sofisticado y son código de pruebas del código del sistema. Está técnica se llama SELF-TESTING PROGRAMS.

 

Pruebas de Regresión

 

En un equipo serio de desarrollo, una vez que el Tester ha reportado errores encontrados en el sistema, estos son asignados a los desarrolladores que correspondan para que los reparen. Los desarrolladores después de esto generan una nueva versión del sistema.

 

En ese momento se debe resolver la pregunta ¿Qué es lo que debo volver a probar? La respuesta a la pregunta no es trivial porque cada reparación de un error puede tener cuatro consecuencias posibles:

 

·         Sólo repara el problema reportado.

·         Falla en resolver el problema reportado.

·         Resuelve el problema, pero genera otras fallas.

·         No resuelve el problema y además genera otras fallas.

 

Lo razonable sería volver a probar todo para así hacerse cargo de todas las opciones que el FIX (código reparado) puede provocar. Esto es, cómo siempre, económicamente inviable para el proyecto de software.

 

Estas pruebas realizadas sucesivamente en cada versión del sistema se llaman pruebas de Regresión.

 

Además de tener que resolver que probar para validar el FIX, ocurre frecuentemente que en cada nueva versión del sistema se incorpora funcionalidades nuevas que deben ser probadas también. Muchas veces el Tester privilegia las pruebas sobre las nuevas funcionalidades en vez de hacer pruebas de regresión, esto es malo pero consistente con el criterio de cobertura expuesto en la fase de diseño de las pruebas.

 

  1. Medir el progreso de las pruebas.

 

Cuando uno juega el rol de Tester, el Project Manager siempre debe estarnos preguntando ¿Cómo vamos con las pruebas? No siempre tenemos una respuesta fundamentada para entregarle. Básicamente tenemos el número de veces que hemos probado, los casos, las fallas, etc. Es decir contamos eventos, pero esto no nos asegura que estemos avanzando hacia el objetivo del proyecto.

 

Para tener una idea del avance de las pruebas debemos preocuparnos de verificar la completitud estructural y funcional. Para poder comprobar los aspectos estructurales podemos formularnos las siguientes preguntas:

 

·         ¿Hemos probado los errores de programación comunes?

·         ¿Hemos ejercitado todo el código fuente?

·         ¿Hemos forzado todos los datos internos para que sean inicializados y usados?

·         ¿Hemos encontrado todos los errores sembrados?

 

Para la completitud estructural por su parte son:

 

·         ¿Hemos pasado a través de las formas en que el sistema puede fallar? ¿Hemos realizado todos los Test que lo validan?

·         ¿Hemos aplicado todas las entradas de datos?

·         ¿Hemos explorado todos los estados del sistema?

·         ¿Hemos ejecutado todos los escenarios que espero que el usuario use?

 

Estas preguntas ayudan a los Tester para poder estimar el número de fallas que quedan en el sistema por ser descubiertos y la probabilidad que estas ocurran en el ambiente productivo del sistema. Está es la medida cuantitativa que todos buscamos.