Arquitectura

¿Qué es un arquitecto de software?

Para mí, un arquitecto de software es un gran apasionado y entusista por crear y diseñar software de calidad que lleva muchos años desarrollando aplicaciones, componentes y servicios y cuyo lema principal es que la creación de aplicaciones empresariales es un arte y una ciencia a la vez.

Además, un arquitecto de software debe tener una serie de habilidades personales y técnicas para ser un lider y colaborador con el equipo de desarrollo, tomar decisiones de diseño, modular los sistemas de información, dominar lenguajes DSL, bases de datos, redes, comunicaciones, tecnologias, programación y por supuesto ser un buen comunicador y negociador con clientes, managers y equipos de operaciones.

Como recordatorio, una frase que siempre tengo presente cuando se habla de decisiones sobre arquitetura de aplicaciones y que sin duda la experimentamos en nuestro dia a dia: “Disagreeing on architectural decisions is a normal and healthy part of software development.”

Introducción

La arquitectura de software tiene muchas facetas que abarcan desde el análisis, diseño, desarrollo, documentación hasta la implementación y puesta en marcha del sistema de información sin olvidar todo lo demás, como las estructuras del software, testing, escalabilidad, disponiblidad, seguridad, rendimiento, etc. para lograr satisfacer las necesidades del cliente en el tiempo y entregar valor al negocio.

Una buena arquitectura y un buen diseño debe identificar y especificar los requisitos que afectan a la estructura de la aplicación de forma clara y debe ser lo suficientemente flexible para manejar la deriva natural que se producirá con el tiempo en hardware y software, así como posibles cambios de escenarios y futuras necesidades de los usuarios.

A la hora de pensar una arquitectura, influyen muchos factores y nunca debemos perder de vista estos que son fundamentales:

  • Application Architecture (clases, componentes, modulos, relaciones, etc)
  • System Architecture (n-tiers, servers, subsistemas, servicios, DBs, etc)
  • Software Architecture (para mi la combinacion de 2 anteriores)
  • Enterprise Architecture (estrategias empresariales que debemos cumplir)
  • Cross-Cutting (audit, logs, excep, integration, security, etc.)
  • Quality Assurance (garantizar calidad de todo el sistema información, R-E-D)

La meta de toda arquitectura, entre otros aspectos, es ofrecer servicios al negocio, a otras aplicaciones de la organizacion y proveedores externos. El objetivo final es construir nuestra API de servicios de negocio lo más robusta y sencilla de consumir.

Cuando pensamos en la arquitectura, hay que diferenciar entre Object Oriented Programming, Network Programming y tener en cuenta Fallacies of distributed computing (Wikipedia) sobretodo hoy en dia, donde cada vez más usuarios usan dispositivios móviles para conectarse y consumir información de nuestro backend.

  1. The network is reliable.
  2. Latency is zero.
  3. Bandwidth is infinite.
  4. The network is secure.
  5. Topology doesn’t change.
  6. There is one administrator.
  7. Transport cost is zero.
  8. The network is homogeneous.

Por último, siempre tengo presente este articulo, muy recomendable, para valorar los efectos negativos de una mala arquitectura o la ausencia de un arquitecto en los proyectos: Arquitectura de software y mal diseño = perdida de dinero

Funciones de un arquitecto de software

Las tareas más comunes donde un arquitecto participa se pueden englobar “a groso modo” en las fases de los proyectos de software que todos conocemos.

  • Inicio: definición y alcance del proyecto
  • Analisis: analisis funcional y requerimientos
  • Diseño: diseños preliminares, prototipos, detalladado, especificaciones
  • Codificación: programación y debug
  • Validación: realizar tests y pruebas del sistema
  • Instalación: puesta en marcha del sistema.
  • Explotación: seguimiento y diagnósticos del sistema en producción

A parte realiza muchas otras funciones en su día a día:

Arquitectura: Definición de arquitectura de las aplicaciones, diagramas, vista física, vista lógica, patrones y principios de arquitectura, etc.

Selección de Software: Pilas de aplicaciones, bases de datos, librerías, frameworks, estándares tecnológicos, etc.

Selección de Infraestructura: Sistemas Operativos, hardware, redes, failover, sistemas de recuperación, etc.

Requisitos no Funcionales: Rendimiento, escalabilidad, seguridad, etc.

Liderazgo Técnico: responsabilidad y autoridad, dirección de equipos, etc.

Coaching y Mentoring: Ayuda sobre problemas técnicos, ofrecer alternativas, etc.

Metodología de Proyectos: Waterfall, Scrum, Iterativo, ITIL, ISTQB, RUP, XP…

Procesos de Desarrollo: Control de versiones, procesos de construcción, integración continua, automatización de pruebas y otras herramientas de desarrollo.

Prácticas y Estándares: Guías y estándares de codificación, libros blancos, selección de herramientas, codigos éticos, buenas prácticas, etc.

Diseño, Desarrollo y Pruebas: Diagramas UML, codificación, pruebas unitarias, etc.

