Numérique et Sciences Informatiques1ère

Partage de code collaboratif
Exercices corrigés

Maîtrisez le partage de code collaboratif : outils, pratiques, gestion de versions et travail en équipe grâce à ces 5 exercices détaillés.

Concepts & Exercices
Collaboration = \frac{Communication + Coordination + Coordination}{3}
Calcul de la collaboration efficace
Gestion de versions
🔄
Suivi des modifications
Branches
/Branches
Parallélisme des développements
Pull Request
📥
Propositions de modifications
Revues de code
🔍
Amélioration de la qualité
Éléments clés :
  • Git : Système de gestion de versions distribué
  • GitHub/GitLab : Plateformes de collaboration
  • Branches : Développement parallèle
  • Commits : Historique des modifications
  • Merge : Intégration des modifications
Exercice 1
Configuration d'un dépôt Git collaboratif
Exercice 2
Gestion de branches et fusion
Exercice 3
Synchronisation entre collaborateurs
Exercice 4
Revue de code et feedback
Exercice 5
Workflow collaboratif complet
Corrigé : Exercices 1 à 3
1 Configuration dépôt Git
Définition :

Problème : Configurer un dépôt Git pour un projet collaboratif

Étapes de configuration :
  1. Installer Git sur la machine locale
  2. Configurer les identifiants utilisateur
  3. Créer un dépôt distant (GitHub/GitLab)
  4. Initialiser un dépôt local
  5. Connecter le dépôt local au distant
1
Configuration globale
2
Création du dépôt
3
Connexion au distant
4
Validation
Étape 1 : Configuration des identifiants
# Configuration des informations utilisateur
git config --global user.name "Alice Martin"
git config --global user.email "alice.martin@example.com"

# Vérification de la configuration
git config --list
Étape 2 : Création du dépôt local
# Création du répertoire du projet
mkdir projet-bibliotheque
cd projet-bibliotheque

# Initialisation du dépôt Git
git init

# Création d'un fichier README
echo "# Projet de gestion de bibliothèque" > README.md

# Ajout des fichiers au suivi
git add README.md

# Premier commit
git commit -m "Initial commit: Ajout du README"
Étape 3 : Connexion au dépôt distant
# Sur GitHub, créer un dépôt nommé "projet-bibliotheque"
# Copier l'URL du dépôt (HTTPS ou SSH)

# Ajouter le dépôt distant
git remote add origin https://github.com/alice-martin/projet-bibliotheque.git

# Pousser le premier commit vers le dépôt distant
git branch -M main
git push -u origin main

# Vérification de la connexion
git remote -v
Dépôt Git configuré et connecté au distant
Configuration terminée :

Le dépôt local est correctement configuré et connecté au dépôt distant pour le travail collaboratif.

Règles de configuration Git :

• Configurer les identifiants : Nom et email pour les commits

• Initialiser le dépôt : git init dans le répertoire du projet

• Connecter au distant : git remote add origin URL

2 Gestion branches et fusion
Définition :

Problème : Gérer les branches et les fusions dans un projet collaboratif

1
Création de branche
2
Développement sur la branche
3
Fusion avec la branche principale
4
Nettoyage
Étape 1 : Création et basculement de branche
# Création d'une nouvelle branche pour une fonctionnalité
git checkout -b feature-gestion-utilisateurs

# Vérification de la branche active
git branch

# Ou en une seule commande (Git 2.23+)
git switch -c feature-gestion-utilisateurs
Étape 2 : Développement sur la branche
# Création d'un fichier pour la fonctionnalité
echo "def creer_utilisateur(nom, email):
    # Fonction pour créer un nouvel utilisateur
    utilisateur = {'nom': nom, 'email': email}
    return utilisateur" > gestion_utilisateurs.py

# Ajout et commit des modifications
git add gestion_utilisateurs.py
git commit -m "Ajout de la fonction de création d'utilisateur"
Étape 3 : Fusion avec la branche principale
# Basculement vers la branche principale
git checkout main

# Mise à jour depuis le dépôt distant
git pull origin main

# Fusion de la branche feature
git merge feature-gestion-utilisateurs

# Pousser les modifications vers le dépôt distant
git push origin main

# Suppression de la branche locale (optionnel)
git branch -d feature-gestion-utilisateurs

# Suppression de la branche distante (optionnel)
git push origin --delete feature-gestion-utilisateurs
Étape 4 : Gestion des conflits potentiels
# Si un conflit survient pendant la fusion
# Git indiquera les fichiers en conflit

