Les structures basées sur les features fonctionnent dans la plupart des cas mieux que les couches techniques, particulièrement pour les plus grands projets. La raison est simple : quand tu dois toucher à une feature, tous les fichiers pertinents sont au même endroit, pas dispersés dans différents dossiers « components » et « services ». Donc au lieu d'avoir `/src/components/UserCard`, `/src/services/userService`, `/src/utils/userHelpers`, tu mets tout ensemble sous `/src/features/user/`. Ça rend l'orientation plus facile et réduit la charge mentale en codant. Surtout quand plusieurs personnes travaillent sur le projet, il y a moins de conflits et de confusion sur « où est-ce que ça doit aller exactement ? ».
Dans tes features, tu peux ensuite construire une structure interne cohérente. Quelque chose comme `/features/user/components`, `/features/user/hooks`, `/features/user/types`, `/features/user/utils` a du sens - ici il y a des sous-catégories claires, mais tout est regroupé thématiquement. Pour les modules vraiment gros, ça vaut aussi le coup de faire une subdivision supplémentaire en sous-features. Un exemple concret : ton `/features/user` pourrait être divisé en `/features/user/authentication`, `/features/user/profile`, `/features/user/settings`.
Ce qui s'étend sur plusieurs features - les utilitaires communs, les types globaux, les services centralisés - tu le mets dans des dossiers séparés comme `/shared`, `/lib` ou `/core`. C'est vraiment l'exception, pas la règle. L'important, c'est vraiment que tu choisisses une structure et que tu la suives conséquemment. Ce qui fonctionne le mieux dépend aussi de la taille et de la stack de ton projet, mais le Feature-First est devenu peu ou prou le standard en pratique.