[{"data":1,"prerenderedAt":687},["ShallowReactive",2],{"page-\u002Fpratiques\u002Fgerer-un-projet":3,"pieces-pratiques":644,"autour-\u002Fpratiques\u002Fgerer-un-projet":669,"prerequis-\u002Fpratiques\u002Fgerer-un-projet":674,"plan-pratiques":676},{"id":4,"title":5,"body":6,"description":613,"extension":614,"ligne":615,"meta":616,"motsCles":617,"navigation":266,"niveau":623,"path":624,"prerequis":625,"ressources":627,"seo":638,"sources":639,"stem":642,"__hash__":643},"docs\u002Fpratiques\u002F04.gerer-un-projet.md","Gérer un projet",{"type":7,"value":8,"toc":602},"minimark",[9,14,27,31,35,38,42,45,48,68,74,80,84,92,95,138,141,148,152,159,162,189,192,295,298,302,305,319,330,339,343,362,535,538,541,545,548,568,571,575,598],[10,11,13],"h2",{"id":12},"ce-que-tu-vas-apprendre","Ce que tu vas apprendre",[15,16,17,21,24],"ul",{},[18,19,20],"li",{},"Découper une grosse idée en tâches petites et faisables.",[18,22,23],{},"Suivre ces tâches avec un tableau Kanban et des issues GitHub.",[18,25,26],{},"Écrire un README qui permet à quelqu'un d'autre de lancer ton projet.",[10,28,30],{"id":29},"pourquoi-organiser-même-seul","Pourquoi organiser, même seul",[32,33,34],"p",{},"« Faire un site de recettes » est trop vague pour commencer. Tu ne sais pas par où attaquer, et tu ne sais jamais où tu en es.",[32,36,37],{},"Un projet avance quand tu sais quelle est la prochaine petite étape. Même seul, noter les tâches évite d'oublier et donne le plaisir de voir les choses se terminer.",[10,39,41],{"id":40},"découper-en-tâches","Découper en tâches",[32,43,44],{},"Pars de l'objectif et divise-le jusqu'à obtenir des tâches de quelques heures au plus.",[32,46,47],{},"Exemple pour le site de recettes :",[49,50,51,59,62,65],"ol",{},[18,52,53,54,58],{},"Afficher la liste des recettes sur ",[55,56,57],"code",{},"\u002Frecettes",".",[18,60,61],{},"Afficher le détail d'une recette.",[18,63,64],{},"Ajouter un formulaire de création.",[18,66,67],{},"Permettre de filtrer par ingrédient.",[32,69,70,71,73],{},"Chaque tâche doit se terminer par un résultat observable : « la page ",[55,72,57],{}," affiche trois recettes ». Une tâche qui s'appelle « travailler sur les recettes » n'est jamais finie.",[75,76,77],"tip",{},[32,78,79],{},"Si une tâche te semble impossible à estimer, coupe-la encore. Une bonne tâche tient en une phrase et se valide en un coup d'œil.",[10,81,83],{"id":82},"le-tableau-kanban","Le tableau Kanban",[32,85,86,87,91],{},"Un ",[88,89,90],"strong",{},"tableau Kanban"," représente les tâches comme des cartes rangées dans des colonnes qui indiquent leur état. Une carte se déplace de gauche à droite au fil de l'avancement.",[32,93,94],{},"Un tableau simple :",[96,97,98,114],"table",{},[99,100,101],"thead",{},[102,103,104,108,111],"tr",{},[105,106,107],"th",{},"À faire",[105,109,110],{},"En cours",[105,112,113],{},"Terminé",[115,116,117,129],"tbody",{},[102,118,119,123,126],{},[120,121,122],"td",{},"Filtrer par ingrédient",[120,124,125],{},"Formulaire de création",[120,127,128],{},"Liste des recettes",[102,130,131,134,136],{},[120,132,133],{},"Page de détail",[120,135],{},[120,137],{},[32,139,140],{},"Garde peu de cartes dans la colonne « En cours ». Finir une chose avant d'en commencer une autre évite d'avoir dix chantiers à moitié faits.",[32,142,143,144,147],{},"Tu peux le faire sur papier ou avec un outil. GitHub propose ",[88,145,146],{},"Projects",", qui affiche tes tâches sous forme de tableau ou de tableur et se met à jour selon l'état de tes issues.",[10,149,151],{"id":150},"les-issues-github","Les issues GitHub",[32,153,154,155,158],{},"Une ",[88,156,157],{},"issue"," (en français « problème » dans la documentation GitHub) est une fiche attachée à un dépôt. Elle sert à suivre une idée, une tâche ou un bug.",[32,160,161],{},"Une bonne issue contient :",[15,163,164,167,170,186],{},[18,165,166],{},"un titre court : « Afficher la liste des recettes » ;",[18,168,169],{},"une description : ce qu'il faut faire, ou comment reproduire le bug ;",[18,171,172,173,177,178,181,182,185],{},"des étiquettes (",[174,175,176],"em",{},"labels",") comme ",[55,179,180],{},"bug"," ou ",[55,183,184],{},"amélioration"," ;",[18,187,188],{},"éventuellement la personne qui s'en occupe.",[32,190,191],{},"Voici un exemple de description pour un bug :",[193,194,199],"pre",{"className":195,"code":196,"language":197,"meta":198,"style":198},"language-bash shiki shiki-themes github-light-default github-dark-default github-dark-default","Étapes :\n1. Aller sur \u002Frecettes\n2. Cliquer sur « Ajouter » sans remplir le titre\n\nRésultat attendu : un message d'erreur.\nRésultat obtenu : une recette sans titre est créée.\n","bash","",[55,200,201,214,229,261,268,289],{"__ignoreMap":198},[202,203,206,210],"span",{"class":204,"line":205},"line",1,[202,207,209],{"class":208},"sIXEE","Étapes",[202,211,213],{"class":212},"shWOn"," :\n",[202,215,217,220,223,226],{"class":204,"line":216},2,[202,218,219],{"class":208},"1.",[202,221,222],{"class":212}," Aller",[202,224,225],{"class":212}," sur",[202,227,228],{"class":212}," \u002Frecettes\n",[202,230,232,235,238,240,243,246,249,252,255,258],{"class":204,"line":231},3,[202,233,234],{"class":208},"2.",[202,236,237],{"class":212}," Cliquer",[202,239,225],{"class":212},[202,241,242],{"class":212}," «",[202,244,245],{"class":212}," Ajouter",[202,247,248],{"class":212}," »",[202,250,251],{"class":212}," sans",[202,253,254],{"class":212}," remplir",[202,256,257],{"class":212}," le",[202,259,260],{"class":212}," titre\n",[202,262,264],{"class":204,"line":263},4,[202,265,267],{"emptyLinePlaceholder":266},true,"\n",[202,269,271,274,277,280,283,286],{"class":204,"line":270},5,[202,272,273],{"class":208},"Résultat",[202,275,276],{"class":212}," attendu",[202,278,279],{"class":212}," :",[202,281,282],{"class":212}," un",[202,284,285],{"class":212}," message",[202,287,288],{"class":212}," d'erreur.\n",[202,290,292],{"class":204,"line":291},6,[202,293,294],{"class":212},"Résultat obtenu : une recette sans titre est créée.\n",[32,296,297],{},"Cette structure, avec étapes, résultat attendu et résultat obtenu, évite à quelqu'un de te poser dix questions. Dans le cours précédent, c'est exactement l'étape « reproduire ».",[10,299,301],{"id":300},"relier-une-issue-à-son-code","Relier une issue à son code",[32,303,304],{},"Quand tu termines le travail, tu peux fermer l'issue automatiquement. Dans la description d'une pull request, écris un mot-clé suivi du numéro de l'issue :",[193,306,308],{"className":195,"code":307,"language":197,"meta":198,"style":198},"Closes #12\n",[55,309,310],{"__ignoreMap":198},[202,311,312,315],{"class":204,"line":205},[202,313,314],{"class":208},"Closes",[202,316,318],{"class":317},"sd6ml"," #12\n",[32,320,321,322,325,326,329],{},"GitHub propose aussi ",[55,323,324],{},"Fixes"," et ",[55,327,328],{},"Resolves",". Quand la pull request est fusionnée dans la branche par défaut, l'issue #12 se ferme toute seule. Ce lien relie ton code à la raison pour laquelle il existe.",[331,332,333],"note",{},[32,334,335,336,58],{},"La fermeture automatique ne fonctionne que si la pull request vise la branche par défaut du dépôt, souvent ",[55,337,338],{},"main",[10,340,342],{"id":341},"le-readme","Le README",[32,344,345,346,349,350,353,354,357,358,361],{},"Le fichier ",[88,347,348],{},"README"," est la première chose que voit quelqu'un qui arrive sur ton dépôt. Écrit en ",[88,351,352],{},"Markdown",", un langage de mise en forme simple (",[55,355,356],{},"#"," pour un titre, ",[55,359,360],{},"-"," pour une liste), il répond à trois questions : c'est quoi, comment le lancer, comment contribuer.",[193,363,365],{"className":195,"code":364,"language":197,"meta":198,"style":198},"# Recettes de mamie\n\nUn site pour garder les recettes de la famille.\n\n## Installation\n\n1. Cloner le dépôt\n2. `npm install`\n3. `npm run dev`\n\nLe site est alors disponible sur http:\u002F\u002Flocalhost:3000.\n\n## Variables d'environnement\n\nCopier `.env.example` en `.env` et remplir les valeurs.\n",[55,366,367,372,376,405,409,414,418,431,445,458,463,485,490,496,501],{"__ignoreMap":198},[202,368,369],{"class":204,"line":205},[202,370,371],{"class":317},"# Recettes de mamie\n",[202,373,374],{"class":204,"line":216},[202,375,267],{"emptyLinePlaceholder":266},[202,377,378,381,384,387,390,393,396,399,402],{"class":204,"line":231},[202,379,380],{"class":208},"Un",[202,382,383],{"class":212}," site",[202,385,386],{"class":212}," pour",[202,388,389],{"class":212}," garder",[202,391,392],{"class":212}," les",[202,394,395],{"class":212}," recettes",[202,397,398],{"class":212}," de",[202,400,401],{"class":212}," la",[202,403,404],{"class":212}," famille.\n",[202,406,407],{"class":204,"line":263},[202,408,267],{"emptyLinePlaceholder":266},[202,410,411],{"class":204,"line":270},[202,412,413],{"class":317},"## Installation\n",[202,415,416],{"class":204,"line":291},[202,417,267],{"emptyLinePlaceholder":266},[202,419,421,423,426,428],{"class":204,"line":420},7,[202,422,219],{"class":208},[202,424,425],{"class":212}," Cloner",[202,427,257],{"class":212},[202,429,430],{"class":212}," dépôt\n",[202,432,434,436,439,442],{"class":204,"line":433},8,[202,435,234],{"class":208},[202,437,438],{"class":212}," `",[202,440,441],{"class":208},"npm",[202,443,444],{"class":212}," install`\n",[202,446,448,451,453,455],{"class":204,"line":447},9,[202,449,450],{"class":208},"3.",[202,452,438],{"class":212},[202,454,441],{"class":208},[202,456,457],{"class":212}," run dev`\n",[202,459,461],{"class":204,"line":460},10,[202,462,267],{"emptyLinePlaceholder":266},[202,464,466,469,471,474,477,480,482],{"class":204,"line":465},11,[202,467,468],{"class":208},"Le",[202,470,383],{"class":212},[202,472,473],{"class":212}," est",[202,475,476],{"class":212}," alors",[202,478,479],{"class":212}," disponible",[202,481,225],{"class":212},[202,483,484],{"class":212}," http:\u002F\u002Flocalhost:3000.\n",[202,486,488],{"class":204,"line":487},12,[202,489,267],{"emptyLinePlaceholder":266},[202,491,493],{"class":204,"line":492},13,[202,494,495],{"class":317},"## Variables d'environnement\n",[202,497,499],{"class":204,"line":498},14,[202,500,267],{"emptyLinePlaceholder":266},[202,502,504,507,509,512,515,518,520,523,525,528,530,532],{"class":204,"line":503},15,[202,505,506],{"class":208},"Copier",[202,508,438],{"class":212},[202,510,511],{"class":208},".env.example",[202,513,514],{"class":212},"`",[202,516,517],{"class":208}," en",[202,519,438],{"class":212},[202,521,522],{"class":208},".env",[202,524,514],{"class":212},[202,526,527],{"class":208}," et",[202,529,254],{"class":212},[202,531,392],{"class":212},[202,533,534],{"class":212}," valeurs.\n",[32,536,537],{},"Teste ton README comme un inconnu : supprime ton dossier, clone le dépôt et suis les étapes. Si ça ne marche pas, c'est le README qu'il faut corriger.",[32,539,540],{},"Un bon README mentionne aussi les prérequis, comme la version de Node.js, les commandes utiles et, pour un projet ouvert, la licence.",[10,542,544],{"id":543},"organiser-son-travail-avec-git","Organiser son travail avec Git",[32,546,547],{},"Les issues se combinent bien avec les branches du cours sur Git. Une branche par tâche, nommée d'après elle :",[193,549,551],{"className":195,"code":550,"language":197,"meta":198,"style":198},"git switch -c recettes-liste\n",[55,552,553],{"__ignoreMap":198},[202,554,555,558,561,565],{"class":204,"line":205},[202,556,557],{"class":208},"git",[202,559,560],{"class":212}," switch",[202,562,564],{"class":563},"s5iOY"," -c",[202,566,567],{"class":212}," recettes-liste\n",[32,569,570],{},"Tu travailles sur la branche, tu ouvres une pull request qui ferme l'issue, puis tu fusionnes. Le tableau Kanban se met à jour de lui-même si tu utilises GitHub Projects.",[10,572,574],{"id":573},"à-retenir","À retenir",[15,576,577,580,583,586,589,595],{},[18,578,579],{},"Découpe un objectif en tâches courtes qui se terminent par un résultat visible.",[18,581,582],{},"Un tableau Kanban range les tâches par état : à faire, en cours, terminé.",[18,584,585],{},"Limite le nombre de tâches en cours pour finir ce que tu commences.",[18,587,588],{},"Une issue décrit une tâche ou un bug : étapes, résultat attendu, résultat obtenu.",[18,590,591,594],{},[55,592,593],{},"Closes #12"," dans une pull request ferme l'issue quand la fusion est faite.",[18,596,597],{},"Un README dit ce qu'est le projet et comment le lancer, et se teste sur une machine vierge.",[599,600,601],"style",{},"html pre.shiki code .sIXEE, html code.shiki .sIXEE{--shiki-light:#953800;--shiki-default:#FFA657;--shiki-dark:#FFA657}html pre.shiki code .shWOn, html code.shiki .shWOn{--shiki-light:#0A3069;--shiki-default:#A5D6FF;--shiki-dark:#A5D6FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sd6ml, html code.shiki .sd6ml{--shiki-light:#6E7781;--shiki-default:#8B949E;--shiki-dark:#8B949E}html pre.shiki code .s5iOY, html code.shiki .s5iOY{--shiki-light:#0550AE;--shiki-default:#79C0FF;--shiki-dark:#79C0FF}",{"title":198,"searchDepth":216,"depth":231,"links":603},[604,605,606,607,608,609,610,611,612],{"id":12,"depth":216,"text":13},{"id":29,"depth":216,"text":30},{"id":40,"depth":216,"text":41},{"id":82,"depth":216,"text":83},{"id":150,"depth":216,"text":151},{"id":300,"depth":216,"text":301},{"id":341,"depth":216,"text":342},{"id":543,"depth":216,"text":544},{"id":573,"depth":216,"text":574},"Découper un projet en tâches, suivre l'avancement avec un tableau Kanban et les issues GitHub, et écrire un README utile.","md","pratiques",{},[618,619,620,621,348,622,352,314],"tâche","Kanban","issue GitHub","GitHub Projects","milestone","intermediaire","\u002Fpratiques\u002Fgerer-un-projet",[626],"\u002Fpratiques\u002Fdeboguer",[628,632,635],{"nom":629,"url":630,"type":631},"GitHub Docs, À propos des problèmes","https:\u002F\u002Fdocs.github.com\u002Ffr\u002Fissues\u002Ftracking-your-work-with-issues\u002Flearning-about-issues\u002Fabout-issues","doc",{"nom":633,"url":634,"type":631},"GitHub Docs, À propos de Projects","https:\u002F\u002Fdocs.github.com\u002Ffr\u002Fissues\u002Fplanning-and-tracking-with-projects\u002Flearning-about-projects\u002Fabout-projects",{"nom":636,"url":637,"type":631},"GitHub Docs, Relier une demande de tirage à un problème","https:\u002F\u002Fdocs.github.com\u002Ffr\u002Fissues\u002Ftracking-your-work-with-issues\u002Fusing-issues\u002Flinking-a-pull-request-to-an-issue",{"title":5,"description":613},[640,641],{"nom":629,"url":630},{"nom":633,"url":634},"pratiques\u002F04.gerer-un-projet","uFZNoKMogqn438fZiAc-0Fu82lwuaVoOYK8n7dPwygc",[645,649,653,656,657,661,665],{"path":646,"title":647,"stem":648},"\u002Fpratiques\u002Fnommer-et-organiser","Nommer et organiser son code","pratiques\u002F01.nommer-et-organiser",{"path":650,"title":651,"stem":652},"\u002Fpratiques\u002Flire-une-erreur","Lire une erreur","pratiques\u002F02.lire-une-erreur",{"path":626,"title":654,"stem":655},"Déboguer méthodiquement","pratiques\u002F03.deboguer",{"path":624,"title":5,"stem":642},{"path":658,"title":659,"stem":660},"\u002Fpratiques\u002Fsecurite-de-base","Sécurité de base","pratiques\u002F05.securite-de-base",{"path":662,"title":663,"stem":664},"\u002Fpratiques\u002Fqualite-et-mise-en-ligne","Qualité et mise en ligne","pratiques\u002F06.qualite-et-mise-en-ligne",{"path":666,"title":667,"stem":668},"\u002Fpratiques","Bonnes pratiques","pratiques\u002Findex",[670,672],{"title":654,"path":626,"stem":655,"description":671,"children":-1},"Reproduire un bug, l'isoler et le corriger avec console.log, les points d'arrêt, la méthode du canard en plastique et git bisect.",{"title":659,"path":658,"stem":660,"description":673,"children":-1},"Protéger les secrets avec .env, ne pas faire confiance aux entrées des utilisateurs, surveiller les dépendances et utiliser HTTPS.",[675],{"path":626,"title":654,"ligne":615},[677,679,680,681,682,683,685],{"path":646,"title":647,"niveau":678,"stem":648},"debutant",{"path":650,"title":651,"niveau":678,"stem":652},{"path":626,"title":654,"niveau":678,"stem":655},{"path":624,"title":5,"niveau":623,"stem":642},{"path":658,"title":659,"niveau":623,"stem":660},{"path":662,"title":663,"niveau":684,"stem":664},"avance",{"path":666,"title":667,"niveau":686,"stem":668},"memo",1794583452335]