- Si las alternativas son pocas y conocidas de antemano, la opción preferible es un grupo de checkboxes o radiobuttons, porque se muestran a primera vista todas las opciones y queda claro si podemos elegir varias opciones o solamente una de ellas.
- Si las opciones son más numerosas pero bien conocidas para el usuario (p.ej. las provincias españolas) entonces una lista desplegable (combobox) puede ser una buena opción (¡ordenada alfabéticamente!).
- En general, si las opciones son desconocidas para el usuario, debemos elegir un control que muestre la mayor información posible (por ejemplo un listbox) sin necesidad de desplegarlo.
- Si las opciones son muy numerosas, debemos proporcionar un mecanismo de búsqueda y/o filtrado para que el usuario pueda ir explorando y reduciendo interactivamente las opciones disponibles hasta encontrar la que quiera.
martes, 24 de noviembre de 2009
Usabilidad: Selección entre alternativas
miércoles, 11 de noviembre de 2009
sábado, 10 de octubre de 2009
Usabilidad: Números y Fechas
[REGLA] ¡Ningún número huérfano! (sin unidades). Incluir siempre las unidades a las que se refiere el número que se presenta o que debe introducir el usuario: horas, días, km, cm, kb, personas, copias, incidencias…
En el idioma del usuario no existen números, existen conceptos y unidades del mundo real: solicitudes, personas, expedientes, minutos, kilogramos, etc.
[REGLA] Normalmente la unidad se colocará a la derecha del número. Se pueden exceptuar los números que aparezcan en una tabla, donde la unidad puede aparecer en el encabezado de la columna correspondiente.
[REGLA] Utilizar la precisión (número de cifras significativas) adecuada a la magnitud que se está mostrando. En general, ningún número con más de 4-5 cifras significativas, los porcentajes con 1-2 decimales.
Contraejemplos: 15,23231232 semanas, 3423246604353 bytes, 0.000000002321 días.
Ejemplos: 15 semanas, 3.188 GB, 200,5 microsegundos
[REGLA] Cuando se presenten varios números en columna, utilizar alineación derecha según la coma decimal. (o simplemente alineación derecha fijando el mismo número de decimales para todas las filas)
[REGLA] Poner siempre el punto de los miles (o espacios cuando poner puntos cause problemas). 1 000 000,00
[REGLA] Permitir espacios en los campos numéricos. Permitir que el usuario introduzca números con punto de separación de miles y coma decimal. (es tan sencillo como hacer str = str.Replace(“.”, “”); )
[RECOMENDACIÓN] Para cada tipo de número (capacidad, tiempo, etc.) preparar una función para formatear la cantidad de forma legible y usarla de forma consistente en toda la aplicación:
Ejemplo:
static public string SizeStr(int bytes)
{
string sizeStr = "";
if (bytes < 1024)
sizeStr = string.Format("{0} bytes", bytes);
else if (bytes < 1024 * 1024)
sizeStr = string.Format("{0:0.0} KB", bytes / 1024.0);
else //if (bytes < 1024 * 1024 * 1024)
sizeStr = string.Format("{0:#,##0.00} MB", bytes / 1024.0 / 1024.0);
return sizeStr;
}
[REGLA] Formatear todas las fechas de forma correcta y consistente.
[RECOMENDACIÓN] Anotar (añadir a continuación de) las fechas con cadenas más legibles (hoy, ayer, hace 3 semanas)
domingo, 4 de octubre de 2009
Usabilidad: ¿quién decide lo que es un bug y debería ser arreglado?
jueves, 10 de septiembre de 2009
miércoles, 18 de marzo de 2009
Los 10 errores más frecuentes con los Casos de Uso
martes, 17 de febrero de 2009
¿Que son los Casos de Uso?
Una historia ficticia (no tanto)

| Requisitos | Casos de Uso |
| El coche será de color blanco | Usuario - Ir a trabajar todos los días |
| El coche tendrá un techo solar | Usuario - Ir a la playa en verano |
| El coche no consumirá combustible diesel | Usuario - Ir al carrefour a hacer la compra |
| El coche tendrá lector de MP3 que permitirá escuchar música | |
Si, vale, pero… ¿Qué son los casos de uso?
La definición académica dice que: “Es la descripción de una secuencia de eventos que, tomados en conjunto hacen que un sistema haga algo de utilidad para un usuario”. En UML se representan así:

