Recentemente abbiamo avuto una discussione in ufficio a causa di opinioni contrastanti tra gli sviluppatori. Un lato (lato S) sosteneva che le soluzioni tecniche dovevano necessariamente essere il più specifiche possibili, mentre l'altro lato (lato G) sosteneva che le soluzioni generalizzate sono preferite.
Cercherò di farla breve; ci occupiamo di trasferimenti di file e dobbiamo iniziare a salvare tre file (log.txt, details.txt, receipt.pdf) per ogni trasferimento. Abbiamo già una tabella di file che useremo ma siamo tutti d'accordo sul fatto che abbiamo bisogno di una tabella diversa per creare una relazione uno-a-molti tra trasferimenti e file.
Il lato G ha proposto di creare una tabella generale delle risorse_attacchi in grado di allegare file a qualsiasi tipo di risorsa; sarebbe simile a questa;
resource_attachments
- id: int
- entityId: int
- entityType: string
- fileId: int
- tipo: stringa
Side S non è d'accordo e ha proposto di creare una tabella specializzata per trasferimenti_attacchi, qualcosa del genere;
transfer_attachments
- id: int
- transferId: int
- fileId: int
- tipo: stringa
Un argomento del lato S è che ogni risorsa dovrebbe essere il più specifica possibile in modo che il suo ruolo, i suoi attributi e i possibili valori siano chiari, quindi qualsiasi nuovo sviluppatore non avrà problemi a comprenderlo.
Un argomento del lato G era che un approccio più generalizzato avrebbe fornito una gamma più ampia di funzionalità; puoi allegare file a qualsiasi risorsa, qualunque sia il loro ruolo.
Anche se le differenze pratiche sono molto piccole, ci sono alcune cose fondamentali in corso qui (questo è dove diventa filosofico); una persona nella stanza ha osservato acutamente che il generalizzatore è l'esperto di rubini, mentre lo specialista è l'esperto di java. Ruby è un linguaggio interpretato con digitazione dinamica mentre java è un linguaggio compilato con tipizzazione statica.
Ho trovato la questione estremamente interessante e mi chiedevo quale approccio preferire; soluzione specializzata o generalizzata e quali aspetti dovrebbero essere presi in considerazione?
Si noti che stiamo parlando solo di una parte tecnica della soluzione, questo non ha nulla a che fare con l'esperienza dell'utente finale.