Está en la página 1de 14

Atributos de calidad

Descripción general
Los atributos de calidad son los factores generales que afectan el comportamiento en tiempo
de ejecución, el diseño del sistema y la experiencia del usuario. Representan áreas de
preocupación que tienen el potencial de tener un impacto amplio en la aplicación a través de
capas y niveles. Algunos de estos atributos están relacionados con el diseño general del
sistema, mientras que otros son específicos del tiempo de ejecución, el tiempo de diseño o
cuestiones centradas en el usuario. La medida en que la aplicación posee una combinación
deseada de atributos de calidad como usabilidad, rendimiento, confiabilidad y seguridad
indica el éxito del diseño y la calidad general de la aplicación de software.

Al diseñar aplicaciones para cumplir cualquiera de los requisitos de atributos de calidad, es


necesario considerar el impacto potencial en otros requisitos. Debe analizar las
compensaciones entre múltiples atributos de calidad. La importancia o prioridad de cada
atributo de calidad difiere de un sistema a otro; por ejemplo, la interoperabilidad a menudo
será menos importante en una aplicación minorista empaquetada de un solo uso que en un
sistema de línea de negocio (LOB).

Este capítulo enumera y describe los atributos de calidad que debe considerar al diseñar su
aplicación. Para aprovechar al máximo este capítulo, utilice la tabla de las páginas siguientes
para comprender cómo los atributos de calidad se relacionan con los factores de calidad del
sistema y de la aplicación, y lea la descripción de cada uno de los atributos de calidad.

Luego utilice las secciones que contienen pautas clave para cada uno de los atributos de
calidad para comprender cómo ese atributo tiene un impacto en su diseño y determinar las
decisiones que debe tomar para abordar estos problemas. Tenga en cuenta que la lista de
atributos de calidad de este capítulo no es exhaustiva, pero proporciona un buen punto de
partida para hacer preguntas apropiadas sobre su arquitectura.

Atributos de calidad comunes


La siguiente tabla describe los atributos de calidad cubiertos en este capítulo. Clasifica los
atributos en cuatro áreas específicas vinculadas al diseño, el tiempo de ejecución, el sistema
y las cualidades del usuario. Utilice esta tabla para comprender qué significa cada uno de los
atributos de calidad en términos del diseño de su aplicación.

Atributo de
Categoría Descripción
Calidad
Cualidades de Integridad La integridad conceptual define la consistencia y
diseño conceptual coherencia del diseño general. Esto incluye la
forma en que se diseñan los componentes o
módulos, así como factores como el estilo de
codificación y la denominación de variables.
Mantenibilidad La mantenibilidad es la capacidad del sistema
para sufrir cambios con cierta facilidad. Estos
cambios podrían afectar los componentes,
servicios, características e interfaces al agregar o
cambiar la funcionalidad, corregir errores y
cumplir con nuevos requisitos comerciales.
Reusabilidad La reutilización define la capacidad de los
componentes y subsistemas de ser adecuados
para su uso en otras aplicaciones y en otros
escenarios. La reutilización minimiza la
duplicación de componentes y también el tiempo
de implementación.
Cualidades en Disponibilidad La disponibilidad define la proporción de tiempo
tiempo de que el sistema está funcional y funcionando. Se
ejecución puede medir como un porcentaje del tiempo de
inactividad total del sistema durante un período
predefinido. La disponibilidad se verá afectada
por errores del sistema, problemas de
infraestructura, ataques maliciosos y carga del
sistema.
Interoperabilidad La interoperabilidad es la capacidad de un
sistema o diferentes sistemas para operar
exitosamente comunicándose e intercambiando
información con otros sistemas externos escritos y
administrados por partes externas. Un sistema
interoperable facilita el intercambio y la
reutilización de información tanto interna como
externamente.
Manejabilidad La manejabilidad define qué tan fácil es para los
administradores de sistemas administrar la
aplicación, generalmente a través de
instrumentación suficiente y útil expuesta para su
uso en sistemas de monitoreo y para depuración
y ajuste del rendimiento.
Desempeño El desempeño es una indicación de la capacidad
de respuesta de un sistema para ejecutar
cualquier acción dentro de un intervalo de tiempo
determinado. Se puede medir en términos de
latencia o rendimiento. La latencia es el tiempo
necesario para responder a cualquier evento. El
rendimiento es la cantidad de eventos que tienen
lugar en un período de tiempo determinado.
Fiabilidad La confiabilidad es la capacidad de un sistema
para permanecer operativo a lo largo del tiempo.
La confiabilidad se mide como la probabilidad de
que un sistema no deje de realizar las funciones
previstas durante un intervalo de tiempo
específico.
Escalabilidad La escalabilidad es la capacidad de un sistema
para manejar aumentos de carga sin impacto en el
rendimiento del sistema o la capacidad de
ampliarse fácilmente.
Seguridad La seguridad es la capacidad de un sistema para
evitar acciones maliciosas o accidentales fuera del
uso diseñado y para evitar la divulgación o
pérdida de información. Un sistema seguro tiene
como objetivo proteger los activos y evitar
modificaciones no autorizadas de la información.
Cualidades del Soportabilidad La soportabilidad es la capacidad del sistema para
sistema proporcionar información útil para identificar y
resolver problemas cuando no funciona
correctamente.
Capacidad de La capacidad de prueba es una medida de qué tan
pruebas fácil es crear criterios de prueba para el sistema y
sus componentes, y ejecutar estas pruebas para
determinar si se cumplen los criterios. Una buena
capacidad de prueba hace que sea más probable
que las fallas en un sistema puedan aislarse de
manera oportuna y efectiva.
Cualidades de Usabilidad La usabilidad define qué tan bien la aplicación
usuario cumple con los requisitos del usuario y del
consumidor al ser intuitiva, fácil de localizar y
globalizar, brindar un buen acceso para usuarios
discapacitados y dar como resultado una buena
experiencia de usuario general.

