Quand devons-nous arrêter de travailler et fabriquer des outils?

25

En tant qu'ingénieur logiciel, nous sommes toujours désireux d'obtenir des outils efficaces pour augmenter notre productivité. Et dans notre travail quotidien, nous sommes souvent insatisfaits des outils existants et nous aimerions avoir de meilleures méthodes telles qu'une meilleure configuration de script GDB, un script Vim et un script Python pour rendre les choses ennuyeuses automatiques.

Cependant, il s'agit en fait d'un compromis car la fabrication d'outils nécessite également du temps et de l'énergie. Cela n'améliore pas immédiatement la productivité. Par conséquent, comment jugez-vous qu'il est temps d'arrêter de travailler et de créer des outils pour soulager votre douleur future?

xiao
la source
1
peut-être refactoriser vers un outil et continuer à travailler
Ray Tayek
1
Ce XKCD le cloue à peu près, sauf pour une chose: si le temps gagné par l'outil est juste le vôtre, ou s'il est multiplié par une large base d'utilisateurs dans toute votre organisation ou au-delà.
Kaz

Réponses:

27

Je «fabrique des outils» lorsque l'un d'eux est vrai:

  1. La tâche m'ennuie
  2. Le risque d'erreur humaine dans la tâche est trop grand

Le "risque" pour la 2ème option n'a pas à être énorme - le coût de construction d'un petit outil est généralement faible, donc si tout ce que vous économisez est le risque d'exécuter à nouveau une construction de 10 minutes une fois par semaine, il sera généralement se rembourser très rapidement.

J'essaie de rendre les outils aussi petits que possible - il suffit de rendre la tâche un peu plus facile maintenant, et peut-être de m'améliorer la prochaine fois.

Cela signifie que vous ne réparez que la plus grande douleur à chaque fois, et que vous ne créez pas de correctifs pour des problèmes qui ne vous blessent pas vraiment.

aviv
la source
2
+1 pour éviter les erreurs car cela dépasse le temps habituel par rapport au temps gagné lors de l'exécution.
k3b
1
J'ajouterais "lorsque vous vous retrouvez à répéter la même tâche très souvent". De façon assez surprenante, je me retrouve souvent à devoir générer une chaîne aléatoire de caractères. Donc, au lieu d'écrire un bout de code pour le faire, j'ai fait un formulaire simple avec un bouton pour le faire pour moi
bsara
9

Avec l'expérience, j'ai constaté que le simple fait de pousser dur sur le travail de grognement est généralement le plus efficace en termes de temps. Faire un outil est souvent tentant. Je renonce à résister lorsque:

  • L'outil a plus d'un objectif. Un bon joueur d'échecs accomplit deux choses à chaque coup: bloquer une pièce adverse et libérer un évêque. Un débutant aurait probablement besoin de deux tours pour le faire. De même, je me demande si l'outil ne ferait qu'une seule chose ou, avec un petit effort supplémentaire, en ferait deux, par exemple, aider à corriger certains fichiers de données brutes et créer également des données de test artificielles.
  • Utilité future. Cela pourrait me faire gagner du temps pour le travail de cette semaine, mais est-ce susceptible de me faire gagner du temps pour moi ou quelqu'un sur un nouveau projet la semaine prochaine?
  • C'est le bon moment pour apprendre une nouvelle langue, bibliothèque, technique de conception ou autre, et j'ai le temps de le faire. L'outil est un effet secondaire bénéfique de faire quelque chose d'éducation, en utilisant le temps déjà accordé pour l'éducation.
  • Lorsque nous avons de graves problèmes pour faire fonctionner les choses. Comme le parachutisme sans parachute, vous devriez vraiment prendre le temps de fabriquer ou d'acheter un parachute. Si vous ne pouvez pas obtenir de résultats expérimentaux significatifs, ou que la nouvelle application Web ne fonctionne pas du tout, vous devez simplement vous arrêter et créer ou acheter un outil pour mesurer ce que vous ne pouvez pas voir, piloter des composants ou remplacer une partie de la système. Lorsque le travail est totalement suspendu dans le besoin d'un outil, je ne me soucie pas de l'utilisation future ou de l'utilisation multiple. La nécessité pèse assez.
DarenW
la source
3
"L'outil a plus d'un but" À moins qu'ils ne soient en fait le même but appliqué de deux manières différentes, d'après mon expérience, il vaut mieux ne faire que deux outils.
AJMansfield
5

Ma règle d'or est que lorsque je dois faire quelque chose pour la troisième fois, il est temps soit d'écrire un petit script pour l'automatiser, soit de repenser mon approche.

Je ne fais pas un "outil" à part entière à ce stade, juste un petit script (généralement bash ou python; perl fonctionnerait aussi, ou même PHP) qui automatise ce que j'ai fait manuellement auparavant. Il s'agit essentiellement d'une application du principe DRY (ou du principe Single Source Of Truth, qui est essentiellement la même chose) - si vous devez modifier deux fichiers source en tandem, il doit y avoir une vérité commune qu'ils partagent, et que la vérité doit être factorisée et stockée en un seul endroit central. C'est génial si vous pouvez résoudre ce problème en interne en refactorisant, mais parfois, ce n'est pas possible, et c'est là que les scripts personnalisés entrent en jeu.

Plus tard, le script peut évoluer ou non en un outil complet, mais je commence généralement par un script très spécifique avec beaucoup de choses codées en dur.

Je déteste le travail de grognement avec passion, mais je crois aussi fermement que c'est un signe de conception mauvaise ou incorrecte. Être paresseux est une qualité importante dans un programmeur, et il vaut mieux être le genre où vous passez beaucoup de temps pour éviter le travail répétitif.

Bien sûr, parfois l'équilibre est négatif - vous passez trois heures à refactoriser votre code ou à écrire un script pour vous faire économiser une heure de travail répétitif; mais généralement, l'équilibre est positif, d'autant plus si vous considérez des coûts qui ne sont pas directement apparents: défaillance humaine (les humains sont vraiment mauvais pour le travail répétitif), base de code plus petite, meilleure maintenabilité en raison de la redondance réduite, meilleure auto-documentation, avenir plus rapide développement, code plus propre. Donc, même si le solde semble négatif en ce moment, la base de code augmentera davantage et cet outil que vous avez écrit pour générer des formulaires Web pour trois objets de données fonctionnera toujours lorsque vous aurez trente objets de données. D'après mon expérience, l'équilibre est généralement estimé en faveur du travail de grognement, probablement parce que les tâches répétitives sont plus faciles à estimer et donc sous-estimées, tandis que le refactoring, l'automatisation et l'abrégé sont perçus comme moins prévisibles et plus dangereux, et donc surestimés. Il s'avère généralement que l'automatisation n'est pas si difficile après tout.

Et puis il y a le risque de le faire trop tard: il est facile de refaçonner trois nouvelles classes d'objets de données en forme et d'écrire un script qui génère des formulaires Web pour elles, et une fois que vous avez fait cela, il est facile d'ajouter 27 classes supplémentaires qui travaillez également avec votre script. Mais il est presque impossible d'écrire ce script lorsque vous avez atteint un point où il existe 30 classes d'objets de données, chacune avec des formulaires Web écrits à la main, et sans aucune cohérence entre eux (aka "croissance organique"). Le maintien de ces 30 classes avec leurs formulaires est un cauchemar de codage répétitif et de recherche-remplacement semi-manuel, changer les aspects communs prend trente fois plus de temps qu'il le devrait, mais écrire un script pour résoudre le problème, qui aurait été une pause déjeuner sans encombre lorsque le projet a commencé est maintenant un projet effrayant de deux semaines avec la perspective redoutable d'un mois de suite consistant à corriger des bugs, éduquer les utilisateurs, et peut-être même abandonner et revenir à la ancienne base de code. Ironiquement, l'écriture du désordre de 30 classes a pris beaucoup plus de temps que la solution propre, car vous auriez pu utiliser le script pratique pendant tout ce temps. D'après mon expérience, l'automatisation du travail répétitif trop tard est l'un des problèmes majeurs des grands projets logiciels de longue durée. parce que vous auriez pu utiliser le script pratique pendant tout ce temps. D'après mon expérience, l'automatisation du travail répétitif trop tard est l'un des problèmes majeurs des grands projets logiciels de longue durée. parce que vous auriez pu utiliser le script pratique pendant tout ce temps. D'après mon expérience, l'automatisation du travail répétitif trop tard est l'un des problèmes majeurs des grands projets logiciels de longue durée.

tdammers
la source
4

Je viens de m'en souvenir:

xkcd - Vaut-il le temps?

Le problème avec cela est bien sûr qu'en situation réelle, vous ne pouvez pas facilement mesurer ces données pour sélectionner la bonne cellule dans le tableau. Et comme cela a été mentionné dans d'autres réponses, il existe d'autres variables (le risque d'erreur, la tâche est trop ennuyeuse pour le faire même une fois, ...) que vous devez ajouter à l'équation.

Donc ma réponse est que cela dépend vraiment de la situation et vous ne pouvez pas espérer obtenir de réponse "correcte" pour toutes les situations. Après tout, la vie serait ennuyeuse si nous avions des livres de cuisine pour tout.

Honza Brabec
la source
1
Joli! :-) Mais le temps gagné peut également être consacré à d'autres tâches - soit parce que l'outil peut être utilisé à plusieurs fins, soit en raison des connaissances acquises lors de l'écriture de l'outil.
Hans-Peter Störr
3

C'est un gros problème dans mon expérience. La construction d'outils est généralement laissée à un développeur motivé qui arrête de travailler pour construire l'outil. Cela interfère souvent avec le développement même s'il apporte de la valeur. La construction d'outils doit être considérée comme une partie intégrante du "processus" de développement.

Je me souviens avoir assisté à des révisions de code où des erreurs d'en-tête entraîneraient la planification d'une autre révision. Beaucoup d'entre eux auraient pu être détectés par un outil. par exemple, nombre de sloc incorrect, exigence manquante, erreurs de formatage. Mon outil écrit en perl a généré l'en-tête à partir du code livré et validé les exigences à partir d'une base de données Oracle. Il ne faisait pas partie de notre «processus», donc à court terme, l'outil a été considéré comme retardant la livraison.

Toute l'équipe doit s'arrêter périodiquement et voir où il y a des efforts manuels qui peuvent être automatisés par la création d'outils.

donleslie
la source
2

Toutes les autres réponses sont bonnes, mais j'ajouterais une autre raison pour laquelle il est utile de passer du temps à créer de petits outils (et à personnaliser votre .vimrc, .emacs, etc.):

Parfois, vous êtes "coincé dans une ornière" de façon créative ou motivante et faire quelque chose, n'importe quoi, "fera couler le jus" (pour mélanger les métaphores). Idéalement, ce serait quelque chose qui ferait avancer le projet de manière productive, mais si c'est un peu tangentiel et qui vous inspire, c'est bien aussi.

Vous ne regardez peut-être pas un écran vide, mais au lieu de cela, vous avez simplement du mal à voir les progrès que vous faites sur une grande tâche. Dans cette situation, cocher quelque chose de tangible peut vous empêcher de vous sentir comme si vous n'alliez nulle part.

Une variation à ce sujet est lorsque vous continuez à penser à quelque chose qui devrait être en veilleuse - en prenant juste un moment et en le faisant, cela vous échappera et vous libèrera pour mettre toute votre énergie dans la tâche principale.

À M
la source
1

Cela dépend de ce que vous considérez comme un outil. On peut dire que j'en fais des tas de façons que d'autres développeurs considéreraient frivoles ... Parce que je les fais pour à peu près tout sauf les commandes de système de fichiers les plus basiques.

J'utilise 2 justifications pour soutenir cela.

  • C'est une extension du principe DRY. Si nous voulons répéter quelque chose, l'effort manuel est l'utilisation la moins efficace des ressources humaines.
  • C'est un moyen efficace d'enregistrer ce que j'ai fait, donc si j'ai construit quelque chose, je (ou quelqu'un d'autre) voudrai peut-être me référer à la façon dont je l'ai fait des semaines ou des mois plus tard et cela conserve le journal de travail avec le projet.

Parfois, ils deviennent de plus grands outils et gagnent des fonctions interactives, mais s'ils ne le font pas, ils ont toujours une valeur d'enregistrement.

James Snell
la source