Alcuni importanti cambiamenti organizzativi e architettonici dovrebbero essere implementati per avere successo nello sviluppo di un prodotto comune che soddisfi tutte le esigenze specifiche dei tuoi clienti.
Dal punto di vista organizzativo è necessario passare dall'erogazione diretta delle richieste dei clienti a una situazione in cui il team di sviluppo consegna richieste al proprietario del prodotto all'interno dell'azienda. Una volta fatto questo, il team di sviluppo non lavora più per i clienti dell'azienda, l'unico cliente che dovrebbe interessare al team di sviluppo è il proprietario del prodotto nella TUA azienda.
Il proprietario del prodotto dovrà raccogliere i requisiti dei clienti più stretti e determinare un insieme comune di requisiti che renderà felice la maggior parte di loro. Il team di sviluppo deve solo preoccuparsi di rendere felice il proprietario del prodotto.
Architettonicamente aiuta quando si progetta un prodotto che ha una vasta gamma di esigenze del cliente per renderlo configurabile, estensibile, disaccoppiato, scalabile e componentizzato come logicamente possibile.
Alcuni buoni approcci in questo senso consistono nel prendere i diversi pool di requisiti e scoprire quali pezzi sono comuni a tutti loro. Questi requisiti comuni costituiranno il nucleo del tuo set di funzionalità. Tutto ciò che è leggermente diverso dal core può essere determinato come una caratteristica configurabile, impostazione, o forse un'intera caratteristica unica che è separata dal nucleo. Rendi queste funzionalità separate quanto più possibile componenti e specificane bene.
I tuoi clienti possono esaminare diverse funzionalità che sono attualmente disabilitate per la loro installazione di un prodotto e potrebbero rendersi conto che potrebbero effettivamente volere quella funzione.
Infine, cerca di essere un "Progettista difensivo" senza violare il principio YAGNI. Questa può essere una linea sottile da attraversare, ma è una possibilità molto reale che certi presupposti architettonici e di progettazione possano farti sviluppare in un angolo, causando la necessità di un importante refactoring in una versione futura. Le ipotesi sono CRITICAMENTE importanti e dovrebbero essere strettamente dettagliate e scrutinate nelle specifiche tecniche. Un'assunzione errata può costarti caro dopo. Un buon modo sarebbe: "So che i clienti sono abbastanza sicuri che vorrebbero che questo componente funzionasse in questo modo specifico, ma nel caso, sto lasciando aperta l'opzione che questo POTREBBE cambiare in futuro senza causare la necessità di un importante rinnovamento. " A volte questo è semplice quanto la componentizzazione e il disaccoppiamento corretti, altre volte confina con possibilità di sviluppo di funzionalità che non sono state richieste. Devi fare quel giudizio per la tua situazione.