Le strutture basate su feature funzionano nella maggior parte dei casi meglio dei layer tecnici, soprattutto per progetti più grandi. Il motivo è semplice: quando devi toccare una feature, tutti i file rilevanti sono in un unico posto, non sparsi in varie cartelle "components" e "services". Quindi invece di avere `/src/components/UserCard`, `/src/services/userService`, `/src/utils/userHelpers`, metti tutto insieme sotto `/src/features/user/`. Questo rende l'orientamento più facile e riduce il carico mentale quando codi. Soprattutto quando più persone lavorano al progetto, ci sono meno conflitti e confusione su "dove diavolo deve andare questo?".
Dentro le tue feature puoi poi costruire una struttura interna coerente. Qualcosa come `/features/user/components`, `/features/user/hooks`, `/features/user/types`, `/features/user/utils` ha senso - qui ci sono sottocategorie chiare, ma tutto rimane tematicamente insieme. Per moduli davvero grandi conviene anche una suddivisione ulteriore in subfeature. Un esempio pratico: il tuo `/features/user` potrebbe essere diviso in `/features/user/authentication`, `/features/user/profile`, `/features/user/settings`.
Quello che riguarda più feature - utility comuni, tipi globali, servizi centrali - lo metti in cartelle separate come `/shared`, `/lib` o `/core`. È davvero l'eccezione, non la regola. La cosa più importante è che scegli una struttura e la segui coerentemente. Quello che funziona meglio dipende anche dalle dimensioni e dallo stack del tuo progetto, ma Feature-First è ormai più o meno lo standard nella pratica.