Las siguientes secciones describen cada uno de los atributos de calidad con más detalle y
brindan orientación sobre los temas clave y las decisiones que debe tomar para cada uno:

• Disponibilidad
• integridad conceptual
• Interoperabilidad
• Mantenibilidad
• Manejabilidad
• Rendimiento
• Fiabilidad
• Reusabilidad
• Escalabilidad
• Seguridad
• Soportabilidad
• Capacidad de pruebas
• Experiencia de usuario/Usabilidad

Disponibilidad (Availability)
La disponibilidad define la proporción de tiempo que el sistema está funcional y
funcionando. Se puede medir como un porcentaje del tiempo de inactividad total del sistema
durante un período predefinido. La disponibilidad se verá afectada por errores del sistema,
problemas de infraestructura, ataques maliciosos y carga del sistema. Las cuestiones clave
para la disponibilidad son:

• Un nivel físico, como el servidor de bases de datos o el servidor de aplicaciones, puede


fallar o dejar de responder, provocando que todo el sistema falle. Considere cómo
diseñar soporte de conmutación por error para los niveles del sistema. Por ejemplo,
utilice el equilibrio de carga de red para servidores web para distribuir la carga y evitar
que las solicitudes se dirijan a un servidor que no funciona. Además, considere utilizar
un mecanismo RAID para mitigar la falla del sistema en caso de falla del disco. Considere
si es necesario un sitio redundante geográficamente separado al que realizar la
conmutación por error en caso de desastres naturales como terremotos o tornados.
• Los ataques de denegación de servicio (DoS), que impiden que los usuarios autorizados
accedan al sistema, pueden interrumpir las operaciones si el sistema no puede manejar
cargas masivas de manera oportuna, a menudo debido al tiempo de procesamiento
requerido o a la configuración y congestión de la red. Para minimizar la interrupción de
los ataques DoS, reduzca el área de superficie de ataque, identifique comportamientos
maliciosos, utilice instrumentación de aplicaciones para exponer comportamientos no
deseados e implemente una validación de datos integral. Considere utilizar los patrones
de disyuntor o mamparo para aumentar la resiliencia del sistema.
• El uso inadecuado de los recursos puede reducir la disponibilidad. Por ejemplo, los
recursos adquiridos demasiado pronto y retenidos durante demasiado tiempo provocan
escasez de recursos y la incapacidad de manejar solicitudes adicionales de usuarios
simultáneos.
• Los errores o fallas en la aplicación pueden causar una falla en todo el sistema. Diseño
para un manejo adecuado de excepciones con el fin de reducir fallas de aplicaciones de
las cuales es difícil recuperarse.
• Las actualizaciones frecuentes, como parches de seguridad y actualizaciones de
aplicaciones de usuario, pueden reducir la disponibilidad del sistema. Identifique cómo
diseñará las actualizaciones en tiempo de ejecución.
• Un fallo de red puede provocar que la aplicación no esté disponible. Considere cómo
manejará las conexiones de red poco confiables; por ejemplo, diseñando clientes con
capacidades conectadas ocasionalmente.
• Considere los límites de confianza dentro de su aplicación y asegúrese de que los
subsistemas empleen algún tipo de control de acceso o firewall, así como una validación
exhaustiva de los datos, para aumentar la resiliencia y la disponibilidad.

