{"id":37449,"date":"2025-08-13T16:54:49","date_gmt":"2025-08-13T14:54:49","guid":{"rendered":"https:\/\/nearshore-it.eu\/?p=37449"},"modified":"2025-08-21T13:54:29","modified_gmt":"2025-08-21T11:54:29","slug":"programowanie-ai-claude-code","status":"publish","type":"post","link":"https:\/\/nearshore-it.eu\/pl\/artykuly\/programowanie-ai-claude-code\/","title":{"rendered":"Programowanie z AI: Od wymaga\u0144 klienta do dzia\u0142aj\u0105cej aplikacji z Claude Code od Antrophic"},"content":{"rendered":"\n<div class=\"table-of-contents\">\n    <p class=\"title\">Go to:<\/p>\n    <ol>\n                    <li><a href=\"#Wprowadzenie-do-Claude-Code:-tw\u00f3j-agent-AI\">1.  Wprowadzenie do Claude Code: tw\u00f3j agent AI<\/a><\/li>\n                    <li><a href=\"#Jak-zacz\u0105\u0107-z-narz\u0119dziem-Claude-Code?\">2.  Jak zacz\u0105\u0107 z narz\u0119dziem Claude Code?<\/a><\/li>\n                    <li><a href=\"#Case-study:-System-rezerwacji-sal-konferencyjnych\">3.  Case study: System rezerwacji sal konferencyjnych<\/a><\/li>\n                    <li><a href=\"#Krok-1:-AI-dekoduje-chaos:-analiza-wymaga\u0144\">4.  Krok 1: AI dekoduje chaos: analiza wymaga\u0144<\/a><\/li>\n                    <li><a href=\"#Krok-2:-Od-wymaga\u0144-do-architektury-w 5-minut\">5.  Krok 2: Od wymaga\u0144 do architektury w 5 minut<\/a><\/li>\n                    <li><a href=\"#Krok-3:-Meta-prompting.-Tw\u00f3j-plan-implementacji\">6.  Krok 3: Meta-prompting. Tw\u00f3j plan implementacji<\/a><\/li>\n                    <li><a href=\"#Krok-4:-Implementacja\">7.  Krok 4: Implementacja<\/a><\/li>\n                    <li><a href=\"#Jak-kodowa\u0107?-3-praktyczne-porady-na-start\">8.  Jak kodowa\u0107? 3 praktyczne porady na start<\/a><\/li>\n                    <li><a href=\"#Sztuczna inteligencja w programowaniu: podsumowanie\">9.  Sztuczna inteligencja w programowaniu: podsumowanie<\/a><\/li>\n            <\/ol>\n<\/div>\n\n\n<p>Szukaj\u0105c odpowiedzi na pytanie, jakiego asystenta AI u\u017cywa\u0107, by programowa\u0107 wydajniej i lepiej, warto przyjrze\u0107 si\u0119 narz\u0119dziu Claude od firmy Anthropic. W artykule znajdziesz informacje o tym, czym jest Claude Code<strong>,<\/strong> jak zacz\u0105\u0107 i korzysta\u0107 z Claude, oraz przegl\u0105d najlepszych praktyk programistycznych.\u00a0\u00a0<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Wprowadzenie-do-Claude-Code:-tw\u00f3j-agent-AI\">Wprowadzenie do Claude Code: tw\u00f3j agent AI<\/h2>\n\n\n\n<p>Wyobra\u017a sobie, \u017ce patrzysz na brief od klienta i zamiast sp\u0119dza\u0107 kolejne godziny na pisaniu boilerplate&#8217;u, wpisujesz w terminal: &#8222;stw\u00f3rz kompletne REST API na podstawie tych wymaga\u0144&#8221;. Po chwili masz gotowy, dzia\u0142aj\u0105cy kod z obs\u0142ug\u0105 b\u0142\u0119d\u00f3w, walidacj\u0105 i testami. To jest w\u0142a\u015bnie Claude Code.<\/p>\n\n\n\n<p><strong>Przeczytaj tak\u017ce: <a href=\"https:\/\/nearshore-it.eu\/pl\/artykuly\/najlepsze-ai-for-coding-w-2025-roku-czego-uzywac-do-generowania-kodu\/\" data-type=\"post\" data-id=\"34778\">Najlepsze AI for coding w 2025 roku<\/a><\/strong><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><a><\/a>Czym w\u0142a\u015bciwie jest Claude Code firmy Anthropic?<\/h3>\n\n\n\n<p>Claude Code to narz\u0119dzie CLI (Command Line Interface) stworzone przez Anthropic. To tak, jakby mie\u0107 do\u015bwiadczonego pair programming partnera, kt\u00f3ry pomaga w ka\u017cdym zadaniu: od analizy i dokumentacji legacy code po implementacj\u0119 nowych funkcjonalno\u015bci. Claude Code przy ka\u017cdym zadaniu pomaga trzyma\u0107 si\u0119 zasad czystego programowania i stosuje wzorce projektowe.<\/p>\n\n\n\n<p>Przyk\u0142adowe prompty mog\u0105 wygl\u0105da\u0107 tak:u<\/p>\n\n\n\n<p>Zamiast godzin analizy, wpisujemy:<\/p>\n\n\n\n<p><em>&#8222;Przeanalizuj projekt i stw\u00f3rz do niego szczeg\u00f3\u0142ow\u0105 dokumentacj\u0119&#8221;<\/em><\/p>\n\n\n\n<p>Zamiast r\u0119cznego refactoringu:<\/p>\n\n\n\n<p><em>&#8222;Przekszta\u0142\u0107 klasy w tym module zgodnie z SOLID&#8221;<\/em><\/p>\n\n\n\n<p>Zamiast pisania test\u00f3w:<\/p>\n\n\n\n<p><em>&#8222;Wygeneruj testy jednostkowe dla klasy PaymentService&#8221;<\/em><\/p>\n\n\n\n<p>Za chwil\u0119 poka\u017c\u0119 ci na realnym przyk\u0142adzie, jak wykorzystam Claude Code do przekszta\u0142cenia chaotycznych wymaga\u0144 klienta w dzia\u0142aj\u0105cy system. Ale najpierw &#8211; szybki start.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Jak-zacz\u0105\u0107-z-narz\u0119dziem-Claude-Code?\">Jak zacz\u0105\u0107 z narz\u0119dziem Claude Code?<\/h2>\n\n\n\n<p>Zanim przejd\u0119 do case study, poka\u017c\u0119 ci, jak rozpocz\u0105\u0107 prac\u0119 z Claude Code.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><a><\/a>Instalacja w 3 krokach:<\/h3>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li>Sprawdzam wymagania &#8211; potrzebuj\u0119 zainstalowanego <a href=\"http:\/\/node.js\" target=\"_blank\" rel=\"noopener\">Node.js<\/a> 18+ oraz dost\u0119pu do API Anthropic (minimum w wersji Pro).<\/li>\n\n\n\n<li>Instaluj\u0119 Claude Code za pomoc\u0105 komendy \u201cnpm install -g @anthropic-ai\/claude-code\u201d.<br><\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"513\" height=\"114\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic01.png\" alt=\"claude code\" class=\"wp-image-37493\" title=\"\" srcset=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic01.png 513w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic01-300x67.png 300w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic01-495x110.png 495w\" sizes=\"auto, (max-width: 513px) 100vw, 513px\" \/><\/figure>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li>Wywo\u0142uj\u0119 Claude Code poleceniem \u201cclaude\u201d. Nast\u0119pnie wybieram opcj\u0119 z kontem Claude <\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"720\" height=\"410\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic02.png\" alt=\"claude code\" class=\"wp-image-37496\" title=\"\" srcset=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic02.png 720w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic02-300x171.png 300w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic02-495x282.png 495w\" sizes=\"auto, (max-width: 720px) 100vw, 720px\" \/><\/figure>\n\n\n\n<p>Finalnie Claude Code jest gotowy do dzia\u0142ania:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"601\" height=\"605\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic03.png\" alt=\"claude code agent ai\" class=\"wp-image-37499\" title=\"\" srcset=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic03.png 601w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic03-298x300.png 298w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic03-150x150.png 150w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic03-392x395.png 392w\" sizes=\"auto, (max-width: 601px) 100vw, 601px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"695\" height=\"397\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic04.png\" alt=\"claude code agent ai\" class=\"wp-image-37502\" title=\"\" srcset=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic04.png 695w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic04-300x171.png 300w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic04-495x283.png 495w\" sizes=\"auto, (max-width: 695px) 100vw, 695px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><a><\/a>Pierwszy prompt &#8211; poka\u017c, co potrafisz, Claude<\/h3>\n\n\n\n<p>Zacznijmy od czego\u015b prostego. Za\u0142\u00f3\u017cmy, \u017ce chc\u0119 napisa\u0107 gr\u0119 w k\u00f3\u0142ko i krzy\u017cyk w HTML. Sprawd\u017amy, czy Claude sobie z tym poradzi<\/p>\n\n\n\n<p>Claude przyst\u0119puje do pracy:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"699\" height=\"186\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic05.png\" alt=\"claude code agent ai\" class=\"wp-image-37505\" title=\"\" srcset=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic05.png 699w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic05-300x80.png 300w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic05-495x132.png 495w\" sizes=\"auto, (max-width: 699px) 100vw, 699px\" \/><\/figure>\n\n\n\n<p>Nast\u0119pnie prosi mnie o pozwolenie zapisania pliku, kt\u00f3ry stworzy\u0142:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"690\" height=\"273\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic06.png\" alt=\"claude code agent ai\" class=\"wp-image-37508\" title=\"\" srcset=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic06.png 690w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic06-300x119.png 300w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic06-495x196.png 495w\" sizes=\"auto, (max-width: 690px) 100vw, 690px\" \/><\/figure>\n\n\n\n<p>Sprawd\u017amy, jak wygl\u0105da strona, kt\u00f3r\u0105 stworzy\u0142:<\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"400\" height=\"580\" data-id=\"37511\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic07.png\" alt=\"claude code agent ai\" class=\"wp-image-37511\" title=\"\" srcset=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic07.png 400w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic07-207x300.png 207w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic07-272x395.png 272w\" sizes=\"auto, (max-width: 400px) 100vw, 400px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"400\" height=\"580\" data-id=\"37514\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic08.png\" alt=\"\" class=\"wp-image-37514\" title=\"\" srcset=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic08.png 400w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic08-207x300.png 207w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic08-272x395.png 272w\" sizes=\"auto, (max-width: 400px) 100vw, 400px\" \/><\/figure>\n<\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>W mniej ni\u017c 30 sekund otrzyma\u0142em gr\u0119 w k\u00f3\u0142ko i krzy\u017cyk zaimplementowan\u0105 w HTML, JS i CSS.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><a><\/a>Integracja z istniej\u0105cym projektem<\/h3>\n\n\n\n<p>Claude Code idealnie spisuje si\u0119 w pracy na istniej\u0105cych ju\u017c projektach. Na potrzeby artyku\u0142u stworzy\u0142em podstawow\u0105 aplikacj\u0119 Spring Boot.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"686\" height=\"1072\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic09.png\" alt=\"claude code agent ai\" class=\"wp-image-37517\" title=\"\" srcset=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic09.png 686w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic09-192x300.png 192w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic09-253x395.png 253w\" sizes=\"auto, (max-width: 686px) 100vw, 686px\" \/><\/figure>\n\n\n\n<p>Aby poprawnie rozpocz\u0105\u0107 prac\u0119 na istniej\u0105cym projekcie, pomocna b\u0119dzie komenda \/init.<\/p>\n\n\n\n<p>Komenda \/init to polecenie, kt\u00f3re:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Skanuje ca\u0142\u0105 struktur\u0119 projektu<\/li>\n\n\n\n<li>Tworzy map\u0119 zale\u017cno\u015bci mi\u0119dzy modu\u0142ami<\/li>\n\n\n\n<li>Identyfikuje u\u017cyte technologie i frameworki<\/li>\n\n\n\n<li>Buduje kontekst, kt\u00f3rego Claude b\u0119dzie u\u017cywa\u0142 we wszystkich kolejnych interakcjach<\/li>\n<\/ul>\n\n\n\n<p>Po wykonaniu \/init w g\u0142\u00f3wnym katalogu projektu zostanie utworzony plik CLAUDE.md. To &#8222;instrukcja obs\u0142ugi&#8221; projektu dla agenta AI.<\/p>\n\n\n\n<p>Sprawd\u017amy, jak to dzia\u0142a w praktyce<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"2324\" height=\"834\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic10.png\" alt=\"claude code agent ai\" class=\"wp-image-37520\" title=\"\" srcset=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic10.png 2324w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic10-300x108.png 300w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic10-1296x465.png 1296w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic10-768x276.png 768w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic10-1536x551.png 1536w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic10-2048x735.png 2048w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic10-495x178.png 495w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic10-1320x474.png 1320w\" sizes=\"auto, (max-width: 2324px) 100vw, 2324px\" \/><\/figure>\n\n\n\n<p>Claude tworzy list\u0119 z czynno\u015bci, jakie musi wykona\u0107, aby poprawnie przygotowa\u0107 plik <a href=\"http:\/\/claude.md\" target=\"_blank\" rel=\"noopener\">CLAUDE.md<\/a>.<\/p>\n\n\n\n<p>Po chwili mog\u0119 sprawdzi\u0107, co znajduje si\u0119 w tym pliku:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1918\" height=\"1016\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic11.png\" alt=\"claude code agent ai\" class=\"wp-image-37523\" title=\"\" srcset=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic11.png 1918w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic11-300x159.png 300w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic11-1296x687.png 1296w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic11-768x407.png 768w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic11-1536x814.png 1536w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic11-495x262.png 495w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic11-1320x699.png 1320w\" sizes=\"auto, (max-width: 1918px) 100vw, 1918px\" \/><\/figure>\n\n\n\n<p>Ten plik mog\u0119 edytowa\u0107, dodaj\u0105c w\u0142asne wytyczne, standardy kodowania czy konkretne wymagania projektu. Claude b\u0119dzie je respektowa\u0142 w ka\u017cdej interakcji.<\/p>\n\n\n\n<p>Teraz, gdy mam ju\u017c dzia\u0142aj\u0105ce narz\u0119dzie, czas sprawdzi\u0107 jego prawdziw\u0105 moc. Przejd\u017amy do realnego przypadku: systemu, kt\u00f3ry musz\u0119 dostarczy\u0107 klientowi w rekordowo kr\u00f3tkim czasie.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Case-study:-System-rezerwacji-sal-konferencyjnych\">Case study: System rezerwacji sal konferencyjnych<\/h2>\n\n\n\n<p>Wyobra\u017amy sobie sytuacj\u0119:<\/p>\n\n\n\n<p>Do mojego zespo\u0142u trafia zlecenie od klienta, du\u017cej firmy farmaceutycznej z Warszawy. Potrzebuj\u0105 systemu rezerwacji sal konferencyjnych &#8222;na wczoraj&#8221;. Termin? 4 tygodnie. Bud\u017cet? Napi\u0119ty. Oczekiwania? Wysokie.<\/p>\n\n\n\n<p>Przyk\u0142adowy brief:<\/p>\n\n\n\n<p><em>\u201cPotrzebujemy systemu do zarz\u0105dzania naszymi salami konferencyjnymi.<\/em><br><em>Mamy 15 sal na 3 pi\u0119trach, pracownicy ci\u0105gle si\u0119 k\u0142\u00f3c\u0105 o rezerwacje.<\/em><br><em>Co ma robi\u0107:<\/em><br><em>&#8211; Pokazywa\u0107, kt\u00f3re sale s\u0105 wolne<\/em><\/p>\n\n\n\n<p><em>&#8211; Rezerwowa\u0107 sale (z g\u00f3ry na ca\u0142y dzie\u0144 albo na godziny)<\/em><\/p>\n\n\n\n<p><em>&#8211; Anulowa\u0107 rezerwacje<\/em><\/p>\n\n\n\n<p><em>&#8211; Sale maj\u0105 r\u00f3\u017cne wyposa\u017cenie (projektor, flipchart, videokonferencja) &#8211; trzeba to jako\u015b oznaczy\u0107<\/em><\/p>\n\n\n\n<p><em>&#8211; Ma dzia\u0142a\u0107 na kom\u00f3rkach!!! To wa\u017cne<\/em><\/p>\n\n\n\n<p><em>&#8211; Szef chce raporty &#8211; kt\u00f3ra sala jest najpopularniejsza, wykorzystanie, itp.<\/em><\/p>\n\n\n\n<p><em>Aha, zapomnia\u0142em &#8211; niekt\u00f3re sale mo\u017cna \u0142\u0105czy\u0107 (np. 201 + 202 = du\u017ca sala).<\/em><\/p>\n\n\n\n<p><em>I jeszcze jedno &#8211; tylko niekt\u00f3rzy mog\u0105 rezerwowa\u0107 sale premium (10. pi\u0119tro).\u201d<\/em><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><a><\/a>Wyzwania, kt\u00f3re mo\u017cna zauwa\u017cy\u0107<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Niejasne wymagania<\/strong>: &#8222;jako\u015b oznaczy\u0107&#8221;, &#8222;raporty&#8221; &#8211; ka\u017cde z tych wyra\u017ce\u0144 mo\u017ce oznacza\u0107 co\u015b zupe\u0142nie innego.<\/li>\n\n\n\n<li><strong>Ukryte z\u0142o\u017cono\u015bci<\/strong>:<\/li>\n\n\n\n<li>\u0141\u0105czenie sal: Czy rezerwacja jednej blokuje mo\u017cliwo\u015b\u0107 rezerwacji drugiej?<\/li>\n\n\n\n<li>Uprawnienia: Kto decyduje o dost\u0119pie do sal premium?<\/li>\n\n\n\n<li>&#8222;Na godziny&#8221;: Czy s\u0105 jakie\u015b minimalne\/maksymalne czasy?<\/li>\n\n\n\n<li>System raportowania: Jak szczeg\u00f3\u0142owy? Dla kogo?<\/li>\n\n\n\n<li><strong>Sprzeczne priorytety<\/strong>: &#8222;na wczoraj&#8221; vs &#8222;zraporty i zaawansowane funkcje&#8221;<\/li>\n\n\n\n<li><strong>Techniczne wyzwania<\/strong>:<\/li>\n\n\n\n<li>Responsywno\u015b\u0107 (r\u00f3\u017cne urz\u0105dzenia mobilne)<\/li>\n\n\n\n<li>Dost\u0119pno\u015b\u0107 w czasie rzeczywistym (dw\u00f3ch u\u017cytkownik\u00f3w nie mo\u017ce zarezerwowa\u0107 tej samej sali)<\/li>\n\n\n\n<li>Logika \u0142\u0105czenia sal (skomplikowane zale\u017cno\u015bci)<\/li>\n\n\n\n<li>System uprawnie\u0144 (r\u00f3\u017cne poziomy dost\u0119pu)<\/li>\n<\/ol>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><a><\/a>Klasyczne podej\u015bcie vs Claude Code<\/h3>\n\n\n\n<p>Bez AI pierwszy tydzie\u0144 sp\u0119dziliby\u015bmy na:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Tworzeniu obszernej dokumentacji wymaga\u0144<\/li>\n\n\n\n<li>Projektowaniu architektury<\/li>\n\n\n\n<li>D\u0142ugich sesjach szacowania zada\u0144 w zespole<\/li>\n<\/ul>\n\n\n\n<p>Zamiast tego wykorzystam Claude Code do natychmiastowej analizy i dekompozycji \u201cchaosu\u201d. Za chwil\u0119 poka\u017c\u0119 ci, jak w 15 minut przekszta\u0142c\u0119 ten chaotyczny email w uporz\u0105dkowany plan projektu z konkretnymi zadaniami i harmonogramem.<a><\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Krok-1:-AI-dekoduje-chaos:-analiza-wymaga\u0144\">Krok 1: AI dekoduje chaos: analiza wymaga\u0144<\/h2>\n\n\n\n<p>Wprowadz\u0119 w Claude Code poni\u017cszy prompt:<\/p>\n\n\n\n<p><em>&#8222;Przeanalizuj poni\u017csze wymagania biznesowe od klienta i:<br>1. Wyodr\u0119bnij wszystkie funkcjonalno\u015bci (jawne i ukryte)<br>2. Uporz\u0105dkuj je metod\u0105 MoSCoW<br>3. Zidentyfikuj niejasno\u015bci i potencjalne problemy<\/em><\/p>\n\n\n\n<p><em>[wklejony brief od klienta]<br>Wynik zapisz w pliku .md&#8221;<\/em><\/p>\n\n\n\n<p>Claude przyst\u0119puje do pracy, tworz\u0105c list\u0119 zada\u0144. Po 15 sekundach otrzymuj\u0119 kompletn\u0105 analiz\u0119:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1828\" height=\"390\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic12.png\" alt=\"claude code agent ai\" class=\"wp-image-37526\" title=\"\" srcset=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic12.png 1828w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic12-300x64.png 300w\" sizes=\"auto, (max-width: 1828px) 100vw, 1828px\" \/><\/figure>\n\n\n\n<p><strong>Must have (MVP):<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Przegl\u0105danie dost\u0119pno\u015bci sal w czasie rzeczywistym<\/li>\n\n\n\n<li>Rezerwacja sali na konkretny dzie\u0144\/godziny<\/li>\n\n\n\n<li>Anulowanie w\u0142asnych rezerwacji<\/li>\n\n\n\n<li>Wy\u015bwietlanie wyposa\u017cenia sal<\/li>\n\n\n\n<li>Responsywny interfejs (mobile-first)<\/li>\n\n\n\n<li>Podstawowa autoryzacja u\u017cytkownik\u00f3w<\/li>\n\n\n\n<li>Podstawowe zapobieganie konfliktom (brak podw\u00f3jnych rezerwacji)<\/li>\n<\/ul>\n\n\n\n<p><strong>Should have:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>System uprawnie\u0144 dla sal premium<\/li>\n\n\n\n<li>\u0141\u0105czenie sal (z blokowaniem zale\u017cno\u015bci)<\/li>\n\n\n\n<li>Podstawowe raporty wykorzystania<\/li>\n\n\n\n<li>Walidacja minimalnego czasu rezerwacji (np. 30 min)<\/li>\n\n\n\n<li>Historia rezerwacji u\u017cytkownika<\/li>\n<\/ul>\n\n\n\n<p><strong>Could have:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Rezerwacje cykliczne<\/li>\n\n\n\n<li>Wyszukiwanie sal po wyposa\u017ceniu<\/li>\n\n\n\n<li>Eksport raport\u00f3w do Excela<\/li>\n\n\n\n<li>Powiadomienia o zbli\u017caj\u0105cych si\u0119 rezerwacjach<\/li>\n<\/ul>\n\n\n\n<p><strong>Won&#8217;t have (w MVP):<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Zaawansowana analityka predykcyjna<\/li>\n\n\n\n<li>Integracja z systemami budynku (klimatyzacja, \u015bwiat\u0142o)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><a><\/a>Pierwsze zaskoczenie: Claude wy\u0142apa\u0142 ukryte wymagania<\/h3>\n\n\n\n<p>Co mnie zaskoczy\u0142o? Claude zauwa\u017cy\u0142 rzeczy, o kt\u00f3rych klient nie wspomnia\u0142, ale kt\u00f3re s\u0105 oczywiste:<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li><strong>Konflikt rezerwacji:<\/strong> Co, je\u015bli dw\u00f3ch u\u017cytkownik\u00f3w pr\u00f3buje zarezerwowa\u0107 t\u0119 sam\u0105 sal\u0119 r\u00f3wnocze\u015bnie?<\/li>\n\n\n\n<li><strong>Anulowanie z wyprzedzeniem:<\/strong> Czy mo\u017cna anulowa\u0107 rezerwacj\u0119 5 minut przed czasem?<\/li>\n\n\n\n<li><strong>\u0141\u0105czenie sal = problem dost\u0119pno\u015bci:<\/strong> Je\u015bli kto\u015b rezerwuje sal\u0119 201+202 jako po\u0142\u0105czon\u0105, system musi automatycznie blokowa\u0107 je pojedynczo.<\/li>\n\n\n\n<li><strong>Widoczno\u015b\u0107 rezerwacji:<\/strong> Czy wszyscy widz\u0105, kto zarezerwowa\u0142 sal\u0119, czy tylko dost\u0119pny jest fakt rezerwacji?<\/li>\n<\/ol>\n\n\n\n<p>Claude Code w kilka chwil wykona\u0142 solidn\u0105 prac\u0119. Po om\u00f3wieniu z klientem niejasno\u015bci, mog\u0119 przej\u015b\u0107 do nast\u0119pnego kroku: zaprojektowania architektury systemu.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Krok-2:-Od-wymaga\u0144-do-architektury-w-5-minut\">Krok 2: Od wymaga\u0144 do architektury w 5 minut<\/h2>\n\n\n\n<p>Maj\u0105c uporz\u0105dkowane wymagania, klasycznie zorganizowaliby\u015bmy sesj\u0119 spotka\u0144 architektonicznych. Zamiast tego, wykorzystam Claude Code do wygenerowania propozycji architektury.<\/p>\n\n\n\n<p>Prompt do generowania architektury:<\/p>\n\n\n\n<p><em>\u201cNa podstawie tych wymaga\u0144 zaprojektuj architektur\u0119 systemu:<br>1. Zaproponuj stack technologiczny (uzasadnij wyb\u00f3r)<br>2. Opisz struktur\u0119 modu\u0142\u00f3w\/serwis\u00f3w<br>3. Zaplanuj model danych<br>4. Stw\u00f3rz harmonogram implementacji dla 3 developer\u00f3w na 4 tygodnie<br>5. Zidentyfikuj ryzyka techniczne<br>Kontekst: zesp\u00f3\u0142 zna React, Spring Boot i PostgreSQL<br>Zapisz ten plan w pliku .md\u201d<\/em><\/p>\n\n\n\n<p><br>Claude ponownie przyst\u0119puje do pracy:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1280\" height=\"352\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic13.png\" alt=\"claude code agent ai\" class=\"wp-image-37529\" title=\"\" srcset=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic13.png 1280w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic13-300x83.png 300w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic13-768x211.png 768w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic13-495x136.png 495w\" sizes=\"auto, (max-width: 1280px) 100vw, 1280px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><a><\/a>Wynik? Kompletny plan techniczny<\/h3>\n\n\n\n<p><strong>Stack technologiczny z uzasadnieniem:<\/strong><\/p>\n\n\n\n<p><strong>Frontend: React + TypeScript + Tailwind CSS<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>React: zesp\u00f3\u0142 zna t\u0119 technologi\u0119<\/li>\n\n\n\n<li>TypeScript: z\u0142o\u017cona logika biznesowa wymaga typowania<\/li>\n\n\n\n<li>Tailwind: szybkie tworzenie responsywnych interfejs\u00f3w<\/li>\n<\/ul>\n\n\n\n<p><strong>Backend: Spring Boot + Spring Data JPA<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Spring Boot: zesp\u00f3\u0142 ma do\u015bwiadczenie w tej technologii<\/li>\n\n\n\n<li>Spring Security: gotowe rozwi\u0105zania dla autoryzacji<\/li>\n\n\n\n<li>Spring Data JPA: praca z relacjami (sale \u0142\u0105czone)<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>Baza: PostgreSQL<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Relacje mi\u0119dzy salami, rezerwacjami, u\u017cytkownikami<\/li>\n\n\n\n<li>Transakcje dla rezerwacji (ACID)<\/li>\n\n\n\n<li>Wydajne zapytania dla raport\u00f3w<\/li>\n<\/ul>\n\n\n\n<p>Struktura modu\u0142\u00f3w frontend:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"452\" height=\"629\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic19.png\" alt=\"claude code agent ai\" class=\"wp-image-37547\" title=\"\" srcset=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic19.png 452w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic19-216x300.png 216w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic19-284x395.png 284w\" sizes=\"auto, (max-width: 452px) 100vw, 452px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>Modele danych (wybrane):<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"468\" height=\"519\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic20.png\" alt=\"claude code agent ai\" class=\"wp-image-37550\" title=\"\" srcset=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic20.png 468w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic20-271x300.png 271w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic20-356x395.png 356w\" sizes=\"auto, (max-width: 468px) 100vw, 468px\" \/><\/figure>\n\n\n\n<p><strong>Przyk\u0142adowy plan implementacji (pierwsze dwa tygodnie)<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1922\" height=\"1281\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic14.png\" alt=\"claude code agent ai\" class=\"wp-image-37532\" title=\"\" srcset=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic14.png 1922w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic14-300x200.png 300w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic14-1296x864.png 1296w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic14-768x512.png 768w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic14-1536x1024.png 1536w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic14-495x330.png 495w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic14-1320x880.png 1320w\" sizes=\"auto, (max-width: 1922px) 100vw, 1922px\" \/><\/figure>\n\n\n\n<p>Plan jest gotowy, dzi\u0119ki czemu jestem gotowy do dzia\u0142ania. Ale jest jeszcze jedna rzecz do zrobienia: czas na meta-prompting.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Krok-3:-Meta-prompting.-Tw\u00f3j-plan-implementacji\">Krok 3: Meta-prompting. Tw\u00f3j plan implementacji<\/h2>\n\n\n\n<p>Tu zaczyna si\u0119 prawdziwa magia Claude Code. Zamiast r\u0119cznie tworzy\u0107 zadania w Jirze, poprosz\u0119 AI o wygenerowanie kompletnego zestawu prompt\u00f3w, kt\u00f3re przeprowadz\u0105 nas przez ca\u0142\u0105 implementacj\u0119.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><a><\/a>Czym jest meta-prompting?<\/h3>\n\n\n\n<p>Meta-prompting to technika, w kt\u00f3rej u\u017cywamy AI do generowania prompt\u00f3w dla&#8230; AI. Brzmi troch\u0119 jak incepcja &#8211; w praktyce to \u015bwietne narz\u0119dzie. Claude Code analizuje plan implementacyjny i nast\u0119pnie tworzy seri\u0119 instrukcji, kt\u00f3re p\u00f3\u017aniej mog\u0119 wykonywa\u0107 krok po kroku.<\/p>\n\n\n\n<p><strong>M\u00f3j prompt:<\/strong><\/p>\n\n\n\n<p><em>&#8222;Przeanalizuj architektur\u0119 systemu rezerwacji sal z pliku system_architecture_plan.md i wygeneruj kompletn\u0105 list\u0119 prompt\u00f3w do implementacji MVP.<\/em><\/p>\n\n\n\n<p><em>Dla ka\u017cdego promptu podaj:<\/em><\/p>\n\n\n\n<p><em>&#8211; Co dok\u0142adnie ma zosta\u0107 zaimplementowane<\/em><\/p>\n\n\n\n<p><em>&#8211; Jakie edge case&#8217;y uwzgl\u0119dni\u0107<\/em><\/p>\n\n\n\n<p><em>&#8211; Z czym si\u0119 integruje<\/em><\/p>\n\n\n\n<p><em>Grupuj prompty wed\u0142ug modu\u0142\u00f3w. Zacznij od podstaw (model danych),<\/em><\/p>\n\n\n\n<p><em>sko\u0144cz na funkcjach biznesowych. Wynik zapisz w pliku .md&#8221;<\/em><\/p>\n\n\n\n<p>Claude wygenerowa\u0142 komplet prompt\u00f3w dla MVP. Oto przyk\u0142adowe z nich:<\/p>\n\n\n\n<p><strong>Modu\u0142: Model danych<\/strong><\/p>\n\n\n\n<p><em>Prompt 1: &#8222;Stw\u00f3rz encje JPA dla systemu rezerwacji sal: Room, Booking, User.<\/em><\/p>\n\n\n\n<p><em>Room musi obs\u0142ugiwa\u0107 relacj\u0119 many-to-many dla sal \u0142\u0105czonych.<\/em><\/p>\n\n\n\n<p><em>Dodaj indeksy dla room.floor i booking.startTime.<\/em><\/p>\n\n\n\n<p><em>Equipment przechowuj jako JSON (PostgreSQL jsonb).&#8221;<\/em><\/p>\n\n\n\n<p><em>Prompt 2: &#8222;Napisz Liquibase migration dla modelu danych.<\/em><\/p>\n\n\n\n<p><em>Dodaj constraint: booking.endTime &gt; booking.startTime.<\/em><\/p>\n\n\n\n<p><em>Stw\u00f3rz trigger blokuj\u0105cy nak\u0142adaj\u0105ce si\u0119 rezerwacje.&#8221;<\/em><\/p>\n\n\n\n<p><strong>Modu\u0142: REST API<\/strong><\/p>\n\n\n\n<p><em>Prompt 7: &#8222;Stw\u00f3rz RoomController z endpointami:<\/em><\/p>\n\n\n\n<p><em>GET \/rooms &#8211; z filtrowaniem po floor, capacity, equipment<\/em><\/p>\n\n\n\n<p><em>GET \/rooms\/available?start=&amp;end= &#8211; dost\u0119pne w czasie<\/em><\/p>\n\n\n\n<p><em>GET \/rooms\/{id}\/schedule &#8211; kalendarz sali<\/em><\/p>\n\n\n\n<p><em>Dodaj @Cacheable dla GET \/rooms.&#8221;<\/em><\/p>\n\n\n\n<p><em>Prompt 8: &#8222;Zaimplementuj BookingController:<\/em><\/p>\n\n\n\n<p><em>POST \/bookings &#8211; nowa rezerwacja (dto validation)<\/em><\/p>\n\n\n\n<p><em>DELETE \/bookings\/{id} &#8211; anulowanie<\/em><\/p>\n\n\n\n<p><em>GET \/bookings\/my &#8211; rezerwacje u\u017cytkownika<\/em><\/p>\n\n\n\n<p><em>Obs\u0142u\u017c @ExceptionHandler dla custom wyj\u0105tk\u00f3w.&#8221;<\/em><\/p>\n\n\n\n<p>Od teraz mog\u0119 rozpocz\u0105\u0107 implementacj\u0119 MVP. W kolejnym kroku poka\u017c\u0119 ci, jak wykorzystam te prompty w praktyce &#8211; z rzeczywistym kodem, kt\u00f3ry Claude wygeneruje.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Krok-4:-Implementacja\">Krok 4: Implementacja<\/h2>\n\n\n\n<p>Maj\u0105c gotowe prompty, przyszed\u0142 czas na prawdziwy test &#8211; implementacj\u0119. Poka\u017c\u0119 ci trzy przyk\u0142ady, w jaki spos\u00f3b Claude Code przekszta\u0142ci\u0142 moje prompty w dzia\u0142aj\u0105cy kod.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><a><\/a>Przyk\u0142ad 1: Model danych z obs\u0142ug\u0105 sal \u0142\u0105czonych<\/h3>\n\n\n\n<p>Prompt:<\/p>\n\n\n\n<p><em>&#8222;Stw\u00f3rz encje JPA dla systemu rezerwacji sal: Room, Booking, User. Room musi obs\u0142ugiwa\u0107 relacj\u0119 many-to-many dla sal \u0142\u0105czonych. Dodaj indeksy dla room.floor i booking.startTime. Equipment przechowuj jako JSON (PostgreSQL jsonb).&#8221;<\/em><\/p>\n\n\n\n<p>Claude Code wygenerowa\u0142:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">@Entity\n\n@Table(name = \"rooms\", indexes = {\n\n\u00a0\u00a0\u00a0 @Index(name = \"idx_room_floor\", columnList = \"floor\")\n\n})\n\n@Data\n\n@Builder\n\n@NoArgsConstructor\n\n@AllArgsConstructor\n\npublic class Room {\n\n\u00a0\u00a0\u00a0 @Id\n\n\u00a0\u00a0\u00a0 @GeneratedValue(strategy = GenerationType.IDENTITY)\n\n\u00a0\u00a0\u00a0 private Long id;\n\n\u00a0\u00a0\u00a0 @Column(nullable = false, unique = true)\n\n\u00a0\u00a0\u00a0 private String name;\n\n\u00a0\u00a0\u00a0 @Column(nullable = false)\n\n\u00a0\u00a0\u00a0 private Integer floor;\n\n\u00a0\u00a0\u00a0 private Integer capacity;\n\n\u00a0\u00a0\u00a0 @Type(type = \"jsonb\")\n\n\u00a0\u00a0\u00a0 @Column(columnDefinition = \"jsonb\")\n\n\u00a0\u00a0\u00a0 private Map&lt;String, Object> equipment;\n\n\u00a0\u00a0\u00a0 private Boolean isPremium = false;\n\n\u00a0\u00a0\u00a0 @ManyToMany\n\n\u00a0\u00a0\u00a0 @JoinTable(\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 name = \"mergeable_rooms\",\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 joinColumns = @JoinColumn(name = \"room_id\"),\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 inverseJoinColumns = @JoinColumn(name = \"mergeable_with_id\")\n\n\u00a0\u00a0\u00a0 )\n\n\u00a0\u00a0\u00a0 @JsonIgnore\n\n\u00a0\u00a0\u00a0 private Set&lt;Room> mergeableWith = new HashSet&lt;>();\n\n\u00a0\u00a0\u00a0 \/\/ Helper method - Claude doda\u0142 to sam!\n\n\u00a0\u00a0\u00a0 public boolean canBeMergedWith(Room other) {\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return mergeableWith.contains(other) ||\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 other.getMergeableWith().contains(this);\n\n\u00a0\u00a0\u00a0 }\n\n}\n\n@Entity\n\n@Table(name = \"bookings\", indexes = {\n\n\u00a0\u00a0\u00a0 @Index(name = \"idx_booking_start_time\", columnList = \"startTime\"),\n\n\u00a0\u00a0\u00a0 @Index(name = \"idx_booking_room_time\", columnList = \"room_id,startTime,endTime\")\n\n})\n\n@Data\n\n@Builder\n\n@NoArgsConstructor\n\n@AllArgsConstructor\n\npublic class Booking {\n\n\u00a0\u00a0\u00a0 @Id\n\n\u00a0\u00a0\u00a0 @GeneratedValue(strategy = GenerationType.IDENTITY)\n\n\u00a0\u00a0\u00a0 private Long id;\n\n\u00a0\u00a0\u00a0 @ManyToOne(fetch = FetchType.LAZY)\n\n\u00a0\u00a0\u00a0 @JoinColumn(nullable = false)\n\n\u00a0\u00a0\u00a0 private Room room;\n\n\u00a0\u00a0\u00a0 @ManyToOne(fetch = FetchType.LAZY)\n\n\u00a0\u00a0\u00a0 @JoinColumn(nullable = false)\n\n\u00a0\u00a0\u00a0 private User user;\n\n\u00a0\u00a0\u00a0 @Column(nullable = false)\n\n\u00a0\u00a0\u00a0 private LocalDateTime startTime;\n\n\u00a0\u00a0\u00a0 @Column(nullable = false)\n\n\u00a0\u00a0\u00a0 private LocalDateTime endTime;\n\n\u00a0\u00a0\u00a0 @Enumerated(EnumType.STRING)\n\n\u00a0\u00a0\u00a0 private BookingStatus status = BookingStatus.ACTIVE;\n\n\u00a0\u00a0\u00a0 @ManyToMany\n\n\u00a0\u00a0\u00a0 @JoinTable(name = \"booking_merged_rooms\")\n\n\u00a0\u00a0\u00a0 private Set&lt;Room> mergedRooms = new HashSet&lt;>();\n\n\u00a0\u00a0\u00a0 @PrePersist\n\n\u00a0\u00a0\u00a0 @PreUpdate\n\n\u00a0\u00a0\u00a0 private void validateTimes() {\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (endTime.isBefore(startTime) || endTime.equals(startTime)) {\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 throw new IllegalArgumentException(\"End time must be after start time\");\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\n\n\u00a0\u00a0\u00a0 }\n\n}<\/pre>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><a><\/a>Przyk\u0142ad 2: Serwis z logik\u0105 konflikt\u00f3w<\/h3>\n\n\n\n<p>Prompt:<\/p>\n\n\n\n<p><em>&#8222;Zaimplementuj BookingService.createBooking() z logik\u0105: &#8211; Sprawd\u017a konflikty (r\u00f3wnie\u017c dla sal \u0142\u0105czonych) &#8211; Waliduj uprawnienia premium &#8211; Transakcja obejmuje wszystkie sale (je\u015bli \u0142\u0105czone) &#8211; Rzu\u0107 custom exceptions&#8221;<\/em><\/p>\n\n\n\n<p>Claude Code wygenerowa\u0142:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">@Service\n\n@Transactional\n\n@RequiredArgsConstructor\n\n@Slf4j\n\npublic class BookingService {\n\n\u00a0\u00a0\u00a0 private final BookingRepository bookingRepository;\n\n\u00a0\u00a0\u00a0 private final RoomRepository roomRepository;\n\n\u00a0\u00a0\u00a0 @Transactional(isolation = Isolation.SERIALIZABLE)\n\n\u00a0\u00a0\u00a0 public Booking createBooking(BookingCreateDto dto, User currentUser) {\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 log.info(\"Creating booking for user {} from {} to {}\",\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 currentUser.getEmail(), dto.getStartTime(), dto.getEndTime());\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ Pobierz g\u0142\u00f3wn\u0105 sal\u0119\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Room mainRoom = roomRepository.findById(dto.getRoomId())\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 .orElseThrow(() -> new RoomNotFoundException(dto.getRoomId()));\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ Sprawd\u017a uprawnienia premium\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (mainRoom.getIsPremium() &amp;&amp; !currentUser.getCanBookPremium()) {\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 throw new InsufficientPermissionsException(\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"User \" + currentUser.getEmail() + \" cannot book premium rooms\"\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 );\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ Zbierz wszystkie sale do rezerwacji\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Set&lt;Room> roomsToBook = new HashSet&lt;>();\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 roomsToBook.add(mainRoom);\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (dto.getMergedRoomIds() != null &amp;&amp; !dto.getMergedRoomIds().isEmpty()) {\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Set&lt;Room> mergedRooms = new HashSet&lt;>(\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 roomRepository.findAllById(dto.getMergedRoomIds())\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 );\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ Waliduj czy sale mog\u0105 by\u0107 po\u0142\u0105czone\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 for (Room mergedRoom : mergedRooms) {\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (!mainRoom.canBeMergedWith(mergedRoom)) {\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 throw new RoomsCannotBeMergedException(\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 mainRoom.getName(), mergedRoom.getName()\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 );\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (mergedRoom.getIsPremium() &amp;&amp; !currentUser.getCanBookPremium()) {\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 throw new InsufficientPermissionsException(\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"Cannot book premium room: \" + mergedRoom.getName()\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 );\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 roomsToBook.addAll(mergedRooms);\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ Sprawd\u017a konflikty dla wszystkich sal\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 for (Room room : roomsToBook) {\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 List&lt;Booking> conflicts = bookingRepository\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 .findConflictingBookings(\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 room.getId(),\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 dto.getStartTime(),\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 dto.getEndTime()\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 );\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (!conflicts.isEmpty()) {\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 throw new RoomNotAvailableException(\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 room.getName(),\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 dto.getStartTime(),\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 dto.getEndTime()\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 );\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ Tw\u00f3rz rezerwacj\u0119\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Booking booking = Booking.builder()\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 .room(mainRoom)\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 .user(currentUser)\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 .startTime(dto.getStartTime())\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 .endTime(dto.getEndTime())\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 .status(BookingStatus.ACTIVE)\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 .mergedRooms(roomsToBook.stream()\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 .filter(r -> !r.equals(mainRoom))\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 .collect(Collectors.toSet()))\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 .build();\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return bookingRepository.save(booking);\n\n\u00a0\u00a0\u00a0 }\n\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><a><\/a>Przyk\u0142ad 3: Endpoint z cache\u2019owaniem<\/h3>\n\n\n\n<p><em>&#8222;Stw\u00f3rz RoomController z endpointami: GET \/rooms &#8211; z filtrowaniem po floor, capacity, equipment GET \/rooms\/available?start=&amp;end= &#8211; dost\u0119pne w czasie Dodaj @Cacheable dla GET \/rooms.&#8221;<\/em><\/p>\n\n\n\n<p>Claude Code wygenerowa\u0142:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">@RestController\n\n@RequestMapping(\"\/api\/rooms\")\n\n@RequiredArgsConstructor\n\n@Slf4j\n\npublic class RoomController {\n\n\u00a0\u00a0\u00a0 private final RoomService roomService;\n\n\u00a0\u00a0\u00a0 private final RoomAvailabilityService availabilityService;\n\n\u00a0\u00a0\u00a0 @GetMapping\n\n\u00a0\u00a0\u00a0 @Cacheable(value = \"rooms\", key = \"#floor + '_' + #minCapacity + '_' + #equipment\")\n\n\u00a0\u00a0\u00a0 public ResponseEntity&lt;List&lt;RoomDto>> getRooms(\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @RequestParam(required = false) Integer floor,\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @RequestParam(required = false) Integer minCapacity,\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @RequestParam(required = false) String equipment) {\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 log.debug(\"Fetching rooms with filters - floor: {}, capacity: {}, equipment: {}\",\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 floor, minCapacity, equipment);\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 List&lt;Room> rooms = roomService.findRooms(floor, minCapacity, equipment);\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return ResponseEntity.ok(\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 rooms.stream()\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 .map(RoomMapper::toDto)\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 .collect(Collectors.toList())\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 );\n\n\u00a0\u00a0\u00a0 }\n\n\u00a0\u00a0\u00a0 @GetMapping(\"\/available\")\n\n\u00a0\u00a0\u00a0 public ResponseEntity&lt;List&lt;AvailableRoomDto>> getAvailableRooms(\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime start,\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime end,\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @RequestParam(required = false) Integer minCapacity,\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @RequestParam(required = false) Boolean includeMergeable) {\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (end.isBefore(start)) {\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 throw new ValidationException(\"End time must be after start time\");\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (Duration.between(start, end).toHours() > 24) {\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 throw new ValidationException(\"Cannot check availability for more than 24 hours\");\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 List&lt;AvailableRoomDto> availableRooms = availabilityService\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 .findAvailableRooms(start, end, minCapacity, includeMergeable);\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return ResponseEntity.ok(availableRooms);\n\n\u00a0\u00a0\u00a0 }\n\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><a><\/a>Demo modu\u0142u frontend przygotowane przez AI<\/h3>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1206\" height=\"797\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic15.png\" alt=\"claude code agent ai\" class=\"wp-image-37535\" title=\"\" srcset=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic15.png 1206w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic15-300x198.png 300w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic15-768x508.png 768w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic15-495x327.png 495w\" sizes=\"auto, (max-width: 1206px) 100vw, 1206px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"620\" height=\"618\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic16.png\" alt=\"claude code agent ai\" class=\"wp-image-37538\" title=\"\" srcset=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic16.png 620w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic16-300x300.png 300w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic16-150x150.png 150w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic16-396x395.png 396w\" sizes=\"auto, (max-width: 620px) 100vw, 620px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1193\" height=\"430\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic17.png\" alt=\"claude code agent ai\" class=\"wp-image-37541\" title=\"\" srcset=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic17.png 1193w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic17-300x108.png 300w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic17-768x277.png 768w, https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/08\/nearshore_2025.07.25_graphic17-495x178.png 495w\" sizes=\"auto, (max-width: 1193px) 100vw, 1193px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><a><\/a>Podsumowanie implementacji<\/h3>\n\n\n\n<p>Ogromna ilo\u015b\u0107 czasu zosta\u0142a zaoszcz\u0119dzona przy zaledwie trzech zadaniach. Przy 23 zadaniach dla ca\u0142ego MVP, oszcz\u0119dno\u015bci mog\u0105 si\u0119ga\u0107 dni. Co warto doda\u0107: kod by\u0142 sp\u00f3jny, przetestowany i zawiera\u0142 obs\u0142ug\u0119 przypadk\u00f3w brzegowych.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Jak-kodowa\u0107?-3-praktyczne-porady-na-start\">Jak kodowa\u0107? 3 praktyczne porady na start<\/h2>\n\n\n\n<p>Po miesi\u0105cu pracy z Claude Code, zebra\u0142em kilka porad, kt\u00f3re mog\u0105 pom\u00f3c efektywnie pracowa\u0107 z tym narz\u0119dziem.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><a><\/a>1. Zacznij od ma\u0142ych, dobrze zdefiniowanych zada\u0144<\/h3>\n\n\n\n<p>Nie powinni\u015bmy rozwi\u0105zywa\u0107 z\u0142o\u017conych problem\u00f3w pojedynczym promptem. Claude Code dzia\u0142a \u015bwietnie, gdy dajemy mu konkretne zadania.<\/p>\n\n\n\n<p><strong>\u0179le:<\/strong><\/p>\n\n\n\n<p><em>&#8222;stw\u00f3rz ca\u0142y system logowania z rejestracj\u0105 i resetowaniem has\u0142a&#8221;<\/em><\/p>\n\n\n\n<p><strong>Dobrze:<\/strong><\/p>\n\n\n\n<p><em>&#8222;stw\u00f3rz model User z bcrypt hashowaniem has\u0142a&#8221;<\/em><\/p>\n\n\n\n<p><em>&#8222;dodaj endpoint POST \/auth\/register z walidacj\u0105 email&#8221;<\/em><\/p>\n\n\n\n<p><em>&#8222;zaimplementuj JWT token generation w Spring Security&#8221;<\/em><\/p>\n\n\n\n<p>Mniejsze zadania = bardziej przewidywalny i testowalny kod. \u0141atwiej te\u017c zlokalizowa\u0107 ewentualne problemy i zrozumie\u0107, co dok\u0142adnie robi wygenerowany kod.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><a><\/a>2. Zawsze sprawdzaj kod, kt\u00f3ry stworzy AI<\/h3>\n\n\n\n<p>Claude Code generuje imponuj\u0105cy kod, ale to wci\u0105\u017c twoja odpowiedzialno\u015b\u0107 jako dewelopera, aby sprawdzi\u0107 poprawno\u015b\u0107&nbsp;tego kodu.<\/p>\n\n\n\n<p>Co powiniene\u015b sprawdzi\u0107:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Czy kod kompiluje si\u0119 bez b\u0142\u0119d\u00f3w?<\/li>\n\n\n\n<li>Czy nazewnictwo jest zgodne z konwencjami projektu?<\/li>\n\n\n\n<li>Czy obs\u0142u\u017cone s\u0105 podstawowe edge case&#8217;y?<\/li>\n\n\n\n<li>Czy nie ma warto\u015bci na sta\u0142e zapisanych w kodzie<a>?<\/a><\/li>\n\n\n\n<li>Czy logi s\u0105 na odpowiednim poziomie (debug\/info\/error)?<\/li>\n<\/ul>\n\n\n\n<p><strong>Pro tip:<\/strong> Skonfiguruj swoje IDE, \u017ceby automatycznie formatowa\u0142o kod wed\u0142ug twoich standard\u00f3w.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Wykorzystuj kontekst projektu: Claude Code zna tw\u00f3j kod<\/h3>\n\n\n\n<p>Ogromn\u0105 przewag\u0105 nad innymi narz\u0119dziami AI w Claude Code jest to, \u017ce rozumie kontekst projektu.<\/p>\n\n\n\n<p>Zamiast takiego prompta:<\/p>\n\n\n\n<p><em>&#8222;napisz metod\u0119 do obliczania ceny z VAT u\u017cywaj\u0105c BigDecimal&#8221;<\/em><\/p>\n\n\n\n<p>Mo\u017cesz bezpo\u015brednio odnie\u015b\u0107&nbsp;si\u0119&nbsp;do projektu:<\/p>\n\n\n\n<p><em>&#8222;dodaj metod\u0119 calculatePriceWithVat do PriceService, kt\u00f3ra u\u017cywa tej samej logiki co calculateDiscount&#8221;<\/em><\/p>\n\n\n\n<p>Claude Code automatycznie:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Sprawdzi, jak wygl\u0105da PriceService<\/li>\n\n\n\n<li>U\u017cyje tych samych konwencji nazewnictwa<\/li>\n\n\n\n<li>Zastosuje podobny styl obs\u0142ugi b\u0142\u0119d\u00f3w<\/li>\n\n\n\n<li>Doda odpowiednie importy<\/li>\n<\/ul>\n\n\n\n<p><strong>Pro tip:<\/strong> po wykonaniu komendy \/init mo\u017cesz odwo\u0142ywa\u0107 si\u0119 do dowolnych plik\u00f3w i klas w projekcie. Claude Code &#8222;pami\u0119ta&#8221; struktur\u0119 i mo\u017ce na\u015bladowa\u0107 istniej\u0105ce wzorce.<\/p>\n\n\n\n<p>Pami\u0119taj, Claude Code to narz\u0119dzie, nie zamiennik dla my\u015blenia. Im lepiej zdefiniujesz problem, tym lepsze dostaniesz rozwi\u0105zanie.<\/p>\n\n\n\n<p><strong>Przeczytaj tak\u017ce:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><a href=\"https:\/\/nearshore-it.eu\/pl\/artykuly\/zod-ai-schema-validation\/\"> Zod AI<\/a><\/strong><\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Sztuczna inteligencja w programowaniu: podsumowanie<\/h2>\n\n\n\n<p>Mam nadziej\u0119, \u017ce ten wpis pokaza\u0142 mo\u017cliwo\u015bci, jakie oferuje Claude Code w codziennej pracy developera. Ale to, co opisa\u0142em, to zaledwie u\u0142amek potencja\u0142u tego narz\u0119dzia.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><a><\/a>Zaawansowane mo\u017cliwo\u015bci Claude Code, kt\u00f3re warto eksplorowa\u0107<\/h3>\n\n\n\n<p>Claude Code to pot\u0119\u017cne narz\u0119dzie, kt\u00f3re skrywa znacznie wi\u0119cej zaawansowanych funkcjimog\u0105cych &nbsp;mog\u0105 zrewolucjonizowa\u0107 Tw\u00f3j workflow:<\/p>\n\n\n\n<p><strong>Sub-agenci:<\/strong> mo\u017cliwo\u015b\u0107 delegowania zada\u0144 do wyspecjalizowanych &#8222;pod-agent\u00f3w&#8221;. Na przyk\u0142ad: jeden agent analizuje wymagania, drugi projektuje architektur\u0119, trzeci implementuje kod. Ka\u017cdy z nich mo\u017ce mie\u0107 w\u0142asny kontekst i specjalizacj\u0119.<\/p>\n\n\n\n<p><strong>Model Context Protocol (MCP):<\/strong> otwarty protok\u00f3\u0142 pozwalaj\u0105cy Claude Code integrowa\u0107 si\u0119 z zewn\u0119trznymi narz\u0119dziami i \u017ar\u00f3d\u0142ami danych. Mo\u017cesz pod\u0142\u0105czy\u0107 w\u0142asne API, bazy danych czy systemy firmowe, daj\u0105c AI dost\u0119p do aktualnych danych projektu.<\/p>\n\n\n\n<p><strong>Autonomiczne debugowanie:<\/strong> Claude Code mo\u017ce samodzielnie analizowa\u0107 b\u0142\u0119dy, testowa\u0107 hipotezy i proponowa\u0107 poprawki. Wystarczy wskaza\u0107 mu niedzia\u0142aj\u0105cy test lub stack trace. Claude samodzielnie uruchomi test i przeanalizuje, co jest nie tak.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><a><\/a>Chcesz wypr\u00f3bowa\u0107 Claude Code?<\/h3>\n\n\n\n<p>Je\u015bli zainteresowa\u0142 ci\u0119 ten wpis, mo\u017cesz rozpocz\u0105\u0107 swoj\u0105 przygod\u0119 z Claude Code ju\u017c dzi\u015b. Narz\u0119dzie jest obecnie dost\u0119pne w wersji research preview &#8211; wi\u0119cej informacji znajdziesz na<a href=\"https:\/\/www.anthropic.com\/claude\" target=\"_blank\" rel=\"noopener\"> <\/a><a href=\"https:\/\/www.anthropic.com\/claude\" target=\"_blank\" rel=\"noopener\">blogu Anthropic<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><a><\/a>Na zako\u0144czenie<\/h3>\n\n\n\n<p>Claude Code to dopiero pocz\u0105tek rewolucji w sposobie, w jaki tworzymy oprogramowanie. To narz\u0119dzie, kt\u00f3re ju\u017c dzi\u015b pozwala ogromnie przyspieszy\u0107 development, zachowuj\u0105c przy tym wysok\u0105 jako\u015b\u0107 kodu.<\/p>\n\n\n\n<p>Pami\u0119taj jednak: to wci\u0105\u017c narz\u0119dzie, nie zamiennik dla dewelopera. Najwi\u0119ksz\u0105 warto\u015b\u0107 uzyskasz, \u0142\u0105cz\u0105c mo\u017cliwo\u015bci AI z ludzk\u0105 kreatywno\u015bci\u0105, zrozumieniem kontekstu biznesowego i umiej\u0119tno\u015bci\u0105 podejmowania strategicznych decyzji.<\/p>\n\n\n\n<p>Czy za kilka lat b\u0119dziemy programowa\u0107 zupe\u0142nie inaczej? Wszystko na to wskazuje. Pytanie brzmi: czy b\u0119dziesz w\u015br\u00f3d tych, kt\u00f3rzy wykorzystaj\u0105 t\u0119 zmian\u0119, czy tych, kt\u00f3rzy s\u0105 wobec niej sceptyczni?<\/p>\n\n\n\n<p><a id=\"_msocom_1\"><\/a><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><br><\/style><div class=\"promotion-box promotion-box--image-left \"><div class=\"tiles latest-news-once\"><div class=\"tile\"><div class=\"tile-image\"><img decoding=\"async\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2025\/02\/Code-Faster-Tlo-2.jpg\" alt=\"\" title=\"\"><\/div><div class=\"tile-content\"><p class=\"entry-title client-name\">AI w programowaniu | bezp\u0142atny e-book<\/p>\r\nZautomatyzuj kodowanie z AI! Pobierz darmowy e-book i odkryj nowe mo\u017cliwo\u015bci\r\n<br \/><br \/>\r\n<a class=\"btn btn-primary\" href=\"https:\/\/www.engage.inetum.com\/ebook-code-faster-build-smarter\/\" target=\"_blank\" rel=\"noopener\">Pobierz teraz!<\/a><\/div><\/div><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Stuczna inteligencja wykorzystywana jest coraz ch\u0119tniej przez programist\u00f3w w obr\u0119bie bardziej z\u0142o\u017conych zada\u0144, a modele AI staj\u0105 si\u0119 coraz bardziej zaawansowane. Gemini, Github Copilot czy Microsoft Copilot rozpocz\u0119\u0142y rewolucj\u0119 w kodowaniu i dzi\u015b trudno wyobrazi\u0107 sobie realizacj\u0119 codziennych zada\u0144 bez pomocy tych narz\u0119dzi.<\/p>\n","protected":false},"author":209,"featured_media":37573,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"iawp_total_views":2019,"footnotes":""},"categories":[1,582],"tags":[],"offering":[522],"class_list":["post-37449","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-artykuly","category-technologie","offering-tech-blog"],"acf":[],"_links":{"self":[{"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/posts\/37449","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/users\/209"}],"replies":[{"embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/comments?post=37449"}],"version-history":[{"count":22,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/posts\/37449\/revisions"}],"predecessor-version":[{"id":37597,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/posts\/37449\/revisions\/37597"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/media\/37573"}],"wp:attachment":[{"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/media?parent=37449"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/categories?post=37449"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/tags?post=37449"},{"taxonomy":"offering","embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/offering?post=37449"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}