En términos generales, ¿es mejor hacer que todas las partes funcionales o que la interfaz de usuario funcione primero, o una combinación de ambas?

47

En términos generales, ¿es mejor hacer que todas las partes funcionales o que la interfaz de usuario funcione primero, o una combinación de ambas?

Suponiendo que está trabajando en algo grande, ¿es una práctica generalmente aceptada hacer que todos los blobs de recolección de datos funcionales funcionen antes de cualquier interfaz de usuario, hacer que toda la interfaz de usuario funcione una pieza a la vez, o algo en el medio?

Todos sabemos dividir el trabajo en piezas manejables, pero la pregunta es, en última instancia, si la UI está incluida en piezas manejables, supongo.

Para el caso del ejemplo, considere una aplicación GUI con una ventana raíz, pero más de una docena de pestañas en varios muelles para separar diferentes componentes de datos. Cada pestaña individual tiene un conjunto relativamente complejo de partes móviles detrás de ella desde una perspectiva de unidades funcionales.

La aplicación de ejemplo en esta pregunta en particular está aquí con el blog adjunto y el producto comercial original .

RobotHumanos
fuente

Respuestas:

85

Existe una concepción general entre muchos usuarios y clientes comerciales de que cuando parece completa, está casi completa. Como probablemente sepa, esto está lejos de la verdad. Uno puede hacer que se vea bien, pero sin backend y algunos usuarios piensan que hacer que se vea bien es el 80% del trabajo, no el 20% ( o el otro 80% ).

Innumerables desarrolladores pueden contar historias de horror sobre esto: obtener una maqueta de las páginas en Microsoft Word utilizando capturas de pantalla de alguna otra herramienta, y el cliente dice "¿casi lo has hecho?"

Debe ajustar el ritmo para que todas las partes estén listas cuando esté hecho. Intentar hacer todo el backend primero y luego todo el front end hará que el usuario final piense que no está haciendo nada y le pregunte por qué le pagan cuando no hay nada que mostrar. Por otro lado, el front end primero y encontrará al usuario final haciendo cambios insignificantes y consumiendo todo nuestro tiempo.

El peor de los casos con un 'uno primero y el otro' es cuando llegas a la otra parte, descubres que no encaja en absoluto con el diseño.

Por lo tanto, construye ambos. Muestre el progreso en el front-end, haga que el back-end funcione con lo que está construyendo. En muchos casos, es una buena idea entregar compilaciones incrementales y asegurarse de que está haciendo lo que el cliente quiere (esto entra en Ágil). Pasar demasiado tiempo sin 'avances visibles' puede dañar la relación con el cliente (esto es para ambos casos de 'todo parece hecho temprano' y 'nada se hace hasta el final' - es difícil para el cliente ver que se está escribiendo el marco o las pruebas unitarias o la desinfección de datos como progreso).

Joel escribió sobre esto en The Iceberg Secret, Revealed :

Corolario importante dos. Si le muestra a un no programador una pantalla que tiene una interfaz de usuario que es 100% hermosa, pensarán que el programa está casi listo.

Las personas que no son programadores solo están mirando la pantalla y viendo algunos píxeles. Y si parece que los píxeles forman un programa que hace algo, piensan "oh, Dios, ¿cuánto más difícil podría ser hacer que realmente funcione?"

El gran riesgo aquí es que si se burla primero de la interfaz de usuario, presumiblemente para poder mantener algunas conversaciones con el cliente, entonces todo el mundo pensará que ya casi ha terminado. Y luego, cuando pasas el próximo año trabajando "encubierto", por así decirlo, nadie verá realmente lo que estás haciendo y pensarán que no es nada.

Esto se reitera nuevamente en la publicación del blog No haga que la demostración se vea Listo, que tiene este útil gráfico:

Cómo se hace a lo que parece

Tenga en cuenta que las dos opciones generalmente reflejan el "hacer la interfaz de usuario" (y luego la expectativa es que terminará pronto) y "hacer el backend" (y luego el cliente está preocupado de que no cumpla con la fecha límite).

Cómo se ve "hecho" algo debe coincidir con cómo se "hace" algo.