Integridad Conceptual (Conceptual Integrity)


La integridad conceptual define la consistencia y coherencia del diseño general. Esto incluye
la forma en que se diseñan los componentes o módulos, así como factores como el estilo de
codificación y la denominación de variables. Un sistema coherente es más fácil de mantener
porque sabrá qué es coherente con el diseño general. Por el contrario, un sistema sin
integridad conceptual se verá afectado constantemente por cambios en las interfaces,
módulos que con frecuencia quedan obsoletos y falta de coherencia en la forma en que se
realizan las tareas. Las cuestiones clave para la integridad conceptual son:
• Mezclar diferentes áreas de interés dentro de su diseño. Considere identificar áreas de
preocupación y agruparlas en capas lógicas de presentación, negocios, datos y servicios,
según corresponda.
• Procesos de desarrollo inconsistentes o mal gestionados. Considere realizar una
evaluación de la gestión del ciclo de vida de las aplicaciones (ALM Application Lifecycle
Managemet) y utilice herramientas y metodologías de desarrollo probadas y
comprobadas.
• Falta de colaboración y comunicación entre los diferentes grupos involucrados en el ciclo
de vida de la aplicación. Considere establecer un proceso de desarrollo integrado con
herramientas para facilitar el flujo de trabajo, la comunicación y la colaboración del
proceso.
• Falta de estándares de diseño y codificación. Considere establecer pautas publicadas
para los estándares de diseño y codificación, e incorporar revisiones de código en su
proceso de desarrollo para garantizar que se sigan las pautas.
• Las demandas del sistema existente (heredado) pueden impedir tanto la refactorización
como la progresión hacia una nueva plataforma o paradigma. Considere cómo puede
crear una ruta de migración lejos de las tecnologías heredadas y cómo aislar las
aplicaciones de las dependencias externas. Por ejemplo, implemente el patrón de diseño
Gateway para la integración con sistemas heredados.

Interoperabilidad (Interoperability)
La interoperabilidad es la capacidad de un sistema o diferentes sistemas para operar
exitosamente comunicándose e intercambiando información con otros sistemas externos
escritos y administrados por partes externas. Un sistema interoperable facilita el intercambio
y la reutilización de información tanto interna como externamente. Los protocolos de
comunicación, las interfaces y los formatos de datos son las consideraciones clave para la
interoperabilidad. La estandarización también es un aspecto importante a considerar al
diseñar un sistema interoperable.

Las cuestiones clave para la interoperabilidad son:

• Interacción con sistemas externos o heredados que utilizan diferentes formatos de datos.
Considere cómo puede permitir que los sistemas interoperen, mientras evolucionan por
separado o incluso son reemplazados. Por ejemplo, utilice la orquestación con
adaptadores para conectarse con sistemas externos o heredados y traducir datos entre
sistemas; o utilice un modelo de datos canónico para manejar la interacción con una gran
cantidad de formatos de datos diferentes.
• Desenfoque de límites, que permite que los artefactos de un sistema se desactiven en
otro. Considere cómo puede aislar sistemas mediante el uso de interfaces de servicio y/o
capas de mapeo. Por ejemplo, exponer servicios utilizando interfaces basadas en XML o
tipos estándar para admitir la interoperabilidad con otros sistemas. Diseñe los
componentes para que sean cohesivos y tengan un bajo acoplamiento para maximizar la
flexibilidad y facilitar el reemplazo y la reutilización.
• Falta de cumplimiento de las normas. Tenga en cuenta los estándares formales y de facto
para el dominio en el que está trabajando y considere utilizar uno de ellos en lugar de
crear algo nuevo y propietario.

