J'ai récemment rejoint un projet de développement et on m'a soudainement confié le poste de développeur principal. Ma principale responsabilité consiste à scinder la partie programmation du projet en tâches, à confier ces tâches aux autres développeurs, puis à vérifier que les pièces fonctionnent ensemble.
Le problème est que je ne sais pas comment faire cela. J'ai passé le week-end avec un crayon et du papier à essayer de comprendre, mais je continue à dresser une liste de tâches sur lesquelles il convient de travailler de manière séquentielle plutôt qu'en parallèle. Je pensais peut-être à le scinder en fonctionnalités, mais vous vous retrouvez avec des tâches nécessitant l'édition des mêmes fichiers, ce qui peut nécessiter la réécriture complète d'une tâche en raison de l'avancement du développement. Certains développeurs pourraient attendre que le programme soit un peu plus complet et plus facile à créer, mais j'aurais alors des personnes assises sur leurs mains pour savoir combien de semaines.
J'ai eu une conversation avec mon patron à propos de mes qualifications pour le faire et je n'ai pas eu le choix. Je n'ai aucune idée de ce que je fais, alors des conseils et des coups de pouce dans la bonne direction seraient grandement appréciés.
Réponses:
Une bonne réponse à votre question remplit plusieurs livres . Je proposerai une liste de mots à la mode qui me viennent à l’esprit, Google et les livres feront le reste à votre place.
La liste ci-dessus est certainement incomplète et certaines parties pourraient même être contestables!
Si tout cela vous fait peur - ne vous inquiétez pas, cela devrait vous faire peur! Réussir des projets de développement de logiciels en équipe n’est pas une tâche facile et il est rare que les gens soient correctement formés et éduqués à cet art. Si cela vous fait peur, votre intuition fonctionne correctement, écoutez-la. Vous voulez être préparé. Parlez à votre patron, prenez du temps et formez-vous.
Voir également
Lectures complémentaires (en ligne)
Lectures complémentaires (livres)
la source
Addison Wesley - The Pragmatic Programmer, From Journeyman To Master by Andrew Hunt, David Thomas & Addison Wesley - 1999
,O'reilly - The Productive Programmer by Neal Ford
,Prentice Hall - Clean Code, a Handbook of Agile Software Craftsmanship ny Robert C. Martin, ...
,O'Reilly - Head First Object-Oriented Analysis & Design by Brett D. McLaughlin, Gary Pollice & David West
et beaucoup d' autres ...Devenir Agile
Je suggérerais ce qui suit:
Éditer les mêmes fichiers
Tout d’abord, utilisez Git (ou un système de gestion de versions simultané similaire). Tant que vous éditez différentes parties des mêmes fichiers, vous ne rencontrerez pas de conflits. Si vous obtenez des conflits, ils seront clairement identifiés comme tels.
Essayer de gérer un projet multi-développeurs sans Git, c'est comme essayer de faire un pudding sans bol de pudding. C'est possible, mais ça va devenir assez compliqué.
Comme il a été souligné dans les commentaires, Git n’est pas une panacée, mais combiné à des tests automatisés, il est certainement très utile.
Lister toutes les fonctionnalités
Deuxièmement, divisez le projet en fonctionnalités visibles par l'utilisateur. Par exemple, "lorsque l'utilisateur s'inscrit, il devrait recevoir un courrier électronique" ou "L'utilisateur peut ajouter un élément". Impliquez toutes les parties prenantes ici. Rassemblez tout le monde dans une pièce et invitez tout le monde à crier ses traits.
Celles-ci doivent être des fonctionnalités visibles par l'utilisateur, vous pouvez parler de la stratégie de mise en œuvre plus tard.
Ecrivez toutes les suggestions sur des fiches, même les plus stupides. Rationalisez rapidement la liste pour supprimer les doublons et disposez toutes les cartes sur une grande table, voire au sol.
Ajoutez toutes les cartes supplémentaires nécessaires. Supposons que votre application envoie des alertes par SMS. Vous ne savez peut-être pas comment faire cela, alors vous avez une question. Ecrivez "Enquêter sur les portails SMS" sur une carte. De même pour toutes les autres grandes inconnues. Vous devrez les décompresser plus tard. Ces fonctionnalités ne feront probablement pas partie de votre premier sprint.
Maintenant, triez vos cartes en groupes, mélangez-les, essayez -les. Ceci est la portée de votre projet.
Planification du poker
Essayez de planifier le poker. Toujours avec tout le monde, donnez à tous les développeurs des cartes indiquant "1 point", "2 points", etc., jusqu'à "4 points". Aussi une carte "plus". Un point équivaut à peu près à une heure.
Parcourez la liste des fonctionnalités une à une. Lorsque vous lisez une fonctionnalité, tout le monde doit jouer une carte. Si une personne joue à 1 et une autre personne à 4, il y a un problème de communication. Une personne comprend que la fonctionnalité signifie quelque chose de différent de l'autre personne. Ayez une discussion, déterminez ce que vous voulez réellement dire et notez-le sur la carte.
Si vous convenez qu'une fonctionnalité est un "plus", cette fonctionnalité est trop grande. Vous devez décomposer cette fonctionnalité. Faites cela de la même manière que précédemment.
Avec votre accord, écrivez les numéros sur les cartes dans un stylo de couleur différente.
Les points valent mieux que les heures
Utiliser des points au lieu de plusieurs heures enlève au macho ce que nous, les développeurs, faisons souvent dans le code. C'est une différence subtile, mais j'ai trouvé que cela fonctionnait plutôt bien.
Maintenant, composez un sprint
Un sprint est un coup d'éclat rapide vers un but. Décidez de la durée du sprint, peut-être 5 ou 10 jours. Multipliez le nombre de jours par le nombre de développeurs par le nombre de points par jour.
Supposons initialement 6 points par jour et par développeur. C'est un nombre réalisable. Si vous avez 5 personnes, cela fait 5 * 5 * 6 = 150 points. En collaboration avec tous les développeurs et la direction, sélectionnez des fonctionnalités dans la liste, jusqu'à 150 points. C'est ton sprint.
Ne soyez jamais tenté de faire plus que ce qui convient. Une promesse excessive nuit à tout le monde, y compris à vous.
Vous devrez tenir compte des dépendances ici. Par exemple, la configuration de l'environnement doit évidemment être incluse dans le premier sprint. C'est en fait relativement facile à faire quand tout le monde est présent. Vous avez 6 cerveaux dans la pièce, tous disant "ça dépend de ça", etc. Vous pouvez ensuite mélanger les cartes pour démontrer les dépendances.
Une fois que vous avez votre sprint, rien ne peut y être ajouté, il est verrouillé pour les 5 jours. Le glissement de fonctionnalités va stresser l’équipe, nuire au moral et ralentir tout le monde. Finalement, le fluage va bloquer un projet. En tant que chef d'équipe, vous devez protéger votre équipe contre le glissement des fonctionnalités. Si une nouvelle demande de fonctionnalité arrive, elle doit être ajoutée au prochain sprint. Si le prochain sprint est déjà complet, quelque chose d'autre doit être retiré.
Ne jamais être tenté de serrer dans les extras. Une promesse trop longue vous donne environ 1 jour de client heureux, suivi de 4 jours de stress pour l’équipe et, éventuellement, de plusieurs clients mécontents lorsque l’équipe ne peut pas livrer à temps.
Maintenant, allez-y.
Distribuez des cartes, demandez qui veut faire quoi. Vous avez une visibilité totale sur ce qui se fait et vous pouvez compter les points à zéro. Ayez un stand up au début de chaque journée pour que tout le monde sache qui travaille sur quoi et ce qui a été fait.
Cinq ou six développeurs motivés qui travaillent ensemble pour former des objectifs gérables clairement définis peuvent réaliser une quantité assez importante de choses en un sprint de cinq jours.
Maintenir la visibilité
Assurez-vous que tout le monde peut voir quel est le statut du projet. Bluetack toutes les cartes au mur. Sur la gauche sont des cartes qui ne sont pas encore travaillées. A droite sont faites les cartes.
Lorsqu'un développeur travaille sur une carte, il la décolle et la pose sur son bureau. Cela préserve la visibilité et empêche les gens de marcher trop lourdement sur les pieds.
Il existe des alternatives technologiques aux fiches, mais rien ne vaut un affichage papier massif de l'état du projet sur le mur.
Si possible, placez tout le monde dans la même pièce pendant toute la durée du projet. Avoir les parties prenantes autour autant que possible, idéalement tous les jours.
Incendier
Vous pouvez représenter graphiquement vos points progressant vers zéro sur un graphique de burndown. Si votre ligne de meilleur ajustement dépasse zéro avant de respecter votre limite de temps, vous êtes probablement sur la bonne voie. Sinon, vous devrez peut-être informer votre client maintenant avant de vous approcher trop près de la date limite.
Si vous échouez, échouez tôt.
Vous pouvez créer un burndown à l'aide d'un logiciel, mais je préfère un gros morceau de papier au mur. Dessine et écris partout.
Test automatisé
Lorsque plusieurs développeurs travaillent simultanément sur le même matériel, ils vont probablement se casser le code les uns des autres de temps à autre. La communication et la visibilité aident à cela, mais vous allez probablement vouloir introduire une technologie pour vous aider à trouver des problèmes.
Le test unitaire est le processus d'écriture de tests pour chaque partie individuelle de votre base de code (idéalement pour chaque méthode). Vos tests unitaires doivent être exécutés souvent, avec chaque sauvegarde si possible. Il existe de nombreux outils qui peuvent aider à cela, par exemple Karma ou Rspec.
Les tests de bout en bout consistent à tester votre projet dans son ensemble, en traitant les éléments internes comme une boîte noire. Basez ces tests sur vos exigences professionnelles de haut niveau, par exemple: "L'utilisateur peut s'inscrire" ou "L'utilisateur peut voir une liste d'éléments". Protractor est un bel exemple de framework de test basé sur le Web.
Il existe des livres entiers sur les tests, mais la mise en place d'au moins quelques tests d'acceptation peut vous aider à vous assurer que rien ne se brise pendant que vous travaillez sur votre projet.
Éviter la dette technique et se faire fini
La dette technique est un concept qui décrit des choses qui devront être nettoyées plus tard. Une source commune d’endettement est constituée de caractéristiques qui ont été marquées comme étant terminées, mais qui n’ont jamais été "réalisées". Une fonctionnalité terminée est vérifiée dans Git, approuvée par la partie prenante et soumise à un test.
Ne cochez pas vos fonctions jusqu'à ce qu'elles soient terminées. Ne jamais masser le graphique. Encore une fois, cela fait mal à tout le monde à long terme, y compris à vous.
C'est l'une des raisons pour lesquelles nous ne citons initialement que 6 points par développeur et par jour. Done-done demande un travail supplémentaire, mais se sent bien et donne un coup de pouce à l'équipe.
la source
Éditer les mêmes fichiers n'est pas un problème en soi. Ce n'est un problème que si vous modifiez la même fonction pour faire deux choses différentes.
Fondamentalement, je diviserais le projet en «fonctionnalités» distinctes. L’un pourrait être lié à la gestion du protocole réseau, l’autre à un fichier de configuration et un autre encore à la gestion de la base de données. Les fonctionnalités sont de grandes choses.
Ensuite, vous souhaitez diviser ces fonctionnalités en tâches (récits). Celles-ci doivent être simples, comme "lorsque l'utilisateur clique sur un bouton, le programme charge le fichier", "au démarrage du programme, il charge le fichier de configuration", etc.
Certaines tâches devront être complétées de manière séquentielle ("le programme analysera tous les champs du fichier de configuration" devra être placé après "le programme chargera le fichier de configuration"). Les autres ne le feront pas (vous pouvez travailler à la fois sur la base de données et sur le réseau).
Mais très probablement, vous le ferez mal, et c'est là que l'expérience se met en place. Vous échouerez un tout petit peu (ou beaucoup), obtiendrez une mauvaise estimation du temps et votre projet prendra un peu plus de temps qu'il ne l'aurait dû. La prochaine fois, ça ira mieux.
Je suggérerais également de lire "Extreme Programming" de Kent Beck. Excellent livre qui m'a aidé quand j'étais sur le point de devenir chef de projet.
la source
En résumé, vous devez diviser votre application en modules fonctionnels, puis introduire des contrats (interfaces et contrats de données) entre les différents modules. Chaque module peut ensuite être remis à un développeur différent. Lorsque vous remettez tout en place, les contrats garantissent que ces modules communiquent correctement les uns avec les autres.
Veillez à appliquer TDD aux développeurs afin de garantir que les modules fonctionnent tous individuellement.
Pour vous donner un exemple de ce que je veux dire:
Supposons que vous souhaitiez qu'un de vos développeurs construise un enregistreur SQL.
Vous définissez une interface et demandez à l'un de vos développeurs ( ou créez une histoire si vous utilisez Agile ) que vous souhaitiez un enregistreur spécifique à SQL selon la spécification suivante:
Ce que j'attends alors d'un développeur est le suivant:
L'implémentation spécifique à SQL pour le consignateur
Tout code dépendant, tel qu'une implémentation pour
SqlLogRepository
Tests unitaires ou simulés selon ce qui a été demandé. Un test fictif dans le cas ci-dessus (où nous avons d'autres dépendances externes), ou s'il s'agit par exemple d'une fonction utilitaire simple telle que
String.ReverseCharacters(string input)
, alors j'aimerais simplement voir des tests unitaires qui testent plusieurs scénarios différents.Cela signifie que:
Vous et votre équipe pouvez maintenant poursuivre le développement en utilisant cette interface. par exemple
et si vous devez exécuter votre code avant qu'il ne
SqlLogger
soit en place, vous pouvez simplement créer unNullLogger
:Et voici comment vous pouvez le tester entre-temps (je suggère de regarder un ICO pour une injection de dépendance)
Sommaire
Je n'ai aucune idée de la taille de votre projet, mais cela pourrait être une tâche ardue et si vous n'aviez jamais dirigé le développement auparavant, je vous suggérerais de prendre cette tâche très au sérieux et de passer les prochaines semaines à lire autant que vous le voudrez. peut sur la conception de logiciel et l'architecture. Et soyez très transparent sur votre travail ( qualité logicielle, etc. ), sinon vous vous retrouverez rapidement dans un gâchis profond que vous ne savez pas comment vous en sortir.
Je suggère également fortement que vous lisiez sur le design et le paradigme orienté objet. Vous comptez beaucoup sur la programmation orientée objet pour ce projet.
la source
Les autres réponses ont parlé des aspects liés à la programmation, mais je voulais simplement mentionner l’aspect gestion des programmes. Je vais commencer par un disclaimer: je ne suis pas un responsable de programme. J'ai suivi un cours de deuxième cycle en gestion de programme et mon expérience professionnelle implique de passer des heures à soumissionner pour de petits projets d'une durée inférieure à 500 heures et jamais supérieure à 1 000 heures.
Mais j'ai dû aider à définir les tâches d'un laboratoire où je devais occuper 2 à 3 personnes pendant 2 à 4 mois (à temps partiel et à temps plein). L’utilisation de logiciels de gestion de projets tels que Microsoft Project est une chose qui m’a vraiment aidée (je ne sais pas s’il existe une version gratuite, mais votre employeur a probablement quelque chose comme ça ... demandez à votre superviseur quel type de logiciel de gestion de programme est utilisé chez vous). En particulier, j'utilise assez souvent les diagrammes de Gantt, qui sont la vue par défaut dans Microsoft Project. En définissant toutes les tâches et leur durée, vous pouvez obtenir une visualisation pour jouer.
Le diagramme de Gantt m'aide le plus en raison de sa visualisation. Voir des tâches sur du papier ne m'aide pas beaucoup, mais voir de jolies images et un graphique, c'est certain. Microsoft Project vous permet également de définir les prédécesseurs et les dates de début. L’idée principale est "Trouvez le nombre minimal de tâches à exécuter pour que la tâche X puisse démarrer". Au moins dans mes petits projets, la quantité de «vrais» prédécesseurs est assez petite. En fait, sur un projet, j’avais le problème que presque tout pouvait être fait en même temps et que je devais synthétiser deux chemins simultanés quelque peu cohésifs. Par exemple, j'ai essayé de m'assurer que si le développeur A touchait l'interface graphique, ils travaillaient également sur des tâches proches de l'interface graphique.
On dirait que vous avez déjà beaucoup travaillé sur ce sujet, mais je trouve toujours très utile de voir les diagrammes de Gantt. En regardant les tâches alignées les unes après les autres, cela me fait vraiment penser: "Attendez, est-ce que la tâche X doit vraiment être accomplie avant la tâche Y?
la source
On dirait que votre développeur est devenu un ingénieur en logiciel. Réalisez que la gestion du travail n'est pas un exercice de conception, mais que les deux vont de pair. Vous devez gérer le travail effectué, et cela dépend de la façon dont votre entreprise se développe. Si vous avez le temps et les ressources, envisagez d'adopter une méthodologie agile - il existe une multitude de documents écrits sur Internet. Trouvez-en un qui fonctionne pour vous, mais sachez que, comme tout le reste, ce n'est pas gratuit. L’adoption de toute technique implique la formation, l’apprentissage et l’échec avant de réussir. Si vous ne disposez pas de la bande passante nécessaire pour adopter une technique plus complète, la planification par étapes peut être la solution pour vous. Si vous avez une liste de tâches séquentielles, il se peut que vous n’ayez pas trouvé de séquences pouvantêtre parallélisé. Il se peut également que vous souhaitiez segmenter votre développement en tâches plus générales telles que les tests et la mise en œuvre. Cela, en soi, ne résout pas le problème des rapports, mais vous gérez la qualité. Votre progression peut être une liste séquentielle, mais vos rôles sont parallèles. Juste une suggestion. Une conception qui intègre le travail effectué par des personnes s'appelle une structure de répartition du travail.
D'autres personnes ont fait de bonnes suggestions, mais souvenez-vous que vous gérez du travail. Parfois, vous pouvez intégrer des concepts de travail dans la conception / architecture, parfois vous ne pouvez pas le faire aussi facilement. Il y a toujours un moyen de structurer le travail pour le rendre traçable. Je suggère de contacter votre responsable et de lui demander ce qui est important pour lui lorsqu'il s'agit de communiquer l'état du projet. Cela va commencer à vous dire comment aborder ce que vous faites. Si c'est prévu, vous voulez vous concentrer sur le rapport d'avancement. Si c'est de la qualité, vous voulez créer un rapport sur une série de métriques que vous devrez établir. Si ses coûts, alors vous voudrez probablement regarder l'effort. Toutes ces choses peuvent également être liées ou non aux tâches.
la source