# Exemple de conflit dans un fichier
<<<<<<< HEAD
def fonction_existant():
    return "ancienne version"
=======
def fonction_existant():
    return "nouvelle version"
>>>>>>> feature-gestion-utilisateurs

# Résolution manuelle du conflit, puis :
git add fichier_conflit.py
git commit -m "Résolution du conflit dans fonction_existant"
Branche créée, modifiée et fusionnée avec succès
Gestion des branches :

Les branches permettent un développement parallèle et une intégration contrôlée des modifications.

Règles de gestion des branches :

• Créer des branches pour chaque fonctionnalité : git checkout -b nom-branche

• Mettre à jour avant la fusion : git pull origin main

• Gérer les conflits : Résoudre manuellement les conflits de fusion

3 Synchronisation entre collaborateurs
Définition :

Problème : Synchroniser les modifications entre plusieurs collaborateurs

Synchronisation = \frac{Pull + Push + Merge}{Collaborateurs}
Fréquence_{sync} = \frac{Commits_{quotidiens}}{Participants}
Étape 1 : Récupération des modifications distantes
# Avant de commencer à travailler, récupérer les dernières modifications
git pull origin main

# Cela combine git fetch et git merge
# fetch télécharge les modifications distantes
# merge les intègre dans la branche locale
Étape 2 : Travail collaboratif quotidien
# Alice travaille sur la gestion des livres
git checkout -b feature-gestion-livres
echo "def ajouter_livre(titre, auteur):
    # Fonction pour ajouter un livre
    livre = {'titre': titre, 'auteur': auteur}
    return livre" > gestion_livres.py
git add gestion_livres.py
git commit -m "Ajout de la fonction d'ajout de livre"

# Bob travaille sur la recherche
git checkout -b feature-recherche
echo "def rechercher_livre(critere, valeur):
    # Fonction pour rechercher un livre
    resultats = []
    # Logique de recherche
    return resultats" > recherche.py
git add recherche.py
git commit -m "Ajout de la fonction de recherche"
Étape 3 : Synchronisation et résolution de conflits
# Alice termine sa fonctionnalité
git checkout main
git pull origin main  # Récupère les modifications de Bob
git merge feature-gestion-livres
git push origin main

# Bob récupère les modifications d'Alice avant de fusionner
git checkout main
git pull origin main  # Récupère les modifications d'Alice
git merge feature-recherche
git push origin main

# Si un conflit survient, résolution manuelle
# Exemple : deux personnes ont modifié le même fichier
Étape 4 : Bonnes pratiques de synchronisation
# Bonnes pratiques :
# 1. Pull avant de pousser
git pull origin main && git push origin main

# 2. Utiliser rebase pour un historique propre
git checkout feature-xyz
git rebase main  # Applique les commits de feature après ceux de main
git checkout main
git merge feature-xyz

# 3. Synchronisation fréquente pour éviter les gros conflits
# 4. Communication entre collaborateurs pour coordonner les changements
Synchronisation réussie entre collaborateurs
Synchronisation effective :

La synchronisation régulière et la communication entre collaborateurs permettent d'éviter les conflits majeurs.

Règles de synchronisation :

• Pull avant de push : Toujours récupérer les dernières modifications

• Commits fréquents : Partager le travail régulièrement

• Communication : Coordonner les changements avec les autres collaborateurs

Corrigé : Exercices 4 à 5
4 Revue de code et feedback
Définition :

Problème : Effectuer une revue de code collaborative et donner des feedbacks constructifs

Demande de revue
📤
Pull Request
Commentaires
💬
Feedback constructif
Améliorations
🔧
Corrections demandées
Validation
✅
Approbation finale
Étape 1 : Création d'une Pull Request
# Alice termine sa branche et la pousse
git checkout feature-gestion-emprunts
git add .
git commit -m "Implémentation complète de la gestion des emprunts"
git push origin feature-gestion-emprunts