Cada desarrollador de software ha experimentado esto muchas veces en su carrera. Pero las herramientas de publicación de escritorio generan el mismo dolor de cabeza para los escritores de tecnología: si le muestra a alguien un borrador que está perfectamente redactado y formateado, lo ven como más hecho de lo que desea. Necesitamos una coincidencia entre dónde estamos y dónde otros perciben que estamos.

Este artículo también presenta un punto importante sobre el tipo de comentarios que recibe con diferentes niveles de cocción de la interfaz de usuario. Si tiene algo que parece completo, es más probable que reciba comentarios acerca de "¿podría cambiar la fuente" que "este diseño no funciona? Hay demasiadas pestañas".


Para aquellos que luchan con esto en el mundo de Java Swing, hay un aspecto llamado Napkin que hace que la interfaz de usuario no se vea completa (incluso si lo es).

La clave aquí es hacerlo para que no parezca hecho. Hacer que la interfaz de usuario se vea completa es una señal para muchos usuarios comerciales de que la aplicación está completa (incluso si son solo unas pocas páginas estáticas sin ninguna lógica detrás o algo integrado en un generador de interfaces).


Lecturas adicionales (y enlaces del artículo):


fuente
77
Parece que estás proponiendo algún tipo de metodología ágil ... :)
Alexander
77
@Alexander Agile ayuda en este caso, pero no es esencial. La cascada puede tener hitos (entregables) y los clientes pueden estar muy decepcionados al ver "parece hecho, ¿por qué hay 3 millas más de piedras que tardan tanto tiempo?" FWIW, he tenido casos en los que el usuario comercial pensó que se hizo debido a que la captura de pantalla + pintura de ms en el diseño tecnológico (tienda en cascada) se veía bien.
3
En caso de que no haya visto una respuesta experta a ese video, aquí está: youtu.be/B7MIJP90biM
ragol
3
He estado diseñando interfaces de usuario para la mayor parte de mi carrera de programación y NO UNA VEZ hice que un cliente supusiera que una interfaz de usuario prototipo significaba que el software estaba "casi listo". Me parece que los presentadores de las interfaces de usuario de estructura metálica no están haciendo un buen trabajo al explicar las estructuras de estructura por adelantado si los clientes están de alguna manera confundidos al pensar que el proyecto está casi terminado.
Graham
2
+1 para Servilleta L&F. Eso seguramente será en mi futuro. :)
Kathy
27

Depende: necesita un ciclo de retroalimentación ajustado alrededor de su pieza más importante de funcionalidad

Si el núcleo de lo que haces, la parte arriesgada y aterradora, es algún motor interno, entonces haz que la parte central funcione, por ejemplo, en la consola o mediante pruebas unitarias. Por ejemplo, un analizador de protocolos no necesita una interfaz de usuario para saber si funciona correctamente.

Si su aspecto interesante implica cualquier tipo de interactividad (la interactividad necesita estar constantemente solucionando problemas, desechando y redescubriendo), entonces un enfoque de primera interfaz de usuario es crucial. Por ejemplo, quiero crear una aplicación que permita a las personas interactuar con una visualización de datos. Lo más importante que necesito averiguar es si la visualización es significativa, por lo que es probable que descarte media docena de enfoques antes de decidirme por uno. Haré todo esto antes de escribir una prueba de unidad única.

Hay un área gris borrosa en el medio donde puede decidir la mejor combinación sobre cómo interactuar mejor y validar su código (¿pruebas automatizadas? ¿IU para experimentación?). Personalmente he hecho ambos extremos y todo lo demás, y decidir el lugar correcto para estar en ese espectro es una de las cosas más difíciles que tengo que decidir y es 100% dependiente del tipo de cosas que estoy construyendo.

Doug T.
fuente
2
Es decir, identificar y abordar los componentes más riesgosos y críticos por adelantado para mitigar la posibilidad de desbordamientos y / o fallas. Si esos componentes son la interfaz de usuario, la lógica de negocios, etc., o lo más probable, alguna combinación de todos los diversos componentes.
Alexander
1
Realmente suena como si me estuvieras hablando de prototipos, porque si todavía estás tirando diseños, entonces eso es en lo que deberías estar iterando, no en el código real.
Aaronaught
8

