Come si può applicare agile alle applicazioni che richiedono elaborazioni complesse?


12

La maggior parte della letteratura sull'agile sembra essere distorta verso le applicazioni aziendali di tipo CRUD in cui l'utente è praticamente consapevole di ciò che accade dietro le quinte. (Va bene perché la maggior parte del codice in fase di scrittura appartiene probabilmente a questa classe.)

Per questo tipo di applicazione la relazione tra user story (requisiti) e attività di sviluppo è per lo più semplice: basta dividere la user story in alcune attività.

Esiste tuttavia un altro tipo di applicazione in cui la maggior parte del codice ha a che fare con elaborazioni complesse che non sono direttamente visibili all'utente. Esempi potrebbero essere:

  • I compilatori
  • Sistemi di analisi delle immagini di auto a guida autonoma
  • Sistemi di simulazione del flusso di fluidi

Qui può essere davvero difficile mettere in relazione compiti e storie degli utenti. Esistono tecniche per superare questo problema o è solo qualcosa che dobbiamo accettare e trarne il meglio?


6
Non il downvoter, ma suppongo sia perché la domanda si basa su una premessa errata. I sistemi complessi IMO sono ancora più adatti per uno sviluppo di stile Agile in virtù del fatto che sono più complessi. Più complesso è il sistema, più è probabile che abbia requisiti emergenti. Agile SwDev è stato creato per gestire meglio i requisiti emergenti.
RubberDuck,

4
@RubberDuck: "Suppongo sia perché la domanda si basa su una premessa errata.": IMO, questo motiverebbe una risposta in cui viene spiegata la premessa falsa, non un voto negativo.
Giorgio,

Se l'uso capisca la logica o no è totalmente irrilevante per il processo agile. Spetta a un team mappare una user story su un'implementazione E stimare quanto tempo ci vorrà. Se è complicato e / o molto lavoro, il team può dividere la storia in più piccoli. Il tipo di logica non ha importanza.
Martin Maat,

2
"La maggior parte della letteratura su Agile sembra essere distorta verso le applicazioni aziendali di tipo CRUD" - E la maggior parte della letteratura su Java sembra distorta verso la stampa della stringa "Hello World" sulla console (o calcolo alternativo dell'ennesimo numero di Fibonacci). Ciò non significa che sia l'unica cosa per cui Java è adatto. La ragione è la stessa in entrambi i casi: è difficile spiegare esempi realistici in un post o tutorial sul blog. [Nota: questo è un commento iperbolico che cerca di illustrare le basi della falsa premessa.]
Jörg W Mittag

1
Agile non richiede attività e storie utente. È possibile utilizzare qualsiasi forma di specifica desiderata. Il punto è la flessibilità.
Frank Hileman,

Risposte:


9

Questo si è rivelato più lungo di quanto avessi pianificato (era iniziato come un commento), ma spero che la lunghezza / i dettagli aggiunti siano utili e li trovi giustificati.

Agile non è specifico delle app CRUD

La maggior parte della letteratura sull'agile sembra essere distorta verso le applicazioni aziendali di tipo CRUD in cui l'utente è praticamente consapevole di ciò che accade dietro le quinte. (Va bene perché la maggior parte del codice in fase di scrittura appartiene probabilmente a questa classe.)

Penso che questo sia perché è più facile creare esempi di questo tipo facili da seguire, non proprio perché la metodologia si rivolge a quel tipo di sistemi. Se crei un esempio non così facile da seguire, rischi di far bloccare il lettore cercando di capire l'esempio quando il tuo punto doveva insegnare al lettore concetti concreti.

User Stories! = Requisiti

Per questo tipo di applicazione la relazione tra user story (requisiti) e attività di sviluppo è per lo più semplice: basta dividere la user story in alcune attività.

Una user story non è la stessa di un requisito. È vero, ci possono essere alcune sovrapposizioni a seconda di quanto sia "alto livello" il requisito, ma generalmente non è lo stesso. Ho l'impressione che stai affrontando la stessa trappola in cui sono caduti molti dei miei ex manager: pensare alle storie degli utenti semplicemente come sinonimi di "requisiti", che è simile a quando gli utenti SVN provano a passare a Git, ma continuano pensando in termini di SVN. (Si imbattono quindi in problemi dovuti alle cattive ipotesi di partenza.)

IMHO, una differenza chiave tra i requisiti e le storie degli utenti è che i requisiti specificano, in dettaglio, come devono comportarsi determinati componenti del sistema; sono specifiche che includono input, output, presupposti / pre-condizioni, possibili eccezioni sollevate, ecc. Si concentrano su ciò che fa il sistema .

OTOH, le storie degli utenti si concentrano sul risultato atteso per l'utente finale senza cercare di creare una specifica comportamentale dettagliata per i componenti di sistema. Si concentrano sull'esperienza utente prevista .

Quello che ero solito fare, e questa era una pratica adottata dal mio team, era di scomporre le storie degli utenti in attività. I tuoi compiti potrebbero essere specifici o vaghi come volevi / ne avresti avuto bisogno, ma dovevano essere i tuoi indicatori di progresso per il vero lavoro svolto per portare la storia a uno stato compiuto.

Esempio

Ricordo approssimativamente un USA su cui ho lavorato anni fa, in cui gli utenti dovevano autoassegnare i casi di test in modo che tutti i membri del team fossero a conoscenza di quali TC stavano lavorando per evitare sforzi duplicati; l'interfaccia utente era un'applicazione web (n interna). L'utente ha visto solo un pulsante, ma la storia è stata divisa in diverse attività che includevano alcuni dettagli tecnici di implementazione, ecc.

Visibilità dell'utente

Esiste tuttavia un altro tipo di applicazione in cui la maggior parte del codice ha a che fare con elaborazioni complesse che non sono direttamente visibili all'utente.

È possibile renderlo visibile all'utente in qualche modo?

Prendi in considerazione un GPS. Quando ti sei perso il turno, non vedrai il processo di ricalcolo del percorso effettivo, ma l'utente riceve un feedback utile (ad esempio "Ricalcolo ...").

I compilatori possono visualizzare avvisi o errori o includere nuove impostazioni / opzioni nella GUI affinché gli utenti possano vedere che è stato aggiunto qualcosa di nuovo. Penserei che gli utenti per i compilatori sarebbero programmatori, giusto? Non vedrebbero il supporto per un nuovo standard aggiunto?

Sebbene il supporto di un nuovo standard sia probabilmente a livello di funzionalità e debba essere suddiviso in storie utente, ti sei assicurato che, almeno in alcuni casi, non stai provando a usare storie quando invece dovresti usare funzionalità ?

L'analisi delle immagini in un'auto potrebbe essere formulata in modo tale da far sapere all'utente che le possibilità di finire in un incidente d'auto sono state ridotte. Per esempio:

Come passeggero in un'auto a guida autonoma, ho bisogno della probabilità che il veicolo causi un incidente schiantandosi contro un oggetto non riconosciuto per essere il più vicino possibile allo zero, in modo da poter viaggiare in sicurezza.

Che gli Stati Uniti catturano, ad alto livello, cose che dovresti normalmente specificare usando una combinazione di requisiti funzionali e non funzionali, tra cui sicurezza, sicurezza, ecc.

Tuttavia, un requisito potrebbe riguardare maggiormente il sistema; per esempio:

La funzione abcnel componente Adeve avere il valore della soglia di tolleranza ridotto nell'algoritmo di confronto delle immagini per rilevare meglio gli oggetti che si muovono lentamente.

Per me, questo sarebbe facilmente un compito sotto la user story che ho menzionato sopra, intitolato qualcosa come: Ridurre la tolleranza nella funzioneA.abc e quindi includere altri dettagli rilevanti in essa.

Per un sistema di simulazione fluido, potresti persino avere una barra di avanzamento che fornisce feedback sulle attività in background che il sistema sta eseguendo, se questo ha senso. (C'è sempre un modo per informare l'utente di qualcosa, anche se potresti voler evitare di essere spammato.)

Non so abbastanza sui domini particolari che hai menzionato per trovare esempi migliori e / o più realistici, ma se c'è un take-away qui è che puoi usare diversi modi per fornire feedback degli utenti su qualcosa di meno visibile che il sistema potrebbe fare, cioè potrebbero esserci modi per rendere le cose invisibili un po 'più visibili. (Anche se si riduce a scrivere una serie di note di rilascio che documenta quanto più velocemente le prestazioni del sistema sono ora dovute ai tuoi sforzi, ecc.)

Relazione tra storie e compiti

Qui può essere davvero difficile mettere in relazione compiti e storie degli utenti.

Il nostro approccio era quello di mantenere le storie degli utenti focalizzate su ciò che la richiesta era, perché era stata fatta e quali cose dovevano essere vere per considerare "fatto" gli Stati Uniti. Il come è stato sempre lasciato fuori dagli Stati Uniti e lasciato agli sviluppatori.

Gli sviluppatori avrebbero suddiviso il problema descritto negli Stati Uniti in una serie di attività su cui avrebbero lavorato.

Lo dico come qualcuno che, per la maggior parte, ha eseguito una programmazione lato server back-end, che è probabilmente "invisibile" come si può ottenere per l'utente finale.

A seconda di ciò che dovevo fare, a volte usavo AJAX per mostrare una semplice animazione / caricamento "caricamento ..." in modo che l'utente sapesse che dovevano aspettare un po 'per completare qualcos'altro, senza avere l'impressione sbagliata. A volte era così semplice. Un compito per questo sarebbe appropriato.

Paradigma, pratica ed esperienza diversi

Esistono tecniche per superare questo problema o è solo qualcosa che dobbiamo accettare e trarne il meglio?

Oltre ad accettare il cambio di paradigma, la pratica e l'esperienza maturata, probabilmente non c'è molto altro da dire. Ho visto spesso persone che cercavano di prendere scorciatoie durante il processo. Lo sconsiglio, soprattutto se stai iniziando. Man mano che acquisisci più esperienza, puoi consentire una certa flessibilità, ma evita di minarti.

Data la tua precedente formulazione, stai ancora pensando alle storie come se fossero "requisiti ribattezzati", che credo sia un falso presupposto. Penso che questo sia un sintomo di una questione più profonda riguardante le differenze fondamentali tra approcci Agile e non Agile.

In secondo luogo, penso che dovresti accettare che l'agile è un cambio di paradigma rispetto alla cascata, il che significa che, sebbene il processo abbia obiettivi simili, lo affrontano in modi molto diversi. (Pensa a SVN vs Git, se questo aiuta.)

Cerca di migliorare la tua attuale comprensione delle differenze concettuali tra requisiti e storie degli utenti e accetta che non siano la stessa cosa.

Imparare dai tuoi Sprint - Retrospettive

Quello che non posso sottolineare abbastanza è la retrospettiva tra Scrum Master e gli sviluppatori alla fine di ogni sprint. Questo è il luogo in cui discutono di cose che "sono andate bene" o "non sono andate bene" in modo onesto / trasparente, e quali cambiamenti fattibili saranno implementati per il prossimo sprint per affrontare i punti "non è andato bene" .

Ciò ci ha permesso di adattarci e persino di imparare dalle reciproche esperienze e, prima di rendercene conto, avevamo migliorato in modo significativo come misurato dalla coerenza generale della velocità del nostro team.


"User Stories! = Requisiti": non intendevo dire che i due sono sinonimi. Non ogni requisito è una storia utente. Ma penso che tutte le storie degli utenti siano requisiti. Considero i requisiti come una struttura gerarchica in cui le storie degli utenti rappresentano un livello specifico di dettaglio. Sei d'accordo?
Frank Puffer,

@FrankPuffer Penso che visualizzare le storie degli utenti come se fossero un livello diverso in una gerarchia di requisiti fondamentalmente sta mescolando concetti diversi. Sul lato Agile, una gerarchia assomiglia di più a: Temi >> Epiche >> Funzionalità >> Racconti utente >> Attività . I requisiti sono generalmente divisi in requisiti funzionali e non funzionali nel più tradizionale approccio a cascata, ma non ho trovato una gerarchia reale; ciò detto, non sarei sorpreso se qualcuno dovesse suddividere ricorsivamente un requisito in requisiti "sub" più piccoli. In ogni caso, stai mescolando concetti diversi.
code_dredd,

I sistemi di gestione dei requisiti come PTC Integrity trattano i requisiti come una gerarchia. Questo può essere un vantaggio quando si associano i requisiti a un documento di specifica.
Frank Puffer,

@FrankPuffer Sì, è per questo che ho detto che non sarei stato sorpreso. Detto questo, mi chiedo che la mia risposta abbia chiarito qualsiasi cosa per te. L'analogia SVN vs Git è stata utile? (Si presume che tu abbia familiarità con entrambi i sistemi, il che sembrava ragionevole in un contesto di sviluppo software.)
code_dredd

Ok, ho letto male il "non" come "sarebbe". E sì, trovo la tua risposta molto utile e probabilmente la accetterò. Probabilmente ho solo bisogno di un po 'di tempo per abituarmi all'idea di non considerare le storie degli utenti come requisiti.
Frank Puffer,

4

In questi casi si possono certamente applicare principi agili. Come?

  • I compilatori possono avere nuove funzionalità linguistiche aggiunte in seguito in storie utente separate
  • Ai sistemi di analisi delle immagini possono essere aggiunte nuove funzionalità come diverse classificazioni delle immagini
  • I sistemi di simulazione del flusso di fluido possono tenere conto di diversi aspetti del modello nelle loro simulazioni

Non devi mangiare l'intero elefante in un boccone. Agile ti chiede solo di mostrare che hai pulito il tuo piatto prima della prossima porzione di elefante.


Penso comunque che rimarranno una o più storie utente che richiedono molte delle cosiddette funzionalità di base. Spesso non si inseriscono in un singolo sprint. Come dovrebbe essere gestito?
Frank Puffer,

1
Misuri il successo con applicazioni eseguibili che i clienti possono testare, vedere o toccare. In tal caso, dai loro un giocattolo che generi il senso di progresso in questo modo. Ad esempio, probabilmente non puoi rilasciare un'auto a guida autonoma nel primo sprint, ma puoi fare una demo di come il tuo algo fa ricognire le persone. Più tardi, come riconduce segnali e animali. Più tardi come misura distanze, dimensioni, ecc ... L'auto a guida autonoma è molto, molto lontana in uno sprint remoto che chissà se accadrà mai.
Laiv

2
@Laiv: Sarebbe bello ma non sono sicuro che funzioni. In particolare, dopo i primi sprint, il software non sarà in grado di fare nulla a cui il cliente può fare riferimento. Avrai progressi tecnici ma sarà difficile, se non impossibile, comunicarlo al cliente.
Frank Puffer,

2
Perché? Perché è stato scritto su Stone da qualcuno estraneo al tuo progetto? Mi aspetto che Agile si adatti alle mie esigenze, non altrimenti. Se dico che posso insegnarti a pattinare in 4 settimane e una volta il 5 non riesci ancora a stare in piedi, significherebbe che non stai imparando a pattinare? O solo che ci vorrà un po 'di più? Il manifesto agile non è stato scritto su pietra né le regole di Scrum sono i comandamenti di Tend.
Laiv

2
Il punto degli sprint è rendere il cliente parte delle tue iterazioni. Per comunicare con loro utilizzando il codice consegnato. Non piani e promesse. Richiede di concentrarsi sulla risoluzione del problema. Non richiede che la prima cosa che consegnerai sia incastonata. Richiede di dimostrare che vale la pena pagare ogni sprint.
candied_orange,

1

Trovo che le persone che aderiscono rigorosamente alle storie degli utenti o si impegneranno in un esercizio molto sciocco di inventare modi molto inverosimili in cui i cambiamenti tecnici del back-end incidono sull'utente (all'insaputa dell'utente ovviamente perché sono solo alcuni ingenui utente e stai parlando di cambiamenti complessi nella tua linea di analisi dei dati o qualcosa del genere) o saranno semplicemente in perdita per "come possiamo organizzare questo lavoro!?!"

Penso che l'ovvia soluzione sia quella di essere più pragmatici. Se il lavoro è di natura molto tecnica e non ha un impatto particolarmente evidente sull'utente, non perdere il sonno cercando di spiegare come funziona. Basta scegliere un modo ovvio e semplice per beneficiare gli utenti e quindi orientare la storia sui dettagli necessari affinché gli sviluppatori possano svolgere il proprio lavoro. Lo trovo incredibilmente frustrante quando un PO insiste nel non avere informazioni tecniche nella storia quando è assolutamente necessario. Non è solo una visione molto olistica di cosa sia realmente quel manufatto (la storia). Come pensano che esista solo per loro, nella maggior parte dei casi è importante anche per gli ingegneri.

Per la maggior parte di questi compiti tecnici c'è un po 'di frutta a galla per quanto riguarda l'impatto dell'utente, se questo sta migliorando l'efficienza in modo che le consegne future saranno più veloci, migliorando le prestazioni, ecc. Non sono proprio quello a cui le persone tendono a pensare quando pensano alle "storie degli utenti", ma se l'azienda vuole capire perché dovresti assumerti un debito tecnico o qualcosa in tal senso, allora queste spiegazioni sono di solito le più semplici da fornire.

tl; dr non lasciare che uno scrumnazi renda la tua vita ancora più difficile semplicemente perché sono troppo quadrati per adattarsi. Essere adattivi è un concetto fondamentale di agile dopo tutto. La stretta aderenza a Scrum o Agile di solito vola in faccia o pragmatismo e praticità (ciò che effettivamente funziona meglio).


Sono tutto per essere flessibile, ma sinceramente l'utente non si preoccupa particolarmente dei dettagli tecnici, purché le loro storie siano soddisfatte. Non devi essere "strettamente agile" per avere buoni requisiti; e per buoni requisiti intendo i requisiti che sono ciascuno accompagnato da un test di accettazione che dimostra inequivocabilmente che il requisito è soddisfatto. Le persone che "si impegnano in esercizi molto sciocchi" stanno ovviamente sbagliando, ma ciò non significa che stiano seguendo una nozione di "mischia severa".
Robert Harvey,

@RobertHarvey Sono d'accordo che i dettagli tecnici sono irrilevanti per l'utente, ma il mio punto è che gli artefatti contenenti le storie degli utenti hanno uno scopo più ampio del semplice comunicare come funzionano le cose per l'utente (o almeno dovrebbero). Come si applicano i requisiti relativi all'architettura, all'estensibilità, alle prestazioni e così via se scrivono storie esclusivamente per gli utenti? Adottare un approccio "user story" incoraggia gli sviluppatori a scrivere un codice di scarsa qualità. E non sono gli utenti a leggere le "storie degli utenti", sono sviluppatori e qa, è sciocco escludere deliberatamente le informazioni pertinenti perché sono tecniche.
evanmcdonnal,

0

Penso che il problema sia nel dare alle storie degli utenti un significato che non hanno. Scrum usa il termine PBI, o Product Backlog Item, che penso sia infinitamente migliore. I PBI seguiranno spesso un formato di user story, ad esempio, potresti avere un PBI come "Gli abbonati dovrebbero essere in grado di visualizzare i dettagli del loro abbonamento", ma potresti anche avere un PBI come "Crea una procedura memorizzata per ottenere i dettagli dell'abbonato ".

Le storie degli utenti sono uno strumento . Ti aiutano a formulare descrizioni e requisiti delle funzionalità in base al fatto di metterti nei panni di un utente. Ma, proprio come una chiave inglese è inutile quando devi appendere una foto, ci sono momenti in cui potresti non aver bisogno di una user story.

Detto questo, molte squadre in realtà giocano in maniera veloce e libera con la parte "utente". Potrebbero avere "user story" come "Come sviluppatore, devo essere in grado di chiamare una procedura memorizzata per ottenere i dettagli dell'abbonato", essenzialmente una "storia dello sviluppatore" per così dire. Questa è un'opzione ugualmente valida, ma personalmente, dico fintanto che puoi descrivere ciò che deve essere fatto e inventare una serie di criteri di accettazione, non importa se hai una storia utente reale o meno.


1
Non sono d'accordo con questo, tranne in casi molto strani e rari. In Scrum l'HOW è di competenza del team di sviluppo, non del proprietario del prodotto. Tuttavia, il proprietario del prodotto dovrebbe essere responsabile dei PBI. Quindi un PBI come "creare una procedura memorizzata" toglie al team di sviluppo il diritto di scegliere il HOW. I PBI, indipendentemente dal fatto che siano user story o meno, dovrebbero spiegare quale sia il valore aziendale nel fare l'IPP. La creazione di una procedura memorizzata non riguarda il valore aziendale, ma i dettagli dell'implementazione.
RibaldEddie,

Non è questo il punto. Quello era solo un esempio. Potresti semplicemente cambiare "stored procedure" in qualcosa di generico come "a way". Il punto è che non deve necessariamente essere una user story.
Chris Pratt,

l'intero punto di un esempio deve essere un esemplare. Se il tuo esempio "non è il punto", qual è il punto dell'esempio ??
RibaldEddie,

-3

Questi tipi di applicazioni sono esattamente quelli in cui sono presenti competenze diverse e si svilupperanno ulteriormente. I membri del team avranno formazione diversa, diversi progetti di hobby e diverse esperienze lavorative passate con competenze diverse. Inoltre, se qualcuno sviluppa un particolare pezzo di codice, ci si può aspettare che lo sviluppatore sia quello che conosce meglio il codice. Quindi potrebbe avere senso assegnare ulteriori compiti di sviluppo che coinvolgono lo stesso codice allo stesso sviluppatore.

Nel processo agile più popolare, Scrum, c'è la pianificazione del poker in cui a ogni attività viene assegnato un livello di difficoltà. Il livello di difficoltà non dipende dalla persona che svolge tale compito secondo il processo. Quindi durante lo sprint, le persone sono considerate omogenee in modo tale che ogni persona dovrebbe essere in grado di scegliere ogni singolo compito e implementarlo. In semplici progetti CRUD, questo presupposto vale. Ma in progetti molto complessi e difficili, certamente no.

Non userei un processo agile per questo tipo di progetti. La scelta migliore è quella di evitare qualsiasi processo formale e utilizzare solo una buona gestione del progetto. Quando si decide chi implementa una particolare funzionalità, considerare chi possiede le migliori competenze necessarie per questa funzionalità e la migliore conoscenza del codice esistente. Non è necessario alcun processo per questo. Probabilmente vorrai scrivere buoni documenti di design per tutte le funzionalità e tenerli aggiornati. Nota che non sto promuovendo un modello simile a una cascata qui: i documenti di progettazione non saranno tutti scritti all'inizio del progetto; scriverete invece nuovi documenti di progettazione quando sono necessarie nuove funzionalità.


5
Non proprio correlato alla mia domanda, ma lasciare sempre quello con le migliori competenze implementare una funzione può essere pericoloso. Ostacola la diffusione della conoscenza all'interno del team. Se è necessaria la manutenzione e l'esperto ha lasciato il team o è temporaneamente non disponibile, si avranno problemi.
Frank Puffer,

@FrankPuffer Per alcuni dei sistemi elencati, ad esempio auto a guida autonoma, se l'esperto lascia la squadra, sei nei guai. Periodo. Anche se probabilmente non è il caso che la codifica debba essere centralizzata, è anche irragionevole ipotizzare un'adeguata "diffusione della conoscenza" per consentire la sostituzione dell'esperto in tempi ragionevolmente brevi. Queste sono persone che avranno speso più di un decennio a ricercare il problema e presumibilmente sono vicine alla cima del loro campo su di esso. Probabilmente avrai bisogno di più persone come questa con competenze diverse. Tali progetti sono intrinsecamente rischiosi.
Derek Elkins lasciò SE il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.