{
    "componentChunkName": "component---src-templates-docs-js",
    "path": "/vecka4-implementation/borja-med-kod",
    "result": {"data":{"site":{"siteMetadata":{"title":"Linnéuniversitetet","language":"sv","courseCode":"1DV613"}},"mdx":{"fields":{"id":"2429b716-c0a0-5b2d-ab79-be231315297e","title":"Att börja arbeta med kod","slug":"/vecka4-implementation/borja-med-kod"},"body":"var _excluded = [\"components\"];\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n/* @jsxRuntime classic */\n\n/* @jsx mdx */\nvar _frontmatter = {\n  \"title\": \"Att börja arbeta med kod\",\n  \"metaTitle\": \"1DV613 | vecka 4 | Att börja arbeta med kod\",\n  \"metaDescription\": \"metaDescription\",\n  \"order\": 2\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n      props = _objectWithoutProperties(_ref, _excluded);\n\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"Det h\\xE4r \\xE4r en forts\\xE4ttning p\\xE5 \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"/kurser/mjukvaruutvecklingsprojekt/vecka3-krav-test/arbeta-i-projekt\"\n  }, \"Att arbeta i projekt\"), \". Du har nu en backlog, tidsskattningar och en identifierad risklista. Vecka 4 \\xE4r veckan d\\xE4r kod b\\xF6rjar landa i repot. Den h\\xE4r sidan handlar om det som kommer f\\xF6re de f\\xF6rsta raderna produktionskod: projektskelettet, linter och kodstandard, en tydlig Definition of Done, och verktyget som heter spike.\"), mdx(\"p\", null, mdx(\"em\", {\n    parentName: \"p\"\n  }, \"Du arbetar ensam i ditt projekt, men anv\\xE4nder arbetsformer som skalar till ett team. Tanken \\xE4r att du \\xF6var p\\xE5 samma arbetss\\xE4tt du kommer m\\xF6ta i en professionell milj\\xF6.\")), mdx(\"h2\", null, \"Projektets skelett\"), mdx(\"p\", null, \"Innan du skriver din f\\xF6rsta egentliga funktion, s\\xE4tt upp strukturen i repot:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Initiera projektet f\\xF6r din teknikstack (t.ex. \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"npm init\"), \" f\\xF6r Node.js, \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"poetry init\"), \" f\\xF6r Python).\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"L\\xE4gg in en \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \".gitignore\"), \" anpassad f\\xF6r ditt spr\\xE5k. GitLab har f\\xE4rdiga mallar.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"L\\xE4gg in en \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \".editorconfig\"), \" s\\xE5 att alla filer har samma indentering och radslut.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Best\\xE4m en grov mappstruktur: \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"src/\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"test/\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"public/\"), \" eller motsvarande f\\xF6r din stack.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Skapa en \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"README.md\"), \" med minst en mening om vad applikationen g\\xF6r och hur den startas.\")), mdx(\"p\", null, \"Den f\\xF6rsta commiten ska vara projektskelettet, inte \\\"f\\xF6rsta feature\\\". Det g\\xF6r det l\\xE4tt att se n\\xE4r sj\\xE4lva aff\\xE4rslogiken b\\xF6rjar landa.\"), mdx(\"h2\", null, \"Kodstandard och linter fr\\xE5n dag ett\"), mdx(\"p\", null, \"S\\xE4tt upp en linter och en autoformatterare \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"innan\"), \" koden v\\xE4xer. Det \\xE4r mycket billigare \\xE4n att inf\\xF6ra det i vecka 6 n\\xE4r kodbasen \\xE4r spretig.\"), mdx(\"p\", null, \"F\\xF6r Node.js-projekt: ESLint + Prettier. F\\xF6r andra milj\\xF6er: motsvarande verktyg (Pylint + Black, Rubocop, etc.).\"), mdx(\"p\", null, \"Commit:a in konfigurationen (\", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \".eslintrc.json\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \".prettierrc\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \".editorconfig\"), \") och k\\xF6r lintern som del av din lokala arbetsloop. Samma konfiguration kommer anv\\xE4ndas i CI/CD-pipelinen i vecka 7, s\\xE5 ju tidigare den \\xE4r stabil desto mindre friktion senare.\"), mdx(\"h2\", null, \"Din Definition of Done\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Definition of Done\"), \" (DoD) \\xE4r en personlig kvalitetsniv\\xE5 f\\xF6r vad \\\"klar\\\" betyder, oavsett vilken issue det handlar om. Det \\xE4r inte samma sak som acceptanskriterier. Acceptanskriterier \\xE4r per krav (\\\"systemet ska acceptera l\\xF6senord med minst 8 tecken\\\"). DoD \\xE4r per \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"arbete\"), \" (\\\"jag har rapporterat tid, lintern \\xE4r gr\\xF6n, Wikin \\xE4r uppdaterad\\\").\"), mdx(\"p\", null, \"Utan en DoD b\\xF6rjar \\\"klar\\\" glida. En vecka betyder det att koden kompilerar. N\\xE4sta vecka betyder det att n\\xE5got \\xE4r mergat. I slutet av iterationen inser du att halva listan fortfarande kr\\xE4ver arbete, och att dina tidsrapporter inte g\\xE5r att j\\xE4mf\\xF6ra.\"), mdx(\"p\", null, \"Formulera din egen DoD redan nu och l\\xE4gg den som en sida i din \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Wiki\"), \". En rimlig utg\\xE5ngspunkt:\"), mdx(\"blockquote\", null, mdx(\"p\", {\n    parentName: \"blockquote\"\n  }, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Min Definition of Done\")), mdx(\"p\", {\n    parentName: \"blockquote\"\n  }, \"En issue \\xE4r klar n\\xE4r:\"), mdx(\"ul\", {\n    parentName: \"blockquote\"\n  }, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Koden \\xE4r pushad och mergad till \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"main\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Minst ett manuellt testfall \\xE4r skrivet, kopplat till kravet, och passerar\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Lintern \\xE4r gr\\xF6n\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Merge request \\xE4r kopplad till issuen med \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"Closes #...\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Faktisk tid \\xE4r rapporterad med \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"/spend\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Wikin \\xE4r uppdaterad om \\xE4ndringen p\\xE5verkar arkitektur eller anv\\xE4ndning\"))), mdx(\"p\", null, \"Bullet-punkterna \\xE4r inte heliga. Din DoD beror p\\xE5 ditt projekt. Revidera den i iterationsreflektionen n\\xE4r du m\\xE4rker att saker slinker igenom.\"), mdx(\"h2\", null, \"Commit ofta, commit tydligt\"), mdx(\"p\", null, \"Sm\\xE5, sj\\xE4lvf\\xF6rklarande commits \\xE4r grunden f\\xF6r det arbetsfl\\xF6de som byggs ut i \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"/kurser/mjukvaruutvecklingsprojekt/vecka5-versionshantering/jobba-med-git\"\n  }, \"vecka 5\"), \". Tv\\xE5 enkla vanor att ta med sig redan nu:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"En commit ska g\\xF6ra en sak. Om du inte kan sammanfatta den p\\xE5 en rad utan ordet \\\"och\\\" \\xE4r det sannolikt tv\\xE5 commits.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Skriv commit-meddelandet s\\xE5 att du sj\\xE4lv kan f\\xF6rst\\xE5 det om tre veckor. \\\"Fixade buggen\\\" \\xE4r v\\xE4rdel\\xF6st. \\\"fix: handle empty username in login form\\\" ber\\xE4ttar n\\xE5got.\")), mdx(\"h2\", null, \"Spike: n\\xE4r implementationen \\xE4r till f\\xF6r att l\\xE4ra sig\"), mdx(\"p\", null, \"Veckans to-do-lista s\\xE4ger att du ska \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"jobba bort tidigare identifierade risker genom initial implementation\\\"\"), \". Verktyget f\\xF6r det heter \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"spike\"), \".\"), mdx(\"p\", null, \"En spike \\xE4r en \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"tidsbegr\\xE4nsad\"), \" unders\\xF6kning, oftast en halv eller en hel dag, d\\xE4r m\\xE5let inte \\xE4r att leverera fungerande kod utan att svara p\\xE5 en fr\\xE5ga. \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"Klarar mitt val av bibliotek OAuth-inloggning?\\\"\"), \" \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"Hur k\\xE4nsligt \\xE4r MongoDB-schemat f\\xF6r tusen poster?\\\"\"), \" Du bygger en liten proof-of-concept, du svarar p\\xE5 fr\\xE5gan, och sedan sl\\xE4nger du koden eller skriver om den ordentligt.\"), mdx(\"p\", null, \"Po\\xE4ngen \\xE4r att minska risken att n\\xE5got visar sig vara om\\xF6jligt, l\\xE5ngsamt eller dyrt, \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"innan\"), \" du hunnit investera i riktig implementation. Rapportera utfallet av spiken i din iterationsreflektion.\"), mdx(\"h2\", null, \"N\\xE4sta steg\"), mdx(\"p\", null, \"N\\xE4r skelettet \\xE4r p\\xE5 plats och DoD \\xE4r skriven \\xE4r det dags f\\xF6r den dagliga loopen: hur du g\\xE5r fr\\xE5n en issue i iterationen till mergad kod. Det fl\\xF6det finns i \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"/kurser/mjukvaruutvecklingsprojekt/vecka5-versionshantering/jobba-med-git\"\n  }, \"Jobba med Git (vecka 5)\"), \".\"));\n}\n;\nMDXContent.isMDXComponent = true;","tableOfContents":{"items":[{"url":"#projektets-skelett","title":"Projektets skelett"},{"url":"#kodstandard-och-linter-från-dag-ett","title":"Kodstandard och linter från dag ett"},{"url":"#din-definition-of-done","title":"Din Definition of Done"},{"url":"#commit-ofta-commit-tydligt","title":"Commit ofta, commit tydligt"},{"url":"#spike-när-implementationen-är-till-för-att-lära-sig","title":"Spike: när implementationen är till för att lära sig"},{"url":"#nästa-steg","title":"Nästa steg"}]},"parent":{"relativePath":"vecka4-implementation/borja-med-kod.md"},"frontmatter":{"metaTitle":"1DV613 | vecka 4 | Att börja arbeta med kod","metaDescription":"metaDescription","fullWidth":null}},"allMdx":{"edges":[{"node":{"fields":{"slug":"/","title":"🎉 Välkommen till Mjukvaruutvecklingsprojekt (1DV613)"}}},{"node":{"fields":{"slug":"/video-loggar","title":"Videologgar"}}},{"node":{"fields":{"slug":"/studieguiden","title":"Studieguiden"}}},{"node":{"fields":{"slug":"/studieguiden/kommunikationsstrategi","title":"Kommunikationsstrategi"}}},{"node":{"fields":{"slug":"/studieguiden/kursledning","title":"Kursledning"}}},{"node":{"fields":{"slug":"/studieguiden/kursplan","title":"Kursplan och betyg"}}},{"node":{"fields":{"slug":"/studieguiden/litteratur","title":"Kurslitteratur"}}},{"node":{"fields":{"slug":"/studieguiden/schema","title":"Schema och deadlines"}}},{"node":{"fields":{"slug":"/studieguiden/studieanvisningar","title":"Studieanvisningar"}}},{"node":{"fields":{"slug":"/studieguiden/utvarderingar","title":"Kursvärderingar"}}},{"node":{"fields":{"slug":"/vecka1-2-planering-vision/dokumentation","title":"Dokumentation"}}},{"node":{"fields":{"slug":"/vecka1-2-planering-vision","title":"Vecka 1/2 - Planering och vision"}}},{"node":{"fields":{"slug":"/vecka1-2-planering-vision/todo","title":"📅 Att göra-lista"}}},{"node":{"fields":{"slug":"/vecka1-2-planering-vision/vision","title":"Projektvision"}}},{"node":{"fields":{"slug":"/vecka10-etik","title":"Vecka 10 - Etik & överlämning"}}},{"node":{"fields":{"slug":"/vecka10-etik/todo","title":"Att göra lista"}}},{"node":{"fields":{"slug":"/vecka3-krav-test/arbeta-i-projekt","title":"Att arbeta i projekt"}}},{"node":{"fields":{"slug":"/vecka3-krav-test","title":"Vecka 3 - Krav och testning"}}},{"node":{"fields":{"slug":"/vecka3-krav-test/testning","title":"Testning"}}},{"node":{"fields":{"slug":"/vecka3-krav-test/todo","title":"Att göra lista"}}},{"node":{"fields":{"slug":"/vecka3-krav-test/vecka3-krav-test","title":"Kravhantering"}}},{"node":{"fields":{"slug":"/vecka4-implementation/arkitektur","title":"Introduktion till mjukvaruarkitektur"}}},{"node":{"fields":{"slug":"/vecka4-implementation/borja-med-kod","title":"Att börja arbeta med kod"}}},{"node":{"fields":{"slug":"/vecka4-implementation/docker-teori","title":"Introduktion till containers"}}},{"node":{"fields":{"slug":"/vecka4-implementation","title":"Vecka 4 - Implementation"}}},{"node":{"fields":{"slug":"/vecka4-implementation/just-task-it-docker","title":"Introduktion till Docker"}}},{"node":{"fields":{"slug":"/vecka4-implementation/todo","title":"Att göra lista"}}},{"node":{"fields":{"slug":"/vecka5-versionshantering/gitlab-fran-krav-till-implementation","title":"GitLab - Från krav till implementation"}}},{"node":{"fields":{"slug":"/vecka5-versionshantering","title":"Vecka 5 - Versionshantering"}}},{"node":{"fields":{"slug":"/vecka5-versionshantering/jobba-med-git","title":"Jobba med Git"}}},{"node":{"fields":{"slug":"/vecka5-versionshantering/todo","title":"Att göra lista"}}},{"node":{"fields":{"slug":"/vecka5-versionshantering/versionshantering","title":"Versionshantering"}}},{"node":{"fields":{"slug":"/vecka6-drift/docker-compose-teori","title":"Introduktion till Docker compose"}}},{"node":{"fields":{"slug":"/vecka6-drift","title":"Vecka 6 - Driftsättning"}}},{"node":{"fields":{"slug":"/vecka6-drift/just-task-it-docker-compose","title":"JTI - Docker Compose"}}},{"node":{"fields":{"slug":"/vecka6-drift/todo","title":"Att göra lista"}}},{"node":{"fields":{"slug":"/vecka6-drift/just-task-it-production","title":"JTI - Production"}}},{"node":{"fields":{"slug":"/vecka7-ci-cd/ci-cd","title":"CI/CD"}}},{"node":{"fields":{"slug":"/vecka7-ci-cd","title":"Vecka 7 - CI/CD"}}},{"node":{"fields":{"slug":"/vecka7-ci-cd/just-task-it-deploy-pipeline","title":"JTI - Deploy through a pipeline"}}},{"node":{"fields":{"slug":"/vecka7-ci-cd/todo","title":"Att göra lista"}}},{"node":{"fields":{"slug":"/vecka8-automatiska-test/automatiska-tester","title":"Automatiserad testning"}}},{"node":{"fields":{"slug":"/vecka8-automatiska-test","title":"Vecka 8 - Automatiserad testning"}}},{"node":{"fields":{"slug":"/vecka1-2-planering-vision/extern-updragsgivare/extern-uppdragsgivare-samverkan","title":"Samverkansinformation: studentprojekt med extern uppdragsgivare"}}},{"node":{"fields":{"slug":"/vecka1-2-planering-vision/extern-updragsgivare","title":"Extern uppdragsgivare"}}},{"node":{"fields":{"slug":"/vecka1-2-planering-vision/extern-updragsgivare/vagledning","title":"Vägledning för arbete med extern uppdragsgivare"}}},{"node":{"fields":{"slug":"/vecka9-leverans/todo","title":"Att göra lista"}}},{"node":{"fields":{"slug":"/vecka9-leverans","title":"Vecka 9 - Slutleverans"}}},{"node":{"fields":{"slug":"/vecka8-automatiska-test/todo","title":"Att göra lista"}}}]}},"pageContext":{"id":"2429b716-c0a0-5b2d-ab79-be231315297e"}},
    "staticQueryHashes": ["253607798","3706406642","710574383"]}