Mantenibilidad (Maintainability)
La mantenibilidad es la capacidad del sistema para sufrir cambios con cierta facilidad. Estos
cambios podrían afectar los componentes, servicios, características e interfaces al agregar o
cambiar la funcionalidad de la aplicación para corregir errores o cumplir con nuevos
requisitos comerciales. La mantenibilidad también puede afectar el tiempo que lleva
restaurar el sistema a su estado operativo después de una falla o de su eliminación para una
actualización. Mejorar la capacidad de mantenimiento del sistema puede aumentar la
disponibilidad y reducir los efectos de los defectos en tiempo de ejecución. La
mantenibilidad de una aplicación suele ser función de sus atributos de calidad generales,
pero existen una serie de cuestiones clave que pueden afectar directamente la
mantenibilidad:

• Las dependencias excesivas entre componentes y capas, y el acoplamiento inadecuado a


clases concretas, impiden reemplazos, actualizaciones y cambios fáciles; y puede
provocar que los cambios en clases concretas se repercutan en todo el sistema. Considere
diseñar sistemas como capas bien definidas, o áreas de preocupación, que delineen
claramente la interfaz de usuario del sistema, los procesos comerciales y la funcionalidad
de acceso a datos. Considere implementar dependencias entre capas mediante el uso de
abstracciones (como clases o interfaces abstractas) en lugar de clases concretas, y
minimice las dependencias entre componentes y capas. El uso de comunicación directa
evita cambios en la implementación física de componentes y capas. Elija un modelo,
formato y protocolo de comunicación adecuados. Considere diseñar una arquitectura
conectable que permita actualizaciones y mantenimiento sencillos y mejore las
oportunidades de prueba, mediante el diseño de interfaces que permitan el uso de
módulos o adaptadores enchufables para maximizar la flexibilidad y la extensibilidad.
• La dependencia de implementaciones personalizadas de funciones como la autenticación
y la autorización impide la reutilización y dificulta el mantenimiento. Para evitar esto,
utilice las funciones y características integradas de la plataforma siempre que sea posible.
• La dependencia de implementaciones personalizadas de funciones como la autenticación
y la autorización impide la reutilización y dificulta el mantenimiento. Para evitar esto,
utilice las funciones y características integradas de la plataforma siempre que sea posible.
• El código lógico de componentes y segmentos no es cohesivo, lo que dificulta su
mantenimiento y reemplazo, y genera dependencias innecesarias de otros componentes.
Diseñe los componentes para que sean cohesivos y tengan un bajo acoplamiento para
maximizar la flexibilidad y facilitar el reemplazo y la reutilización.
• La base del código es grande, inmanejable, frágil o demasiado compleja; y la
refactorización es engorrosa debido a los requisitos de regresión. Considere diseñar
sistemas como capas bien definidas, o áreas de preocupación, que delineen claramente
la interfaz de usuario del sistema, los procesos comerciales y la funcionalidad de acceso
a datos. Considere cómo gestionará los cambios en los procesos comerciales y las reglas
comerciales dinámicas, tal vez utilizando un motor de flujo de trabajo comercial si el
proceso comercial tiende a cambiar. Considere la posibilidad de utilizar componentes
empresariales para implementar las reglas si sólo los valores de las reglas empresariales
tienden a cambiar; o una fuente externa, como un motor de reglas de negocios, si las
reglas de decisión de negocios tienden a cambiar.
• El código existente no tiene un conjunto de pruebas de regresión automatizadas. Invierta
en automatización de pruebas a medida que construye el sistema. Esto dará sus frutos
como validación de la funcionalidad del sistema y como documentación sobre lo que
hacen las distintas partes del sistema y cómo funcionan juntas.
• La falta de documentación puede obstaculizar el uso, la administración y futuras
actualizaciones. Asegúrese de proporcionar documentación que, como mínimo, explique
la estructura general de la solicitud.