# Sur GitHub, créer une Pull Request
# Titre: "feat: Ajouter la gestion des emprunts"
# Description: 
# - Fonctionnalité complète de gestion des emprunts
# - Ajout des tests unitaires
# - Documentation mise à jour
# Reviewers: bob.doe, charlotte.lee
Étape 2 : Exemple de revue de code
# Code proposé par Alice
def gerer_emprunt(utilisateur_id, livre_isbn):
    """
    Gère l'emprunt d'un livre par un utilisateur
    """
    # Vérifier si l'utilisateur existe
    utilisateur = rechercher_utilisateur(utilisateur_id)
    if utilisateur is None:
        raise ValueError("Utilisateur non trouvé")
    
    # Vérifier si le livre existe
    livre = rechercher_livre(livre_isbn)
    if livre is None:
        raise ValueError("Livre non trouvé")
    
    # Vérifier la disponibilité
    if livre['disponible'] == False:
        raise ValueError("Livre non disponible")
    
    # Enregistrer l'emprunt
    emprunt = {
        'utilisateur_id': utilisateur_id,
        'livre_isbn': livre_isbn,
        'date_emprunt': datetime.now(),
        'date_retour_prevue': datetime.now() + timedelta(days=14)
    }
    
    sauvegarder_emprunt(emprunt)
    return emprunt
Commentaires de Bob:
- ✅ Bonne gestion des erreurs
- ⚠️ Manque de validation des dates
- 💡 Ajouter un commentaire sur la durée de l'emprunt (14 jours)
- 🔄 Suggestion: Extraire la logique de vérification dans des fonctions séparées

Commentaires de Charlotte:
- ✅ Structure claire et lisible
- ❓ Est-ce que l'utilisateur peut avoir plusieurs emprunts ?
- 🔧 Suggestion: Ajouter un champ 'statut' à l'emprunt
Étape 3 : Réponse aux commentaires et améliorations
def gerer_emprunt(utilisateur_id, livre_isbn):
    """
    Gère l'emprunt d'un livre par un utilisateur
    
    Args:
        utilisateur_id: ID de l'utilisateur
        livre_isbn: ISBN du livre à emprunter
        
    Returns:
        dict: Dictionnaire contenant les détails de l'emprunt
        
    Raises:
        ValueError: Si l'utilisateur ou le livre n'existe pas
                   ou si le livre n'est pas disponible
    """
    # Vérifier si l'utilisateur existe
    utilisateur = rechercher_utilisateur(utilisateur_id)
    if utilisateur is None:
        raise ValueError("Utilisateur non trouvé")
    
    # Vérifier si l'utilisateur a atteint la limite d'emprunts
    nb_emprunts = compter_emprunts_actifs(utilisateur_id)
    if nb_emprunts >= MAX_EMPRUNTS_PAR_UTILISATEUR:
        raise ValueError(f"L'utilisateur a atteint la limite de {MAX_EMPRUNTS_PAR_UTILISATEUR} emprunts")
    
    # Vérifier si le livre existe
    livre = rechercher_livre(livre_isbn)
    if livre is None:
        raise ValueError("Livre non trouvé")
    
    # Vérifier la disponibilité
    if not livre.get('disponible', False):
        raise ValueError("Livre non disponible")
    
    # Enregistrer l'emprunt
    emprunt = {
        'utilisateur_id': utilisateur_id,
        'livre_isbn': livre_isbn,
        'date_emprunt': datetime.now(),
        'date_retour_prevue': datetime.now() + timedelta(days=DUREE_EMPRUNT_JOURS),
        'statut': 'actif'  # Ajout du statut de l'emprunt
    }
    
    sauvegarder_emprunt(emprunt)
    return emprunt
Étape 4 : Validation finale
Bob: 
✅ Corrections apportées comme demandé
✅ Tests unitaires mis à jour
✅ Documentation améliorée
✅ Approve

Charlotte:
✅ Bonne réponse aux commentaires
✅ Gestion des limites d'emprunts ajoutée
✅ Code plus robuste
✅ Approve

Alice:
✅ PR mergée dans la branche principale
✅ Branches de développement supprimées
✅ Ticket de suivi mis à jour
Revue de code collaborative terminée avec succès
Revue de code constructive :

La revue de code permet d'améliorer la qualité du code et de favoriser le partage de connaissances.

Règles de revue de code :

• Commentaires constructifs : Suggestions d'amélioration, pas de critiques personnelles

• Respect des conventions : Normes de codage et de documentation

• Validation par plusieurs personnes : Double validation pour les modifications critiques

5 Workflow collaboratif complet
Définition :

Problème : Mettre en place un workflow collaboratif complet pour un projet de développement

1
Planification
2
Développement
3
Revues
4
Déploiement
Étape 1 : Configuration du workflow
WORKFLOW COLLABORATIF PROJET BIBLIOTHÈQUE

