Joaquin Martinez

Depura tus errores y construye la mejor versión de ti, cada línea cuenta.

Más allá de la funcionalidad: Entendiendo los atributos de calidad del software

09-09-2024
Desarrollo de software
Fundamentos de arquitectura de software
Cover Post

Características No Funcionales: ¿Qué son y por qué son vitales para la arquitectura de software?

Las características no funcionales, comúnmente denominadas “características estructurales de calidad” o “arquitectónicas”, son atributos de calidad que un sistema de software debe poseer. Aunque no están directamente relacionadas con la funcionalidad del dominio, son esenciales para el correcto funcionamiento del sistema.

Su importancia es tal que su desarrollo a menudo requiere la adquisición de nuevos conocimientos. Es crucial entender que estas características interactúan entre sí. Por ejemplo, un alto nivel de seguridad puede entrar en conflicto con un requisito de mantenibilidad, como se mencionó en el post sobre Tradeoffs. El balance entre estas características es un análisis de equilibrio específico para cada proyecto, dependiendo del software a desarrollar y sus necesidades.

A continuación, se ejemplifican algunas de estas características clave:

  1. Disponibilidad
    • ¿Puedo acceder al sistema cuando lo necesito?
    • ¿Cuánto tiempo de inactividad tiene el sistema al año, mes o día?

    Como diseñadores, debemos determinar el nivel de disponibilidad requerido. Es importante considerar que aumentar la disponibilidad suele ser costoso. Se expresa comúnmente en porcentajes.

  2. Rendimiento
    • ¿Cuánto tiempo tarda el sistema en responder a una petición?
    • ¿Qué tan rápido es el sistema?
    • ¿Cuánto tiempo tarda en completar su tarea principal?

    El rendimiento define la eficiencia del sistema al procesar las peticiones de los usuarios. Un sistema rápido implica mayores costos. Nuestro rol como arquitectos de software es comunicar esta realidad al cliente y tomar la mejor decisión para el proyecto.

  3. Extensibilidad
    • ¿Es sencillo añadir nuevas funcionalidades?
    • ¿Se pueden crear nuevas funciones sin reescribir gran parte del código?

    Cuanto más extensible es un sistema, más complejo y costoso resulta su desarrollo en términos de recursos y habilidades técnicas.

  4. Escalabilidad
    • ¿Puede el sistema crecer para atender a más usuarios?
    • ¿Qué esfuerzo se requiere para gestionar más usuarios o datos simultáneamente?

    La escalabilidad es uno de los temas más discutidos en el mundo del desarrollo de software, especialmente en el ámbito de las startups. Es también una de las características más difíciles y costosas de implementar.

  5. Tolerancia a fallos
    • ¿Puede el sistema soportar fallos sin perder disponibilidad?
    • ¿Qué ocurre si el hardware falla?
    • ¿Qué pasa si se producen fallos intencionales?

    La tolerancia a fallos se logra mediante técnicas específicas y ayuda a que el sistema se mantenga disponible incluso ante errores. Está estrechamente relacionada con la disponibilidad.

  6. Consistencia
    • ¿La información es la misma al consultarla desde diferentes dispositivos o en distintos momentos?
  7. Confiabilidad
    • ¿Se puede verificar que la información que el sistema presenta es correcta y precisa?

    Este atributo puede considerarse un punto intermedio entre los requerimientos funcionales y los no funcionales.

  8. Seguridad
    • ¿Pueden acceder a la información y al sistema solo los usuarios autorizados?
    • ¿Está el sistema protegido contra ataques maliciosos?

    Actualmente, la seguridad es uno de los atributos de software más importantes. Debido a su criticidad, su implementación es costosa y a menudo entra en conflicto con otras características, generando trade-offs.

  9. Auditabilidad
    • ¿Puedo saber qué sucede dentro del sistema?
    • ¿Puedo inspeccionar la información para entender por qué el sistema responde de cierta manera?

    La auditabilidad es crucial en entornos gubernamentales o financieros, donde se requiere rastrear las acciones del sistema y su justificación.

  10. Monitoreabilidad
    • ¿El sistema genera métricas sobre su estado actual?
    • ¿Se pueden agregar o expandir estas métricas fácilmente?

    Esta característica está relacionada con la capacidad de supervisar el estado general del sistema.

  11. Interoperabilidad
    • ¿Puede el sistema interactuar fácilmente con otros sistemas?

    La interoperabilidad se enfoca en la capacidad del sistema para complementarse con otros sin necesidad de programar módulos adicionales.

Todas estas características son fundamentales para alcanzar los objetivos de un arquitecto de software. Se logran al equilibrar los aspectos del dominio del negocio con los atributos que aseguran el correcto funcionamiento y la calidad del software.

Post Siguiente

Comprendiendo los estilos y patrones de arquitectura en desarrollo

Post Anterior

Requisitos funcionales: La clave para el desarrollo de software