Je me retrouve à réfléchir à cette question de temps en temps, encore et encore. Je veux faire les choses correctement: écrire un code propre, compréhensible et correct facile à gérer. Cependant, ce que je finis par faire, c’est écrire un correctif sur un correctif; juste parce qu'il n'y a pas de temps à perdre, les clients attendent, un bogue doit être corrigé du jour au lendemain, la société perd de l'argent à cause de ce problème, un responsable insiste fort, etc., etc.
Je sais parfaitement que, à long terme, je perds plus de temps sur ces correctifs, mais comme ce temps dure plusieurs mois de travail, personne ne s'en soucie. En outre, comme l'un de mes responsables le disait souvent: "nous ne savons pas s'il y aura un long terme si nous ne le réparons pas maintenant".
Je suis sûr que je ne suis pas le seul à être pris au piège de ces cycles de choix sans fin entre réel et idéal. Alors, comment vous, mes collègues programmeurs, gérez-vous cela?
MISE À JOUR: Merci à tous pour cette discussion intéressante. Il est regrettable que tant de personnes doivent choisir quotidiennement entre une quantité et une qualité de leur code. Pourtant, de manière surprenante, beaucoup de gens pensent qu’il est possible de gagner cette bataille, alors merci à tous pour ces encouragements.
Réponses:
En fait, c'est une question très difficile car il n'y a pas de réponse absolument juste. Dans notre organisation, nous avons mis en place de meilleurs processus pour produire un meilleur code. Nous avons mis à jour nos normes de codage afin de refléter la manière dont nous écrivons en tant que groupe. Nous avons mis en place une boucle très forte de test / refactorisation / conception / code. Nous livrons continuellement ou du moins essayons de. À tout le moins, nous avons quelque chose à montrer aux parties prenantes toutes les deux semaines. Nous sentons que nous sommes des artisans du logiciel et le moral est bon. Mais malgré tous ces freins et contrepoids, nous avons le même problème que vous.
En fin de compte, nous livrons un produit à un client payant. Ce client a des besoins et des attentes, réalistes ou non. Souvent, l'équipe des ventes nous pose des problèmes simplement pour obtenir une commission. Parfois, le client a des attentes irréalistes ou une demande qui change, même si nous avons un contrat en vigueur. Les échéances arrivent. La prise de force et les jours perdus lors d'un sprint peuvent arriver. Toutes sortes de petites choses peuvent aboutir à une situation dans laquelle nous sommes forcés de faire comme si de rien n'était. «Fais-le bien» ou «Fais-le dès que possible». Presque toujours, nous sommes obligés de "le faire dès que possible".
En tant qu’artisans logiciels, développeurs, programmeurs, personnes qui codent pour un travail, c’est notre tendance naturelle à «faire les choses correctement». "Faites-le dès que possible" est ce qui se passe lorsque nous travaillons pour survivre, comme le font la plupart d'entre nous. La balance est dure.
Je commence toujours par contacter la direction (je suis directrice du développement logiciel et développeur actif dans ce groupe) pour défendre le calendrier, l’équipe et le travail en cours. Habituellement, à ce moment-là, on me dit que le client doit l'avoir maintenant et que cela doit fonctionner. Quand je sais qu'il n'y a pas de place pour la négociation ou pour donner, je retourne en arrière et travaille avec l'équipe pour voir quels coins peuvent être coupés. Je ne sacrifierai pas la qualité dans la fonctionnalité qui incite le client à l'obtenir dès que possible, mais quelque chose se passera et sera poussé à un autre sprint. C'est presque toujours OK.
Lorsque vous ne parvenez pas à livrer car il y a tant de bugs, que la qualité du code est mauvaise et qu'elle empire et que les délais sont de plus en plus courts, vous vous retrouvez dans une situation différente de celle que je décris. Dans ce cas, une mauvaise gestion actuelle ou passée, de mauvaises pratiques de développement qui ont conduit à une mauvaise qualité de code, ou d’autres facteurs peuvent vous mener à la mort.
Mon avis est de faire de votre mieux pour défendre le code et les bonnes pratiques afin que votre entreprise sorte de la tranchée. S'il n'y a pas un seul collègue prêt à écouter ou à défendre le groupe contre la direction, alors il serait peut-être temps de commencer à chercher un nouvel emploi.
En fin de compte, la vraie vie prime sur tous. Si vous travaillez pour une entreprise qui a besoin de vendre ce que vous développez, vous rencontrerez ce compromis quotidiennement. Ce n'est qu'en m'efforçant d'obtenir de bons principes de développement dès le début que j'ai réussi à rester en tête de la courbe de qualité du code.
Le va-et-vient entre développeurs et vendeurs me fait penser à une blague. "Quelle est la différence entre un vendeur de voitures d'occasion et un vendeur de logiciels? Au moins, le vendeur de voitures d'occasion sait qu'il ment." Gardez la tête haute et essayez de "faire ce qui est bien" au fur et à mesure.
la source
Une chose que j’ai réalisée au cours de ma carrière, c’est qu’il est toujours temps de bien faire les choses. Oui, votre manager pourrait pousser. Le client peut être énervé. Mais ils ne savent pas combien de temps cela prend. Si vous (votre équipe de développement) ne le faites pas, cela ne se fait pas; vous détenez tous les effets de levier.
Parce que vous savez ce qui va réellement pousser votre responsable à vous pousser, vous ou votre client, à vous en vouloir? Mauvaise qualité .
la source
Cela revient à ce que j'ai commencé à considérer comme "le conflit éternel" (entre les entreprises et l'ingénierie). Je n'ai pas la solution car c'est un problème qui ne disparaît jamais, mais vous pouvez faire des choses pour aider à atténuer les effets.
Ce que les gens ne réalisent pas souvent, c’est qu’en tant qu’ingénieurs, nous ne faisons que supposer que le problème des "entreprises prospères" est toujours acquis. Nous voulons que notre code soit agréable, net et facile à gérer, afin que nous puissions ajouter de nouvelles fonctionnalités et peaufiner celles qui existent déjà rapidement et avec un minimum de clients effectuant l'assurance qualité pour nous en découvrant d'étranges problèmes marginaux qui auraient été contrecarrés par un meilleur code. Garder les clients et conserver un avantage concurrentiel avec des fonctionnalités et une finesse que personne d'autre ne peut produire assez rapidement sont des avantages commerciaux qu'un code de qualité contribue directement et explique en grande partie la raison pour laquelle nous souhaitons un code de meilleure qualité.
Alors épelez-le. "Nous voulons utiliser X dans notre base de code parce que, sinon, cela aurait un impact négatif sur votre activité en raison de Y" ou "... car cela améliorera notre capacité à rester compétitif en améliorant notre capacité à appliquer plus rapidement les nouvelles améliorations et fonctionnalités." . "
Et faites de votre mieux pour essayer d’obtenir des preuves tangibles du bon fonctionnement des améliorations. Si l'amélioration d'un sous-ensemble d'une application entraîne une amélioration / fonctionnalité plus rapide, vérifiez quel outil d'arriéré que vous utilisez peut-être pour en apporter la preuve et signalez-le lors des réunions appropriées.
Les égos sont souvent un problème. Une chose dont les équipes d’ingénierie ont vraiment besoin, c’est d’établir l’utilité d’une approche convenue pour résoudre certains types de problèmes, et ce, pour que chacun puisse faire sa propre tasse de Kool Aid d’jour, car ils savent mieux. Il est normal de croire que les préférences de l'autre homme sont pires que les vôtres, mais valorisez la cohérence plutôt que d'avoir plus raison si son approche est réalisable et qu'il s'agit d'un argument que vous ne pouvez pas gagner. Le compromis dans un souci de cohérence est la clé. Lorsque les choses sont cohérentes, il est plus difficile de les mal faire, car la méthode établie et cohérente sera généralement la méthode la plus rapide.
Il existe deux écoles de cadres / outils / bibliothèques / peu importe. "Définissez 99% de la somme pour moi, donc je dois savoir / faire très peu" contre "rester en dehors de mon chemin quand je ne veux pas de vous, mais aidez-moi à bricoler très rapidement et avec cohérence avec ce que je veux réellement à utiliser sur la carotte plutôt que le principe de bâton ". Favoriser le second. La flexibilité et le contrôle granulaire ne devraient jamais être sacrifiés à l'autel d'un redressement rapide, car, pour les entreprises, "nous ne pouvons pas le faire car nos propres outils ne nous laissent pas" n'est jamais une réponse acceptable et la question ne se posera jamais. ingénierie produit triviale / jetable. D'après mon expérience, les outils inflexibles sont presque toujours ouverts ou manipulés de manière peu élégante et créent un gâchis géant et incontrôlable. Plus souvent qu'autrement, les solutions flexibles / plus faciles à modifier sont aussi ou presque aussi rapides à court terme, peu importe. Rapide, flexible et maintenable sont possibles avec les bons outils.
J'ai l'impression qu'il s'agit d'une question du point de vue du développeur, mais je me suis trouvé dans beaucoup trop de situations où les décisions technologiques ont été prises sans aucune intervention de l'ingénieur. Qu'est-ce que c'est que ça? Oui, il faut bien que le dernier appel soit passé, mais si vous êtes un responsable non technique, obtenez des opinions nuancées, mais pas ce que certains vendeurs ou un site de démonstration disent de ses propres produits. Tout ce qui promet de vous faire économiser de l’argent parce que les gens n’ont pas besoin d’être aussi intelligents ou parce que cela protège les développeurs contre eux-mêmes est un mensonge sale et sale. Embauchez des talents en lesquels vous pouvez avoir confiance. Expliquez-leur ce que vous attendez d'une pile ou d'une autre solution technique et prenez leur contribution au sérieux avant de décider quel mouvement technologique adopter.
Les outils sont destinés à la mise en œuvre et peuvent donc vous aider, mais la priorité absolue doit être l'architecture, quel que soit le jeu de jouets dont vous disposez pour construire cette architecture. À la fin de la journée, KISS et DRY et toutes les excellentes philosophies qui en découlent sont plus importantes que le fait de savoir s'il s'agit de .NET ou de Java ou de quelque chose qui est à la fois gratuit ET nul, c'est nul.
Lorsque le côté commercial insiste pour que vous le fassiez de la mauvaise façon, enregistrez cet e-mail, en particulier la partie où vous dites pourquoi cela vous coûterait. Lorsque toutes vos prévisions se réalisent et que de graves problèmes qui nuisent à votre entreprise en résultent, vous disposez de nombreux arguments pour prendre plus au sérieux les préoccupations des ingénieurs. Mais chronométrez les choses avec soin. Au milieu de l'enfer flamboyant, le moment est mal choisi pour un "Je te l'avais bien dit" après avoir suivi un code d'incendie. Eteignez le feu et apportez votre liste de problèmes précédemment ignorés à une réunion / conversation rétrospective, et essayez de garder le focus sur les problèmes d'ingénierie exprimés et ignorés et sur le raisonnement que vous avez compris, et non sur le nom des personnes. prendre la décision d'ignorer. Vous êtes un ingénieur. Restez sur les problèmes, pas les gens. " Nous avons exprimé notre inquiétude à propos de X parce que nous avions peur que cela pose des problèmes à Y. On nous a dit à Z et de remettre ça à plus tard. "
la source
Il n'y a qu'une seule solution. Réservez environ 10-20% du projet / temps de travail pour la refactorisation. S'il est difficile de convaincre la direction qu'il s'agit d'une tâche justifiable, donnez-lui le seul argument réel: sans refactorisation, le coût de la maintenance du code augmentera de manière exponentielle avec le temps. Il est bon d’avoir quelques métriques / articles / résultats de recherche pour étayer cette thèse lors de la réunion avec le responsable :)
Edit: il existe quelques bonnes ressources sur "le refactoring par rapport aux coûts croissants de la maintenance" mentionnées dans ce livre blanc: http://www.omnext.net/downloads/Whitepaper_Omnext.pdf
la source
Chaque fois que vous avez le temps de faire quelque chose de bien, utilisez-le - écrivez le meilleur code possible et améliorez-le régulièrement. Ne compliquez pas votre travail en faisant preuve de négligence et en contractant des dettes techniques là où il n’est pas nécessaire.
Les appels d'urgence pour réparer un bug grave ne sont pas des choses que vous pouvez contrôler par vous-même, quand ils se produisent, vous devez réagir aussitôt que possible, c'est la vie. Bien sûr, si vous avez l’impression que tout votre travail consiste en des appels d’urgence et que vous n’avez jamais assez de temps pour bien faire les choses, alors vous êtes sur le point d’être épuisé et vous devriez en parler à votre patron.
Si cela ne vous aide pas, il reste la "stratégie de Scotty" pour disposer de suffisamment de temps pour bien faire les choses: multipliez toutes vos estimations par un facteur de 4:
http://blogs.popart.com/2007/07/what-scotty-from-star-trek-can-teach-us-about-managing-expectations/
la source
Je considère que mon travail consiste à fournir le logiciel de la meilleure qualité possible dans les délais impartis pour le projet. Si je crains que le niveau de qualité ne soit bas, je ferai appel au propriétaire du projet. Je décris mes préoccupations et discute des risques potentiels liés au déploiement du logiciel dans cet état. Une des trois choses va se passer à ce stade:
Le propriétaire du projet ne voudra pas accepter les risques et modifiera le calendrier pour nous permettre de consacrer plus de temps à la qualité du logiciel.
Le porteur de projet ne voudra pas accepter les risques mais ne pourra pas revenir au calendrier. Si cela se produit, nous devons alors négocier les fonctionnalités à supprimer de la portée du projet afin de consacrer plus de temps à la qualité logicielle pour les principales parties de l’application.
Le porteur de projet acceptera les risques et le logiciel de mauvaise qualité sortira comme prévu. Parfois, le risque commercial de ne rien déployer (ou de déployer tardivement) est beaucoup plus grand que le risque commercial de déployer un logiciel de qualité médiocre, et seul le propriétaire du projet peut prendre cette décision.
Les logiciels d’écriture ressemblent beaucoup à la peinture d’un portrait. Il est impossible de dire qu'un portrait est fait "correctement" ou "parfait". Parfait est l'ennemi du fait. Vous pourriez littéralement passer 1 mois à travailler sur une seule méthode et cela ne sera toujours pas considéré comme "parfait" par certains. Mon travail consiste à dresser un portrait qui satisfasse le client.
la source
Cela ne fonctionnera pas dans tous les cas, mais j'ai eu un peu de chance en utilisant cette stratégie si le problème est un problème de production cassé qui doit être résolu de manière urgente. Estimez le temps nécessaire à la résolution rapide de la production et au temps nécessaire pour améliorer la qualité. Présentez les estimations à votre patron / client et obtenez l'heure approuvée pour les deux. Ensuite, vous faites le correctif rapide pour obtenir la production en cours et un correctif à long terme immédiatement après, lorsque la pression temporelle urgente est levée. Je trouve que si je le présente car j'ai besoin de ce temps pour faire le travail correctement, mais que je peux mettre en place un correctif temporaire jusqu'à ce que je puisse le faire, mes clients semblent aimer cette approche. Il remet en marche et répond au besoin à long terme.
la source
L'équilibre optimal peut être de passer autant de temps supplémentaire à faire les choses correctement que de perdre à corriger les bugs que vous éliminez en les faisant bien. Évitez de plaquer la solution en plaqué or. Dans la plupart des cas, la solution proposée par Volkswagen est aussi valable que celle de Cadillac. Vous pouvez généralement effectuer une mise à niveau plus tard s'il est prouvé que vous avez besoin de la Cadillac.
La correction de code qui n'a pas suivi les meilleures pratiques prend souvent beaucoup plus de temps. Essayer de trouver l’origine de la valeur null lorsque l’appel ressemble à abcde () peut prendre beaucoup de temps.
L'application de DRY et la réutilisation du code existant sont généralement beaucoup plus rapides que le codage et le test d'une autre solution. Cela facilite également l'application des modifications lorsqu'elles se produisent. Il vous suffit de modifier et de tester un ensemble de codes, pas deux, trois ou vingt.
Viser un code de base solide. On peut perdre beaucoup de temps à essayer de le rendre parfait. Certaines pratiques recommandées conduisent à un code rapide, mais pas nécessairement le plus rapide possible. Au-delà de cela, essayer d'anticiper les goulots d'étranglement et d'optimiser le code au fur et à mesure de sa construction peut être une perte de temps. Pire encore, l'optimisation peut ralentir le code.
Dans la mesure du possible, fournissez la solution de travail minimale. J'ai vu des semaines de solutions de placage à l'or perdues. Soyez extrêmement prudent avec la portée.
J'ai passé quelque temps à travailler sur un projet qui aurait dû prendre six mois. Quand je suis arrivé, ça faisait un an et demi que ça marchait. Le responsable du projet avait posé au responsable de projet une question au début: "Voulez-vous que je le fasse correctement ou que je sois réactif?" En une semaine, une fonctionnalité a été implémentée les lundi, mercredi et vendredi; Mardi et jeudi, la fonctionnalité a été supprimée.
EDIT: Lorsque le code est terminé à un niveau satisfaisant, laissez-le. Ne retournez pas le réparer si vous trouvez une meilleure façon de le faire. Si vous devez vous faire une note. Si des modifications sont nécessaires, passez en revue votre idée et mettez-la en œuvre si elle a toujours du sens.
S'il existe des endroits où vous souhaitez implémenter des extensions pour les fonctionnalités à venir, ne les implémentez pas. Vous pouvez laisser un commentaire de repère pour vous rappeler où apporter les modifications.
la source
Faites-le fonctionner puis rendez-le parfait
Je peux tirer quelque chose pour cela - mais si le temps presse, alors votre priorité devrait être de le faire fonctionner, aussi simple que cela. Faites des commentaires approfondis sur les lacunes de votre code et notez ce que vous avez fait dans n'importe quel logiciel de gestion de projet / temps que vous utilisez.
Espérons que cela vous donnera plus de temps pour revenir sur ces problèmes et les rendre parfaits.
Évidemment, il n’ya pas de réponse absolument correcte à cette question, mais c’est une réponse que j’essaie de respecter. Cependant, il se peut que vous ne trouviez pas cela adapté à votre style de travail actuel. Ce qui m'amène à l'alternative ...
Il suffit de trouver une méthode qui fonctionne pour vous . et ensuite s'en tenir à cela. Chacun a sa propre façon de gérer les projets et il n’ya pas d’approche «taille unique». Trouvez une approche et personnalisez-la.
la source
"Faire les choses correctement" signifie faire les bons compromis pour une situation donnée. Certains d'entre eux sont:
Évidemment, si un morceau de code doit être utilisé une fois et jeté, le n ° 2 peut être sacrifié pour n’importe lequel des autres. (Mais méfiez-vous: vous pouvez penser que vous allez le jeter, puis vous devez continuer à l'utiliser et à le conserver, à quel point il sera plus difficile de convaincre les gens de vous donner le temps d'améliorer quelque chose qui "fonctionne".)
Si vous et / ou votre équipe allez continuer à utiliser et à mettre à jour du code, prendre des raccourcis maintenant signifie simplement que vous vous ralentissez plus tard.
Si vous livrez actuellement du code buggy (faible sur # 4) et que vous prenez beaucoup de temps pour le faire (faible sur # 1), c'est parce que vous essayez de mettre à jour du code qui était faible sur # 2, eh bien, vous avez Vous avez un argument solide et pragmatique pour changer vos pratiques.
la source
Si c'est un bug, faites-le dès que possible, si c'est une nouvelle fonctionnalité, prenez votre temps.
Et si vous travaillez pour une entreprise qui ne respecte pas le travail de développeur, vous n’avez peut-être pas le choix que de le faire rapidement et de sacrifier la qualité.
J'ai travaillé pour un certain nombre d'entreprises qui ne feraient que passer d'un projet à l'autre et tout faire rapidement. En fin de compte, ils ont eu peu de succès dans tous les projets car la mise en œuvre (pas seulement la programmation) a été précipitée.
Les meilleures entreprises comprennent qu'un bon logiciel nécessite du temps et du travail manuel.
la source
En cas d'urgence, créez la solution de correction. Créez un nouveau bogue dans le suivi des bogues en le mentionnant. Faites-le bien, chaque fois que vous en avez le temps.
la source
Je pense que je fais comme tout le monde qui est coincé dans cette industrie. Je le fais aussi vite que possible et si je dois laisser de côté certaines des choses intéressantes qui pourraient aider à prévenir les problèmes à l'avenir ou faciliter la résolution des problèmes à l'avenir, c'est ce que je fais. Ce n'est pas une situation optimale, mais lorsque vous vous retrouvez avec des échéances basées sur des estimations basées sur des estimations, basées sur de nombreuses variables inconnues, c'est quasiment tout ce que vous pouvez faire.
la source
Voici un bon plan:
la source
Je fais la plupart des choses de la manière habituelle, la première qui me vienne à l’esprit. C’est rapide, et j’aime penser que je suis un bon programmeur et que je fais la plupart des choses raisonnablement bien du premier coup.
De temps en temps (j'aimerais dire deux fois par jour, mais deux fois par semaine, c'est plus réaliste), surtout quand je trouve quelque chose d'extrêmement ennuyeux à faire de façon routinière, je pense "quelle serait une façon IMPRESSIONNANTE de le faire ? " et je passe plus de temps à trouver ou à inventer une meilleure façon de le faire.
Si je continue à le faire assez souvent, mon codage de routine continuera à s'améliorer, je pense.
la source
Le logiciel est un truc bizarre et le processus de développement logiciel est plus étrange.
Contrairement à la plupart des choses dans la vie réelle, mais comme la plupart des choses à faire avec les ordinateurs
Plus rapide est plus fiable
Cela va à l’encontre de toutes les intuitions que votre vie jusqu’à présent vous a enseignées, les voitures très réglées tombent en panne plus souvent que les voitures standard, les maisons construites rapidement se défont plus rapidement, les devoirs faits à l’arrière de l’autobus scolaire n’ont pas de bonnes notes.
Mais les procédures méthodiques lentes ne produisent pas de meilleurs logiciels. Les gars qui passent des semaines à rédiger des documents d’exigences et des jours sur les diagrammes de classes avant d’écrire du code ne produisent pas de meilleurs logiciels. Le type qui répond aux exigences de base, clarifie quelques problèmes, dessine un diagramme de classes sur le tableau blanc et obtient le codage de son équipe produira presque toujours un logiciel plus fiable et de meilleure qualité, et le fera en quelques jours plutôt que plusieurs mois.
la source
Le travail ne vous convient pas.
Un code de qualité médiocre écrit "parce qu’il n’ya pas de temps à perdre, les clients attendent, un bogue doit être corrigé du jour au lendemain, la société perd de l’argent à cause de ce problème, un directeur insiste", est le symptôme d’une société mal gérée.
Si vous êtes prêt à être fier de votre travail et à écrire un code de haute qualité, la meilleure chose à faire est de trouver un employeur qui comprend cela et qui vous paiera pour le faire.
la source