1. PLANIFICATION
- Création des tickets de fonctionnalités
- Attribution aux membres de l'équipe
- Estimation de la complexité
- Sprint planning (2 semaines)

2. BRANCHING STRATEGY
- main: Code de production stable
- develop: Intégration des fonctionnalités
- feature/*: Développement de nouvelles fonctionnalités
- hotfix/*: Corrections urgentes
- release/*: Préparation des releases

3. PROCESSUS DE DÉVELOPPEMENT
- Chaque fonctionnalité dans une branche dédiée
- Pull Request obligatoire pour merger
- Revue par au moins 2 membres
- Tests automatisés obligatoires
Étape 2 : Cycle de développement quotidien
# Matin: Récupération des dernières modifications
git checkout main
git pull origin main
git checkout develop
git merge main
git push origin develop

# Début d'une nouvelle tâche
git checkout -b feature/recherche-avancee develop

# Développement de la fonctionnalité
# ... écriture du code ...

# Commit des modifications
git add .
git commit -m "feat: Ajouter la recherche avancée par catégories"

# Pousser la branche
git push origin feature/recherche-avancee

# Création d'une Pull Request sur GitHub
Étape 3 : Processus de validation
PROCESSUS DE VALIDATION:

1. La PR est assignée à 2 reviewers
2. Les tests automatisés s'exécutent (CI/CD)
3. Les reviewers examinent le code
4. Feedbacks et suggestions
5. Modifications si nécessaire
6. Approbation par les reviewers
7. Intégration dans la branche develop
8. Tests d'intégration
9. Si OK: Merge dans main pour release
10. Sinon: Retour à l'étape 5
Étape 4 : Exemple de cycle complet
Lundi:
- Alice: feature/gestion-retours
- Bob: feature/recherche-avancee
- Charlotte: refactor:ameliorer-performance

Mardi:
- Alice termine et crée PR #15
- Bob termine et crée PR #16
- Charlotte termine et crée PR #17

Mercredi:
- PR #15: Revue par Bob et Charlotte → Approbation
- PR #16: Revue par Alice et Charlotte → Demande de modifications
- PR #17: Revue par Alice et Bob → Approbation

Jeudi:
- Bob corrige PR #16
- PR #15 et #17 mergées dans develop
- PR #16 revue à nouveau et approuvée

Vendredi:
- Toutes les PRs mergées dans main
- Release de la version 1.2.0
Workflow collaboratif complet mis en place
Workflow optimisé :

Le workflow collaboratif assure une qualité de code élevée et une coordination efficace entre les membres de l'équipe.

Règles de workflow :

• Processus clair : Chaque étape est bien définie et comprise

• Revues obligatoires : Toutes les modifications sont revues

• Tests automatisés : Vérification de la qualité avant l'intégration

Cours bien détaillé
Efficacité_{collaboration} = \frac{Communication × Coordination × Qualité}{Temps × Complexité}
Calcul de l'efficacité de la collaboration
🤝
Communication : Échanges clairs et réguliers entre collaborateurs.
🔄
Coordination : Synchronisation des activités et des plannings.
🔍
Qualité : Revue de code et tests pour assurer la robustesse.
⚡
Efficacité : Productivité et rapidité d'exécution.
💡
Conseil : Utilisez des outils de gestion de projet comme Trello ou Jira
🔍
Attention : Faites des revues de code régulières
⚡
Astuce : Automatisez les tests et les validations
📋
Méthode : Utilisez des conventions de nommage cohérentes
✅
Vérification : Tenez des réunions quotidiennes brèves
Meilleures pratiques de collaboration :
  • Commits atomiques : Chaque commit représente une modification logique
  • Messages clairs : Messages de commit descriptifs et conventionnels
  • Branches sémantiques : Noms de branches qui décrivent la fonctionnalité
  • Revues de code : Validation par des pairs avant l'intégration
  • Documentation : Maintenir la documentation à jour
Règles importantes :
  • Ne jamais pousser directement sur la branche principale
  • Toujours faire une Pull Request pour les modifications
  • Respecter les conventions de codage de l'équipe
  • Écrire des tests pour chaque nouvelle fonctionnalité
Points clés à retenir :
  • Communication : La clé d'une collaboration efficace est la communication ouverte
  • Automatisation : Utilisez des outils pour automatiser les tâches répétitives
  • Flexibilité : Adaptez le workflow selon les besoins du projet
  • Qualité : Priorisez la qualité du code sur la rapidité d'exécution
Partage de code collaboratif Documentation et communication