Un mio amico sta lavorando per una piccola azienda su un progetto che ogni sviluppatore odierebbe: è costretto a rilasciare il più rapidamente possibile, è l'unico a cui sembra interessare il debito tecnico, il cliente non ha esperienza tecnica, ecc.
Mi ha raccontato una storia che mi ha fatto riflettere sull'adeguatezza dei modelli di progettazione in progetti come questo. Ecco la storia.
Abbiamo dovuto mostrare prodotti in diversi punti del sito web. Ad esempio, i gestori dei contenuti possono visualizzare i prodotti, ma anche gli utenti finali o i partner tramite l'API.
A volte, i prodotti mancavano di informazioni: ad esempio, alcuni di essi non avevano alcun prezzo al momento della creazione del prodotto, ma il prezzo non era ancora stato specificato. Alcuni non avevano una descrizione (la descrizione era un oggetto complesso con storie di modifica, contenuto localizzato, ecc.). Alcuni mancavano di informazioni sulla spedizione.
Ispirato dalle mie recenti letture sui modelli di design, ho pensato che fosse un'ottima opportunità per usare il magico modello a oggetti nulli . Così l'ho fatto e tutto era liscio e pulito. Uno doveva solo chiamare
product.Price.ToString("c")
per visualizzare il prezzo oproduct.Description.Current
per mostrare la descrizione; nessuna richiesta condizionale. Fino a quando un giorno lo stakeholder ha chiesto di visualizzarlo in modo diverso nell'API, avendo unnull
in JSON. E anche in modo diverso per i gestori dei contenuti mostrando "Prezzo non specificato [Modifica]". E ho dovuto uccidere il mio amato modello a oggetti nulli, perché non ce n'era più bisogno.Allo stesso modo, ho dovuto rimuovere alcune fabbriche astratte e alcuni costruttori, ho finito per sostituire il mio bellissimo modello di facciata con chiamate dirette e brutte, perché le interfacce sottostanti sono cambiate due volte al giorno per tre mesi e anche il Singleton mi ha lasciato quando i requisiti dicevano che l'oggetto in questione doveva essere diverso a seconda del contesto.
Più di tre settimane di lavoro consistevano nell'aggiungere modelli di progettazione, poi nel separarli un mese dopo, e il mio codice divenne finalmente abbastanza spaghetti da essere impossibile da mantenere per chiunque, incluso me stesso. Non sarebbe meglio non usare mai questi schemi in primo luogo?
In effetti, ho dovuto lavorare su quei tipi di progetti in cui i requisiti cambiano costantemente e sono dettati da persone che non hanno in mente la coesione o la coerenza del prodotto. In questo contesto, non importa quanto tu sia agile, verrai con una soluzione elegante a un problema e quando finalmente lo implementerai, imparerai che i requisiti sono cambiati così drasticamente, che la tua soluzione elegante non si adatta non piu.
Quale sarebbe la soluzione in questo caso?
Non utilizzare alcun modello di progettazione, smettere di pensare e scrivere direttamente il codice?
Sarebbe interessante fare un'esperienza in cui un team sta scrivendo direttamente il codice, mentre un altro ci pensa due volte prima di digitare, correndo il rischio di dover buttare via il design originale qualche giorno dopo: chissà, forse entrambi i team avrebbero il stesso debito tecnico. In assenza di tali dati, vorrei solo affermare che non è giusto digitare il codice senza pensarci prima quando si lavora su un progetto di 20 mesi al mese.
Mantenere lo schema di progettazione che non ha più senso e provare ad aggiungere altri schemi per la situazione appena creata?
Neanche questo sembra giusto. I pattern sono usati per semplificare la comprensione del codice; metti troppi schemi e il codice diventerà un casino.
Cominciare a pensare a un nuovo design che racchiude le nuove esigenze, quindi adattare lentamente il vecchio design a quello nuovo?
Come teorico e colui che favorisce Agile, sono totalmente coinvolto. In pratica, quando sai che dovrai tornare alla lavagna ogni settimana e ripetere gran parte del progetto precedente e che il cliente non ha abbastanza fondi per pagarti per quello, né abbastanza tempo per aspettare , questo probabilmente non funzionerà.
Quindi, qualche suggerimento?