In molti domini, tuttavia, il cliente tipico è:
- Interessato alle preoccupazioni operative quotidiane - tattiche a corto raggio ... non strategia;
- Riguardava solo la soluzione immediata;
- Pensatori generalmente monodimensionali, non astratti;
- Principalmente interessato a "portare a termine il lavoro" invece di trovare una soluzione duratura e di qualità.
E per essere sinceri, di solito hanno buoni motivi per pensare in questo modo. Prima di tutto, gestiscono un'azienda, che dovrebbe generare entrate oggi e domani, non in un futuro lontano. In secondo luogo, non sono esperti tecnici: non sanno cosa sia possibile e cosa no e quali siano le conseguenze di specifiche scelte architettoniche / progettuali / di implementazione. Questo è quello che sappiamo.
Quindi la risposta è - quasi sorprendente - comunicazione .
È necessario comunicare molto, educarsi a vicenda, per far comprendere l'un l'altro il punto di vista dell'altra parte almeno a un livello base. È necessario spiegare loro le conseguenze a breve e lungo termine di possibili alternative. E devi usare un linguaggio che capiscono .
- Se dici "questo sarebbe un trucco, che rende il codice meno leggibile ed estensibile" , dicono "sì, qualunque cosa" .
- Se dici "questa sarebbe una soluzione a breve termine, che renderebbe lo sviluppo e la manutenzione a lungo termine più costosi e aumenterebbe il rischio di introdurre bug" , dicono "ah ah, consideriamo" .
- E se dici "questa soluzione ti costerebbe $ 100 ora, ma introduce $ 500 di debito tecnico che sei tenuto a rimborsare con gli interessi prima o poi; OTOH questa altra soluzione ti costa $ 400 ora e non lascia alcun debito tecnico; scegli quello che voglio " , dicono " ora stiamo parlando! " .
OTOH ci possono insegnare una cosa o due sulla prospettiva aziendale. Azienda vuole usabile e abbastanza buono - quasi perfetto - soluzioni. E sanno probabilmente meglio di chiunque altro che "perfetto è il nemico del bene". Quindi è necessario tenere presente che il nostro compito è fornire soluzioni ai problemi dei nostri clienti, piuttosto che produrre software tecnicamente perfetto. A volte questi due convergono allo stesso, ma più spesso no. Questo può essere visto da molti come triste, ma è una realtà aziendale. Per me, se sono riuscito a risolvere il problema dei miei clienti, e vedo che ha reso la loro vita visibilmente più semplice, sono felice come loro. OTOH se sono riuscito a implementare il design perfetto che avevo in mente, ma la società fallisce la settimana successiva, non è certo una vittoria per nessuno, vero?
Un imprenditore sensibile capirà - se li spieghi usando la propria lingua - perché è importante mantenere pulito il software, scrivere unit test, refactoring ecc. Anche se questi non sembrano contribuire direttamente a breve termine, essi sono essenziali per la manutenzione a lungo termine. E i clienti sensibili si preoccupano della manutenibilità a lungo termine della loro attività, quindi sicuramente sono disposti a investire in essa quando vedono il valore generato dal loro investimento. Tuttavia, sia le loro risorse che il tuo tempo sono limitati, quindi devi dare la priorità e concentrarti sulle cose più importanti. Ma è importante solo se è importante per entrambi .
Potresti voler refactificare il modulo A perché il codice qui dentro è semplicemente orribile, e hai una stupenda idea su come refactificare il codice in modo che sia conciso, elegante e pulito, usando un modello di progettazione che hai appena letto. Tuttavia, se quel modulo non è stato toccato per anni e funziona in modo affidabile, molto probabilmente starai meglio concentrandoti sul modulo B, che verrà esteso la prossima settimana con una nuova funzionalità molto importante e contiene tonnellate di bug già.