Manejabilidad (Manageability)
La manejabilidad define qué tan fácil es para los administradores de sistemas administrar la
aplicación, generalmente a través de instrumentación suficiente y útil expuesta para su uso
en sistemas de monitoreo y para depuración y ajuste del rendimiento. Diseñe su aplicación
para que sea fácil de administrar, exponiendo suficiente y útil instrumentación para su uso
en sistemas de monitoreo y para depuración y ajuste del rendimiento. Las cuestiones clave
para la manejabilidad son:

• Falta de información de seguimiento, rastreo y diagnóstico de la salud. Considere la


posibilidad de crear un modelo de estado que defina los cambios de estado importantes
que pueden afectar el rendimiento de la aplicación y utilice este modelo para especificar
los requisitos de instrumentación de gestión. Implemente instrumentación, como
eventos y contadores de rendimiento, que detecte cambios de estado y exponga estos
cambios a través de sistemas estándar como registros de eventos, archivos de
seguimiento o Instrumental de administración de Windows (WMI). Capture y reporte
suficiente información sobre errores y cambios de estado para permitir un monitoreo,
depuración y administración precisos. Además, considere crear paquetes de
administración que los administradores puedan usar en sus entornos de monitoreo para
administrar la aplicación.
• Falta de configurabilidad en tiempo de ejecución. Considere cómo puede permitir que el
comportamiento del sistema cambie según los requisitos del entorno operativo, como
cambios de infraestructura o implementación.
• Falta de herramientas de resolución de problemas. Considere incluir código para crear
una instantánea del estado del sistema para usarla en la resolución de problemas, e
incluir instrumentación personalizada que pueda habilitarse para proporcionar informes
operativos y funcionales detallados. Considere registrar y auditar información que
pueda ser útil para el mantenimiento y la depuración, como detalles de solicitudes o
salidas de módulos y llamadas a otros sistemas y servicios.
Desempeño (Performance)
El rendimiento es una indicación de la capacidad de respuesta de un sistema para ejecutar
acciones específicas en un intervalo de tiempo determinado. Se puede medir en términos de
latencia o rendimiento. La latencia es el tiempo necesario para responder a cualquier evento.
El rendimiento es la cantidad de eventos que tienen lugar en un período de tiempo
determinado. El rendimiento de una aplicación puede afectar directamente su escalabilidad
y la falta de escalabilidad puede afectar el rendimiento. Mejorar el rendimiento de una
aplicación a menudo mejora su escalabilidad al reducir la probabilidad de disputa por
recursos compartidos. Los factores que afectan el desempeño del sistema incluyen la
demanda de una acción específica y la respuesta del sistema a la demanda. Las cuestiones
clave para el rendimiento son:

• Aumento del tiempo de respuesta del cliente, rendimiento reducido y sobreutilización


de los recursos del servidor. Asegúrese de estructurar la aplicación de forma adecuada e
implementarla en un sistema o sistemas que proporcionen recursos suficientes. Cuando
la comunicación debe cruzar límites de procesos o niveles, considere usar interfaces de
grano grueso que requieran la cantidad mínima de llamadas (preferiblemente solo una)
para ejecutar una tarea específica, y considere usar comunicación asincrónica.
• Mayor consumo de memoria, lo que resulta en un rendimiento reducido, pérdidas
excesivas de caché (la incapacidad de encontrar los datos requeridos en la caché) y un
mayor acceso al almacén de datos. Asegúrese de diseñar una estrategia de
almacenamiento en caché eficiente y adecuada. Mayor procesamiento del servidor de
bases de datos, lo que resulta en un rendimiento reducido. Asegúrese de elegir tipos
efectivos de transacciones, bloqueos, subprocesos y enfoques de colas. Utilice consultas
eficientes para minimizar el impacto en el rendimiento y evite recuperar todos los datos
cuando solo se muestra una parte. No diseñar un procesamiento eficiente de la base de
datos puede generar una carga innecesaria en el servidor de la base de datos, no cumplir
con los objetivos de rendimiento y costos que exceden las asignaciones presupuestarias.
• Mayor consumo de ancho de banda de la red, lo que resulta en tiempos de respuesta
retrasados y una mayor carga para los sistemas cliente y servidor. Diseñe una
comunicación de alto rendimiento entre niveles utilizando el mecanismo de
comunicación remota adecuado. Intente reducir la cantidad de transiciones entre límites
y minimice la cantidad de datos enviados a través de la red. Trabajo por lotes para
reducir las llamadas a través de la red.

