¿Cómo manejar las "condiciones" (o requisitos no funcionales) para la planificación/priorización/asignación de trabajo de un proyecto?

Parece que el mundo está haciendo un buen trabajo en la gestión de los requisitos funcionales de un sistema: puede vincularlos a los beneficios, priorizarlos y administrar su programa de implementación (supongamos un mundo ideal :)

Ahora considere 'capacidades' como modificabilidad, usabilidad, adaptabilidad, reutilización, seguridad, confiabilidad, disponibilidad, etc., etc.,

Técnicamente, uno puede vincularlos con posibles beneficios finales y también priorizar su importancia para un negocio, pero ¿CÓMO se debe administrar su implementación? Suponiendo que priorice las funciones y las necesidades en la misma "pila", por así decirlo, es posible que la disponibilidad sea menor que el conjunto de funciones de "reserva de boletos" (por ejemplo).

Los agilistas pueden argumentar que el diseño debe revelarse por sí mismo y que pueden 'refactorizar' la disponibilidad o la seguridad, etc., más adelante. Honestamente, todo se puede agregar al sistema mediante la refactorización, pero los costos pueden ser prohibitivos y es por eso que uno debe dedicar algo de tiempo (puede ser más) por adelantado al tener en cuenta tales problemas, en mi opinión.

Así que mi pregunta es esta: ¿debería realizar una priorización separada para las enfermedades? ¿Deberían estar en una 'pila' separada (o atraso) propia? ¿Cuál debería ser un buen orden de secuencia al implementar el sistema? Si de hecho realiza dos actividades de priorización independientes, ¿cómo puede compararlas y convencer a las partes interesadas de que está haciendo cosas valiosas primero? Básicamente, ¿cómo justificarías hacer gestión/planificación/diseño de funcionalidades sobre el diseño de conjuntos de funciones?

Dado que las enfermedades tienen compensaciones asociadas, debe poder equilibrarlas bien y pensar en ello más tarde o seguir a YAGNI (no lo necesitará) no será suficiente. ¿Que sugieres?

Respuestas (4)

Los requisitos no funcionales, las 'capacidades' o (el mejor nombre para ellos en mi opinión) los atributos de calidad tienen una influencia significativa sobre la arquitectura. Dado que los atributos de calidad no son realmente algo que su sistema hace sino algo que su sistema es , debe tratarlos de manera diferente a los requisitos funcionales.

Es por esta razón que no es apropiado tratar los atributos de calidad de la misma manera que lo haría con otros elementos de su cartera de pedidos. Ponerlos en la cartera de pedidos implica que se pueden "hacer", lo que nunca puede suceder, ya que muchos atributos de calidad tienen influencia en muchas funciones en muchas iteraciones; algo como la capacidad de prueba, escalabilidad o mantenimiento no es algo que un cliente pueda elegir para un sprint, así que no lo trate como una función en la cartera de pedidos.

Así que mi pregunta es esta: ¿debería realizar una priorización separada para las enfermedades?

Sí. Los atributos de calidad generalmente se registran como un escenario. Estos pueden ser escenarios "formales" de 6 partes o historias de uso simple. Lo más importante es registrar los estímulos, la respuesta y el entorno. Cuanto más específico y medible, mejor. Lo mejor es recoger los grandes, los más importantes al principio utilizando una técnica como el Taller de Atributos de Calidad . El resultado del QAW es una lista priorizada de escenarios de atributos de calidad.

¿Deberían estar en una 'pila' separada (o atraso) propia?

Sí. Los atributos de calidad deben rastrearse por separado . Dos razones.

  1. No puede probar los atributos de calidad de la misma manera que prueba las funciones. Muchas veces necesitará razonar sobre la arquitectura para comprender si una propiedad específica del sistema se promueve o inhibe de manera adecuada. A medida que se desarrolla el sistema, algunos tipos de atributos de calidad pueden volverse comprobables (p. ej., rendimiento o confiabilidad: influye en las estructuras dinámicas), otros no (p. ej., mantenibilidad, modificabilidad: influye en las estructuras estáticas).
  2. Muchas características influirán (potencialmente muchas) en los atributos de calidad. Por ejemplo, la seguridad no es simplemente una función que se agrega al final: "¡Hagamos seguridad en este sprint!" -- pero algo que debe integrarse, potencialmente, en cada característica que cree.

¿Cuál debería ser un buen orden de secuencia al implementar el sistema?

El truco de esto es que puede poner historias discretas de deuda técnica en la cartera de pedidos (con algunos clientes). Es decir, tareas discretas que influyen directamente en los atributos de calidad específicos. Un ejemplo: "El módulo XYZ tiene muchos errores porque el código está mal escrito, necesitamos refactorizarlo para que sea más fácil de mantener".

Hay muchas estrategias para lidiar con la deuda: frutas al alcance de la mano, aplastar "granjas de errores", "cerrar" la deuda con características para garantizar que esté al tanto de las cosas...

Si de hecho realiza dos actividades de priorización independientes, ¿cómo puede compararlas y convencer a las partes interesadas de que está haciendo cosas valiosas primero? Básicamente, ¿cómo justificarías hacer gestión/planificación/diseño de funcionalidades sobre el diseño de conjuntos de características?

Puede haber compensaciones dentro de un diseño, por ejemplo, la seguridad es más importante que el rendimiento, por lo que es tan importante conocer las grandes por adelantado. Recuerde, los atributos de calidad influyen en el diseño; no son el artefacto que se entrega. No haces seguridad, esta es una propiedad del software que construyes. Acordar esto por adelantado es la única manera de garantizar que las funciones que ofrece tengan la calidad adecuada . Podría haber un millón de formas de resolver un problema, pero solo unas pocas con las propiedades deseadas. No haga esto y sus características serán rechazadas cada vez. "Sí, calcula el XYZ correctamente... pero dos minutos es demasiado..."

Eso tiene mucho sentido. Gracias por las aclaraciones punto por punto!
+1; Tiene razón en que no puede rastrear los atributos de calidad en sí mismos. Agregaría que los requisitos/historias/características se pueden extraer de ellos, y se pueden rastrear y priorizar. Mi respuesta asumió que esto se hizo, en cuyo caso es mi opinión que deben rastrearse y priorizarse junto con todo lo demás.

¿Debería realizar una priorización separada para las enfermedades? ¿Deberían estar en una 'pila' separada (o atraso) propia?

Las otras respuestas aquí están en el camino correcto. Las funciones para desarrolladores deben estar en la misma cola que las funciones para otras partes interesadas del negocio.

Esto le permitirá realizar un seguimiento de las dependencias entre funciones y ilityfunciones relacionadas con el negocio. También ayudará con su siguiente pregunta:

¿Cuál debería ser un buen orden de secuencia al implementar el sistema? Si de hecho realiza dos actividades de priorización independientes, ¿cómo puede compararlas entre ellas?

Una vez que trata todas las características de la misma manera, puede priorizarlas de la misma manera:

  • Análisis coste-beneficio
  • Presupuesto frente a la necesidad empresarial prevista, no solo para este sprint, sino también para el próximo trimestre o año
    (o el tiempo que dure su cartera de pedidos)

... [¿cómo puede] convencer a las partes interesadas de que está haciendo cosas valiosas primero? Básicamente, ¿cómo justificarías hacer gestión/planificación/diseño de funcionalidades sobre el diseño de conjuntos de funciones?

En los equipos en los que he trabajado, usamos el término Deuda técnica para ayudar a las partes interesadas del negocio a comprender la importancia de mantener la base del código.

La deuda técnica suena como una buena idea, pero tiene el riesgo de ser el hoyo del perezoso, es decir, las cosas podrían simplemente tirarse y mientras el 'negocio esté en el dinero' nadie le prestaría mucha atención en mi humilde opinión (I sé de algunos casos de este tipo personalmente :)
Someto todas las funciones al mismo análisis (incluidas las funciones), sin embargo, no hay garantía de que las funciones siempre superen la función en la priorización y puede ser bastante difícil decir 'tenemos que hacer eso primero'...
@Nupul: sugiero que se use la deuda técnica para ayudarlos a comprender el concepto en general, para que puedan entender por qué ilitylas funciones aparecen en la misma cola. No estoy sugiriendo que se use como un cubo para lanzar elementos o un sumidero de recursos ilimitado. No implementa funciones ni realiza cambios a menos que tenga que hacerlo y/o tenga el presupuesto, y haya hecho una predicción fundamentada de los beneficios que traerá. Esto es lo mismo que las características que provienen directamente de los requisitos comerciales principales. ¿Querías decir otra cosa?
@Nupul: no debe usar un proceso que garantice que ilitiessiempre tendrá una prioridad más alta. Los elementos deben priorizarse según el costo y el beneficio, que deben basarse en una predicción lo más realista posible. La predicción debe basarse en el costo básico, las dependencias de costos y el "interés" del costo. Por ejemplo, si implementa esto ahora, costará menos, o si implementa A antes que B, B será más económico. En muchos casos, esta predicción se puede hacer mediante la comprensión del alcance de cada característica comercial y qué código probablemente tocará, luego un código grep y tal vez una implementación de pico.
Eso tiene sentido... por lo que puede estar bien que las ilidades resulten menos importantes para algunas características, pero las implementaciones posteriores podrían ser prohibitivamente costosas y eso puede usarse para tener en cuenta el costo/beneficio o el análisis de compensación...

Los manejaría con el mismo retraso que todas sus historias. Solemos abordar los requisitos no funcionales de 3 maneras (en orden de preferencia):

Como parte de nuestra Definición de Listo donde se aplica a toda la aplicación.

En nuestros Criterios de aceptación para aquellos que solo se aplican a una historia o subconjunto de historias.

Como una Historia donde no pueden ser considerados claramente como parte de los dos primeros pero no queremos olvidarlos.

Soy consciente de 'cómo manejarlos'; la pregunta es cómo planificar su implementación; es posible que requieran un análisis arquitectónico inicial y es posible que no conduzcan a ningún código per se para ese sprint/iteración. ¡Simplemente no puede 'posponerlo' para una iteración posterior donde los costos de refactorización pueden ser abrumadores! Habría sido mucho más barato pensarlo antes... y deseo saber cómo equilibrar/planificar/manejar algo así.
@Nupul: Lo que está describiendo no es diferente de las características que implementan los requisitos comerciales básicos. Ambas son actividades de recopilación de requisitos y CBA. No puede saber nada sobre lo que ignora :) En cuanto a la secuenciación, los desarrolladores podrían recopilar requisitos ilitysen paralelo con los analistas de negocios recopilando requisitos sobre características principales. Priorizar antes de eso (sobre qué incluso reunir requisitos) debe basarse en la intuición y el acuerdo entre las partes interesadas (los desarrolladores son las capacidades WRT de las partes interesadas).
Mi punto es que es bastante raro que necesitemos pensar en priorizarlos por separado. La mayoría de las veces, están cubiertos por nuestra definición de hecho o criterios de aceptación, por lo que simplemente se hacen como algo normal con sus historias. En las raras ocasiones en que necesitamos crear una historia para ella, el propietario del producto la prioriza con el resto de la cartera de pedidos.

Tenga siempre un único backlog y deje que las necesidades del negocio dicten las prioridades.

Los requisitos no funcionales suelen ser más difíciles de resolver frente a los requisitos funcionales y si priorizarlos por encima o por debajo de los requisitos funcionales, es una pregunta que debe hacer a las partes interesadas o al propietario del producto.

El orden de priorización depende completamente del contexto/las necesidades comerciales de su producto.

Trabajo probando sistemas integrados para organizaciones de seguridad pública y para un policía de patrulla (nuestro usuario típico), la confiabilidad del producto es primordial y está muy por delante en términos de prioridad frente al nuevo conjunto de características que el producto tiene para ofrecer.

¡Absolutamente! Puedo imaginar que ese sea el caso en su dominio. En los lugares donde es un poco más fácil determinar el valor de las enfermedades, estos problemas no surgen. La situación que es un poco molesta es cuando no está claro y la refactorización de la 'arquitectura' es prohibitivamente costosa y debe hacerlo por adelantado...
Estoy completamente de acuerdo en que aquí es clave un único trabajo pendiente para los requisitos "funcionales" y "no funcionales". También es importante que el responsable del presupuesto (o propietario del producto) sea responsable de la eficacia operativa del producto. Varias personas han encontrado útil esta publicación de blog que escribí: Hablemos de características operativas, no de requisitos no funcionales: blog.softwareoperability.com/2013/04/08/…