En un entorno ágil, es posible que escuche discusiones sobre "esqueletos para caminar" o "cortes verticales delgados". La idea es que, dado que el software de trabajo es lo que es importante para el usuario, usted construye el software de manera pieza por pieza.

En la aplicación de ejemplo que mencionó, comenzaría con la ventana y tal vez una pestaña, y haría que todo funcionara de frente de alguna manera. Luego, con el tiempo, agregaría funcionalidad y, por lo tanto, pestañas caso por caso, haciendo que cada característica funcione a medida que la construye. Esto es parte de lo que las demostraciones frecuentes de los clientes le brindan: la oportunidad de mostrar algo nuevo que funciona y obtener comentarios al respecto al instante.

En resumen, sí, el trabajo de la interfaz de usuario es absolutamente parte de una unidad de trabajo funcional, si tiene una interfaz de usuario.

Comience con algo pequeño que funcione e itere su funcionalidad para entregar una pieza completa de software.

Keith B
fuente
+1 Siempre es esencial tener una pieza de algo que se pueda enviar.
JensG
@Jens: "Siempre es esencial tener una pieza de algo que se pueda enviar" es una tontería. En el mejor de los casos, ese dicho solo se aplica a una minoría de aplicaciones de software. En el mundo real, las aplicaciones que solo hacen parte del trabajo necesario no son útiles en lo más mínimo.
Dunk
Esa es tu experiencia. Yo tengo diferentes Grandes proyectos del mundo real con muchos hitos y clientes reales incluidos.
JensG
1
@Dunk: una aplicación que no realiza ninguna parte del trabajo es menos útil que una aplicación que hace parte del trabajo. Sin embargo, no estoy hablando de una aplicación que está "hecha"; Estoy hablando del orden en que uno debe construir una aplicación. Mi experiencia es congruente con JensG: siempre poder cortar una versión beta en función de lo que demostró esa semana y enviarla a los clientes de inmediato los hace mucho más felices.
Keith B
Esta es la única respuesta con la que me puedo identificar. Los otros ni siquiera parecen estar considerando la posibilidad de que un buen desarrollo de productos no se descomponga limpiamente en "UI" y "back-end". Es una pregunta que solo un programador novato o gerente de proyecto alguna vez haría, y no una pregunta que un programador experimentado o un PM deberían dignarse a responder al pie de la letra. La sola idea de preguntar cuál debe hacerse "primero" apesta a cascada.
Aaronaught
3

Recomendaría hacer una combinación de funcionalidad e interfaz de usuario (y obtener comentarios o experiencia de prueba lo antes posible).

Por cierto, ¿no es la forma en que se desarrolla el software GUI más grande? Mire, por ejemplo, el navegador Firefox : de una versión a la siguiente, tanto la funcionalidad como la interfaz de usuario han evolucionado.

Basile Starynkevitch
fuente
2

En las aplicaciones grandes (basadas en PHP) en las que trabajo, trato de poner primero las clases y los métodos, que devuelven valores ficticios . Esto es para establecer un pseudocontrato que los otros desarrolladores pueden usar para implementar la interfaz de usuario.

Una ventaja secundaria de este método es que podemos perfeccionar el contrato / interfaz a medida que cambian los requisitos de la interfaz de usuario (y siempre cambian), incluso antes de que se escriba y entregue todo el código.

dotancohen
fuente
Esto es algo que estoy tratando de hacer. Dado que mi proyecto particular se implementa como un shell de interfaz de usuario masivo y cada recolector de puntos de datos es un complemento, cada complemento es responsable de administrar sus propios componentes de la interfaz de usuario. De esta forma no se requiere un "contrato" para una persona / grupo de personas. La suposición es que el mismo grupo de personas estará trabajando en un complemento dado de principio a fin. Es parte de la razón por la que lo estoy diseñando como soy. Alternativamente, para otros proyectos, este es un excelente consejo. Así que vota de mi parte, ya que será útil para otros.
RobotHumans
2