En lenguaje corriente, un caso de uso responde a la pregunta: “¿Para qué necesita el usuario el sistema?” “¿Qué quiere hacer con el sistema?”. Los usuarios de Microsoft Word no quieren cambiar la fuente del texto, ni cortar y pegar palabras, ni corregir textos ortográficamente. Estas acciones, aunque necesarias, no son útiles en si mismas. Los usuarios, lo que realmente quieren es escribir cartas, redactar informes o preparar documentos técnicos, para declarar su amor, conseguir presupuesto para su departamento o vender un producto. Y la mayoría de usuarios si pudieran hacerlo sin utilizar un ordenador, lo harían.
Entonces … ¿Cómo se utilizan?
Vale… ya sabemos lo que es un caso de uso… pero ¿cómo se utilizan? ¿cómo identifico los casos de uso de un sistema y cómo me ayudan a evitar el desastre de trabajar durante meses y que al final no sirva para nada?
En primer lugar, para identificarlos hay que hablar con los usuarios en su propio lenguaje y no forzar al usuario a que haga nuestro trabajo de determinar los requisitos que mejor se ajustan a sus necesidades. No le preguntes cuantos asientos quiere en su coche, sino cuantos hijos tiene y si piensa aumentar la familia o llevar a la abuela. No le preguntes el tamaño del coche, sino si tiene plaza de garaje o si va a hacer viajes largos o cortos. El desarrollador es el experto en sistemas de información, y debe tomar la responsabilidad de hacer un buen sistema. Hay que construir el sistema que el usuario “necesita”, no el que el usuario “quiere” o “cree que quiere”. De todo lo que nos diga el usuario debemos filtrar las necesidades reales y no cerrar requisitos anticipadamente. Si el usuario dice: “necesito una BB.DD. Oracle”, probablemente tenga razón y realmente la necesite, pero debe ser el desarrollador el que decida si las necesidades, los casos de uso justifican realmente una BBDD y si Oracle es el mejor fabricante.
Una vez que tenemos claros los casos de uso del sistema, y los tenemos priorizados identificaremos los requisitos que el sistema debe cumplir para que los casos de uso se puedan completar. Habrá requisitos explícitos “quiero el coche blanco” e implícitos (de los que nadie se acuerda inicialmente pero que son esenciales para que el sistema sirva de algo), Por ejemplo: para el caso de uso “ir a la compra con el coche”, tengo que poner varios requisitos: “queremos un coche”, “que pueda circular por las calles de la localidad donde vive el usuario”, “que pueda cargar la compra cómodamente”, “que sea fácil de aparcar”, “que tenga una autonomía suficiente para al menos llegar desde mi casa hasta el hipermercado”. Si consideramos el caso de uso “ir a la playa en verano”, muchos requisitos serán repetidos “queremos un coche”, otros serán parecidos “que pueda cargar el equipaje cómodamente” y otros serán totalmente nuevos “quiero aire acondicionado”.
Ya tengo los Casos de Uso y los requisitos ¿por donde empezamos a desarrollar?
Los casos de uso son una buena forma de “ordenar” el trabajo de desarrollo. En lugar de empezar por el primer requisito y terminar por el último, debemos empezar por el caso de uso más importante o prioritario, implementando los requisitos necesarios para completar este caso de uso.
Durante el desarrollo, se toman a diario muchas pequeñas (o grandes) decisiones que no están especificadas en los requisitos. (p.ej. “¿Qué tamaño debe tener el depósito de combustible?”). Si al tomar cada pequeña decisión no tenemos presentes los casos de uso, corremos el riesgo de hacer que el sistema no sea utilizable (no se puedan completar los casos de uso) aun a pesar de cumplir todos los requisitos que habíamos identificado explícitamente.
¿Y si hay cambios?
Cuando alguien (el usuario o un desarrollador) proponga cambios en los requisitos, tenemos que contrastarlos con los casos de uso, para ver si el cambio se justifica con la utilidad que se le piensa dar al sistema o es solamente una ocurrencia. A veces al examinar requisitos a la luz de los casos de uso vemos que son innecesarios o menos prioritarios de lo que parecía (por ejemplo Gmail no tiene carpetas para organizar el correo… el usuario no quiere organizar su correo en categorías, lo que realmente quiere es encontrar los correos antiguos cuando los necesita)
Y también las pruebas
Otra utilidad importante de los Casos de Uso es que ayudan a organizar y planificar las pruebas. El equipo de pruebas puede seguir la secuencia de eventos documentada en el caso de uso y verificar si el sistema, efectivamente, sirve para lo que hemos dicho que sirve o hay algo que lo impida. Esta forma de probar es mucho más útil que probar requisito a requisito. Como ya hemos dicho, podemos tener un sistema con el 90% de los requisitos implementados de acuerdo a la especificación y que la utilidad del sistema sea el 0% porque no se puede completar ningún caso de uso. Lamentablemente tener completado el 100% de los requisitos no garantiza la utilidad del sistema.
En resumen
Los casos de uso ayudan a que las entrevistas entre desarrollador y usuario se lleven a cabo en el lenguaje del usuario, centrándose en la utilidad prevista del sistema, en lugar de negociar requisitos aislados que tomados por separado no tienen ningún sentido.
Además, ayudan a identificar los requisitos “ocultos” o “implícitos” que se dan por supuesto por parte del usuario y que deben ser tenidos en cuenta por parte del desarrollador.
Sirven para ordenar y priorizar las tareas de desarrollo, para implementar primero los requisitos necesarios para completar los casos de uso más importantes y prioritarios.
Finalmente son una buena forma de organizar y planificar las pruebas. Podemos evaluar el grado de avance de una aplicación por el número de casos de uso completados, es decir por la cantidad de cosas útiles para el usuario que es capaz de hacer.
Epílogo
El ejemplo del “coche” que no sirve para ir a hacer la compra puede parecer exagerado, pero en este caso se aplica lo de que la realidad siempre supera a la ficción. Yo he visto con mis propios ojos a un desarrollador explicarle al Director de Tecnología de Correos que con el flamante sistema GIS que le estaba desarrollando se podían cambiar las rutas de los carteros pero no se podía buscar la ruta que le correspondía a un cartero e imprimirla en un papel. “No estaba en los requisitos” fue su explicación.
martes, 27 de enero de 2009
Verificación vs Validación
- Verificación: comprobar que una aplicación software cumple correctamente todos los requisitos
- Validación: comprobar que una aplicación software sirve para el propósito para el que fue concebida, es decir, que además de cumplir los requisitos sirve para algo.
martes, 20 de enero de 2009
Usabilidad: Software Considerado
viernes, 9 de enero de 2009
Simplicidad - mi palabra preferida
of work not done--is essential.