TL; DR
Quali sono le buone pratiche di ricerca iterativa di una soluzione migliore?
Bene, se sapessi tutto in anticipo e potrei suggerire immediatamente una soluzione corretta al 146% per un determinato contesto, sarei probabilmente l'uomo più ricco del mondo, ma sicuramente non lo sono.
Quindi è necessario spazio e tempo per la sperimentazione.
In caso di approccio a nuove tecnologie o framework è abbastanza ragionevole (se ne hai il tempo) creare un prototipo di prototipo appositamente allo scopo di testare le sue capacità ed esplorare i caveat.
Dall'altro lato, il cambiamento dell'architettura riguarda più il modo in cui il codice è scritto e refactored. Si tratta più dell'evoluzione del sistema, della facilità di sviluppo e dell'aumento del prodotto con nuove funzionalità. Quindi credo che questo tipo di cambiamenti sia alquanto difficile da verificare se astratto dai casi di utilizzo dello sviluppo del mondo reale. Inoltre, dubito che il business consenta lo sviluppo parallelo di diverse versioni del prodotto solo per gli sviluppatori che potrebbero trovare una soluzione migliore.
Non vedo altro modo che introdurre modifiche durante lo sviluppo di nuove funzionalità.
Dopo diverse iterazioni si ottiene la stabilizzazione e la soluzione viene lucidata. Ma poi il sistema diventa un buon esempio per l'antipattern Lava: hai diversi approcci leggermente diversi (Refactoring è per l'aiuto). Non sorprende che alcuni compagni di squadra stiano impazzendo senza una chiara comprensione come dovrebbero fare.
I do not want to constantly think how I should do this, I just need to complete the task. We have conventions, I get used to it.
È quello che sento spesso da un compagno di squadra.
In realtà anche impostando il modificatore di accesso di una classe in internal
invece di public
, o la decisione di utilizzare l'iniezione del costruttore invece dell'input della proprietà usato in modo errato ma diffuso, o utilizzando Trace.WriteLine
può causare la stessa reazione.
Quindi il rapporto con alcuni dei miei compagni di squadra sta peggiorando, e non voglio che accada, ma allo stesso tempo odio fare le cose in un modo solo perché tutti si sono abituati senza chiedermi se sia migliore, più corretto esiste una soluzione Eppure capisco che non sono perfetto e inevitabilmente commetto errori a volte.
L'affermazione di PM è che non avvio una discussione. Ma dovrei davvero chiedere il permesso di non usare lo sviluppo Copy-Paste ed estrarre la logica di setup del test ?! Dovrei discutere se posso utilizzare un generatore di dati di prova come Autofixture?
Esempio più recente:
Finalmente ho potuto esprimere ciò che non mi è piaciuto del nostro codice. Il nostro Get
viene sviluppato sia per le esigenze dell'interfaccia utente sia per la successiva convalida durante l'aggiornamento; riutilizziamo quindi l'entità (modello completamente anemico) restituita da Get
quando si esegue un Update
. Quindi ogni volta che dobbiamo cambiare ciò che mostriamo nell'interfaccia utente, abbiamo anche la funzionalità "toutch" Update
. Almeno questo richiede di cambiare i test unitari.
Ho deciso di verificare la mia ipotesi e ho estratto la logica della query in un'altra classe e ho reso questa classe non accessibile dalle regole aziendali in cui solo la logica di elaborazione dei comandi lascia. Inserisco anche la logica di validazione all'interno dell'entità.
La reazione di un revisore?
What the heck? Are we moving to CQRS? Have we discussed it? We do not use logic inside entities. Why query is merged with Db access logic (I simply return projections from EF query)?
Potrei fare di meglio?
Discussione faccia a faccia ha dimostrato che la maggioranza della squadra ha considerato questo approccio che vale la pena provare, senza essere del tutto sicuro che porterà i dividendi in seguito. E pochi membri erano strongmente contrari a dichiarare che il riutilizzo soffre, e la logica get sarà in qualche modo duplicata se avessimo bisogno di dati da altre entità (aggregati).
Il modo migliore per verificare l'ipotesi è la pratica, no?
La funzionalità è isolata e ancora in fase di sviluppo e i requisiti per l'interfaccia utente e la funzionalità cambieranno per diverse iterazioni. Al ha detto che permette di testare in sicurezza l'ipotesi di un codice base più stabile con questo approccio. Ciò nonostante, coloro che erano contrari pretendevano che venisse ridimensionato di nuovo alla soluzione convenzionale.