Lo que tiendo a hacer es comenzar con una interfaz de usuario horrible : algo que simplemente voltea los datos variables en la pantalla. Sin fuentes, sin alineación, nada realmente gráfico durante mucho tiempo. Simplemente "Bienvenido usuario x" y botones llamados "cargar imagen", etc. Lo bueno de esto es que descubrirá si algo en el back-end está roto.

A medida que avanza el desarrollo, es posible que necesite más cosas o menos. Pero en algún momento, usted decidirá que el backend está casi terminado. Ahora tiene una interfaz de usuario que contiene todos los archivos adjuntos necesarios, y puede pasar mucho tiempo haciendo todas las cosas gráficas.

Sin embargo, ten cuidado, no es infalible. Necesita un poco de previsión para ver surgir ciertos problemas. Por ejemplo, es posible que necesite investigar los componentes de la interfaz de usuario para mostrar los datos de manera sensata.

Carlos
fuente
¿Y dónde entra en juego el cliente en su metodología? Tenga en cuenta que generalmente su cliente solo tiene una idea muy general de lo que quiere. Depende de usted descubrir cómo "extraer de ellos" exactamente lo que quieren para poder construirlo. Su metodología acaba de construir lo que cree que quiere el cliente, pero rara vez será lo que realmente quiere el cliente. Así que ha perdido una tonelada de tiempo codificando algo que el cliente no quiere.
Dunk
Ah, mis "clientes" están sentados a mi lado, y tengo experiencia en el campo que me da una muy buena idea de lo que se quiere. Básicamente, siempre estamos cerca del producto final, UI sabio, y siempre puedo obtener comentarios. No había considerado el problema de tener un ciclo de retroalimentación largo. Supongo que tener el dominio del conocimiento es clave.
Carlos
0

Si utiliza un buen sistema de seguimiento de hitos y problemas, puede evitar algunos de estos problemas porque, de un vistazo, la gerencia puede ver cuán productivo está siendo. Podrán ver que has completado el 80% del backend y que la interfaz de usuario es el próximo hito; podrán ver que tiene un conjunto de tareas de interfaz de usuario y backend para finalizar para un hito de función específico. Pero todo comienza con los requisitos del proyecto, y la respuesta de Doug T plantea algunos puntos positivos sobre ese aspecto del diseño de un sistema.

Derek
fuente
0

Piense en el punto de vista de sus usuarios / clientes. Un sistema de software es una colección de características que le da a estos usuarios / clientes algo de valor. Por supuesto, cada una de estas características tiene una interfaz de usuario, un backend y algunas otras cosas.

Cree su sistema siempre característica por característica, e intente dividir en características muy pequeñas. De esta manera, siempre estará cerca de tener algo más que ofrecer a sus clientes, recuerde que el desarrollo de software no se trata de construir la versión 1.0, sino de ir a la versión 1.0.1 a la 1.0.2 y así sucesivamente ...

AlfredoCasado
fuente
0

Depende. ¿Qué tan bien definidos están sus requisitos? ¿Cuánto del sistema está enfrentando la interfaz de usuario?

Según mi experiencia, la mayoría de los clientes no saben lo que quieren hasta que ven algo frente a ellos. Por lo tanto, normalmente proporciono algunos marcos de alambre de aspectos clave de la interfaz de usuario o entrego la mayoría de la interfaz de usuario (no funciona). Esto permite que el cliente cambie de opinión sobre las características / funciones sin demasiado impacto ya que el diseño de la base de datos y la estructura del código todavía están en fase de diseño; es fácil modificar el diseño. Es un orden de magnitud más fácil / rápido cambiar el diseño antes en el proyecto que luego.

Los estados ágiles también deben trabajar primero en los elementos más difíciles y los más importantes. Fallar rápido . Entonces, una vez que el cliente ha visto la interfaz de usuario, me concentro en construir componentes pequeños que sean completamente funcionales, hablar lo más importante y lo más difícil de implementar primero para que sepa lo antes posible si va a encontrar algún obstáculo.

Luego, tiene sus sprints y se comunica constantemente con el cliente, desarrollando tanto la IU como los aspectos funcionales en algún momento.

Daveo
fuente