À quelle fréquence valider les modifications du contrôle de code source? [fermé]


204

À quelle fréquence dois-je valider les modifications du contrôle de code source? Après chaque petite fonctionnalité, ou seulement pour les grandes fonctionnalités?

Je travaille sur un projet et j'ai une fonctionnalité à long terme à mettre en œuvre. Actuellement, je m'engage après chaque morceau de travail, c'est-à-dire chaque sous-fonctionnalité implémentée et corrigée. Je m'engage même après avoir ajouté un nouveau bloc de tests pour une fonctionnalité après avoir découvert un bug.

Cependant, je suis préoccupé par ce modèle. Dans une journée de travail productive, je pourrais faire 10 commits. Étant donné que j'utilise Subversion, ces commits affectent l'ensemble du référentiel, donc je me demande si c'est vraiment une bonne pratique d'en faire autant?


1
Man, cette question n'est pas basée sur l'opinion, et est une question totalement valide avec une réponse appropriée. La validation est une sorte de compétence importante, l'idée est que vous devez valider une amélioration / fonctionnalité / hotfix stable et que vous avez ajoutée dans votre base de code, y compris des messages de validation descriptifs. si c'est la fin de la journée et que vous voulez partir, vous ne pouvez pas simplement valider un code cassé et dire que vous le réparerez demain, car il est préférable d'utiliser le rebase parallèlement à la fusion pour conserver les messages et les validations importants et écraser les inutiles, si vous voulez juste garder un état temporaire, vous devez utiliser git stash
Eric

Pour éviter toute ambiguïté, si, dans certaines situations particulières, vous aviez besoin de valider et de pousser un code non terminé, après être revenu et vouloir continuer cette branche, lorsque vous avez terminé la chose, vous devez modifier la validation incomplète précédente, puis la pousser. c'est à vous de savoir comment garder votre arbre de travail propre et utile pour les rétrospectives, mais croyez-le ou non quand il s'agit de trouver et de résoudre des bogues très cachés ou subtils ou de mauvaises fonctionnalités, c'est une grande aide si vous avez un arbre de travail propre et professionnel lorsque vous veulent utiliser des outils de débogage git comme - git blame ou git bisect
Eric

Réponses:


196

Chaque fois que je termine une «réflexion complète» sur le code qui se compile et s'exécute, je m'enregistre. Cela se termine généralement entre 15 et 60 minutes. Parfois, cela peut être plus long, mais j'essaie toujours de vérifier si j'ai beaucoup de changements de code que je ne voudrais pas réécrire en cas d'échec. Je m'assure également généralement de la compilation de mon code et je m'enregistre à la fin de la journée de travail avant de rentrer chez moi.

Je ne m'inquiéterais pas de faire "trop" de validations / enregistrements. Cela craint vraiment quand vous devez réécrire quelque chose, et c'est agréable de pouvoir revenir en arrière par petits incréments au cas où.


3
La probabilité de rompre la construction avec une telle approche augmente considérablement. Attention, si vous n'avez pas de tests d'automatisation qui valident votre enregistrement - les gens vont frapper à votre porte parce que vous les avez bloqués.
Alex Weinstein

57
La probabilité de rupture de la génération avec une telle approche n'augmente pas si vous utilisez un système de contrôle de version distribué.
skiphoppy

24
Bien que le nombre de ruptures de génération augmente avec les validations plus fréquentes, le temps nécessaire pour corriger les ruptures diminue, tout comme le temps perdu à annuler les validations. Des engagements fréquents entraînent également de nombreux autres avantages. Si je casse la version, j'espère la casser rapidement et avec un petit commit afin que je puisse la réparer rapidement.
jyoungdev

26
Et si vous effectuez 2 semaines de travail, vous ne voulez pas fouiller dans un énorme commit pour voir quel morceau de code a cassé la construction. Les validations fréquentes vous permettent d'isoler les problèmes dans une base de code beaucoup plus petite car vous savez que seul un peu de code a changé.
Steven Sproat

1
@MikeJ Tout dépend de la façon dont vous utilisez le contrôle de code source. De plus, si vous utilisez quelque chose comme Git et travaillez dans votre propre branche, vous n'affecterez pas la génération pour les autres membres de l'équipe ni même le pipeline CI / CD.
Chris Pietschmann

82

Lorsque vous dites que vous craignez que vos "validations affectent l'ensemble du référentiel" --- faites-vous référence au fait que le numéro de révision de l'ensemble du référentiel augmente? Je ne sais pas combien de bits Subversion utilise pour le stocker, mais je suis sûr que vous ne manquerez pas de numéros de révision! De nombreux commits ne sont pas un problème. Vous pouvez vous engager dix fois plus souvent que le gars d'à côté et vous n'augmenterez pas du tout votre empreinte carbone.

Une seule fonction ou méthode doit être nommée pour ce qu'elle fait, et si le nom est trop long, cela fait trop. J'essaie d'appliquer la même règle aux check-ins: le commentaire de check-in doit décrire exactement ce que le changement accomplit, et si le commentaire est trop long, je change probablement trop à la fois.


1
J'aime ta déclaration. Si vous vous engagez dix fois plus souvent, il n'y aura aucun problème (mais il y en aura probablement si vous vous engagez 1/10 des fois).
Camilo Martin


24

Personnellement, je valide chaque groupe logique de code terminé / stable / compile et j'essaie de ne pas quitter la journée sans commettre ce que j'ai fait ce jour-là.


20

Si vous apportez des modifications majeures et que vous craignez d'affecter les autres personnes travaillant sur le code, vous pouvez créer une nouvelle branche, puis fusionner à nouveau dans le tronc une fois vos modifications terminées.


12

Je m'engage chaque fois que j'ai terminé une tâche. Cela prend généralement 30 minutes à 1 heure.


12

Si votre commentaire de contrôle de version dépasse une ou deux phrases, vous ne vous engagez probablement pas assez souvent.


7
Et si c'est moins, vous ne commentez probablement pas correctement.
JD Isaacks

11

Je suis le mantra open-source (paraphrasé) - engagez-vous tôt, engagez-vous souvent.

Fondamentalement, chaque fois que je pense avoir ajouté des fonctionnalités utiles (même petites) sans introduire de problèmes pour les autres membres de l'équipe.

Cette stratégie de validation est particulièrement utile dans les environnements d'intégration continue car elle permet des tests d'intégration par rapport à d'autres efforts de développement, permettant une détection précoce des problèmes.


10

Ne validez pas de code qui ne fonctionne pas réellement. N'utilisez pas votre référentiel comme solution de sauvegarde.

Au lieu de cela, sauvegardez votre code incomplet localement de manière automatisée. Time Machine prend soin de moi et il existe de nombreux programmes gratuits pour d'autres plateformes.


25
Ou créez une branche. C'est pour ça qu'ils sont là.
Brian Carlton

2
Le contrôle de version est destiné à empêcher la perte ou la sauvegarde de données. Mais ce n'est pas non plus destiné à être une corbeille. Seul le code qui compile doit être validé, mais la fonctionnalité ne doit pas nécessairement être complète pour effectuer une validation.
jmort253

8

La règle générale, que j'utilise, est l'archivage lorsque le groupe de fichiers en cours d'archivage peut être couvert par un seul commentaire d'archivage.

Il s'agit généralement de s'assurer que les enregistrements sont atomiques et que les commentaires peuvent être facilement digérés par d'autres développeurs.

Cela est particulièrement vrai lorsque vos modifications affectent un fichier de configuration (tel qu'un fichier de contexte Spring ou un fichier de configuration Struts) qui a une portée étendue à l'application. Si vous apportez plusieurs «groupes» de modifications avant l'archivage, leur impact se chevauche dans le fichier de configuration, entraînant la fusion des 2 groupes.


7

Je ne pense pas que vous devriez vous soucier autant de la fréquence. L'important ici est de savoir quoi, quand et pourquoi. Dire que vous devez vous engager toutes les 3 heures ou toutes les 24 heures n'a vraiment aucun sens. Engagez-vous lorsque vous avez quelque chose à engager, ne le faites pas si vous ne le faites pas.

Voici un extrait de mes meilleures pratiques recommandées pour le contrôle de version :

[...] Si vous apportez plusieurs modifications à un projet en même temps, divisez-les en parties logiques et validez-les en plusieurs sessions. Cela facilite beaucoup le suivi de l'historique des modifications individuelles, ce qui vous fera gagner beaucoup de temps lors de la recherche et de la correction de bogues ultérieurement. Par exemple, si vous implémentez les fonctionnalités A, B et C et corrigez les bogues 1, 2 et 3, cela devrait entraîner un total d'au moins six validations, une pour chaque fonctionnalité et une pour chaque bogue. Si vous travaillez sur une grande fonctionnalité ou que vous effectuez une refactorisation approfondie, envisagez de diviser votre travail en parties encore plus petites et effectuez un commit après la fin de chaque partie. De plus, lors de l'implémentation de modifications indépendantes sur plusieurs modules logiques, validez les modifications séparément pour chaque module, même si elles font partie d'une modification plus importante.

Idéalement, vous ne devriez jamais quitter votre bureau avec des modifications non validées sur votre disque dur. Si vous travaillez sur des projets dont les modifications affecteront d'autres personnes, envisagez d'utiliser une branche pour implémenter vos modifications et les fusionner à nouveau dans le coffre lorsque vous avez terminé. Lorsque vous validez des modifications dans des bibliothèques ou des projets dont dépendent d'autres projets, et donc d'autres personnes, assurez-vous de ne pas casser leurs builds en validant du code qui ne sera pas compilé. Cependant, avoir du code qui ne compile pas n'est pas une excuse pour éviter de commettre. Utilisez plutôt des branches. [...]


6

Votre modèle actuel est logique. Gardez à l'esprit la façon dont vous utilisez ce contrôle de source: que faire si vous devez revenir en arrière ou si vous voulez faire un diff? Les morceaux que vous décrivez semblent être exactement le bon différentiel dans ces cas: le diff vous montrera exactement ce qui a changé dans l'implémentation du bogue # (spécifié dans le journal de connexion), ou exactement ce que le nouveau code était pour implémenter une fonctionnalité. De même, le retour en arrière ne touchera qu'une chose à la fois.


6

J'aime aussi m'engager après avoir fini un gros morceau de travail, qui est souvent plusieurs fois par jour. Je pense qu'il est plus facile de voir ce qui se passe dans les petits commits que dans les grands. Si vous vous inquiétez d'un trop grand nombre de validations, vous pouvez envisager de créer une branche et de la fusionner à nouveau dans le tronc lorsque l'ensemble de la fonctionnalité est terminée.

Voici un article de blog connexe: Coding Horror: Check Early, Check In souvent


+1 sur votre point sur les commits plus petits, ce qui facilite le suivi. Rien n'est pire qu'un long paragraphe dans une validation CVS. Ça fait mal aux yeux et à la tête.
jmort253

4

Comme d'autres l'ont dit, essayez de valider un bloc logique suffisamment "complet" pour qu'il ne gêne pas les autres développeurs (par exemple, il construit et passe des tests automatisés).

Chaque équipe de développement / entreprise doit définir ce qui est «suffisamment complet» pour chaque branche. Par exemple, vous pouvez avoir des branches de fonctionnalités qui nécessitent uniquement le code pour être construites, un tronc qui nécessite également du code pour passer des tests automatisés et des étiquettes indiquant que quelque chose a passé les tests d'AQ ... ou quelque chose comme ça.

Je ne dis pas que c'est un bon modèle à suivre; Je souligne seulement que la façon dont "se fait" dépend des politiques de votre équipe / entreprise.


3

Le moment où vous y pensez.

(tant que ce que vous enregistrez est sûr)


3

Cela dépend de votre système de code source et de ce que vous avez d'autre en place. Si vous utilisez Git, validez chaque fois que vous terminez une étape. J'utilise SVN et j'aime m'engager lorsque je termine une fonctionnalité entière, donc toutes les une à cinq heures. Si j'utilisais CVS, je ferais de même.


3

Je suis d'accord avec plusieurs des réponses: ne pas archiver le code qui ne sera pas compilé; utiliser une branche ou un référentiel personnel si votre souci est d'avoir une «sauvegarde» du code ou de ses modifications; archiver lorsque les unités logiques sont terminées.

Une autre chose que j'ajouterais est qu'en fonction de votre environnement, le taux d'enregistrement peut varier avec le temps. Par exemple, au début d'un projet, le fait de vérifier que chaque élément fonctionnel d'un composant est terminé est logique à la fois pour la sécurité et pour avoir un historique de révision (je pense aux cas où les bits antérieurs sont refactorisés au fur et à mesure que les autres sont en cours de développement). Plus tard dans le projet, en revanche, une fonctionnalité entièrement complète devient plus importante, en particulier pendant le développement / test d'intégration. Une demi-intégration ou une demi-correction n'aide personne.

Quant à l'enregistrement après chaque correction de bogue: à moins que la correction ne soit triviale, absolument! Rien n'est plus pénible que de constater qu'un enregistrement contient trois correctifs et que l'un d'eux doit être annulé. Plus souvent qu'autrement, il semble que dans cette situation, le développeur a corrigé trois bogues dans une zone et décompose quel changement va à quelle correction de bogue est un cauchemar.


3

J'aime aussi vérifier régulièrement. C'est à chaque fois que j'ai franchi une étape vers mon objectif.

C'est généralement toutes les deux heures .

Ma difficulté est de trouver quelqu'un désireux et capable d' effectuer autant de révisions de code .

Notre politique d'entreprise est que nous devons avoir un examen du code avant de pouvoir enregistrer quoi que ce soit, ce qui est logique, mais il n'y a pas toujours quelqu'un dans le département qui a le temps d'effectuer immédiatement un examen du code. Solutions possibles:

  1. Plus de travail par enregistrement; moins de checkins == moins d'avis.
  2. Modifiez la politique d'enregistrement de l'entreprise. Si je viens de faire une refactorisation et que les tests unitaires fonctionnent tous au vert, je peux peut-être assouplir la règle?
  3. Modifiez le changement jusqu'à ce que quelqu'un puisse effectuer la révision et continuer à travailler. Cela peut être problématique si le réviseur n'aime pas votre code et que vous devez le reconcevoir. Jongler avec différentes étapes d'une tâche en «mettant en suspens» les changements peut devenir compliqué.

8
Une politique d'entreprise d'examen des enregistrements est judicieuse, mais incompatible avec les enregistrements de sauvegarde rapide. À cette fin, je pense qu'il est logique de travailler dans une succursale et de s'y enregistrer sans avoir à passer en revue, et de ne procéder aux enregistrements officiels qu'en fusionnant dans le coffre, avec une révision du code
Eli Bendersky

@ Eli- Je suis d'accord, utiliser une branche semble être la meilleure idée. Nous le faisions dans notre entreprise, mais nous nous sommes arrêtés. Je ne me souviens pas exactement quel était le problème - mais je pense que cela devenait trop complexe et s'avérait trop compliqué pour le gars qui gère les processus de publication et de déploiement.
GarethOwen

Idem Eli. Une autre option consiste à passer en revue avant la sortie, ou tout autre jalon. Passer en revue chaque enregistrement / validation du contrôle de version est terrible . C'est tellement terrible que je mettrais en place un dépôt local juste pour valider quelque part entre-temps jusqu'à ce que je puisse m'engager dans le dépôt "principal". (Je l'ai déjà fait lorsque le serveur CVCS n'était pas disponible.)
jyoungdev

2

J'aime commettre des changements toutes les 30 à 60 minutes, tant qu'il compile proprement et qu'il n'y a pas de régression dans les tests unitaires.


2

Eh bien, vous pouvez avoir votre propre branche dans laquelle vous pouvez vous engager aussi souvent que vous le souhaitez, et lorsque vous avez terminé avec votre fonctionnalité, vous pouvez la fusionner dans le tronc principal.

En ce qui concerne la fréquence des validations, j'y pense de cette façon, quelle douleur cela me ferait si mon disque dur tombait en panne et que je n'avais pas commis quelque chose - le quantum de ce quelque chose pour moi est d'environ 2 heures de travail.

Bien sûr, je ne commets jamais quelque chose qui ne compile pas.


alors, ce ne serait que 2 heures de douleur .. non? pourquoi est-ce si mauvais?
Kevin Conner


2

Je n'ai pas de limite de temps spécifique par commit, j'ai tendance à commettre une fois un test réussi et je suis satisfait du code. Je ne commettrais pas de code qui ne se compile pas ou se trouve dans un état dans lequel je ne me sentirais pas bien de revenir en cas d'échec


2

Vous devez trouver un équilibre entre la sécurité et la récupérabilité d'une part et la facilité de gestion du changement pour l'ensemble du projet, d'autre part.

Le meilleur schéma que j'ai utilisé a eu deux réponses à cette question.

Nous avons utilisé 2 référentiels complètement séparés: l'un était le référentiel à l'échelle du projet et l'autre était notre propre référentiel personnel (nous utilisions rcs à l'époque).

Nous vérifions notre référentiel personnel très régulièrement, à peu près chaque fois que vous enregistrez vos fichiers ouverts. En tant que tel, le référentiel personnel était fondamentalement un grand tampon d'annulation à longue portée.

Une fois que nous avons eu un morceau de code qui serait compilé, testé ok et accepté comme étant prêt pour une utilisation générale, il a été archivé dans le référentiel du projet.

Malheureusement, ce système reposait sur l'utilisation de différentes technologies VCS pour fonctionner. Je n'ai trouvé aucune méthode satisfaisante pour obtenir les mêmes résultats en utilisant deux VCS du même type (par exemple, deux référentiels de subversion)

Cependant, j'ai obtenu des résultats acceptables en créant des branches de développement "personnelles" dans un référentiel de subversion - en vérifiant régulièrement dans la branche puis en fusionnant dans le tronc une fois terminé.


2

Si vous travaillez sur une branche qui ne sera pas publiée, un commit est toujours sûr.

Cependant, si vous le partagez avec d'autres développeurs, la validation de code non fonctionnel risque d'être un peu ennuyeuse (en particulier si elle se trouve dans un endroit important). Normalement, je ne valide que du code qui "fonctionne" effectivement - non pas qu'il ait été entièrement testé, mais que je me suis assuré qu'il compile et n'échoue pas immédiatement.

Si vous utilisez un outil de suivi des bogues intégré, il peut être utile de faire des validations distinctes si vous avez corrigé deux bogues, afin que le journal de validation puisse aller à l'encontre des bons bogues. Mais là encore, parfois, un changement de code corrige deux bogues, alors il vous suffit de choisir celui contre lequel le mettre (à moins que votre système n'autorise un commit à être associé à plusieurs bogues)


2

Je crois toujours à l'expression «engagez-vous souvent, engagez-vous tôt». Je préfère les VCS décentralisés comme Mercurial et il n'y a aucun problème à valider plusieurs choses et à les pousser en amont plus tard.

C'est vraiment une question courante, mais la vraie question est: pouvez-vous valider du code inachevé?


1
Je crois que le code inachevé peut être validé tant qu'il est correctement architecturé afin qu'il puisse être isolé du reste du système. Par exemple, si vous implémentez une fonctionnalité de vote comme dans Stack Overflow, personne ne saura qu'elle est là si l'interface utilisateur n'a pas encore été construite.
jmort253

2

Chaque fois que vous terminez du code qui fonctionne et que vous ne foirez personne d'autre s'il l'obtient dans une mise à jour.

Et assurez-vous de bien commenter.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.