Experiencia: Conocimiento sobre tecnologías y estar al día en cuanto a tendencias en arquitecturas, nuevos retos tecnológicos, transformación digital, cloud, contenedores, etc.

¿Qué es una aplicación empresarial?

Uno de los objetivos más importantes de la arquitectura es diseñar y construir aplicaciones empresariales, basicamente, una aplicación empresarial es aquella destinada a resolver las necesidades internas de una empresa u organización, vamos a ver que significa este término, según la wikipedia:

Por software empresarial se entiende generalmente cualquier tipo de software que está orientado a ayudar a una empresa o a una organización a mejorar su productividad y/o a medirla.

El término engloba una amplia variedad de aplicaciones informáticas que incluyen desde programas de contabilidad y de ofimática, hasta sistemas de planificación de recursos empresariales (ERP), pasando por programas de gestión de clientes (CRM) y de recursos humanos, así como programas de cadena de suministros (SCM), etc.

Pero como vemos, sigue siendo una definición poco detallada, creo que la mejor definición la encontramos en palabras de Martin Fowler, cuando dice:

A grandes rasgos, una aplicación empresarial debe cumplir estas características:

  • Tener una interfaz de pantallas con las que el usuario final puede interactuar
  • Adaptada a los procesos y reglas de negocio de la empresa
  • Acceder a la información de forma concurrente
  • Manejar sistema de persistencia de datos
  • Control de acceso al sistema: usuarios y roles
  • Control de acceso a la información: quien puede crear, modificar o ver datos
  • Permitir mostrar y manipular los datos en diferentes modos
  • Posibilidad de integración con otras aplicaciones empresariales
  • A veces, deben procesar gran cantidad de datos en lotes (batch processing)
En resumen, todos sabemos lo que son y las conocemos como aplicaciones de seguros, facturación, contabilidad, tiendas online, CRM, ERP,etc.

Microsoft Architecture Overview

Como guía de consulta, aunque sea del año 2002, es totalmente válida para enteder todos los aspectos que abarcan una arquitectura y siempre recomiendo tenerla a mano para consultar información sobre:

Atributos Transversales (cross-cutting)

Principales beneficios de una arquitectura

Adaptabilidad: Añadir características técnicas al sistema o nuevas de reglas de negocio son más fáciles de lograr, ya que una arquitectura de software debe tener una clara separación de responsabilidades entre sus componentes y módulos.

Agnóstica:  Estar por encima de las modas o tendencias de la industria y no depender de tecnologías concretas para aplicar cambios en el futuro en caso de ser necesario.

Mantenibilidad: Es más fácil mantener el software existente, ya que la estructura del código es visible y conocido, por lo que es más fácil de encontrar errores y anomalías.

Productividad: Agregar nuevas características al software existente debe ser fácil, ya que la estructura ya está definida y la ubicación de todas las piezas del sistema se conoce de antemano.

Testing y diferentes “logicas” en nuestras aplicaciones

Normalmente, cuando hablamos de testing y que lógica vamos a probar en nuestras aplicaciones lo relacionamos siempre con “Logica de Negocio” cuando en realidad, en nuestras aplicaciones escribimos muchos tipos de lógica diferentes, es muy importante a la hora de valorar el testing, definir el equipo de testers, el esfuerzo en diseñar todas las pruebas,  el tiempo y coste de las mismas porque impactará directamente en el proyecto.

  • Lógica de Negocio
  • Lógica de Presentación
  • Lógica de Interacción de usuario
  • Lógica de Transformación de datos
  • Lógica de Database (Stored, Functions, etc.)
  • Lógica de Integración entre sistemas/componentes
  • Ejemplo: app. web (no funciona igual en todos los navegadores)
  • Ejemplo: app. móvil android5 (ok),  android6 (no funciona – temas de permisos)

Nota: Es un concepto clave para tenerlo en cuenta en futuras aplicaciones hasta donde queremos llegar con nuestras pruebas, por ello, siempre recomiendo crear un documento de Plan de Pruebas para acordar con el cliente hasta donde llegar, porque como dice ISTQB, es imposible probarlo todo.

Aplicaciones Ejemplos

Aqui dejo una lista de aplicaciones publicadas por Microsoft para analizar y estudiar como estan diseñadas y construidas:

1. Visitors application
2. Expenses application
3. Staff application
4. Travel application
5. Vacation application
6. Face recognition app

Project MyCompany Suite: http://aka.ms/mycompanyapps

eShopOnContainers – Docker & Microservices

En esta aplicación de ejemplo para Visual Studio 2017 podemos consultar y probar una aplicacion diseñada con .NET Core usando microservicios y contenedores para tener una visión de como se puede implementar este tipo de soluciones usando tecnologias de Microsoft y Azure.

app-eshop-containers

Project eShop: https://github.com/dotnet-architecture/eShopOnContainers

 

Bueno, espero que este articulo sea de utilidad y ayude a entender un poco más a la gente el concepto de Arquitecto de Software y sus funciones como figura clave para el éxito en el desarrollo de las aplicaciones empresariales.

Anuncios
A %d blogueros les gusta esto: