Prova finale del concetto; come pianificare / prevedere / stimare il lavoro rimanente?

2

Abbiamo una dimostrazione pratica del concetto che implementa gli scenari del giorno di sole, ma dobbiamo iniziare a gestire i percorsi delle eccezioni. Siamo appaltatori e dobbiamo mettere insieme stime dettagliate per discutere questa fase successiva con il cliente prima di rinnovare il contratto.

Dettagli

Abbiamo impiegato 10-20 mesi di sviluppo per implementare la libreria proof of concept in JavaScript. Tocca le API del browser, le librerie di terze parti e si connette al software server proprietario del nostro cliente per la comunicazione bidirezionale in tempo reale. Attualmente questa libreria funziona dietro un'interfaccia utente HTML + JavaScript scritta dal nostro cliente. Nel prossimo futuro rilasceranno anche questa libreria come sdk.

Fino ad ora, ci siamo concentrati principalmente su scenari di giornata di sole per mettere insieme la dimostrazione del concetto. Ora che è terminato, dobbiamo portare la biblioteca alla maturità e supportare gli scenari dei giorni di pioggia nelle diverse aree della biblioteca, tra cui:

  • dati errati forniti tramite l'API dagli utenti sdk
  • percorsi di errore nel nostro codice
  • risposte di errori legali dall'API del browser e da librerie di terze parti
  • problemi di rete (jitter, limiti di larghezza di banda, disconnessione temporanea, ecc.)

Domanda: quale processo possiamo seguire per generare un elenco di attività ragionevoli di scenari di giorni piovosi che non dobbiamo ma sostenere. In altre parole: Come posso capire cosa manca tra (1) la mia dimostrazione di applicazione concettuale e (2) un'ipotetica applicazione matura e robusta che implementa le stesse funzionalità

Mi interessano anche suggerimenti di tipo retrospettivo su ciò che avremmo potuto fare mentre implementavamo la dimostrazione del concetto per rendere più facile la descrizione di questo lavoro.

Cosa farei nel vuoto

Senza un consiglio migliore, eseguirò un'analisi statica del codice che ho scritto, e le specifiche per le librerie di terze parti e le apis dei browser e identificherò possibili casi di errore. Iniziando dal tutto, lo dividerei in componenti, sottocomponenti, ecc. Quando avrò raggiunto una granularità sufficiente, eseguirò l'analisi statica o analizzerò le specifiche e specificherò i modi in cui potrebbe fallire (output di errore legale, casi di eccezione ragionevole, eccetera.). Quindi vorrei aggregare le modalità di errore per ciascun sottocomponente, quindi componente e ritorno all'intero e vorrei avere un elenco di scenari di giorni piovosi che ho bisogno di supportare.

Problemi con questo:

  1. come posso evitare di perdere qualcosa di importante?
  2. c'è un modo per evitare di analizzare codice e specifiche riga per riga?
  3. avremo bisogno di dare la priorità a questi scenari di giorni di pioggia - come divideremo la lista in più importanti e meno importanti? (probabilità che si verifichi?)
  4. come aggregare l'elenco di particolari casi di errore per particolari metodi / apis in qualcosa di abbastanza alto da consentire al progetto di prendere decisioni su cosa / quanto / quando? (Questo è strettamente correlato all'ultima domanda sulla definizione delle priorità)

Aggiornamento: ho fatto un FMEA (Analisi degli effetti in modalità fallimento) che è stato utile per analizzare i confini del sistema: gli scenari di giorni piovosi relativi al networking, i consumatori dell'API pubblica e (in misura minore) gli errori a livello di API di terze parti. Il processo FMEA suggerisce di utilizzare un team eterogeneo per generare l'elenco dei possibili errori, il che sarebbe di aiuto con il mio numero 1 (come evitare di perdere qualcosa di importante). Si occupa anche di # 3 (come stabilire le priorità) fornendo una metrica di priorità basata sulla gravità di un errore, sulla probabilità che si verifichi e sulla probabilità che venga rilevata. Non mi ha aiutato (a questo punto) a trovare una lista di scenari per il giorno piovoso per il codice che abbiamo scritto, e non ha risolto i miei problemi n. 2 e n.

    
posta alexanderbird 26.07.2017 - 18:22
fonte

4 risposte

1

Di solito sconsiglio di sviluppare un programma come questo. Prendere un prototipo e "venderlo" come funziona bene una volta che tutti i percorsi sono corretti, di solito si trasforma in un ROI su ogni piccolo errore. Una cosa che sentirai nel prossimo futuro è "Quanti utenti potranno vederlo. No, non ho intenzione di pagare per sistemarlo."

Tuttavia, la mia macchina di ritorno è attualmente nel negozio, quindi proseguiamo. Prima mai dire cose come "il prodotto è fatto eccetto ...". Ancora una volta, hai trascorso 15 mesi a sviluppare il prodotto. Ora ogni cosa che vuoi fare da questo punto sarà "ne vale la pena?". Se invece dici cose come "necessità di aggiungere uno smalto", o "solo bisogno di avere alcuni angoli arrotondati", sarai in un posto molto migliore. È facile spiegare che la casa è stata costruita ma deve ancora dipingere, quindi è guardare una casa costruita e cercare di spiegare che non è ancora stata costruita.

Comprendi che ciò che costruisci usando questo primo prototipo è un prodotto scadente. Funziona, hai appena detto che lo ha fatto. Semplicemente non funziona bene, e questo è il combattimento che avremo intenzione di andare avanti. In qualità di appaltatore, se non stai attento, potresti persino lavorare in un luogo in cui mangi il tempo fatturabile.

Considera di nuovo una casa. Ne hai uno costruito. Voi pagate. Ora fai un tour, e sembra bello, non eccezionale, ma buono. Più tardi, quando inizi a dare un'occhiata più da vicino, noterai che una delle pareti è più corta di quanto dovrebbe essere. Lo racconti ma il costruttore dice "Sappiamo, abbiamo detto che ci sono cose che non sono ancora state fatte, sarà un'altra X $". Come risponderesti?

So che sembra che sto selezionando, ma è molto importante inquadrare correttamente la situazione per evitare più problemi che puoi.

Ora, al tecnico. Hai due obiettivi. Innanzitutto il costo totale del "lavoro di verniciatura" DEVE essere inferiore al costo totale di sviluppo. In secondo luogo è necessario assicurarsi che la libreria funzioni.

Quindi, implementa un progetto di riferimento. Usa qualcosa come link e documenta come usare la lib. Assicurati che ogni metodo abbia una risposta positiva e negativa. foo (1) fa questo, ma chiamando foo ("sting") genera un errore. Man mano che costruisci il tuo progetto di riferimento, puoi identificare e risolvere problemi nella tua libreria senza doverli costare direttamente contro quel progetto in molti casi. Ciò ti consente di evitare il problema del "lavoro di verniciatura deve costare meno", pur continuando a fornire un posto dove fatturare se necessario.

La maggior parte delle persone sarebbe più disposta a pagare per un esempio di progetto e documentazione. Molti sono disposti ad accettare che una buona documentazione ha un costo. La maggior parte capirà anche che durante il processo di documentazione, gli errori vengono scoperti e risolti. Quindi ottieni un nuovo bucket da fatturare da AND un modo per trovare problemi nella tua lib che sarà più critico.

Accetta che non troverà tutto. Ma questo è il posto in cui metti il progetto. Ora stai giocando un gioco ROI prima di quanto dovresti essere. Questo troverà i problemi più critici.

Per quanto riguarda la stima del tempo, direi raddoppiare il tempo del tuo progetto. Hai trascorso 15 mesi con la lib, spendi 30 sul progetto di riferimento e la documentazione. È perfetto, no, ma è facile da capire e ti dà un punto di partenza.

    
risposta data 01.08.2017 - 22:44
fonte
2

How can I figure out what's missing between (1) my proof of concept application and (2) a hypothetical mature, robust application that implements the same features.

Posizione del prodotto

Se l'ipotetica applicazione matura esiste già significa che stiamo gareggiando contro qualcun altro. È positivo per noi sapere qual è il nostro posto nel mercato. E anche la situazione attuale del mercato.

Di solito, miriamo a colmare una lacuna che nessun altro sta riempiendo. Questo è il nostro valore differenziale. Potrebbe essere qualsiasi cosa. Ad esempio usabilità, prestazioni, compatibilità, scalabilità, distribuzione, funzionalità mancanti. ecc. Tutto ciò che è veramente importante per il potenziale consumatore 1 .

Individuandoci sul mercato ci portano a identificare i nostri concorrenti immediati e confrontare. Troveremo interessante l'opinione della comunità in merito ai concorrenti perché ci sono molti feedback preziosi lì. Abbiamo anche una vaga idea di ciò che la comunità sta chiedendo o cosa manca.

Sottolinea il prodotto

Con o senza concorrenti, dovremo sottolineare il prodotto. Il più e il più a lungo possibile. A questo punto, possiamo guardare all'industria dei videogiochi. Nell'industria dei videogiochi, beta aperte / chiuse sono abbastanza comuni. Durante l'OB / CB, un numero limitato di giocatori sono invitati a giocare e sottolineare il gioco per un periodo di tempo limitato. I giocatori sono incoraggiati a "hackerare" il gioco e condividere i loro pensieri. Fidati di me quando dico che alcuni giocatori sono in grado di spingere i limiti ben oltre le aspettative degli sviluppatori.

I beta generano un feedback inestimabile per entrambi, sviluppatori e stakeholder. Non solo ci dirà cosa manca, ma ci dirà anche cosa dovremo fare. Cosa funziona e cosa non funziona. Forse, ciò che consideriamo una caratteristica fondamentale, è insultatamente ignorato e banalizzato.

QA

Is there a way to avoid analysing code and spec line by line?

Mi aspetterei sempre test automatici e analisi statiche. L'analisi statica potrebbe sembrare irrilevante, ma è una "misura di qualità" oggettiva che possiamo prendere come riferimento. In sostanza, ci dice in quali condizioni viene rilasciato il nostro prodotto. Tuttavia, non può dirci quanto "buono", "cattivo", "sbagliato", "giusto" sia il prodotto. In questo caso specifico, non può sapere in che modo "sviluppatore-amichevole" è l'SDK.

Dovremmo prendere in considerazione l'impostazione di un team "beta tester" con i nostri migliori giocatori, gli sviluppatori, per test e analisi manuali.

Analisi

Finora stai facendo un buon lavoro. Tuttavia, non essere fissato su di esso al punto di non fare il passo successivo. Portare avanti il progetto. A questo punto, potresti essere interessato a controllare alcuni anti-pattern relativi all'organizzazione, come ad esempio < a href="https://en.wikipedia.org/wiki/Analysis_paralysis"> Analisi paralisi o Deposito biciclette .

how to aggregate the list of particular error cases for particular methods/APIs into something high level enough for the project leads to make decisions about what/how much/when? (This is closely related to the last question about prioritization)

Assegna la priorità ai problemi

Sarebbe ingenuo da parte mia dire come dovresti farlo perché, IMHO, questo dipende in gran parte dalla tua visione tecnica e dalla strategia aziendale. Tornando alla concorrenza, qualsiasi cosa renda il tuo SDK diverso dai concorrenti lo rende prezioso e considererei queste differenze come priorità 2 . Penso anche che il feedback del consumatore fornirà gli input necessari per prendere decisioni in merito a questo argomento.

1: La debolezza del concorrente può essere la mia forza.

2: Non permetterei alla mia debolezza di essere la forza del mio concorrente

    
risposta data 30.07.2017 - 03:17
fonte
1

Buttalo via

Non è la risposta che stavi cercando? Questo può sembrare uno strano consiglio, ma la dimostrazione di concetti e prototipi è pensata per essere buttata via. Se si implementa il sistema finale migliorando gradualmente il prototipo, si avrà qualcosa di molto simile nella struttura del prototipo. Non bene! Non limiterei la mia versione finale del programma a ciò che può essere ragionevolmente evoluto da un prototipo. Sono stato in progetti in cui il prototipo è stato realizzato nel codice finale, e i risultati sono, beh, abbastanza orribili.

Tuttavia, non procedere immediatamente ed eliminare tutto. Forse il tuo prototipo ha una buona cosa o due, che potresti creare in librerie riutilizzabili. I miei prototipi hanno sicuramente avuto qualcosa di buono in loro che ho sempre salvato aggiungendo una corretta gestione dei casi d'angolo. Parti del tuo prototipo sono buone, le parti sono cattive, il tuo compito è determinare quali sono buone e trasformare le parti buone in librerie riutilizzabili.

