From 9e65226f1ee2e4705a2f492bbaf967dcb21a8e30 Mon Sep 17 00:00:00 2001 From: varhegyimeli Date: Wed, 1 Apr 2026 21:39:03 +0200 Subject: [PATCH 1/2] chore: subdirectory added with the initial index.md --- snippets/1004_Wordle/image/AUT_logo.png | Bin 0 -> 2342 bytes snippets/1004_Wordle/index.md | 102 ++++++++++++++++++++++++ 2 files changed, 102 insertions(+) create mode 100644 snippets/1004_Wordle/image/AUT_logo.png create mode 100644 snippets/1004_Wordle/index.md diff --git a/snippets/1004_Wordle/image/AUT_logo.png b/snippets/1004_Wordle/image/AUT_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d47ff3803ffea7f292be9a59ee0fbec706a9df86 GIT binary patch literal 2342 zcmZuzXH*l&8jXOFDn+CO14tA^N@xiRQi6nlD@c1Rh+sen0i>5ur0P;PQq&btObCy% z)I=jSC<=xMBFzL}z#s=?L5LJ-aVZ=1ocHqM{g|2aedoJ(?ssSAoXK@|LP?2(!~p<+ zl!LvkD}P<#4|h=@f2O_f2;naWVq8%+fTp*{7Wjck5W*1w08k1fcKi5&03iB@gDt{6 z!IxV;J+j^+b?dp@6`Ko@V*1BV{`=P5!o#jM7ox;9Nu}!`coQgg{gzY3Oar@=SyN=5KDPmU?c0gHgQ8MMX=(4y_vK-%ElH}ZwmZYHz|cd( zG>-bO!i%%AtOVYgeP14p(7gAz>{`3dV|=oBnBx-Ls0*@W28DOn#Rw-`y7_v}#7&+Y z+V^qZtNO`7S?u2=1dbr*k;YM|+>e`V;y z5VS00bwWW2(J&tUlLF+ag(uS&hZ^Q5X3S$7ZaA>^aMIcx zc=Lsqzninm^eJA3bji-Q`S_-h58b%5rLf5=b7$Qosfw9(?atb4*q0NtNED>}Wq*6~v4Nf+E-b;xhpFh-BUf9n>}wjk zgOBZFa7&~vM;G}Ha43Xb=J76zK9S+`*DJemYzSH>%n2GHUs(_uY}W^Eh^nbr>~9L& zNbra+S5)zVTt|ZgUKRg!w&^!=@BDx@!N%LI{-Q@g(9Z*@h8d77!tw35$i1Shwz1*3 z##*k*waY(!Nee-P(XWb4&Ge~;8bf+H7P^L7qpYWO&mw*g_WN-d95{KyCJT=G4xh?1 zm+~2}V?Tp^$@w8|I~&M4q&I);ZcRbKm#_Dfc#}z}#c^RD-!?gm78H)?ZH_vtOPV3w zXqI7}S#Jhe1g6t-=UXzmKKtRH_-~9wDHtO5R5z?C_2CTbYugaM1Vw*XCH<#T53v)$w1V`A17n;FV`*`cG%ejf- zY}TYWK0mgV&cK~4T6NK{+jp`k#7X}rbT+L0GcUpnambL?ldJqJAr``lVd~ zR~b@lo;l5J*Tw+3gPTxMqNAK4`P*fG%m_zy-~Nke77iA9z%+LQ4VcA~d*6_{EcS{f zWhIwGK5B&BDU4Wdf`I#MlaqHK?GPmnvm2@vbMqXB)uv2s?X&vM>?5@k{TMFF%S-Z{ z!3_VGb0r_~0FovnS-1s$rW zm1J)!UyYz0;&N9DW^bbteieRxw*k-l8)eMlBuES3k7M0D@3$Y17^rG6%gzK)8KxGJGgg0BtvyWlIbCsw+^2 zBo4|L=6th@MhPYZ!m{?nN|cxR)(L18p~^OBC8rbt028+Vxq*m?>(Z48~1L86m_1sI%-6fJumaK{C1#i2|EpI(5^ zmaf&6qsU|<94{x4UWfvHNR61QncNvhTim4^JgwU_|AXD2hf>TywNkJ&9Pq}P)3 z>Q9a$Rzar&R4CF{+X1412yJDc`e`z+X^7Yxw*#srEHh_W-c|P?JwgM!YzPS>>e;Lm` zVQ*Uz&pBt3?cAhx07i;u$GmUS{r6)=4-?IT{sdYcqjqa3lyY*IGmSu|R#_EjJJLu| zsl3d1SGK;-TdEEktriDcc|qROCZVdgz*8Vo75Dq6Z1|}F{cx5KN@2b2z7voM$#a#u zVNja?V8KFY*CkJ*rff=tso_6a<|%dKRH;Nh4XJ~e$#)WFM&=@5D;Y%OQ3_*yGkq>9 z7&rXTn^Ft3l%dwX8LDCIdlTEQu#cLIdt9u`kUkOPQq(&CfXJh=51N?j!I|CJ84B*b z8e`@{W%pUF)-i~FB52#-v7*U@l~9?==;`72_G=}Tx_l@JH*HrPFFZIxI>i_xU3V4^ zsxJ}I!?eU79E{UyB!RZohy5{m8^0X(T2~cXaipZ4`5;_|s?Gyo5l>>})*c4A_nb~S zVnWb8`bsXzDy`pn?!GJ11)xDVO4xSJAf3unPTkqI`u2zaJE&8mJpUU5a6mfQHrb#v F{{f`gf35%k literal 0 HcmV?d00001 diff --git a/snippets/1004_Wordle/index.md b/snippets/1004_Wordle/index.md new file mode 100644 index 0000000..c14410e --- /dev/null +++ b/snippets/1004_Wordle/index.md @@ -0,0 +1,102 @@ +--- +layout: default +codename: MIEsettanulmanySablon +title: MI Esettanulmány Sablon +tags: snippets mieset +authors: Csorba Kristóf +--- + +# Ez egy snippet sablon az MI Esettanulmányok számára + +Ide jön a snippet teljes szövege, GitHub Markdown formátumban. + +Ezek a snippetek egy konkrét MI esettanulmányról tartalmaznak egy leírást, ami később mások számára összefoglalja a tapasztalatokat és a tanulságokat. Egy teljes snippet az alábbiakból áll (ami releváns is a konkrét esetben): + +- A snippet legfontosabb része az egyetlen weboldal (markdown fájl), mely ennek a sablonnak a második fele alapján készül és összefoglalja a feladatot és a tanulságokat. +- Ha a snippet eredménye megosztható és futtatható/használható is (például egy hasznos kis Python script vagy Excel makró), akkor + - az index.md mellett lehetnek forrásfájlok, xlsx fájlok, képek és ami még a futtatáshoz kell (ne legyen túl nagy!). Ezekre a fájlokra hivatkozzon az index.md is. + - Ha a használati útmutató túl terjedelmes a snippethez, akkor külön markdown fájlba kerüljön és az index.md csak hivatkozzon rá. +- Bármilyen egyéb melléklet, külön fáljként, hivatkozva. (Például ha a feladathoz egy spec.md fájlba írtad le a specifikációt az LLM számára, azt is mellékelheted.) +- Bármilyen az index.md által tartalmazott screenshot, esetleg minta eredmények, mind belinkelve az index.md-ben. + +## Új snippet létrehozása + +Mivel a snippeteknek egyedi sorszáma és kódneve van, a munka elkezdésekor egyeztetni kell a snippet gyűjtemény karbantartójával (jelenleg Csorba Kristóf). Küldd el neki a témakört egy mondatban és ha van javaslat a kódnévre, akkor azt. Ő ad neked egy sorszámot és egy kódnevet (előbbi az alkönyvtár nevébe, utóbbi az index.md elején a fejlécbe kerül). Ezzel hozz létre egy alkönyvtárat a többi snippet mellé (pl. ennek 1000_MIEsettanulmanySablon), másold oda ezt a sablont és egy külön branchen kezdj el dolgozni rajta. (Github pages esetén a tartalom nem a master, hanem a gh-pages branchen található!) + +Ha készen vagy, pull requestként adhatod be az eredményt, reviewerként rendeld hozzá Kristófot (csorbakristof) és a biztonság kedvéért írj neki emailt vagy Teams üzenetet. + +## Felsorolások, forráskód + +A snippetekben forráskód az alábbi három módon jelenhet meg: + +* Közvetlenül a szövegbe ágyazva, mint lentebb. +* Magában a snippet könyvtárában szerepelhet minta forráskód, külön fájlban. +* Hivatkozhatunk például egy github repositoryra is, mint ez itt: [ennek a snippetnek a forrása a github.com-on](https://github.com/bmeaut/snippets/blob/gh-pages/snippets/1000_MIEsettanulmanySablon/index.md) + + +A forráskód lehet inline, mint a `` printf() ``, vagy lehet kódblokk, melynek minden sora legalább 4 szóközzel kezdődik: + +```cpp +void main() +{ + printf("Mizu?\n"); +} +``` + +## Képek beágyazása + +Képek beágyazása az image alkönyvtárból, relatív címzéssel így történik: + +![AUT Logó](image/AUT_logo.png "AUT Logó") + +## További információk a szintaxisról + +Például itt: [Markdown szintaxis összefoglaló](http://daringfireball.net/projects/markdown/syntax) + +# Egy konkrét MI esettanulmány (ide jön a címe) + +Ide jön a témakör rövid leírása: mi volt a feladat, ehhez miben használtad fel az MI-t, valamint hogy konkértan milyen MI eszközt (pl. N8N, Github Copilot és Clude Sonnet 99 stb.) használtál. + +## Tanulságok + +A fő tanulságokat a snippet elején foglald össze felsorolás jelleggel, hogy a legfontosabb dolgok az oldal elején legyenek, a részletek pedig utána. + +- Office makró generálás VBA scriptként jól ment, de a hibakezelést érdemes megtiltani neki, hogy debuggolhatóbb maradjon a script. +- A specifikáció megírása után kérd meg, hogy tegyen fel pontosító kérdéseket azzal kapcsolatban! + +## Az eredmény használata + +Ha olyan a snippet, hogy ki is lehet próbálni (pl. rövid python script, amit mellékeltél), akkor itt foglald össze röviden, hogy hogyan kell használni. Ha ennél hosszabb a használati útmutató, mert bonyolultabb az eset, azt rakd egy másik markdown fájlba e mellé és itt csak hivatkozz rá. + +## A munkafolyamat tanulságos részletei + +Ide jöhetnek fontos promptok és az arra kapott válaszok (szükség esetén rövidítve). Minden, ami a tanulságokban csak röviden felsorolt dolgok megértéséhez, reprodukálásához, magyarázatához hasznos lehet. + +### Script környezet kiválasztása + +``` +What language would you recommend to implement a script which creates zip files from all subdirectories in Windows environment? +``` + +MI: +``` +[...] +Recommendation: Use PowerShell for the simplest Windows-native solution, or Python for a cross-platform, scriptable solution with more control. +[...] +``` + +### Specifikáció pontosítása + +Előre megírtam a teljes specifikációt egy spec.md fájlba. + +``` +Have a look at the specification in #spec.md and ask me clarification questions! +``` + +MI: hosszú válaszban számos hasznos kérdést tett fel. + +Válaszoltam a kérdésekre a spec.md kiegészítésével. + +``` +I have extended #spec.md, now start the implementation in a new file called zipper.py ! +``` From 062e62ec01e193988d6d96133a5c05492b23a849 Mon Sep 17 00:00:00 2001 From: varhegyimeli Date: Wed, 1 Apr 2026 21:45:57 +0200 Subject: [PATCH 2/2] docs: snippet 1004 added in index.md --- snippets/1004_Wordle/index.md | 331 ++++++++++++++++++++++++++++------ 1 file changed, 276 insertions(+), 55 deletions(-) diff --git a/snippets/1004_Wordle/index.md b/snippets/1004_Wordle/index.md index c14410e..e93a95f 100644 --- a/snippets/1004_Wordle/index.md +++ b/snippets/1004_Wordle/index.md @@ -1,102 +1,323 @@ --- layout: default -codename: MIEsettanulmanySablon -title: MI Esettanulmány Sablon +codename: Wordle +title: Test-Driven Wordle klón fejlesztés MI segítségével tags: snippets mieset -authors: Csorba Kristóf +authors: Várhegyi Melinda --- -# Ez egy snippet sablon az MI Esettanulmányok számára +# Test-Driven Wordle klón fejlesztés MI segítségével -Ide jön a snippet teljes szövege, GitHub Markdown formátumban. +## A feladat leírása -Ezek a snippetek egy konkrét MI esettanulmányról tartalmaznak egy leírást, ami később mások számára összefoglalja a tapasztalatokat és a tanulságokat. Egy teljes snippet az alábbiakból áll (ami releváns is a konkrét esetben): +A feladat egy Wordle szójáték klón elkészítése volt .NET MAUI keretrendszerben, C# nyelven, +Windows platformra célozva (`net8.0-windows10.0.19041.0`), Visual Studio 2022-ben. +A fejlesztés során használt MI eszközök: -- A snippet legfontosabb része az egyetlen weboldal (markdown fájl), mely ennek a sablonnak a második fele alapján készül és összefoglalja a feladatot és a tanulságokat. -- Ha a snippet eredménye megosztható és futtatható/használható is (például egy hasznos kis Python script vagy Excel makró), akkor - - az index.md mellett lehetnek forrásfájlok, xlsx fájlok, képek és ami még a futtatáshoz kell (ne legyen túl nagy!). Ezekre a fájlokra hivatkozzon az index.md is. - - Ha a használati útmutató túl terjedelmes a snippethez, akkor külön markdown fájlba kerüljön és az index.md csak hivatkozzon rá. -- Bármilyen egyéb melléklet, külön fáljként, hivatkozva. (Például ha a feladathoz egy spec.md fájlba írtad le a specifikációt az LLM számára, azt is mellékelheted.) -- Bármilyen az index.md által tartalmazott screenshot, esetleg minta eredmények, mind belinkelve az index.md-ben. +- **GitHub Copilot Chat (Claude Haiku 4.5)** — a kód generálásához és a TDD ciklus végrehajtásához +- **Claude Sonnet 4.6** — tervezéshez, architektúra döntésekhez, prompt íráshoz és + hibakereséshez -## Új snippet létrehozása +A projekt MVVM architektúrán alapul, a fejlesztés TDD (Test Driven Development) +módszerrel történt, xUnit, Moq és FluentAssertions könyvtárak használatával. -Mivel a snippeteknek egyedi sorszáma és kódneve van, a munka elkezdésekor egyeztetni kell a snippet gyűjtemény karbantartójával (jelenleg Csorba Kristóf). Küldd el neki a témakört egy mondatban és ha van javaslat a kódnévre, akkor azt. Ő ad neked egy sorszámot és egy kódnevet (előbbi az alkönyvtár nevébe, utóbbi az index.md elején a fejlécbe kerül). Ezzel hozz létre egy alkönyvtárat a többi snippet mellé (pl. ennek 1000_MIEsettanulmanySablon), másold oda ezt a sablont és egy külön branchen kezdj el dolgozni rajta. (Github pages esetén a tartalom nem a master, hanem a gh-pages branchen található!) +--- + +## Tanulságok + +- **A kontextus átadása kulcsfontosságú.** Minél részletesebb és pontosabb promptot kap a Copilot, + annál jobb kódot generál. Az egyszerű, rövid kérések általában rossz vagy hiányos eredményt adnak. +- **A TDD workflow jól kombinálható az MI-vel**, de egyes tesztek megírása emberi feladat marad — + különösen az összetett edge case-ek esetén (pl. duplikált betűk kezelése a Wordle logikában). +- **Copilot nem látja a renderelt UI-t**, így vizuális hibák debuggolásában (pl. gomb layout) + korlátozott a segítsége. Az ilyen problémákat sajátkezűleg kell megoldani. +- **A Copilot hajlamos hibás architektúra döntéseket javasolni** — pl. rossz target framework, + felesleges `` a `.csproj`-ban, inkompatibilis NuGet csomagok. + Ezeket mindig kritikusan kell értékelni. +- **Az összetett logikai edge case-eket a Copilot nem kezeli helyesen** — a duplikált betűk + Wordle szabály szerinti kiértékelési logikáját kézzel kellett megírni. +- **A kontextus elvész** — ha a Copilot Chat ablak bezárul (pl. VS összeomlás vagy fájlok + áthelyezése után), az összes korábbi kontextus elveszik. Érdemes a kontextus promptot + külön fájlban tárolni és újra beadni. +- **Claude és Copilot jól kiegészítik egymást** — Claude erős volt a tervezésben, + architektúrában és hibakeresésben, a Copilot pedig a kód generálásban. +- **A mutációs tesztelés és az MI jól kombinálható** — a Stryker által talált túlélő + mutánsokat Copilottal hatékonyan meg lehet ölni, de a promptot pontosan kell + megfogalmazni: meg kell adni a mutáns pontos helyét és viselkedését. +- **A Copilot törlési feladatoknál megbízhatatlan** — amikor kódot kellett törölni, + Copilot váratlan módosításokat végzett más fájlokban is. Törlési feladatokat + érdemes kézzel elvégezni. + +--- -Ha készen vagy, pull requestként adhatod be az eredményt, reviewerként rendeld hozzá Kristófot (csorbakristof) és a biztonság kedvéért írj neki emailt vagy Teams üzenetet. +## A megvalósított rendszer -## Felsorolások, forráskód +### Projektstruktúra (4 projekt) -A snippetekben forráskód az alábbi három módon jelenhet meg: +``` +WordleMAUI/ ← .NET MAUI alkalmazás — csak nézetek (XAML) +WordleMAUI.Core/ ← Class Library — modellek és szolgáltatások (pure C#) +WordleMAUI.ViewModels/ ← Class Library — GameViewModel (CommunityToolkit.Mvvm) +WordleMAUI.Tests/ ← xUnit tesztprojekt +``` + +**Projekt hivatkozások:** +- `WordleMAUI` → `WordleMAUI.ViewModels` → `WordleMAUI.Core` +- `WordleMAUI.Tests` → `WordleMAUI.ViewModels` és `WordleMAUI.Core` +- `WordleMAUI.Tests` nem hivatkozik `WordleMAUI`-ra (WinRT inicializálási hiba miatt) -* Közvetlenül a szövegbe ágyazva, mint lentebb. -* Magában a snippet könyvtárában szerepelhet minta forráskód, külön fájlban. -* Hivatkozhatunk például egy github repositoryra is, mint ez itt: [ennek a snippetnek a forrása a github.com-on](https://github.com/bmeaut/snippets/blob/gh-pages/snippets/1000_MIEsettanulmanySablon/index.md) +### Főbb komponensek +| Komponens | Leírás | +|---|---| +| `LetterState` | enum: Correct, Misplaced, Absent | +| `GuessResult` | record: char Letter, LetterState State | +| `WordValidator` | 5 betűs, csak alfa, szótárban szereplő szavak ellenőrzése | +| `GuessEvaluator` | Betűnkénti kiértékelés, duplikált betűk helyes kezelésével | +| `GameStateManager` | Játékállapot kezelése (6 kísérlet, nyerés/vesztés) | +| `WordSelector` | Véletlenszerű szókiválasztás | +| `GameViewModel` | MVVM ViewModel, összeköti a logikát és a UI-t | -A forráskód lehet inline, mint a `` printf() ``, vagy lehet kódblokk, melynek minden sora legalább 4 szóközzel kezdődik: +--- + +## A munkafolyamat tanulságos részletei -```cpp -void main() -{ - printf("Mizu?\n"); -} +### 1. A TDD workflow MI-vel + +A fejlesztés az alábbi ciklust követte minden komponensnél: + +``` +1. Tesztnevek megírása (szándék leírása) +2. Copilot által tesztek generálása +3. Copilot javaslatának kritikus értékelése +4. Tesztek alapján kód generálása +5. Tesztek futtatása, felmerülő hibák javítása +6. Összes teszt zöld -> kész a komponens ``` -## Képek beágyazása +Ez a workflow az egyszerűbb komponenseknél (pl. `WordValidator`, `GameStateManager`) +jól működött. Copilot gyorsan generált helyes implementációt, mivel a tesztek neve +egyértelműen leírta a szándékot. -Képek beágyazása az image alkönyvtárból, relatív címzéssel így történik: +**Példa sikeres promptra (Phase 2 implementáció):** -![AUT Logó](image/AUT_logo.png "AUT Logó") +``` +The unit tests for Phase 2 — Core Domain Layer are written and finalized. +Now implement the production code to make all tests pass, one class at a time +in the order below. Do not move to the next class until all tests for the +current one are green. + +## Rules +- All strings are uppercase — no case conversion needed in any service +- Use the exact class and interface names specified below +- Do not add any methods or properties that are not required by the tests +- All classes are plain C# with zero UI dependencies + +## Implementation Order +[...] +``` -## További információk a szintaxisról +### 2. A duplikált betűk problémája + +A `GuessEvaluator` implementálása során a duplikált betűk helyes kezelése +nem zajlott zökkenőmentesen. A Wordle szabályai szerint: + +- Ha a tippben egy betű többször szerepel, mint a feladványban, a felesleges + előfordulások `Absent` jelölést kapnak +- A helyes pozíciókat (`Correct`) kell először meghatározni, és csak ezután + a rosszul pozicionált (`Misplaced`) betűket + +A Copilot még részletes magyarázat után sem generált helyes +duplikált betű logikát. Az ehhez kapcsolódó teszteket végül kézzel kellett megírni. + +**Példa edge case teszt (kézzel írva):** + +```csharp + [Fact] + public void GivenDuplicateLetterInGuess_WhenOnlyOneExistsInSecret_ShouldMarkSecondAsAbsent() + { + var guess = "AWAKE"; // Two A's in guess + var secret = "STARE"; // Only one A in secret at position 2 + + var result = _evaluator.Evaluate(guess, secret); + + result.Should().HaveCount(5); + // A is in STARE at position 2, BUT the other A in guess at position 2 is correct -> Absent + result[0].State.Should().Be(LetterState.Absent); + // W is not in STARE -> Absent + result[1].State.Should().Be(LetterState.Absent); + // A is in STARE at position 2 (correct position in guess) -> Correct + result[2].State.Should().Be(LetterState.Correct); + // K is not in STARE -> Absent + result[3].State.Should().Be(LetterState.Absent); + // E is in STARE at position 4 (correct position in guess) -> Correct + result[4].State.Should().Be(LetterState.Correct); + } +``` -Például itt: [Markdown szintaxis összefoglaló](http://daringfireball.net/projects/markdown/syntax) +**Tanulság:** Az összetett üzleti logikát tartalmazó teszteket nem érdemes +a Copilotra bízni. Az ilyen tesztek megírása emberi feladat, a Copilot feladata az +implementáció generálása a tesztek alapján. -# Egy konkrét MI esettanulmány (ide jön a címe) +### 3. Architektúra probléma — WinRT hiba a tesztek futtatásakor -Ide jön a témakör rövid leírása: mi volt a feladat, ehhez miben használtad fel az MI-t, valamint hogy konkértan milyen MI eszközt (pl. N8N, Github Copilot és Clude Sonnet 99 stb.) használtál. +Az első megközelítésben a tesztprojekt közvetlenül hivatkozott a MAUI projektre. +Ez `System.TypeInitializationException` hibát okozott, mert a MAUI projekt +betölti a WinRT runtime-ot, ami nem elérhető a tesztfuttató környezetben. -## Tanulságok +**Copilot javasolta megoldás:** A tesztprojekt target frameworkjét `net8.0`-ra +állítani — ez hibás volt, mert a framework eltérése miatt a projekthivatkozás +sem működött. -A fő tanulságokat a snippet elején foglald össze felsorolás jelleggel, hogy a legfontosabb dolgok az oldal elején legyenek, a részletek pedig utána. +**Helyes megoldás:** Külön osztálykönyvtár projektek +létrehozása (`WordleMAUI.Core` és `WordleMAUI.ViewModels`), amelyek nem +húzzák be a WinRT függőségeket. A tesztprojekt csak ezekre hivatkozik, +a MAUI projektre nem. -- Office makró generálás VBA scriptként jól ment, de a hibakezelést érdemes megtiltani neki, hogy debuggolhatóbb maradjon a script. -- A specifikáció megírása után kérd meg, hogy tegyen fel pontosító kérdéseket azzal kapcsolatban! +**Tanulság:** A Copilot hajlamos a legegyszerűbb technikai megoldást javasolni, +ami nem mindig az architektúrailag helyes döntés. Az ilyen döntéseknél emberi +felülvizsgálat szükséges. -## Az eredmény használata +### 4. Projekt konfiguráció hibák — .csproj problémák -Ha olyan a snippet, hogy ki is lehet próbálni (pl. rövid python script, amit mellékeltél), akkor itt foglald össze röviden, hogy hogyan kell használni. Ha ennél hosszabb a használati útmutató, mert bonyolultabb az eset, azt rakd egy másik markdown fájlba e mellé és itt csak hivatkozz rá. +Copilot több hibás `.csproj` módosítást javasolt: -## A munkafolyamat tanulságos részletei +| Copilot javaslata | Probléma | Helyes megoldás | +|---|---|---| +| `net8.0` a tesztprojektben | Framework eltérés, hivatkozás nem működik | `net8.0-windows10.0.19041.0` | +| `win10-x64` | Felesleges, projekt hivatkozási problémákat okoz | Törlés | +| `CommunityToolkit.Maui` NuGet csomag | Verzió inkompatibilitás | Csomag eltávolítása | -Ide jöhetnek fontos promptok és az arra kapott válaszok (szükség esetén rövidítve). Minden, ami a tanulságokban csak röviden felsorolt dolgok megértéséhez, reprodukálásához, magyarázatához hasznos lehet. +**Tanulság:** A `.csproj` fájlokat mindig kritikusan kell átnézni, mielőtt +elfogadjuk a Copilot javaslatát. Ha valami furcsának tűnik, valószínűleg az is. -### Script környezet kiválasztása +### 5. A kontextus prompt fontossága -``` -What language would you recommend to implement a script which creates zip files from all subdirectories in Windows environment? -``` +Mivel a Copilot Chat nem őrzi meg a kontextust munkamenetek között (pl. VS +összeomlás, fájlok áthelyezése után), részletes kontextus promptot kellett készíteni, +amelyet minden új munkamenet elején be kellett adni. Ez tartalmazta: + +- A projekt teljes struktúráját +- Az összes projekt hivatkozást +- A már implementált komponensek interfészeit +- A fejlesztési konvenciókat (csak nagybetűs szavak, nincs `CommunityToolkit.Maui` stb.) +- Az aktuális fázist és feladatot + +**Példa kontextus prompt részlet:** -MI: ``` +You are helping me build a Wordle clone called WordleMAUI using .NET MAUI +targeting net8.0-windows10.0.19041.0 in Visual Studio 2022 with .NET 8.0. [...] -Recommendation: Use PowerShell for the simplest Windows-native solution, or Python for a cross-platform, scriptable solution with more control. +Note: CommunityToolkit.Maui is NOT installed due to version incompatibility. +Do not suggest or use any APIs from it. [...] +We follow strict TDD: tests are always written before implementation. +Never generate implementation before tests unless I ask. ``` -### Specifikáció pontosítása +**Tanulság:** Minél pontosabb és részletesebb a kontextus prompt, annál kevesebb +hibás javaslatot ad a Copilot. A negatív megszorítások (pl. "ne használd ezt a +csomagot") különösen fontosak. -Előre megírtam a teljes specifikációt egy spec.md fájlba. +### 6. A UI fejlesztés kihívásai -``` -Have a look at the specification in #spec.md and ask me clarification questions! -``` +A MAUI XAML UI generálásánál a Copilot hasznos volt az alapstruktúra elkészítésében, +de a vizuális hibák javításában korlátozott segítséget nyújtott, mivel nem látja +a renderelt eredményt. + +**Konkrét példa — billentyűzet layout:** +A virtuális billentyűzet gombjainak helyes elhelyezése több lépésen keresztül tartott: +- Copilot egymás után javasolt fix pixel szélességeket, padding és margin értékeket +- Ezek egyike sem oldotta meg a problémát +- A végső megoldás a MAUI `Button` vezérlő `MinimumWidthRequest="0"` tulajdonsága + volt + +**Tanulság:** A vizuális UI debuggolás emberi feladat. A Copilot tud XAML kódot +generálni, de a renderelt eredményt nem látja, ezért vizuális javításra +nem feltétlenül alkalmas. + + +### 7. Mutációs tesztelés Stryker.NET-tel + +A fejlesztés végén mutációs tesztelést végeztünk a Stryker.NET eszközzel (v4.14.0) +a `WordleMAUI.Core` projekt tesztelési minőségének mérésére. + +**A mutációs tesztelés folyamata:** +A Stryker apró változtatásokat ("mutációkat") végez a forráskódon, majd lefuttatja +a teszteket. Ha egy mutáció nem buktatja el a teszteket, az azt jelenti, hogy +a tesztek nem fedik le megfelelően azt a logikát — ez egy túlélő mutáns. + +**Eredmények — a fejlesztés során:** + +| Iteráció | Mutáció score | Változás | +|---|---|---| +| Első futtatás | 74.00% | kiindulópont | +| `SelectByDate` eltávolítása után | 80.43% | +6.43% | +| `GameStateManager` tesztek után | 89.13% | +8.70% | +| `WordSelector` tesztek után | 93.48% | +4.35% | +| `WordValidator` + `GuessEvaluator` tesztek után | **100.00%** | +6.52% | -MI: hosszú válaszban számos hasznos kérdést tett fel. +**Végső eredmény — 100% mutáció score:** -Válaszoltam a kérdésekre a spec.md kiegészítésével. +| Fájl | Score | +|---|---| +| `GameStateManager.cs` | 100% | +| `WordSelector.cs` | 100% | +| `WordValidator.cs` | 100% | +| `GuessEvaluator.cs` | 100% | + +**A Stryker konfigurálásának nehézségei:** +A Stryker beüzemelése számos kihívással járt, amelyek mind a `.csproj` konfiguráció +sajátosságaiból eredtek: +- A `stryker-config.json` helyes formátumát Copilot rosszul generálta +- A `console` reporter neve Stryker 4.14.0-ban `cleartext` — ezt is tévesen adta meg +- A `mutate` path filter nem működött relatív útvonalakkal, csak `**/*.cs` mintával +- A `LinqMutator` érvénytelen kódot generált `List.Count` mutációjakor, + amit az `ignore-mutations: ["linq"]` beállítással kellett kizárni + +**A Stryker + Copilot workflow:** +A leghasznosabb megközelítésnek az bizonyult, amikor a Stryker riportból azonosított túlélő +mutánsokat Copilottal öltük meg. A workflow: ``` -I have extended #spec.md, now start the implementation in a new file called zipper.py ! +1. Stryker futtatása → HTML riport generálása +2. Túlélő mutáns azonosítása a riportban (fájl + sor + mutáció típusa) +3. Copilot Chat: pontos prompt a mutáns megöléséhez szükséges teszttel +4. Teszt hozzáadása → Stryker újrafuttatása → score javulás ellenőrzése ``` + +**Tanulság:** A mutációs tesztelés hasznos eszköz a tesztek minőségének mérésére, +de a konfigurálása összetett és eszközismeretet igényel. A Copilot segíthet +a tesztek generálásában, de a mutáns azonosítása és a prompt pontos +megfogalmazása emberi feladat marad. + +**Megjegyzés:** +A 100%-os mutáció score azt jelenti, hogy minden meglevő kódsor tesztelve +van — de nem jelenti azt, hogy a szoftver helyes. A Stryker csak a meglévő +kódot tudja mutálni, hiányzó funkciókat vagy hibás üzleti logikát nem képes +detektálni. Jó példa erre a duplikált betűk kezelése: ha a `GuessEvaluator` +eleve rossz algoritmust tartalmazott volna, a Stryker azt nem találta volna +meg — csak a kézzel megírt, üzleti logikán alapuló tesztek tudták garantálni +a helyes viselkedést. + +--- + +## Összefoglalás + +A TDD és az MI eszközök kombinációja hatékony fejlesztési módszernek bizonyult, +de fontos tanulság, hogy az MI nem helyettesíti a fejlesztői tudást — inkább +egy erős asszisztens, amely felgyorsítja a munkát, de folyamatos emberi +felügyeletet igényel. + +A legjobb eredményt akkor értük el, amikor: +1. A fejlesztő írta meg a tesztek leírását + (NEM az MI dönti el, hogy milyen tesztesetekre lesz szükségünk) +2. A teszteket vagy MI generálta és alaposan ellenőrizte őket a fejlesztő, + vagy maga a fejlesztő írta +3. A Copilot legenerálta az implementációt a tesztek alapján +4. A fejlesztő itt is kritikusan értékelte és szükség esetén javította a javaslatot +5. Claude segített az összetettebb promptok megírásában és a nehezebb hibák azonosításában + +**Szerző:** Várhegyi Melinda +