¿Qué es la »arquitectura» de software?
1. ¿Qué es?
La arquitectura de software es la estructura fundamental de un sistema de software. Es como el plano de un edificio, pero para programas de computadora. Define cómo se organizan los diferentes componentes de un sistema, cómo interactúan entre sí y qué patrones de diseño se utilizan.
¿Por qué es importante?
- Organización: Ayuda a organizar el código de manera lógica y manejable.
- Escalabilidad: Permite que el software crezca y se adapte a nuevas necesidades.
- Mantenibilidad: Facilita la actualización y reparación del software.
- Rendimiento: Una buena arquitectura puede mejorar la velocidad y eficiencia del programa.
- Colaboración: Permite que varios desarrolladores trabajen juntos de manera efectiva.
Componentes básicos de la arquitectura de software
- Módulos o Componentes: Partes independientes del software que realizan funciones específicas.
- Interfaces: Definen cómo los diferentes módulos se comunican entre sí.
- Datos: Cómo se almacena y fluye la información dentro del sistema.
- Comportamiento: Describe cómo el sistema responde a diferentes entradas o eventos.
Estilos comunes de arquitectura de software
- Arquitectura en Capas: Organiza el software en capas con responsabilidades específicas (por ejemplo, capa de presentación, lógica de negocio, acceso a datos).
- Cliente-Servidor: Divide la aplicación entre un cliente (que solicita servicios) y un servidor (que proporciona servicios).
- Microservicios: Divide la aplicación en servicios pequeños e independientes que se comunican entre sí.
- Monolítica: Toda la aplicación está en un solo bloque de código, lo que es simple pero puede ser difícil de escalar.
Consejos
- Empezar simple: No se necesita una arquitectura compleja para proyectos pequeños y hay muchos servicios o tecnologías que integran varios componentes de cualquier arquitectura y así no preocuparse de todos los aspectos.
- Aprender patrones de diseño: Estudiar soluciones comunes a problemas recurrentes en el diseño de software.
- Practicar la modularidad: Intentar dividir tu código en funciones y clases con responsabilidades claras.
- Pensar en el futuro: Considerar cómo podría crecer tu aplicación con el tiempo.
- Leer código de otros o estudiar casos de otras aplicaciones: Examinar proyectos de código abierto o mi favorita: mirar o atender conferencias donde los desarrolladores hablan sobre sus retos y decisiones, para ver cómo están estructuradas sus aplicaciones (y el pensamiento detrás de esas estructuras).
2. Algunos ejemplos:
La arquitectura de software varía enormemente. Exploraremos algunos ejemplos reales de arquitecturas utilizadas por softwares famosos, lo que nos dará una idea de cómo las grandes empresas tecnológicas estructuran sus aplicaciones.
Empresa | Tipo de Arquitectura | Componentes Clave | Beneficios |
---|---|---|---|
Netflix | Microservicios | • Cientos de microservicios independientes • Netflix Eureka (descubrimiento de servicios) • Hystrix (tolerancia a fallos) • Zuul (enrutamiento de API) | • Alta escalabilidad • Despliegues rápidos e independientes • Resistencia a fallos |
Google Search | Distribuida Masivamente Paralela | • Crawlers distribuidos • MapReduce (procesamiento de datos) • BigTable (almacenamiento distribuido) • PageRank (algoritmo de clasificación) | • Procesamiento de petabytes de datos • Búsquedas extremadamente rápidas • Alta disponibilidad y tolerancia a fallos |
Grafos a Gran Escala | • TAO (almacenamiento de grafos sociales) • Cassandra (almacenamiento distribuido) • Presto (consultas SQL distribuidas) • React (frontend) | • Manejo eficiente de relaciones complejas • Escalabilidad masiva • Rendimiento optimizado para operaciones sociales | |
Spotify | Basada en Squads | • Equipos autónomos (squads) • Uso extensivo de microservicios • Google Cloud Platform • Desarrollo basado en características | • Autonomía de los equipos • Innovación rápida • Escalabilidad técnica y organizativa |
Uber | Microservicios con Enfoque en Tiempo Real | • Sistema de despacho en tiempo real • Kafka (procesamiento de streams) • Cassandra y MySQL (almacenamiento) • Servicios de geolocalización | • Procesamiento de datos en tiempo real • Alta escalabilidad para picos de demanda • Flexibilidad para operar en diferentes ubicaciones |
Estos ejemplos ilustran cómo las empresas adaptan sus arquitecturas a necesidades específicas, equilibrando factores como escalabilidad, rendimiento, mantenibilidad y velocidad de desarrollo. Cada arquitectura tiene sus propias ventajas y desafíos, y evoluciona constantemente para satisfacer las demandas cambiantes. No hay que sentirse abrumado tampoco por la terminologia o tecnologías, cada una de ellas requiere estudio para adquirir experticia.
3. Un ejemplo personal: Aplicación de Análisis de Ventas con Python y Streamlit
Este ejemplo es muy lejano a las necesidades de grandes empresas como Netflix con billones de visitas. El proyecto que presentaré a continuación es el trabajo de un solo desarrollador (el mío) para una empresa a la que se le construye un pequeño software de análisis de datos de ventas. Sin embargo lo presento para que queden más claras las nociones de arquitectura de software.
En este caso hay muchas no-necesidades (que aligeran las decisiones de arquitectura):
- El software será usado por solamente los administradores de la empresa (pocos usuarios).
- No necesita base de datos (ni se conecta con bases de datos externas), por razones de confidencialidad y trabaja en vez de ello con tablas csv, txt, entre otras sobre las que hace los análisis.
- La alimentación de información para dichos análisis tiene un periodo semanal como el más frecuente, es decir no necesita un flujo de información rápido como otros en el otro extremo del panorama que incluso son a tiempo real como juegos másivos en línea, Uber, etc.
- Pocos desarrolladores trabajando simultaneamente en la aplicación y así un despliege sencillo.
La tecnología actual permite «outsource» (delegar) gran parte de las preocupaciones de la arquitectura, y eso mismo se ha hecho para que los recursos y conocimientos del equipo de desarrollo de la empresa sean mejor aprovechados.
Se podría llamar a la arquitectura elegida:
Arquitectura Monolítica Ligera con Despliegue en la Nube para una aplicación web de análisis de datos a pequeña escala.
Componentes Clave
Componente | Tecnología | Función | Características |
---|---|---|---|
Presentación y Lógica de Negocio | Python con Streamlit | UI y procesamiento de datos | – Streamlit como framework web y UI – Lógica de negocio integrada |
Almacenamiento de Datos | Sistema de archivos local | Almacenamiento de datos de ventas | – Actualización manual semanal – Tablas CSV, TXT, exportaciones locales a XLSX. |
Infraestructura y Despliegue | Proveedor de nube (empresas como DigitalOcean/Linode/Vultr) | Hosting de la aplicación | – Servidor virtual único (VPS) – Nginx para servidor web |
Análisis de la Arquitectura
Aspecto | Descripción |
---|---|
Tipo | Monolítica Ligera: UI, lógica y acceso a datos en un solo paquete |
Escalabilidad | Adecuada para uso actual (<10 usuarios), limitada para crecimiento significativo |
Mantenibilidad | Fácil debido a su simplicidad y uso único de Python |
Rendimiento | Suficiente para cargas pequeñas y actualizaciones semanales |
Seguridad | Acceso limitado reduce riesgos |
Costo-eficiencia | Económica para necesidades a pequeña escala |
Flexibilidad | Fácil de modificar, pero con limitaciones para cambios mayores |
Consideraciones futuras
Aspecto | Recomendación |
---|---|
Escalabilidad | Considerar arquitectura más robusta si crece significativamente |
Base de Datos | Implementar BD estructurada para mejor manejo a largo plazo |
Seguridad | Implementar medidas adicionales si los datos son sensibles |
Respaldo y Recuperación | Establecer procesos de respaldo regulares |
Esta arquitectura demuestra cómo una solución simple y bien implementada puede satisfacer eficazmente las necesidades de un proyecto específico sin sobreingeniería.
Sin embargo, tener en cuenta que es solamente un ejemplo de las innumerables formas de estructurar una arquitectura.