source: trunk/doc/extreme_version_control.txt @ 2

Revision 2, 6.1 KB checked in by dom, 5 years ago (diff)

Importing revision 150 of XP Dojo from BerliOS

Line 
1Je ne sais pas si nous utiliserons Darcs, mais si j'avais retenu cet
2outil lorsque je l'avais découvert il y a quelques temps, c'est que
3ses concepts m'ont beaucoup intéressés et m'ont inspiré dans ma
4réflexion sur E3 et la gestion de configuration extrême.
5
6Une autre réflexion que je menais concernait comment fournir une
7interface textuelle. Fabrice nous en a récemment rappelé
8l'importance. L'autre jour, dans un éclair de lucidité, ces deux
9sujets en apparence distincts se sont rejoints. Je vais essayer de
10décrire cette vision.
11
12Il faut commencer par ne plus penser au code comme un ensemble de
13fichiers source, et ne plus penser au développement et à la gestion de
14configuration comme une manipulation de fichiers contenant du
15texte. Visualisons le code comme quelque chose de concret, qui possÚde
16une structure, des formes, des relations. Par analogie, au lieu de se
17mettre au niveau du code génétique (séquence d'ADN), on regarde
18l'organisme vivant, sa structure cellulaire voire physiologique.
19
20Alors, chaque intervention sur le code devient une intervention
21logique, ayant un sens concret. On ne modifie pas les caractÚres 30 à
2235 de la 56Úme ligne d'un fichier, on change le nom d'une variable
23locale utilisée dans une fonction donnée.
24
25Imaginons un outil qui comprendrait cette structure du code. Pour
26manipuler le code, il faut lui demander une intervention logique, pas
27une édition d'un fichier source. Il offrirait tout un éventail de
28commandes élémentaires (ajout d'une instruction, ajout d'un argument,
29modification d'un nom de méthode...), des commandes plus complexes
30composées de plusieurs commandes élémentaires (ajout d'une classe), et
31des opérations intelligentes (refactoring).
32
33Ces commandes "logiques" sont un candidat parfait pour une interface
34textuelle avec l'outil. Autant ce serait débile d'imaginer une
35interface en ligne de commande pour faire de l'édition de fichiers
36sources (on reviendrait à l'éditeur "ed" d'Unix, c'est vraiment un
37retour en arriÚre par rapport à Emacs ou d'autres IDE modernes),
38autant je trouve cela intéressant, au lieu d'aller trouver un fichier
39source dans une arbo, de l'ouvrir, de descendre à la 56Úme ligne, de
40sélectionner un mot à la souris et de saisir "newName", de simplement
41saisir :
42
43e3 rename local variable MyModule:MyFunc:toto titi.
44
45Surtout si l'outil est assez intelligent pour modifier toutes les
46occurrences de la variable dans la fonction !
47
48Outre l'intérêt d'offrir un langage de commande (testabilité,
49intégration avec des outils externes et tout simplement ergonomie pour
50une utilisation avancée), cette approche à base de "commandes
51logiques" offre une vision puissante et innovante de la gestion de
52configuration.
53
54La gestion de configuration consiste à gérer les versions successives
55du code, et à gérer le développement par équipes. Avec des commandes
56logiques, la gestion de versions successives devient un jeu d'enfant
57dÚs lors qu'on constate l'évidence que toute commande logique à une
58commande inverse. Il suffit donc de conserver une trace de toutes les
59commandes effectuées, et on peut à tout moment revenir en arriÚre en
60appliquant une ou plusieurs commandes inverses. Notons au passage que
61nous disposons par la même occasion d'une trace permettant de faire du
62rejeu (à des fins d'analyse d'anomalies) et offrant un enregistrement
63à des fins ISO9000/CMM bien plus utile (car intelligible
64sémantiquement) que des diffs et bien plus objectif et fiable que des
65commentaires mis dans CVS.
66
67Quant à la question du développement par équipe, nous avons à la fois
68une façon d'égaler les fonctionnalités existantes (update, commit,
69fusion...), et le moyen d'aller beaucoup plus loin.
70
71C'est là que cela ressemble un peu à la philosophie de Darcs. Chacun
72travaille de son cÎté, puis soumet au référentiel ses
73modifications. Les modifications sont soumises sous la forme d'une
74séquence de commandes logiques. Là où cela devient intéressant, c'est
75que si les autres binÎmes décident de faire un update (de récupérer
76chez eux les modifs de quelqu'un d'autre), ils le font aussi sous
77forme de commandes logiques... Or une commande logique, appliquée sur
78du code qui n'est pas le même que celui sur lequelle elle a été
79appliquée à l'origine, ne fera pas forcément la même chose
80physiquement, mais devrait en fait faire ce qu'un développeur aurait
81voulu. Il ne devrait même plus y avoir de "conflits" au sens CVS. On
82peut même appliquer deux "patchs" dans un ordre différent, et toujours
83tomber sur un résultat correct! Par contre, on peut déceler de
84véritables conflits, par exemple lorsque deux commandes logiques ont
85toutes les deux cherché à renommer une fonction.
86
87Prenons l'exemple de deux tâches menées en parallÚle qui ont modifié
88la même ligne de code. Une tâche a renommé une fonction partout dans
89le code, l'autre a éliminé du code dupliqué en extractant deux zones
90de code semblables dans une nouvelle fonction. Or, cette zone de code
91contenait un appel à la fonction dont le nom a été modifié par l'autre
92tâche. CVS serait incapable de gérer cette situation. Avec l'approche
93en question, c'est possible. Lorsqu'on applique la commande logique
94"rename function" sur le code d'un binÎme, elle renomme la définition
95et tous les appels, y compris dans les /deux/ zones de code
96dupliqué. Sur le code du binÎme qui a lui supprimé cette duplication,
97elle renomme la définition et tous les appels, y compris celui qui se
98trouve maintenant dans la nouvelle fonction! Mais le plus fort est que
99l'inverse est vrai aussi. Le binÎme ayant supprimé la duplication a
100lui-même fait une séquence de commandes logiques qu'on peut appliquer
101aussi au code du binÎme qui a renommé la fonction, et ce dans
102n'importe quel ordre...
103
104Du coup, c'est là qu'on peut envisager (mais il faudra expérimenter à
105l'usage) une approche consistant à "broadcaster" en temps réel toutes
106les commandes logiques faites par les uns et les autres, et tout le
107monde update continuellement (en fait quasiment sans s'en rendre
108compte...) Et tout cela avec toujours la possibilité de faire "undo",
109à la fois individuellement dans son propre espace, ou dans le
110référentiel, ou globalement chez tout le monde!
Note: See TracBrowser for help on using the repository browser.