Fiabilidad (Reliability)
La confiabilidad es la capacidad de un sistema para continuar operando de la manera
esperada a lo largo del tiempo. La confiabilidad se mide como la probabilidad de que un
sistema no falle y de que realice su función prevista durante un intervalo de tiempo
específico. Las cuestiones clave para la confiabilidad son:

• El sistema falla o deja de responder. Identifique formas de detectar fallas e iniciar


automáticamente una conmutación por error o redirigir la carga a un sistema de repuesto
o de respaldo. Además, considere implementar código que utilice sistemas alternativos
cuando detecte una cantidad específica de solicitudes fallidas a un sistema existente.
• La salida es inconsistente. Implemente instrumentación, como eventos y contadores de
rendimiento, que detecte un rendimiento deficiente o fallas de las solicitudes enviadas a
sistemas externos y exponga información a través de sistemas estándar como registros
de eventos, archivos de seguimiento o WMI. Registrar información de rendimiento y
auditoría sobre llamadas realizadas a otros sistemas y servicios
• El sistema falla debido a la falta de disponibilidad de otras externalidades como sistemas,
redes y bases de datos. Identifique formas de manejar sistemas externos poco confiables,
comunicaciones fallidas y transacciones fallidas. Considere cómo puede desconectar el
sistema, pero aún poner en cola las solicitudes pendientes. Implemente sistemas de
comunicación basados en mensajes de almacenamiento y reenvío o en caché que
permitan almacenar las solicitudes cuando el sistema de destino no esté disponible y
reproducirlas cuando esté en línea. Considere la posibilidad de utilizar Windows
Message Queuing o BizTalk Server para proporcionar un mecanismo confiable de
entrega única para solicitudes asincrónicas.

Reusabilidad (Reusability)
La reutilización es la probabilidad de que un componente se utilice en otros componentes o
escenarios para agregar nuevas funciones con pocos o ningún cambio. La reutilización
minimiza la duplicación de componentes y el tiempo de implementación. Identificar los
atributos comunes entre varios componentes es el primer paso en la construcción de
pequeños componentes reutilizables para su uso en un sistema más grande. Las cuestiones
clave para la reutilización son:

• El uso de diferentes códigos o componentes para lograr el mismo resultado en diferentes


lugares; por ejemplo, duplicación de lógica similar en múltiples componentes y
duplicación de lógica similar en múltiples capas o subsistemas. Examine el diseño de la
aplicación para identificar la funcionalidad común e implemente esta funcionalidad en
componentes separados que pueda reutilizar. Examine el diseño de la aplicación para
identificar preocupaciones transversales, como la validación, el registro y la
autenticación, e implemente estas funciones como componentes separados.
• El uso de múltiples métodos similares para implementar tareas que tienen sólo una ligera
variación. En su lugar, utilice parámetros para variar el comportamiento de un único
método.
• Usar varios sistemas para implementar la misma característica o función en lugar de
compartir o reutilizar la funcionalidad en otro sistema, en múltiples sistemas o en
diferentes subsistemas dentro de una aplicación. Considere exponer la funcionalidad de
componentes, capas y subsistemas a través de interfaces de servicio que otras capas y
sistemas puedan usar. Utilice estructuras y tipos de datos independientes de la
plataforma a los que se pueda acceder y comprender en diferentes plataformas.
Escalabilidad (Scalability)
La escalabilidad es la capacidad de un sistema para manejar aumentos de carga sin impacto
en el rendimiento del sistema o la capacidad de ampliarse fácilmente. Hay dos métodos para
mejorar la escalabilidad: escalar verticalmente (aumentar) y escalar horizontalmente
(reducir). Para escalar verticalmente, agrega más recursos como CPU, memoria y disco a un
solo sistema. Para escalar horizontalmente, agrega más máquinas a una granja que ejecuta la
aplicación y comparte la carga. Las cuestiones clave para la escalabilidad son:

• Las aplicaciones no pueden soportar una carga cada vez mayor. Considere cómo puede
diseñar capas y niveles para la escalabilidad, y cómo esto afecta la capacidad de ampliar
o ampliar la aplicación y la base de datos cuando sea necesario. Puede decidir ubicar
capas lógicas en el mismo nivel físico para reducir la cantidad de servidores necesarios
y al mismo tiempo maximizar las capacidades de carga compartida y conmutación por
error. Considere dividir los datos en más de un servidor de bases de datos para
maximizar las oportunidades de ampliación y permitir una ubicación flexible de los
subconjuntos de datos. Evite componentes y subsistemas con estado siempre que sea
posible para reducir la afinidad del servidor.
• Los usuarios sufren retrasos en la respuesta y tiempos de finalización más prolongados.
Considere cómo manejará los picos de tráfico y carga. Considere implementar código
que utilice sistemas adicionales o alternativos cuando detecte una carga de servicio
predefinida o una cantidad de solicitudes pendientes a un sistema existente.
• El sistema no puede poner en cola el exceso de trabajo y procesarlo durante períodos de
carga reducida. Implemente sistemas de comunicación basados en mensajes
almacenados y reenviados o en caché que permitan almacenar las solicitudes cuando el
sistema de destino no esté disponible y reproducirlas cuando esté en línea.

Seguridad (Security)
La seguridad es la capacidad de un sistema para reducir la posibilidad de que acciones
maliciosas o accidentales fuera del uso diseñado afecten al sistema y evitar la divulgación o
pérdida de información. Mejorar la seguridad también puede aumentar la confiabilidad del
sistema al reducir las posibilidades de que un ataque tenga éxito y perjudique el
funcionamiento del sistema. Asegurar un sistema debe proteger los activos y evitar el acceso
no autorizado o la modificación de la información. Los factores que afectan la seguridad del
sistema son la confidencialidad, la integridad y la disponibilidad. Las funciones utilizadas
para proteger los sistemas son autenticación, cifrado, auditoría y registro. Las cuestiones
clave para la seguridad son:

• Falsificación de la identidad del usuario. Utilice autenticación y autorización para evitar


la suplantación de la identidad del usuario. Identifique límites de confianza y autentique
y autorice a los usuarios que cruzan un límite de confianza.
• Daños causados por entradas maliciosas como inyección SQL y secuencias de comandos
entre sitios. Protéjase contra dichos daños asegurándose de validar todas las entradas en
cuanto a longitud, rango, formato y tipo utilizando los principios de restricción, rechazo
y desinfección. Codifique todos los resultados que muestra a los usuarios.
• Manipulación de datos. Divida el sitio en usuarios anónimos, identificados y
autenticados y utilice la instrumentación de la aplicación para registrar y exponer el
comportamiento que se puede monitorear. Utilice también canales de transporte seguros
y cifre y firme datos confidenciales enviados a través de la red.
• Repudio a las acciones de los usuarios. Utilice instrumentación para auditar y registrar
todas las interacciones del usuario para operaciones críticas de aplicaciones.
• Divulgación de información y pérdida de datos sensibles. Diseñe todos los aspectos de
la aplicación para evitar el acceso o la exposición de información confidencial del sistema
y de la aplicación.
• Interrupción del servicio debido a ataques de Denegación de Servicio (DoS). Considere
reducir los tiempos de espera de las sesiones e implementar código o hardware para
detectar y mitigar dichos ataques.

Soportabilidad (Supportability)
La soportabilidad es la capacidad del sistema para proporcionar información útil para
identificar y resolver problemas cuando no funciona correctamente. Las cuestiones clave
para la compatibilidad son:

• Falta de información de diagnóstico. Identifique cómo monitoreará la actividad y el


