Mon équipe et moi reconstruisons un site que nous avons développé il y a une dizaine d'années, et nous voulons le faire en Agile.
Donc, après avoir passé beaucoup de temps à lire (probablement pas assez), j'ai du mal à diviser le travail entre les développeurs.
Je serai plus précis et je dirai que le site est divisé en modules séparés qui n'ont pas beaucoup d'intégration entre eux.
Quelle est la meilleure façon/la plus acceptée de partager le travail entre les développeurs?
Ou peut-être quelque chose de complètement différent?
Mon équipe a essayé de devenir "agile" pour quelques versions maintenant, mais faire partie d'une grande entreprise n'a pas vraiment facilité les choses. Je ne vais pas prétendre avoir la réponse, mais je peux partager certaines de mes observations.
Diviser les développeurs par module:
Tout le monde travaille sur le même module en même temps
Nous avons fait cette dernière chose, et bien qu'il y ait une tonne de possibilités d'amélioration, dans l'ensemble, toute notre équipe a été très heureuse et cela en dit long, lorsque nous faisons partie d'une société géante.
Une chose importante sur laquelle nous nous sommes trompés les 3 premières fois que nous sommes "devenus agiles", c'est à chacune de ces fois que les gens ont appris comment travailler et sur quoi travailler. C'est le moyen numéro un pour que votre équipe se désintéresse complètement du projet et que vous ayez alors de vrais ennuis.
Essayez plutôt le contraire. Dites à l'équipe qu'elle peut faire ce qu'elle veut et en tant que manager/leader (si vous en êtes un, sinon faites répéter ces mots à votre manager), votre travail est de vous assurer qu'ils sont aussi productifs et heureux que possible. Le processus n'est pas une mauvaise chose, mais le processus devrait être là pour aider votre équipe lorsqu'elle se rend compte qu'elle en a besoin, et non l'inverse.
Si certains membres de votre équipe préfèrent travailler de manière isolée, laissez-les (dans une certaine mesure). S'ils préfèrent travailler par deux, laissez-les faire. Assurez-vous de laisser vos employés choisir leur propre travail autant que possible.
Enfin, et cela est très important et est toujours négligé. VOUS N'OBTENEZ PAS CE DROIT (à moins que vous ne soyez un surhomme ou au moins un batman). Il est extrêmement important d'avoir des réunions rétrospectives régulières. Lorsque nous avons déployé les rétrospectives, elles ont été réalisées par le livre et c'était comme un autre processus que vous deviez traverser. Ce n'est pas à cela que sert la rétrospective. C'est pour écouter votre équipe, identifier les zones qui causent le plus de douleur et les corriger afin que chacun puisse continuer son travail. Apparemment, les ingénieurs logiciels, en général, aiment fournir des produits et des fonctionnalités et la plus importante réunion rétrospective de messages doit communiquer, c'est que c'est uniquement pour leur bénéfice. Vous voulez identifier et surmonter les obstacles, en commençant par les plus grands (ou les plus faciles, il y a une sorte de carte 2D impliquée) et les éliminer afin que vos employés fassent leur travail.
Ayez une réunion avec l'équipe, montrez-leur la liste des choses à faire et demandez qui veut faire quoi.
Ne pensez pas dans les modules. Pensez aux éléments de fonctionnalité. Décrivez ces éléments de fonctionnalité par des user stories (ou d'une autre manière) et n'oubliez pas de décrire les critères d'acceptation (probablement définis par votre application actuelle et les changements attendus par l'entreprise). Mettez vos éléments fonctionnels en retard. Ensuite, laissez l'entreprise prioriser les fonctionnalités qui doivent être fournies en premier (vous travaillerez de manière incrémentielle et itérative et la priorité vous dira ce qui doit être mis en œuvre en premier).
Une fois que vous l'avez au moins pour une partie de votre application d'origine, vous êtes prêt pour le développement. Ce qui se passe ensuite dépend de votre méthodologie agile sélectionnée. La partie importante est que chaque fonctionnalité peut généralement être divisée en plusieurs tâches et les membres de l'équipe sélectionneront les tâches qu'ils souhaitent effectuer - c'est ce que l'on appelle l'auto-organisation. Lorsque vous commencez avec agile, l'auto-organisation peut avoir besoin d'aide pour que quelqu'un s'assure que les tâches impopulaires et populaires sont également partagées par l'équipe. Une fois que l'équipe est plus mature, les développeurs n'hésiteront pas à exprimer leur désaccord avec l'auto-organisation actuelle et cela sera géré automatiquement au sein de l'équipe.
Penser aux modules dès le départ ne doit pas être une bonne façon. Vous réécrivez l'application pour une raison quelconque et peut-être que l'architecture actuelle de l'application basée sur une séparation incorrecte des modules est l'une des raisons cachées des problèmes visibles. Vous pouvez également constater que certaines fonctionnalités des modules existants seront complètement redéfinies et déplacées ailleurs.
Bien que je sois d'accord avec la réponse de David, je pensais qu'elle pourrait bénéficier d'une élaboration:
Fondamentalement, le résultat est le suivant: personne ici sur SE ne peut répondre à cette question pour vous, et il n'y a pas grand-chose à y faire, car il vaut beaucoup mieux que vous trouviez une réponse en équipe.
L'approche la plus simple est souvent la meilleure.
J'éviterais de diviser les tâches en groupes tels que testing/log/UI/etc à moins que vous ne puissiez définir de très bonnes raisons claires pour le faire. Mon raisonnement est que lorsque vous autorisez les programmeurs à travailler en dehors de leurs domaines d'expertise habituels, cela peut garder les choses plus intéressantes et stimulantes pour eux, et leur permettre de se développer et de grandir dans leur domaine. Si vous pensez que les contraintes de temps vous obligent à diviser le travail en fonction de l'expertise, assurez-vous au minimum que chaque développeur doit toujours effectuer ses propres tests unitaires et utiliser la révision du code et les tests d'acceptation pour détecter les problèmes. Écrire vos propres tests est très agile, et attendre que les testeurs soient disponibles peut être très inutile.
Face à ce même genre de dilemme, j'ai utilisé l'approche suivante:
Étendez le projet. Donnez-vous une idée de ce dans quoi vous vous embarquez et développez une liste de fonctionnalités en décomposant le projet en une série de tâches.
Prioriser les fonctionnalités. Décidez quelles fonctionnalités doivent être terminées tôt et lesquelles apporteront une valeur immédiate à vos clients. Ne vous inquiétez pas si vos développeurs finissent par travailler sur les mêmes modules, mais assurez-vous que vous disposez d'un bon processus et d'outils pour gérer les fusions de code.
Impliquez votre équipe et demandez à vos développeurs de vous aider à décomposer les fonctionnalités en une liste de tâches plus faciles à gérer. Passez en revue en groupe et ajustez les tâches au besoin afin qu'elles puissent être estimées plus facilement.
Demandez à chaque développeur de choisir une tâche à implémenter - ou un groupe de tâches en fonction de la façon dont vos itérations vont s'exécuter - en haut de la file d'attente prioritaire, sur laquelle le développeur aimerait travailler.
Demandez à chaque développeur de travailler sur une seule chose jusqu'à ce qu'il soit terminé avant de passer à la sélection de l'élément suivant en haut de la file d'attente prioritaire. Vous pourriez être tenté de faire changer occasionnellement les tâches de votre personnel, mais cela entraînera une perte de temps pour le développeur. Si vous vous trouvez avec des goulots d'étranglement de dépendance, vous devrez ajuster vos priorités de tâche et minimiser le gaspillage.
N'ayez pas peur que les développeurs s'exécutent avec des itérations qui se chevauchent et gérez vos versions en conséquence. Cela permettra de réduire le temps perdu entre les versions en attente de fin des tâches.
En fin de compte, être Agile, c'est trouver une solution qui fonctionne bien pour votre équipe, votre entreprise et vos clients. C'est à vous de régler votre processus en trouvant l'équilibre des pratiques qui vous convient le mieux. La répartition de vos tâches sera une partie très importante d'un processus beaucoup plus vaste, mais devrait être aussi simple que possible pour encourager la participation volontaire et éviter les problèmes difficiles à résoudre liés au processus qui se développent plus tard.
Aucune discussion organisationnelle de l'équipe de développeurs ne serait complète sans mentionner le Dr Fred Brooks équipe chirurgicale.
La formule de base est: ne équipe chirurgicale par unité de travail
Le concept de l'équipe chirurgicale repose sur deux idées fondamentales:
Une équipe chirurgicale est composée de 3 à 10 développeurs:
Alors maintenant que nous pouvons constituer une équipe, que leur assignons-nous?
Vous devriez voir émerger trois modèles de base acceptables:
En fonction du nombre de développeurs et de modules (et des délais), je demande généralement à mes développeurs de choisir un module intéressant (pour eux) et un module difficile (de préférence quelque chose qu'ils n'ont pas fait), puis le reste, je le divise par niveau de compétence et contraintes de temps. Je trouve que cela donne à mes développeurs quelque chose sur lequel ils veulent travailler et quelque chose pour les pousser.
Bien sûr, cela ne fonctionne pas toujours ...
Voici ce que je ferais:
Si tous les modules sont petits, vous pouvez donner à chacun un module sur lequel travailler. Sinon, procédez comme suit:
Ce qui précède ne fonctionnera pas si les personnes qui n'aiment pas travailler avec les autres sont les plus compétentes et c'est un cas courant, alors faites une exception aux 4 et 5 en conséquence