Quando si progetta il sistema reale dopo che la dimostrazione del concetto ha dimostrato che è fattibile, fai attenzione all'effetto sul secondo sistema . Se la tua mentalità è che "questa volta ho intenzione di fare tutto bene e correttamente", avrai un sacco di complessità nel codice che non produrranno nulla di buono. Costruisci un prodotto sufficientemente buono utilizzando l'esperienza ottenuta con il prototipo ed evita le insidie in cui ti sei imbattuto durante l'implementazione del prototipo.

    
risposta data 28.07.2017 - 18:52
fonte
0

Questo potrebbe essere un compito terribile e arduo, se non si stessero progettando le cose con un occhio di riguardo all'estensibilità. Se lo fossi, però, questo non dovrebbe essere troppo cattivo.

Il tuo primo compito è determinare i limiti del tuo codice: ciò che è pubblicamente consumabile e modificabile, ciò che è pubblicamente visibile ma non modificabile pubblicamente e ciò che è interamente interno al tuo livello.

Da lì, hai due problemi principali:

  • Garantire che ciò che è privato è effettivamente privato. In una lingua che ti permette di farlo, ciò significa che i campi privati sono in realtà contrassegnati come privati; in JS / ES, dovrai fare affidamento su convenzioni di denominazione (ad esempio, potresti decidere che tutte le variabili "private" hanno il prefisso "__" e hanno getter e / o setter se appropriato che non sono preceduti in quel modo).
  • Garantire che tutti i casi d'uso siano contabilizzati in un modo o nell'altro. Assicurati che le persone possano accedere a ciò che fanno devono esternamente al tuo livello.

Probabilmente vorresti scrivere test espliciti su queste due cose.

Dopo esserti occupato di questo, probabilmente vorrai provare a implementare alcune cose come consumatore del tuo livello . Ciò contribuirà a garantire che i tuoi idiomi funzionino bene in altri ecosistemi e ti aiuterà a trovare tutto ciò che non è accessibile, ma dovrebbe essere.

In parallelo a tutto questo, se non hai già dei test, dovresti aggiungerli. Almeno vuoi test unitari, ma idealmente li hai già ottenuti - tuttavia, sembra che tu non abbia molti casi di copertura. Ora è un buon momento per aggiungere quelli: cosa succede se passi una data formattata in modo errato? Un numero negativo? Un numero frazionario? Una stringa che contiene alcuni SQL?

Questo è anche un momento molto appropriato per iniziare ad aggiungere anche test di integrazione. Quei test di integrazione sarebbero un buon posto per cercare di spiegare i problemi di rete.

Quindi, come lo presenti al tuo cliente? Ciò dipenderà dalla tua relazione con loro e da quali norme di sviluppo hai attualmente. Se hai lavorato in sprint, ti esorto a impegnarti in uno sprint di esplorazione, il cui risultato sarà un elenco più dettagliato di quali aree devono funzionare e quali aree sono attualmente in buone condizioni.

Se il cliente si aspetta una descrizione dettagliata di ciò che verrà fatto in base alla data ... potrebbe essere un problema, dal momento che è necessario iniziare a fare un po 'di lavoro per stimarlo. Tutta la speranza non viene persa, tuttavia è ancora possibile stimare alcune date per "analisi preliminare", "scrittura di test falliti", "risoluzione dei casi in errore" e forse un giro di test di accettazione. La durata di quelli dovrebbe dipendere dalla dimensione e dalla complessità della tua applicazione, ma ricorda che vuoi sempre stimare più in alto di quanto pensi sia effettivamente necessario. Se spingono indietro, vedi se riesci ad arrivare ad un accordo - forse "OK, assegnerò una settimana (invece dei due mesi richiesti) per farlo, ma solo per questo sottosistema. rivisitare gli altri sistemi con una stima rivista, che ci consente di utilizzare ciò che abbiamo imparato lavorando su quel sottosistema. " Questo ti dà un margine di manovra - potresti trovare alcune scorciatoie per lo sforzo più grande, e potresti scoprire che i due mesi inizialmente richiesti erano leggermente gonfiati. D'altra parte, se ti imbatti in problemi concreti che significano che sicuramente avresti avuto bisogno dei due mesi completi , puoi fornire al cliente una copia concisa di ciò che era quel blocco (piuttosto che un generico "bene, sono abbastanza sicuro che sarà difficile").

    
risposta data 26.07.2017 - 18:52
fonte

Leggi altre domande sui tag