rendimiento del sistema. Considere una aplicación de monitoreo del sistema, como
Microsoft System Center.
• Falta de herramientas de resolución de problemas. Considere incluir código para crear
una instantánea del estado del sistema para usarla en la resolución de problemas, e
incluir instrumentación personalizada que pueda habilitarse para proporcionar informes
operativos y funcionales detallados. Considere registrar y auditar información que
pueda ser útil para el mantenimiento y depuración, como detalles de solicitudes o salidas
de módulos y llamadas a otros sistemas y servicios.
• Falta de capacidad de rastreo. Utilice componentes comunes para proporcionar soporte
de seguimiento en el código, tal vez mediante técnicas de programación orientada a
aspectos (AOP) o inyección de dependencia. Habilite el seguimiento en aplicaciones web
para solucionar errores.
• Falta de seguimiento de la salud. Considere la posibilidad de crear un modelo de estado
que defina los cambios de estado importantes que pueden afectar el rendimiento de la
aplicación y utilice este modelo para especificar los requisitos de instrumentación de
gestión. Implemente instrumentación, como eventos y contadores de rendimiento, que
detecte cambios de estado y exponga estos cambios a través de sistemas estándar como
registros de eventos, archivos de seguimiento o Instrumental de administración de
Windows (WMI). Capture y reporte suficiente información sobre errores y cambios de
estado para permitir un monitoreo, depuración y administración precisos. Además,
considere crear paquetes de administración que los administradores puedan usar en sus
entornos de monitoreo para administrar la aplicación.
Capacidad de prueba (Testability)
La capacidad de prueba es una medida de qué tan bien el sistema o los componentes le
permiten crear criterios de prueba y ejecutar pruebas para determinar si se cumplen los
criterios. La capacidad de prueba permite aislar las fallas en un sistema de manera oportuna
y efectiva. Las cuestiones clave para la capacidad de prueba son:

• Las aplicaciones complejas con muchas permutaciones de procesamiento no se prueban


de manera consistente, tal vez porque no se pueden realizar pruebas automatizadas o
granulares si la aplicación tiene un diseño monolítico. Diseñar sistemas para que sean
modulares para soportar las pruebas. Proporcione instrumentación o implemente sondas
para pruebas, mecanismos para depurar resultados y formas de especificar entradas
fácilmente. Diseñe componentes que tengan alta cohesión y bajo acoplamiento para
permitir la capacidad de prueba de los componentes de forma aislada del resto del
sistema. Falta de planificación de pruebas. Comience a realizar pruebas temprano
durante el ciclo de vida de desarrollo. Utilice objetos simulados durante las pruebas y
cree soluciones de prueba estructuradas y sencillas.
• Cobertura de prueba deficiente, tanto para pruebas manuales como automatizadas.
Considere cómo puede automatizar las pruebas de interacción del usuario y cómo puede
maximizar la cobertura de las pruebas y el código.
• Inconsistencias de entrada y salida; para la misma entrada, la salida no es la misma y la
salida no cubre completamente el dominio de salida incluso cuando se proporcionan
todas las variaciones conocidas de la entrada. Considere cómo facilitar la especificación
y comprensión de las entradas y salidas del sistema para facilitar la construcción de casos
de prueba.

Experiencia de usuario / Usabilidad (User Experience / Usability)


Las interfaces de las aplicaciones deben diseñarse teniendo en cuenta al usuario y al
consumidor para que su uso sea intuitivo, puedan localizarse y globalizarse, proporcionen
acceso a usuarios discapacitados y proporcionen una buena experiencia de usuario general.
Las cuestiones clave para la experiencia del usuario y la usabilidad son:

• Se requiere demasiada interacción (un número excesivo de clics) para una tarea.
Asegúrese de diseñar la pantalla, los flujos de entrada y los patrones de interacción del
usuario para maximizar la facilidad de uso.
• Flujo incorrecto de pasos en interfaces de varios pasos. Considere incorporar flujos de
trabajo cuando corresponda para simplificar las operaciones de varios pasos.
• Los elementos de datos y los controles están mal agrupados. Elija los tipos de control
adecuados (como grupos de opciones y casillas de verificación) y diseñe los controles y
el contenido utilizando los patrones de diseño de interfaz de usuario aceptados.
• La retroalimentación al usuario es deficiente, especialmente en el caso de errores y
excepciones, y la aplicación no responde. Considere implementar tecnologías y técnicas
que proporcionen la máxima interactividad del usuario, como JavaScript asincrónico y
XML (AJAX) en páginas web y validación de entradas del lado del cliente. Utilice técnicas
asincrónicas para tareas en segundo plano y tareas como completar controles o realizar
tareas de larga duración.

También podría gustarte