<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>programowanie » enterv.pl</title>
	<atom:link href="https://enterv.pl/tag/programowanie/feed/" rel="self" type="application/rss+xml" />
	<link>https://enterv.pl</link>
	<description>Więcej niż tylko portfolio i blog</description>
	<lastBuildDate>Tue, 04 Mar 2025 17:27:32 +0000</lastBuildDate>
	<language>pl-PL</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://enterv.pl/wp-content/uploads/2022/12/cropped-1024_bt-32x32.png</url>
	<title>programowanie » enterv.pl</title>
	<link>https://enterv.pl</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Puzzle Game &#8211; wywiad z autorem 🎮</title>
		<link>https://enterv.pl/2023/09/19/puzzle-game-wywiad/</link>
		
		<dc:creator><![CDATA[enterv]]></dc:creator>
		<pubDate>Tue, 19 Sep 2023 19:30:32 +0000</pubDate>
				<category><![CDATA[GameDev]]></category>
		<category><![CDATA[Pozostałe]]></category>
		<category><![CDATA[Wywiady]]></category>
		<category><![CDATA[ambitny twórca]]></category>
		<category><![CDATA[autor]]></category>
		<category><![CDATA[discord]]></category>
		<category><![CDATA[game dev]]></category>
		<category><![CDATA[gamedev]]></category>
		<category><![CDATA[giveaway]]></category>
		<category><![CDATA[informatyka]]></category>
		<category><![CDATA[patryk kamionka]]></category>
		<category><![CDATA[programowanie]]></category>
		<category><![CDATA[projekt]]></category>
		<category><![CDATA[promocja]]></category>
		<category><![CDATA[puzzle game]]></category>
		<category><![CDATA[solo dev]]></category>
		<category><![CDATA[steam]]></category>
		<category><![CDATA[technikum]]></category>
		<category><![CDATA[the room]]></category>
		<category><![CDATA[trailer]]></category>
		<category><![CDATA[unity]]></category>
		<category><![CDATA[unreal]]></category>
		<category><![CDATA[unreal engine]]></category>
		<category><![CDATA[wywiad]]></category>
		<guid isPermaLink="false">https://enterv.pl/?p=907</guid>

					<description><![CDATA[<p>Pragnę wam dzisiaj zaprezentować wywiad z twórcą gry Puzzle Game. Młody ambitny Game Developer zgodził się powiedzieć nieco więcej o sobie i swoim dziele :)</p>
Artykuł <a href="https://enterv.pl/2023/09/19/puzzle-game-wywiad/">Puzzle Game – wywiad z autorem 🎮</a> pochodzi z serwisu <a href="https://enterv.pl">enterv.pl</a>.]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading">🌄 Wprowadzenie</h2>



<p>Nie tak dawno miała miejsce premiera gry <a href="https://store.steampowered.com/app/2562870/Puzzle_Game/" target="_blank" rel="noopener nofollow" title="">Puzzle Game na platformie Steam</a>. Jej autor zgłosił się do moderacji discordowego serwera <a href="https://www.youtube.com/@PL_Tutors" target="_blank" rel="noopener nofollow" title="">PL Tutorsa</a> z prośbą o promocję swojego dzieła, więc kimże byśmy byli, gdybyśmy odmówili pomocy?</p>



<p>Stąd, z tej też okazji na ww. serwerze odbył się giveaway, w którym można było wygrać jeden z pięciu kluczy do tytułowej gry! Wszystkim zwycięzcom gratulujemy 😀</p>







<p>Tyle słowem wstępu i poznajmy nareszcie bohaterów artykułu: autora i grę 😃</p>



<h2 class="wp-block-heading">👤O autorze</h2>



<h3 class="wp-block-heading">Opowiedz nam coś o sobie</h3>



<p>Nazywam się Patryk Kamionka, mam 18 lat. Obecnie jestem w ostatniej klasie technikum na kierunku: informatyk. Od 3 lat hobbystycznie tworze modele 3D.</p>



<h3 class="wp-block-heading">Kiedy pojawiło się zainteresowanie GameDev?</h3>



<p>Prawdopodobnie było to mniej więcej w 2012 r. Małoletni ja zawsze chciał stworzyć własnego moda do Minecrafta. Później przerodziło się to w chęć zrobienia własnej gry.</p>



<p>Niestety w tym wieku było to zadanie ekstremalnie trudne. W tamtym czasie się poddałem. 3 lata temu zainteresowałem się grafiką 3D. Pierwszymi tutorialami były te od “<a href="https://www.youtube.com/@PL_Tutors" target="_blank" rel="noopener nofollow" title="">TutorsaPL</a>”. Mniej więcej miesiąc później od tego momentu postanowiłem, że chce się rozwijać w kierunku tworzenia gier na pozycji grafika 3D. Wtedy też pojawiły się pierwsze zabawy z Unity</p>



<h3 class="wp-block-heading">Ile i jakie produkcje już stworzyłeś?</h3>



<p><strong>Puzzle Game</strong> to pierwsza gra, która trafia do szerszej publiczności. Ale mam kilka, które jako tako działają. Mam za sobą 3 game jamy. Szczęśliwie, na każdym z nich udało się coś wykombinować. Link: <a href="https://globalgamejam.org/users/pro-g" target="_blank" rel="noopener nofollow" title="">https://globalgamejam.org/users/pro-g</a>. Opiszę krótko każdą z nich:</p>



<figure class="wp-block-image alignright size-large"><img decoding="async" src="https://globalgamejam.org/amazons3/image-derivative/ggj/styles/feature_image__narrow/featured_image/2021/01/336922/obraz_2021-01-31_154745.png?itok=ltS7fpfH&amp;timestamp=1612104796" alt=""/></figure>



<h4 class="wp-block-heading"><strong><a href="https://globalgamejam.org/2021/games/lost-found-office-2" target="_blank" rel="noopener nofollow" title="">CYBERFIND SIMULATOR</a></strong></h4>



<p>Nie jestem z niej zadowolony, ale to był mój pierwszy game jam. W grze dostajemy zlecenie na znalezienie konkretnego przedmiotu w magazynie. Czas jest ograniczony.</p>



<figure class="wp-block-image alignleft size-large"><img decoding="async" src="https://globalgamejam.org/amazons3/image-derivative/ggj/styles/feature_image__narrow/featured_image/2022/01/336000/icon_4.png?itok=OBfVZpUU&amp;timestamp=1643405170" alt=""/></figure>



<h4 class="wp-block-heading has-text-align-left"><strong><a href="https://globalgamejam.org/2022/games/mccock-2" target="_blank" rel="noopener nofollow" title="">Don&#8217;t STOP</a></strong></h4>



<p>Gierka która nie osiągnęła swojego pełnego potencjału, ale mimo wszystko przyjemnie się gra. Gra polega na realizowaniu kulinarnych zamówień poprzez podchodzenie do wyznaczonych punktów. Haczyk polega na tym, że musimy sterować dwoma postaciami jednocześnie. Zadanie postaci A nie może być wykonane przez postać B.</p>



<figure class="wp-block-image alignright size-large"><img fetchpriority="high" decoding="async" width="323" height="197" src="https://enterv.pl/wp-content/uploads/2023/09/image.png" alt="" class="wp-image-944" srcset="https://enterv.pl/wp-content/uploads/2023/09/image.png 323w, https://enterv.pl/wp-content/uploads/2023/09/image-300x183.png 300w" sizes="(max-width: 323px) 100vw, 323px" /></figure>



<h4 class="wp-block-heading"><strong><a href="https://globalgamejam.org/2023/games/help-ancestors-1" target="_blank" rel="noopener nofollow" title="">With The Help Of Ancestors</a></strong></h4>



<p>Moja ulubiona ze wszystkich game jamowych. Gra polega na pozbywaniu się niechcianych korzeni i dbaniu o roślinki. Ze strony deweloperskiej gra jest o tyle ciekawa, że mimo iż miałem zamiar być zespołowym grafikiem to byłem zespołowym programistą i grafikiem ¯_(ツ)_/¯ zabrakło programistów i trzeba było<br>sobie poradzić.</p>



<p>Mam jeszcze 2 ukończone gierki, ale nie widziały one publiczności.</p>



<h4 class="wp-block-heading"><strong>Cube_vs_Spheres</strong></h4>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="Cube_vs_Spheres" width="1290" height="726" src="https://www.youtube.com/embed/n1h5hKbN5jM?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
</div></figure>



<p><br>Moja pierwsza ukończona gra. (Swoją drogą na moim kanale YT są filmy z game jamowych gierek).</p>



<h4 class="wp-block-heading">Nieupubliczniona gra</h4>



<p>Druga nie była nigdzie publikowana. Była to prosta gierka. Ekran był podzielony na dwie części. Po prawej stronie pojawiał się kolor. Gracz miał 3 kontrolki: R, G, B. Klikając je w odpowiedni sposób, mógł wytworzyć jeden z 7 kolorów. Celem było aby stworzyć kolor wyświetlany po prawej stronie ekranu. Tworzony kolor był wyświetlany po lewej stronie. Gracz dostawał punkty za szybkość dopasowywania kolorów.</p>



<p>Brałem udział w kilku innych projektach zespołowych, ale żaden z nich nie został ukończony.</p>



<h3 class="wp-block-heading">Czym na co dzień się zajmujesz? Jaki jest twój zawód?</h3>



<p>Jak wspomniałem przy pierwszym pytaniu, ciągle szkoła, 5 klasa technikum informatycznego. Egzaminy zawodowe zdane. 🙂 Po szkole jestem grafikiem 3D na zlecenie (obecnie jest STOP ponieważ jestem w klasie maturalnej, trochę czasu brakuje., Kiedy nie mam zleceń to tworzę prace dla siebie (<a href="https://www.artstation.com/patryk_kamionka" target="_blank" rel="noopener nofollow" title="">Artstation</a>) lub kreuję jakąś grę (tak już mam plan na puzzle game 2).</p>



<p>Ogólnie to zajmuję się grafiką 3D, ale potrafię też programować. Web development również nie jest mi obcy, ale to akurat na niższym poziomie.</p>



<h2 class="wp-block-heading">🧩 O Puzzle Game</h2>



<figure class="wp-block-image size-large"><img decoding="async" width="1920" height="1080" src="https://enterv.pl/wp-content/uploads/2023/09/image.jpeg" alt="" class="wp-image-943" srcset="https://enterv.pl/wp-content/uploads/2023/09/image.jpeg 1920w, https://enterv.pl/wp-content/uploads/2023/09/image-300x169.jpeg 300w, https://enterv.pl/wp-content/uploads/2023/09/image-1024x576.jpeg 1024w, https://enterv.pl/wp-content/uploads/2023/09/image-768x432.jpeg 768w, https://enterv.pl/wp-content/uploads/2023/09/image-1536x864.jpeg 1536w" sizes="(max-width: 1920px) 100vw, 1920px" /></figure>



<h3 class="wp-block-heading">Opowiedz nam coś o swoim dziele</h3>



<p>Jest to krótka gra logiczna z 10 poziomami i drobną fabułą. Została stworzona mniej więcej w miesiąc (w trakcie wakacji miałem dużo czasu). Zrobiona na Unreal Engine 5.2. Stworzyłem ją solo: programowanie i grafika -&gt; wszystko moje, ręcznie robione. Tylko dźwięki outsourcowałem z <a href="https://www.zapsplat.com/" target="_blank" rel="noopener nofollow" title="">zapsplat.com</a> (Darmowe dźwięki). Lektor to mój głos, również robiony samodzielnie, ale przyznam, że nie wyszedł zbyt dobrze.</p>



<h3 class="wp-block-heading">Dla kogo jest gra?</h3>



<p>Myślę, że każdy w wieku 12+ kto lubi gry logiczne/zagadkowe będzie zadowolony z rozgrywki. Gra była inspirowana produkcjami typu “The Room”, także jeśli komuś się to podobało, to moja gra również powinna się spodobać.</p>



<h3 class="wp-block-heading">Czy gra jest trudna? Ile czasu potrzeba na jej przejście?</h3>



<p>Część zagadek jest prosta, a część zagadek jest taka, że trzeba posiedzieć i się zastanowić. Gra jest na około 40-60 min.</p>



<h3 class="wp-block-heading">Co było najtrudniejsze podczas tworzenia gry?</h3>



<p>Będąc szczerym, nie miałem zbyt dużo problemów. Na pewno programowanie w Unreal Engine 5 było nowością. No i sam fakt, że wszystko robiłem całkowicie samemu. Trzeba było<br>utrzymać pewien poziom samomotywacji. Ogólnie to zdradzę, że gra początkowo miała być tylko projektem do nauczenia się Unreala, ale tak dobrze pochłaniałem wiedzę na jego temat, że przerodziło się w moją pierwsza grę na Steam. Wiedza zdobyta podczas tworzenia tego projektu zostanie wykorzystana, do stworzenia kolejnej części, tym razem chcę żeby dało się normalnie chodzić po mapie. (The room, ale pełna swoboda).</p>



<h3 class="wp-block-heading">Czy chciałbyś coś podpowiedzieć swoim graczom?</h3>



<p>Szczerze, myślę, że gra jest wystarczająco prosta + ma wbudowany system podpowiedzi.<br>Mogę co najwyżej powiedzieć, że z beta testów wynika, że gracze często za bardzo kombinują. Wiele zagadek jest prostszych niż się wydają.</p>



<h3 class="wp-block-heading">Czy chciałbyś coś jeszcze dodać?</h3>



<p>Gra nie jest idealna, szczególnie jeśli mowa o lektorze, ale tak to już jest, kiedy jest się solo devem. Podróż samotnego developera będzie raczej wyboista, często trzeba iść na kompromisy. Chciałbym zachęcić wszystkich mających ambicję bycia game deweloperami, do próbowania mimo przeszkód i nie bania się i pójścia na takie kompromisy, niestety ale jest to wymóg do ukończenia gry w rozsądnym czasie. Satysfakcja po ukończeniu takiego projektu jest nie do opisania.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://enterv.pl/wp-content/uploads/2022/12/gamejaminterview-1024x1024.webp" alt="" class="wp-image-523" srcset="https://enterv.pl/wp-content/uploads/2022/12/gamejaminterview.webp 1024w, https://enterv.pl/wp-content/uploads/2022/12/gamejaminterview-300x300.webp 300w, https://enterv.pl/wp-content/uploads/2022/12/gamejaminterview-150x150.webp 150w, https://enterv.pl/wp-content/uploads/2022/12/gamejaminterview-768x768.webp 768w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading">✅ Zakończenie</h2>



<p>Grę <a href="https://store.steampowered.com/app/2562870/Puzzle_Game/" target="_blank" rel="noopener nofollow" title=""><strong>Puzzle Game</strong> znajdziecie na platformie Steam</a> i możecie ją ograć na PC jak i, niespodzianka, na Steam Deck co z pewnością pozwoli cieszyć się dziełem w całym domostwie jak i poza nim 😉. Dzieło dostępne jest za przyzwoitą cenę 3$ co z całą pewnością jest na każdą kieszeń, a jednocześnie wspomoże młodego i ambitnego twórcę gier 😁</p>



<p>Również gorąco polecam śledzić prace graficzne Patryka na <a href="https://www.artstation.com/patryk_kamionka" target="_blank" rel="noopener nofollow" title="">Artstation</a>, na którym możecie zobaczyć jego piękne portfolio 😉 </p>Artykuł <a href="https://enterv.pl/2023/09/19/puzzle-game-wywiad/">Puzzle Game – wywiad z autorem 🎮</a> pochodzi z serwisu <a href="https://enterv.pl">enterv.pl</a>.]]></content:encoded>
					
		
		<enclosure url="https://cdn.cloudflare.steamstatic.com/steam/apps/256963983/movie480_vp9.webm?t=1692656025" length="1884497" type="video/webm" />

			</item>
		<item>
		<title>PHP vs Node.js &#8211; krótki test</title>
		<link>https://enterv.pl/2023/02/05/php-vs-node-js-krotki-test/</link>
					<comments>https://enterv.pl/2023/02/05/php-vs-node-js-krotki-test/#comments</comments>
		
		<dc:creator><![CDATA[enterv]]></dc:creator>
		<pubDate>Sun, 05 Feb 2023 11:39:58 +0000</pubDate>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[aplikacje webowe]]></category>
		<category><![CDATA[backend development]]></category>
		<category><![CDATA[backend development w php i node.js]]></category>
		<category><![CDATA[co szybsze]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[jaka technologia jest szybsza]]></category>
		<category><![CDATA[jakie są różnice]]></category>
		<category><![CDATA[język programowania]]></category>
		<category><![CDATA[języki programowania]]></category>
		<category><![CDATA[krótki test]]></category>
		<category><![CDATA[która technologia jest lepsza]]></category>
		<category><![CDATA[node]]></category>
		<category><![CDATA[node.js]]></category>
		<category><![CDATA[node.js a php]]></category>
		<category><![CDATA[node.js czy php]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[po stronie serwera]]></category>
		<category><![CDATA[porównanie]]></category>
		<category><![CDATA[porównanie dwóch technologii]]></category>
		<category><![CDATA[porównanie technologii]]></category>
		<category><![CDATA[prędkość]]></category>
		<category><![CDATA[programowanie]]></category>
		<category><![CDATA[programowanie po stronie serwera]]></category>
		<category><![CDATA[server-side programming]]></category>
		<category><![CDATA[szybkość]]></category>
		<category><![CDATA[technologie]]></category>
		<category><![CDATA[test]]></category>
		<category><![CDATA[test prędkości]]></category>
		<category><![CDATA[test wydajności]]></category>
		<category><![CDATA[testy wydajności]]></category>
		<category><![CDATA[web development]]></category>
		<category><![CDATA[wybór języka programowania]]></category>
		<category><![CDATA[wybór technologii]]></category>
		<category><![CDATA[wydajność]]></category>
		<category><![CDATA[zalety i wady]]></category>
		<category><![CDATA[zastosowanie]]></category>
		<guid isPermaLink="false">https://enterv.pl/?p=661</guid>

					<description><![CDATA[<p>Dzisiaj na warsztat weźmiemy sobie porównanie technologii PHP vs Nodej.js i dowiemy się, który z nich działa szybciej oraz dojdziemy do ciekawych wniosków. Serdecznie zapraszam</p>
Artykuł <a href="https://enterv.pl/2023/02/05/php-vs-node-js-krotki-test/">PHP vs Node.js – krótki test</a> pochodzi z serwisu <a href="https://enterv.pl">enterv.pl</a>.]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading">Przygotowanie</h2>



<p>Do dzisiejszego porównania wykorzystamy PHP w wersji 8.2 oraz NodeJS w wersji 18.14.0 LTS. Użyjemy również Docker, aby ułatwić sobie konfigurowanie środowisk. Oczywiście wszystko starałem się trzymać w najbardziej defaultowej wersji jak tylko mogłem, więc nie uświadczymy tutaj żadnych dodatkowych konfiguracji, które mogłyby &#8222;podboostować&#8221; którąkolwiek technologię.</p>



<p>Dzięki lekcji, którą wyciągnąłem podczas tworzenia <a href="https://enterv.pl/2022/11/21/programowanie-php-vs-python-krotki-test/" target="_blank" rel="noopener" title="">poprzedniego porównania</a>, dowiedziałem się, że testy muszą być jeszcze prostsze i bardziej uniwersalne i oto doszedłem do wniosku, że   najlepiej będzie zainicjować następujące sprawdziany:</p>



<ol class="wp-block-list">
<li>Obliczenie 20! czyli <a href="https://pl.wikipedia.org/wiki/Silnia" target="_blank" rel="noopener nofollow" title="">silnię</a> z 20. Oczywiście rekurencją, aby było dodatkowe obciążenie.</li>



<li>Znaleźć największą liczbę z przedziału 1-100000 &#8211; generowanie tablicy oczywiście poza mierzeniem czasu.</li>



<li>Wygenerowanie losowego ciągu znaku o długości 100000 znaków i przekształcenie wszystkich liter na wielkie litery.</li>
</ol>



<p>Zadania może nie są aż nadto trudne, ale są wystarczające, aby ukazać konkretne czasy wykonania. Ważne też jest przy każdym teście, aby wyniki były po prostu przyzwoite &#8211; to nam powie czy daną technologię w ogóle brać za poważny wybór.</p>



<h2 class="wp-block-heading">Tworzenie kodu</h2>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="683" src="https://enterv.pl/wp-content/uploads/2022/11/vecteezy_graphic-designer-learning-program-software-painting-on-computer_-1024x683.jpg" alt="" class="wp-image-479" srcset="https://enterv.pl/wp-content/uploads/2022/11/vecteezy_graphic-designer-learning-program-software-painting-on-computer_-1024x683.jpg 1024w, https://enterv.pl/wp-content/uploads/2022/11/vecteezy_graphic-designer-learning-program-software-painting-on-computer_-300x200.jpg 300w, https://enterv.pl/wp-content/uploads/2022/11/vecteezy_graphic-designer-learning-program-software-painting-on-computer_-768x512.jpg 768w, https://enterv.pl/wp-content/uploads/2022/11/vecteezy_graphic-designer-learning-program-software-painting-on-computer_-1536x1024.jpg 1536w, https://enterv.pl/wp-content/uploads/2022/11/vecteezy_graphic-designer-learning-program-software-painting-on-computer_.jpg 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Na szczęście nie musiałem spędzić wielu godzin nad tym wszystkim, a i samo wyszukanie potrzebnych informacji dla obu narzędzi było bardzo przyjemne i bardzo proste. Powiem, że na tym polu mamy ładny remis. Co ciekawe, najwięcej problemów miałem z Dockerem. To nie tak, że to było uwłaczające i mega trudne, po prostu zapomniałem jak go się nastawia 😅. Także mogę powiedzieć, że taki minimalny problem był z Dockerem, no ale to nie o nim miałem pisać 😉</p>



<h2 class="wp-block-heading">Wyniki</h2>



<p>Muszę uprzedzić, że wyniki są nawet ciekawe. Żadna z technologii nie jest słaba i stanowią nadal dla siebie konkurencję. Jak dla mnie oba narzędzia dały sobie świetne radę. Liczby mówią same za siebie:</p>







<h2 class="wp-block-heading">Podsumowanie</h2>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="683" src="https://enterv.pl/wp-content/uploads/2022/11/19362653-1024x683.webp" alt="" class="wp-image-509" srcset="https://enterv.pl/wp-content/uploads/2022/11/19362653-1024x683.webp 1024w, https://enterv.pl/wp-content/uploads/2022/11/19362653-300x200.webp 300w, https://enterv.pl/wp-content/uploads/2022/11/19362653-768x512.webp 768w, https://enterv.pl/wp-content/uploads/2022/11/19362653-1536x1024.webp 1536w, https://enterv.pl/wp-content/uploads/2022/11/19362653-2048x1365.webp 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Wyniki są bliskie siebie i wydawać się może że PHP jest 2x razy szybszy od Node.js, ale czy tak jest przy większych projektach? Nie wiem, bo te testy tego nie ukazują. To co wiem, to oba narzędzia są jednak wydajne i tylko różnice technologiczne powinny decydować o tym, które narzędzie wybierzemy 🙂</p>



<p>Wszystkie testy oraz konfiguracja Docker dostępne są na <a href="https://github.com/EnterVPL/php8.2vsnode.js.18.14" target="_blank" rel="noopener nofollow" title="">GitHub</a></p>Artykuł <a href="https://enterv.pl/2023/02/05/php-vs-node-js-krotki-test/">PHP vs Node.js – krótki test</a> pochodzi z serwisu <a href="https://enterv.pl">enterv.pl</a>.]]></content:encoded>
					
					<wfw:commentRss>https://enterv.pl/2023/02/05/php-vs-node-js-krotki-test/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>ChatGPT, a programowanie. Czy to dobry pomysł?</title>
		<link>https://enterv.pl/2023/01/17/chatgpt-a-programowanie-czy-to-dobry-pomysl/</link>
					<comments>https://enterv.pl/2023/01/17/chatgpt-a-programowanie-czy-to-dobry-pomysl/#comments</comments>
		
		<dc:creator><![CDATA[enterv]]></dc:creator>
		<pubDate>Tue, 17 Jan 2023 08:35:03 +0000</pubDate>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[automatyczne programowanie]]></category>
		<category><![CDATA[automatyzacja procesów]]></category>
		<category><![CDATA[chatbots]]></category>
		<category><![CDATA[chatgpt]]></category>
		<category><![CDATA[dobry pomysł]]></category>
		<category><![CDATA[edukacja informatyczna]]></category>
		<category><![CDATA[generowanie kodu]]></category>
		<category><![CDATA[innowacje w programowaniu]]></category>
		<category><![CDATA[kariera programisty]]></category>
		<category><![CDATA[machine learning]]></category>
		<category><![CDATA[model językowy]]></category>
		<category><![CDATA[narzedzie programistyczne]]></category>
		<category><![CDATA[nauka programowania]]></category>
		<category><![CDATA[openai]]></category>
		<category><![CDATA[potencjał ChatGPT w rozwoju kariery]]></category>
		<category><![CDATA[programowanie]]></category>
		<category><![CDATA[programowanie z pomocą AI]]></category>
		<category><![CDATA[programowanie z wykorzystaniem sztucznej inteligencji]]></category>
		<category><![CDATA[przygotowanie]]></category>
		<category><![CDATA[przyspieszenie procesu tworzenia oprogramowania]]></category>
		<category><![CDATA[przyszłość pracy]]></category>
		<category><![CDATA[przyszłość programowania]]></category>
		<category><![CDATA[rozwiązania AI]]></category>
		<category><![CDATA[rozwój kariery]]></category>
		<category><![CDATA[samodzielne poprawianie kodu]]></category>
		<category><![CDATA[sztuczna inteligencja]]></category>
		<category><![CDATA[technologie AI]]></category>
		<category><![CDATA[technologie przyszłości]]></category>
		<category><![CDATA[umiejętności informatyczne]]></category>
		<category><![CDATA[wiedza]]></category>
		<category><![CDATA[wprowadzenie do AI]]></category>
		<category><![CDATA[wprowadzenie do ChatGPT]]></category>
		<category><![CDATA[wspomaganie programowania]]></category>
		<category><![CDATA[zastosowanie ChatGPT w programowaniu]]></category>
		<guid isPermaLink="false">https://enterv.pl/?p=641</guid>

					<description><![CDATA[<p>Cześć kochani, dzisiaj wtrącę moje dwa grosze jakże to hucznym temacie AI ChatGPT, który uznaje się za dosyć rewolucyjnym narzędziem. Jaka jest zatem prawda?</p>
Artykuł <a href="https://enterv.pl/2023/01/17/chatgpt-a-programowanie-czy-to-dobry-pomysl/">ChatGPT, a programowanie. Czy to dobry pomysł?</a> pochodzi z serwisu <a href="https://enterv.pl">enterv.pl</a>.]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading">Pozorna prostota</h2>



<p>Wystarczy, wpisać tylko kilka słów, a AI zacznie nam generować kod, który na pierwszy rzut oka robi to dobrze. Jeśli założymy, że cały projekt zaczniemy od początku do końca na ChatGPT, to w większości przypadków powinno się obejść bez błędów.</p>



<p>Przykładowe polecenie: </p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Napisz mi Encję Cat w języku TS. Powinna mieć kilka własności i metod:</p>



<pre class="wp-block-code"><code lang="typescript" class="language-typescript line-numbers">class Cat {
    name: string;
    age: number;
    color: string;
    private _weight: number;

    constructor(name: string, age: number, color: string, weight: number) {
        this.name = name;
        this.age = age;
        this.color = color;
        this._weight = weight;
    }

    get weight(): number {
        return this._weight;
    }

    set weight(value: number) {
        this._weight = value;
    }

    meow(): void {
        console.log("Meow!");
    }

    eat(food: string): void {
        console.log(`${this.name} is eating ${food}.`);
    }

    sleep(): void {
        console.log(`${this.name} is sleeping.`);
    }
}</code></pre>



<p></p>
</blockquote>



<p>i generalnie nie ma tutaj większej zawiłości, bo kod jest zrozumiały, ale z drugiej strony to ten sam kod można napisać prościej. Osoby, które się znają, od razu zobaczą, że własności można zadeklarować i przypisać za pomocą samego konstruktora, dzięki czemu odpada nam pisanie tego samego aż 3 razy.</p>



<h2 class="wp-block-heading">Poprawianie AI ChatGPT</h2>



<p>Na szczęście dosyć często kod z ChatGPT można łatwo poprawić kolejną prostą komendą.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p> Zadeklaruj własności za pomocą konstruktora: </p>



<pre class="wp-block-code"><code lang="typescript" class="language-typescript line-numbers">class Cat {
    constructor(
        public name: string,
        public age: number,
        public color: string,
        private _weight: number
    ) {}

    get weight(): number {
        return this._weight;
    }

    set weight(value: number) {
        this._weight = value;
    }

    meow(): void {
        console.log("Meow!");
    }

    eat(food: string): void {
        console.log(`${this.name} is eating ${food}.`);
    }

    sleep(): void {
        console.log(`${this.name} is sleeping.`);
    }
}
</code></pre>
</blockquote>



<p>W ten oto sposób dostajemy uproszczony kod. Zauważmy jednak, że wszystkie publiczne metody tak na prawdę nic nie robią poza wyświetleniem informacji. Zmieńmy to podając AI kolejne komendy. Zobaczmy najpierw czy się domyśli o co mi chodzi, jeśli nie zda egzaminu to podamy więcej konretów. </p>



<h2 class="wp-block-heading">Rozszerzanie kodu</h2>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="683" src="https://enterv.pl/wp-content/uploads/2022/11/19362653-1024x683.webp" alt="app design image" class="wp-image-509" srcset="https://enterv.pl/wp-content/uploads/2022/11/19362653-1024x683.webp 1024w, https://enterv.pl/wp-content/uploads/2022/11/19362653-300x200.webp 300w, https://enterv.pl/wp-content/uploads/2022/11/19362653-768x512.webp 768w, https://enterv.pl/wp-content/uploads/2022/11/19362653-1536x1024.webp 1536w, https://enterv.pl/wp-content/uploads/2022/11/19362653-2048x1365.webp 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Chciałbym, aby metody zamiast console.log robiły coś więcej. Zrób te metody bardziej funkcjonalne:</p>



<pre class="wp-block-code"><code lang="typescript" class="language-typescript line-numbers">class Cat {
    constructor(
        public name: string,
        public age: number,
        public color: string,
        private _weight: number
    ) {}

    get weight(): number {
        return this._weight;
    }

    set weight(value: number) {
        this._weight = value;
    }

    meow(): string {
        return `${this.name} says "Meow!"`;
    }

    eat(food: string): string {
        return `${this.name} is eating ${food}.`;
    }

    sleep(): string {
        return `${this.name} is sleeping.`;
    }
}

const fluffy = new Cat("Fluffy", 2, "white", 5);
console.log(fluffy.meow());
console.log(fluffy.eat("tuna"));
console.log(fluffy.sleep());</code></pre>
</blockquote>



<p>Zostawiam to waszej ocenie. Jak dla mnie AI dostało za mało konkretów i moim zdaniem metody nadal są za mało funkcjonalne. Jednak trzeba to przyznać, że jest zdeterminowane, bo faktycznie wywaliło console.log z metod za co jakiś punkt można mu przyznać pomimo tego, że miał to w poleceniu.</p>



<p>Dajmy mu coś teraz bardziej zrozumiałego</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Metoda meow powinna włączać dźwięk maiuczenia kota. Metoda eat powinna zwiększać sytość oraz wagę jeśli kot jest przekarmiany &#8211; należy wprowadzić jakiś system metabolizmu. Metoda sleep powinna regenerować energię kota:</p>



<pre class="wp-block-code"><code lang="typescript" class="language-typescript line-numbers">class Cat {
    private _hunger: number;
    private _energy: number;
    private _metabolism: number;

    constructor(
        public name: string,
        public age: number,
        public color: string,
        private _weight: number
    ) {
        this._hunger = 0;
        this._energy = 100;
        this._metabolism = 10;
    }

    get weight(): number {
        return this._weight;
    }

    set weight(value: number) {
        this._weight = value;
    }

    meow(): void {
        new Audio("cat-meow.mp3").play();
    }

    eat(food: string): void {
        this._hunger -= 10;
        if(this._hunger &lt; 0) {
            this._hunger = 0;
        }
        this._weight += this._metabolism;
        console.log(`${this.name} is eating ${food}. Hunger level: ${this._hunger}%. Weight: ${this._weight}kg`);
    }

    sleep(): void {
        this._energy += 10;
        if(this._energy &gt; 100) {
            this._energy = 100;
        }
        console.log(`${this.name} is sleeping. Energy level: ${this._energy}%`);
    }
}

const fluffy = new Cat("Fluffy", 2, "white", 5);
fluffy.meow();
fluffy.eat("tuna");
fluffy.sleep();</code></pre>



<p>This is an example of how you can make the methods more functional as you described. The <code>meow()</code> method now plays an audio file of a cat meowing. The <code>eat()</code> method now decreases the cat&#8217;s hunger level and increases its weight based on the cat&#8217;s metabolism rate. The <code>sleep()</code> method increases the cat&#8217;s energy level. You can also see that there are some private properties like <code>_hunger</code>, <code>_energy</code>, <code>_metabolism</code> and <code>_weight</code> which are updated in the methods and if needed have a limit.</p>



<p>Please note that the audio file and the path to it must exist and be accessible in the code in order for this code to work as expected.</p>
</blockquote>



<p></p>



<p>Jak dla mnie średnio, bo wracamy do tego, że znowu trzeba poprawić AI z tym kontruktorem, ale poza tym to myślę że dał radę pomimo tego, że wrócił z tymi console.log-ami.</p>



<h2 class="wp-block-heading">Poważne zadanie</h2>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="683" src="https://enterv.pl/wp-content/uploads/2022/11/vecteezy_graphic-designer-learning-program-software-painting-on-computer_-1024x683.jpg" alt="" class="wp-image-479" srcset="https://enterv.pl/wp-content/uploads/2022/11/vecteezy_graphic-designer-learning-program-software-painting-on-computer_-1024x683.jpg 1024w, https://enterv.pl/wp-content/uploads/2022/11/vecteezy_graphic-designer-learning-program-software-painting-on-computer_-300x200.jpg 300w, https://enterv.pl/wp-content/uploads/2022/11/vecteezy_graphic-designer-learning-program-software-painting-on-computer_-768x512.jpg 768w, https://enterv.pl/wp-content/uploads/2022/11/vecteezy_graphic-designer-learning-program-software-painting-on-computer_-1536x1024.jpg 1536w, https://enterv.pl/wp-content/uploads/2022/11/vecteezy_graphic-designer-learning-program-software-painting-on-computer_.jpg 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Jako iż bardzo ważne jest skonfigurowanie środowiska potrzebnego do pracy, poproszę AI o to, aby wygenerowało mi konfigurację Dockera potrzebną do uruchomienia ww. kodu.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Wygeneruj konfigurację Docker dla nodejs tak, aby można było bez problemu uruchomić ww. kod:</p>



<p>Here is an example of a Dockerfile that can be used to run a Node.js application, including the code you provided:</p>



<pre title="Dockerfile" class="wp-block-code"><code lang="docker" class="language-docker line-numbers">FROM node:14-alpine

WORKDIR /usr/src/app

COPY package*.json ./
RUN npm install
COPY . .

CMD [ "node", "index.js" ]</code></pre>



<p>This Dockerfile uses the official Node.js Alpine image as the base image and sets the working directory to /usr/src/app. It then copies the package.json and package-lock.json files and runs npm install to install the dependencies. After that it copies all the files to the container and CMD instruction runs node index.js command, to start the application.</p>



<p>You will also need to have a file named index.js in the same directory as your Dockerfile that contains the code you want to run.</p>



<p>After that you can build your image using:</p>



<pre class="wp-block-code"><code lang="bash" class="language-bash">docker build -t my-node-app .</code></pre>



<p>And then start the container using:</p>



<pre class="wp-block-code"><code lang="bash" class="language-bash">docker run -p 3000:3000 my-node-app</code></pre>



<p>This will start a container with your Node.js application running on port 3000 and the container will be accesible on localhost:3000.</p>



<p>Please note that this is just an example and you might need to adjust the Dockerfile or the command depending on your specific needs and requirements.</p>
</blockquote>



<p>Widzę tutaj małe niedociągnięcie w Dockerfile, bo po co kopiować <code>package*.json</code>, a potem drugą komendą tak na prawdę wszystko, skoro można skopiować od razu wszystko i potem wykonać <code>npm install</code>? Z drugiej strony jak na nasz wygenerowany programik nie powinno się nic złego stać.</p>



<p>Drugą wadą jest to, że nasz kod ani trochę nie jest serwerowy, a tu nam karze go tak uruchamiać. Zatem nie domyślił się, że chodzi o CLI pomimo tego, że tak powinno wyjść z kontekstu. Zatem poproszę go o wygenerowanie drugiej konfiguracji. </p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Wygeneruj konfigurację Docker dla CLI nodejs</p>



<p>Here is an example of a Dockerfile that can be used to run a Node.js command-line application:</p>



<pre title="Dockerfile" class="wp-block-code"><code lang="docker" class="language-docker">FROM node:14-alpine

WORKDIR /usr/src/app

COPY package*.json ./
RUN npm install
COPY . .

ENTRYPOINT [ "npm", "start" ]</code></pre>



<p>This Dockerfile uses the official Node.js Alpine image as the base image and sets the working directory to /usr/src/app. It then copies the package.json and package-lock.json files and runs npm install to install the dependencies. After that it copies all the files to the container and ENTRYPOINT instruction runs npm start command, to start the command line application.</p>



<p>You will also need to have a file named package.json in the same directory as your Dockerfile that contains the command you want to run, for example:</p>



<pre class="wp-block-code"><code lang="json" class="language-json">"scripts": {
    "start": "node index.js --arg1 --arg2"
  },</code></pre>



<p>After that you can build your image using:</p>



<pre class="wp-block-code"><code lang="bash" class="language-bash">docker build -t my-node-cli-app .</code></pre>



<p>And then start the container using:</p>



<pre class="wp-block-code"><code lang="bash" class="language-bash">docker run -it my-node-cli-app --arg1 --arg2</code></pre>



<p>This will start a container with your Node.js command-line application running, and the arguments passed in the command line after run command will be passed to the npm start command</p>



<p>Please note that this is just an example and you might need to adjust the Dockerfile or the command depending on your specific needs and requirements.</p>
</blockquote>



<p>Teraz jest znacznie lepiej, bo mamy możliwość odpalania aplikacji za pomocą prostej dockerowej komendy. Oczywiście dla tego przykładu przesadą jest stosowanie argumentów, ponieważ żaden nie jest nam potrzebny.</p>



<p>Fajnie jednak by było, gdyśmy jednak nie musieli ciągle wpisywać tego długiego ciągu znaków za każdym razem, aby uruchamiać aplikację, na to już rozwiązanie mamy: poprosimy AI 😁</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Utwórz plik wsadowy zawierający docker run -it my-node-cli-app &#8211;arg1 &#8211;arg2, aby uprosić uruchamianie:</p>



<p>You can create a shell script file with the docker run command to simplify running your Node.js command-line application in a container. Here is an example of a shell script file named run-app.sh:</p>



<pre title="run-app.sh" class="wp-block-code"><code lang="bash" class="language-bash">#!/bin/bash
docker run -it my-node-cli-app --arg1 --arg2</code></pre>



<p>This script file can be placed in the same directory as your Dockerfile and can be executed by running ./run-app.sh in the terminal.</p>



<p>You can also make the script file executable by running</p>



<pre class="wp-block-code"><code lang="bash" class="language-bash">chmod +x run-app.sh</code></pre>



<p>and then you can run it directly with</p>



<pre class="wp-block-code"><code lang="bash" class="language-bash">./run-app.sh</code></pre>



<p>You can also pass parameters to the script file and then use them as arguments for the docker run command. For example, you can modify the script file to accept parameters and use them as arguments for the command</p>



<pre title="./run-app.sh" class="wp-block-code"><code lang="bash" class="language-bash">#!/bin/bash
docker run -it my-node-cli-app $1 $2</code></pre>



<p>and then you can run the script passing parameters</p>



<pre class="wp-block-code"><code lang="bash" class="language-bash">./run-app.sh --arg1 --arg2</code></pre>
</blockquote>



<p>ChatGPT dał nam ciekawy wybór, bo możemy zrobić plik sh z możliwością luźnego lub sztywnego parametryzowania. Jednak to co mnie zadziwiło to to że to wcześniej pisał o CMD, który jest Windowsowy, a plik wsadowy zrobił na Linux 😂</p>



<h2 class="wp-block-heading">Podsumowanie</h2>



<p>OpenAI stworzyło na prawdę bardzo pomocne narzędzie, które przydaje się w wielu dziedzinach. W tym artykule skupiliśmy się na programowaniu i krok po kroku pokazałem jak wygląda wytwarzanie bardzo prostego kodu za pomocą ChatGPT.</p>



<p>W mojej opinii osobom bez większej wiedzy specjalistycznej czasami będzie trudno odróżnić co za zabobony ten AI pisze, a dobre ku temu dowody dostarczyłem w tym artykule.</p>



<p>Uważam, że AI najlepiej precyzyjnie określać to co od niego oczekujemy i z jakich standardów ma korzystać. Gdy już swoje wiemy, to narzędzie może nam bardzo pomóc w wytwarzaniu oprogramowania, bo będziemy wiedzieć co jest do podmianki, co trzeba dopowiedzieć itd.</p>



<p>Dziękuję bardzo za uwagę, i kochani, widzimy się w kolejnym artykule 😃</p>Artykuł <a href="https://enterv.pl/2023/01/17/chatgpt-a-programowanie-czy-to-dobry-pomysl/">ChatGPT, a programowanie. Czy to dobry pomysł?</a> pochodzi z serwisu <a href="https://enterv.pl">enterv.pl</a>.]]></content:encoded>
					
					<wfw:commentRss>https://enterv.pl/2023/01/17/chatgpt-a-programowanie-czy-to-dobry-pomysl/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>TutJam #3 &#8211; jak będzie oceniać jury? 😉</title>
		<link>https://enterv.pl/2022/12/15/tutjam-3-jak-bedzie-oceniac-jury-%f0%9f%98%89/</link>
		
		<dc:creator><![CDATA[enterv]]></dc:creator>
		<pubDate>Thu, 15 Dec 2022 17:49:31 +0000</pubDate>
				<category><![CDATA[GameDev]]></category>
		<category><![CDATA[Pozostałe]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[gamedev]]></category>
		<category><![CDATA[gamejam]]></category>
		<category><![CDATA[godot]]></category>
		<category><![CDATA[jury]]></category>
		<category><![CDATA[ocenianie gier]]></category>
		<category><![CDATA[programowanie]]></category>
		<category><![CDATA[tutjam]]></category>
		<guid isPermaLink="false">https://enterv.pl/?p=613</guid>

					<description><![CDATA[<p>Cześć słodziaki. Przygotowałem dla jury kilka pytań odnośnie gier tworzonych na TutJam #3. Poznamy ich sposób oceniani oraz rady 😀</p>
Artykuł <a href="https://enterv.pl/2022/12/15/tutjam-3-jak-bedzie-oceniac-jury-%f0%9f%98%89/">TutJam #3 – jak będzie oceniać jury? 😉</a> pochodzi z serwisu <a href="https://enterv.pl">enterv.pl</a>.]]></description>
										<content:encoded><![CDATA[<p>Pytania dla jury zawarłem w anonimowej ankiecie. Zostały one zadane tak, aby oceniający musieli odpowiadać otwarcie i zgodnie z tym co sami uważają. Nie przedłużając oto pierwsze z nich</p>



<h2 class="wp-block-heading">Jakiego rodzaju gier spodziewasz się oceniać? </h2>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="748" src="https://enterv.pl/wp-content/uploads/2022/12/h0nn_s4ay_211008-1024x748.webp" alt="" class="wp-image-622" srcset="https://enterv.pl/wp-content/uploads/2022/12/h0nn_s4ay_211008-1024x748.webp 1024w, https://enterv.pl/wp-content/uploads/2022/12/h0nn_s4ay_211008-300x219.webp 300w, https://enterv.pl/wp-content/uploads/2022/12/h0nn_s4ay_211008-768x561.webp 768w, https://enterv.pl/wp-content/uploads/2022/12/h0nn_s4ay_211008.webp 1200w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>A oto odpowiedzi:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Platformówki, Jednoosobowe</p>
</blockquote>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Myślę, że będzie podobnie, jak we wcześniejszych TutJamach. Różny poziom jeśli chodzi o grafikę, efekty dźwiękowe i samą rozgrywkę. Jedno jest pewne &#8211; będą kolce! 🤣</p>
</blockquote>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Uważam iż będą to gry wyśmienicie zrobione, które będą dawać pełno frajdy i radości. Liczę też oczywiście na kolce 🙂</p>
</blockquote>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Poprzednie Tutjamy pokazały, że uczestnicy są bardzo kreatywni w interpretacji tematu. Pod tym względem można się spodziewać wszystkiego, chociaż liczę, że będzie dużo kolców 😉 Jeżeli chodzi o samo wykonanie to zapewne zobaczymy zarówno gry 2D oraz 3D. Zakładam, że będą to w większości gry platformowe, chociaż może znajdzie się też coś z widokiem z pierwszej osoby.</p>
</blockquote>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Przyjemnych, pomysłowych, niedopracowanych</p>
</blockquote>



<p>Jak dla mnie większość z jury chce po prostu kolców 😆</p>



<h2 class="wp-block-heading">Jakiego rodzaju gry uwielbiasz grać? Jakie to gatunki? Co sprawa, że tak je lubisz?</h2>



<p>Tak wiem, że to wiele pytań, ale zgrupowałem je, głównie z tego powodu, że tyczą się tego. Dzięki temu odpowiedzi są bardziej szczegółowe 😉. Poznajmy odpowiedzi: </p>



<blockquote class="wp-block-quote is-style-default is-layout-flow wp-block-quote-is-layout-flow">
<p>Pierwszoosobowa, o budowaniu. Trzeba mocno myśleć przy budowie, a potem rozbudowie</p>
</blockquote>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Lubię różne gry &#8211; Strategie takie, jak 0A.D., czy AoE. Oczywiście Minecraft i gry sandboxowe, w których mogę niszczyć! 😉. Uwielbiam klimaty horroru i postapo, co niektórzy już pewnie zdążyli zauważyć. A prócz tego uwielbiam gry rytmiczne, a w osu! potrafię zagrać nawet kilka tysięcy razy w ciągu miesiąca i mam w tej grze na chwilę obecną spędzony czas: 9 dni 15 godzin i 48 minut (który nalicza się tylko, gdy klikam)</p>
</blockquote>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Różne, byle fajne</p>
</blockquote>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Dosłownie niemal wszystkie. Ja ogólnie uwielbiam gry i mam ich sporą kolekcję, ale jeśli już mam coś wybrać to są to strategie, hack&amp;slashe, rpg drużynowe, rpg akcji oraz wszelkie sandbox&#8217;y, gdzie można tworzyć i budować co się chce. Do tego city buildery, zarządzanie koloniami, także strzelanki, różne symulac&#8230;. Może skończmy na tym, że dosłownie niemal wszystkie</p>
</blockquote>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Bardzo lubię gry strategiczne, ekonomiczne, twardo stąpające po ziemi bez przesadnego fantasy. Gry typu Frostpunk, Rimworld, Football Manager, czy Battlebrothers. Lubię je z tego powodu, że potrafią bardzo mocno zaangażować i wciągnąć na wiele godzin plus nie są ograniczone fabułą ani jednym głównym celem jaki narzuca nam gra &#8211; wygrana następuje gdy ty tak stwierdzisz, a nie sama gra powie, że już ją przeszedłeś. Ta otwarta struktura sprawia, że można podchodzić do tych gier wielokrotnie i za każdym razem odkryjesz coś nowego.</p>
</blockquote>



<p>Niesamowita mieszanka, ale myślę że temu uczestnikom będzie dużo łatwiej trafić w cokolwiek, a i może kogoś powyższe odpowiedzi uspokoją? 😉</p>



<h2 class="wp-block-heading">Które aspekty gier i dlaczego są dla Ciebie najważniejsze?</h2>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Budowanie, dużo budowania i myślenia co budować</p>
</blockquote>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>W grach prócz niszczenia wszystkiego na swojej drodze cenie sobie to jak gra potrafi wciągnąć. Fabuła, ścieżka dźwiękowa i klimat, to chyba najważniejsze rzeczy i na nie też zawsze zwracam uwagę. grafika też jest ważna, ale gdy gra wybija się właśnie grafiką, to potrafię stać w jednym miejscu myśląc sobie &#8222;podoba mi się ten głaz, to na prawdę fajny głaz&#8221; &#8211; takie zboczenie grafików 😉</p>
</blockquote>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Lubię gry z emocjonującą fabułą, ładną grafiką i dobrą muzyką. Takie gry często mnie wciągają, bo można nieźle wczuć się w świat gry i postacie którymi gramy. Również ciężej jest się rozstać z taką grą, no ale cóż.</p>
</blockquote>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>To bardzo zależy od konkretnego gatunku, ale bardzo cenię sobie możliwości rozwiązywania problemów na wiele sposobów, dbanie o drobne, nawet gameplay&#8217;owo nieistotne, szczegóły, które pozwalają bardziej zagłębić się w świat gry. Lubię gdy nie ma sztucznych ograniczeń i można realizować swoje szalone pomysły.</p>
</blockquote>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Pomysł &#8211; zdecydowanie pomysł. Sama jakość wykonania oczywiście też jest istotna ale nic nie przebije &#8222;pomysłowego pomysłu&#8221; który wyróżnia się spośród pozostałych gier. To sprawia, że od razu dostrzegasz taką grę i jesteś zaintrygowany tym co ona może oferować bo nie jesteś pewien czego się spodziewać.</p>
</blockquote>



<p>Bardzo ciekawa różnorodność, a jeśli jesteś uczestnikiem to daj znać w co trafiłeś! 😉</p>



<h2 class="wp-block-heading">Jak się spodziewasz: ile frajdy sprawi ci ocenianie gier? Dlaczego tak uważasz?</h2>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="683" src="https://enterv.pl/wp-content/uploads/2022/12/happyforplaying-1024x683.webp" alt="" class="wp-image-623" srcset="https://enterv.pl/wp-content/uploads/2022/12/happyforplaying-1024x683.webp 1024w, https://enterv.pl/wp-content/uploads/2022/12/happyforplaying-300x200.webp 300w, https://enterv.pl/wp-content/uploads/2022/12/happyforplaying-768x512.webp 768w, https://enterv.pl/wp-content/uploads/2022/12/happyforplaying.webp 1200w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Kolejny złożony punkt, ale trzeba jednak wiedzieć, że poza obowiązkiem też liczy się zabawa, którą uzyska się z grania 😁 Jurorzy też co nie co o tym wiedzą:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Jeśli gra będzie zachęcać do włączenia to da dużo frajdy</p>
</blockquote>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Na pewno będzie fajnie móc ocenić gry stworzone przez taką społeczność. Uważam tak, bo na pewno będzie fajnie móc ocenić gry stworzone przez taką społeczność. A tak na poważnie, to będę na prawdę ucieszony, gdy zagram w coś, co się wybija świetnym pomysłem (tak zrobił np. Superhot, który też jest grą GameJamową)</p>
</blockquote>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Myślę że będzie mega dużo frajdy</p>
</blockquote>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Pierwszy raz będę oceniał oficjalnie gry, więc będę mógł się wreszcie wyżyć… to znaczy pokazać twórcom, co zrobili dobrze, a co jest do poprawy. Dla mnie taki wkład edukacyjny jest bardzo istotny. Dodatkowo jak będą kolce, to sama świadomość, że Tutors się wkurza będzie zabawą samą w sobie.</p>
</blockquote>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Dużo</p>
</blockquote>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Uważam tak, ponieważ w poprzednich edycjach jamu bawiłem się bardzo dobrze, więc myślę, że tym razem będzie podobnie 🙂</p>
</blockquote>



<p>Zatem każdy jest pozytywnie nastawiony, co jest mega dobre. Myślę, że jak gry na prawdę ucieszą głosujących to tylko to wpłynie dobrze na ocenę 😄</p>



<h2 class="wp-block-heading">Jeśli trafi się bardzo trudna do przejścia gra, to jak to wpłynie na ocenianie?</h2>



<p>Zobaczmy czy to się popłaca:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Nie powinno to wpłynąć na efekt końcowy (kolce mogą być)</p>
</blockquote>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Jeśli gra będzie nie do przejścia, to pewnie jej nie przejdę. Wiadomo, że takie podejście do tworzenia może negatywnie odbić się na punktacji</p>
</blockquote>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Jak będą kolce to git, jak nie to marnie to widzę.</p>
</blockquote>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Są dwie opcje: albo gra ma wysoki i przemyślany stopień trudności, która wymaga nauczenia się i dobrego wykorzystania jej mechanik to jest to olbrzymi plus albo ta gra ma nawalone wszędzie kolce i głupie utrudniacze, a największa trudność wynika z tego, że błąd powoduje ponowne przejście gry albo jej sporej części, to takiej grze świetlanej przyszłości nie wróżę.</p>
</blockquote>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Zależy jakiego rodzaju będzie to trudność. Jeżeli trudność będzie polegała na przyjemnym rozkminianiu i bazowaniu na wcześniej wytłumaczonych mechanikach to jestem jak najbardziej na tak i z chęcią będę ogrywał tak długo aż uda mi się przejść. Jednak jeżeli to będzie trudne z tego powodu że gra jest po prostu słabo przemyślana lub zbalansowana to przyznam, że mogę odpaść zanim dotrę do końca.</p>
</blockquote>



<p>Rozumiem to tak, że gra może być trudna, ale nie powinno się przesadzać. Może warto, aby dać jakiemuś koledze do ogrania swoją grę, aby móc lepiej dopasować bilans? Hmm? 😉 </p>



<h2 class="wp-block-heading">Jakie rady chcesz dać uczestnikom TutJamu?</h2>



<p>To jest pytanie, które tak w zasadzie nie powinno się tu znaleźć, ale.. dobrze wiemy, że to nie jest konkurs na światową skalę, a bardziej event, dzięki któremu można się sporo nauczyć jak i otworzyć przed sobą nowe perspektywy. Oto rady od jury płynące prosto z ich serc:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Zróbcie grę, starajcie się zrobić ją jak najlepiej umiecie</p>
</blockquote>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Nie śpiesz się, tylko rób wszystko #naspokojnie. Z doświadczenia wiem, że gdy chce się zacząć tworzyć od razu po podaniu tematu i bez przemyślenia wszystkiego, to mogą wyniknąć z tego problemy. Jeśli pracujesz w większej grupie ciężko będzie dojść do jednogłośnie dobrego pomysłu &#8211; trzeba iść na kompromis. Nie próbuj robić nie wiadomo jakiej gry, tylko zrób coś prostszego, ale dokończ to. Jeśli masz już jakiś fajny pomysł, to wywal z niego połowę albo i więcej, żebyś na pewno go skończył, bo łatwiej jest coś potem dodać, niż wywalić niedokończone mechaniki zaraz przed zakończeniem jamu. A! I jeszcze jedno. Gry fajnie jest kończyć, więc oszacuj na początku ile masz czasu i ile możesz w tym czasie zrobić.</p>
</blockquote>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Kolce.</p>
</blockquote>



<p>No poza radą z kolcami &#8211; wszystko na umiar 🤣</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>To game jam. Tutaj nie chodzi o to, żeby zrobić kolejnego Wiedźmina. Tutaj chodzi o naukę i dobrą zabawę. Po prostu wykorzystajcie to co umiecie w ciekawy sposób. Najważniejszy jest pomysł. A od niego ważniejsza dobra zabawa, której Wam życzę!</p>
</blockquote>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Pomysł jest mega istotny! Czasem warto poświecić parę pierwszych godzin na przemyślenie pomysłu i zapisanie go niż rzucanie się od razu do pracy nad projektem, którego sam nie jesteś pewien. Bardzo ważne jest to aby twoja gra miała przynajmniej jedną cechę która odróżni ją od pozostałych.</p>
</blockquote>



<h2 class="wp-block-heading">Czy jako jury chcesz coś jeszcze dodać?</h2>



<p>Z tym pytaniem wyszło akurat tak, że każdy życzy <strong>powodzenia</strong>, zatem przekazuję 😄</p>



<h2 class="wp-block-heading">Podsumowanie</h2>



<p>Poznaliśmy zdanie jury nt. tworzonych gier oraz to czego oczekują, a ja liczę, że uczestnikom jamu pomogą te odpowiedzi.</p>



<p>Życzę miłej zabawy i do następnego 😀</p>Artykuł <a href="https://enterv.pl/2022/12/15/tutjam-3-jak-bedzie-oceniac-jury-%f0%9f%98%89/">TutJam #3 – jak będzie oceniać jury? 😉</a> pochodzi z serwisu <a href="https://enterv.pl">enterv.pl</a>.]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Jak planować i jak utworzyć dobry projekt?</title>
		<link>https://enterv.pl/2022/11/29/gamedev-jak-planowac-i-jak-utworzyc-dobry-projekt/</link>
					<comments>https://enterv.pl/2022/11/29/gamedev-jak-planowac-i-jak-utworzyc-dobry-projekt/#comments</comments>
		
		<dc:creator><![CDATA[enterv]]></dc:creator>
		<pubDate>Tue, 29 Nov 2022 18:48:47 +0000</pubDate>
				<category><![CDATA[GameDev]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[gamedev]]></category>
		<category><![CDATA[jak utworzyć dobry projekt]]></category>
		<category><![CDATA[planowanie]]></category>
		<category><![CDATA[programowanie]]></category>
		<category><![CDATA[projekt]]></category>
		<guid isPermaLink="false">https://enterv.pl/?p=503</guid>

					<description><![CDATA[<p>Niezależnie od tego czy chcesz stworzyć dobry program czy też dobre gry to najlepiej, na takie duże i średnie rzeczy utworzyć projekt. Więc na co czekamy?</p>
Artykuł <a href="https://enterv.pl/2022/11/29/gamedev-jak-planowac-i-jak-utworzyc-dobry-projekt/">Jak planować i jak utworzyć dobry projekt?</a> pochodzi z serwisu <a href="https://enterv.pl">enterv.pl</a>.]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading">Wstęp</h2>



<p>Cześć cukierki wy moje słodkie 🍬 Poznajmy dzisiaj się z projektowaniem i z planowaniem bliżej 🫂</p>



<p>Niezależnie od tego czy chcesz stworzyć dobry program czy też dobrą grę, czy to będzie samochód czy łódź czy samolot, a może&#8230;. to najlepiej, na takie duże i średnie rzeczy utworzyć projekt, plan działania i zebrać zespół. Więc na co czekamy? Ruszajmy z tematem! 😀</p>



<p>&#8230; no tylko tak właśnie ja sam nie wiem co do końca co wyróżnia dobry projekt i nie zrozumcie mnie źle. Wiele razy co musiałem zaprojektować i stworzyć. Na swoim koncie mam utworzonych kilka gier i parę technicznych rozwiązań. Po mimo tego znam osoby, które dużo lepiej ode mnie potrafią coś zaplanować i tym bardziej pokierować zespołem.</p>



<p>Zatem ten artykuł nie będzie poradnikiem i proszę nie traktować to co chcę przekazać jako najwyższej prawdy 😅 Teraz możemy polecieć z tematem 😁</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://enterv.pl/wp-content/uploads/2022/11/6272-1024x1024.jpg" alt="" class="wp-image-506" srcset="https://enterv.pl/wp-content/uploads/2022/11/6272-1024x1024.jpg 1024w, https://enterv.pl/wp-content/uploads/2022/11/6272-300x300.jpg 300w, https://enterv.pl/wp-content/uploads/2022/11/6272-150x150.jpg 150w, https://enterv.pl/wp-content/uploads/2022/11/6272-768x768.jpg 768w, https://enterv.pl/wp-content/uploads/2022/11/6272.jpg 1200w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading">Początki</h2>



<p>, które zawsze początkującym przysparzają wiele problemów, ajajaj, jak ja dobrze to rozumiem. Bąbelki wy moje, nic na siłę, no chyba że zaparcia, ale to taki wyjątek od reguły. Ja przeważnie zaczynam od wstępu (przykład powyżej), a potem jakoś leci. Jeśli natomiast miałbym brać się za stworzenie gry to bym sobie próbował najpierw ją sobie wyobrazić. Ci co mnie znają, wiedzą że lubię tworzyć rzeczy nieszablonowe i taki jest już mój urok, a Ci co nie znają mnie to powiem, że pomysły czerpię ze skojarzeń i z tego na co obecnie patrzę. Czyli dzisiaj bym miał zaczynać to wymyśliłbym grę o kremach nawilżających. Generalnie mało to mówi, no bo tak jest, bo jeszcze nic nie wymyśliłem. Popatrzyłem na krem i po prostu o nim napisałem.</p>



<p>Ok ok.. mamy kremik kremaśny +10 do nawilżenia skóry. Co taka gra o kremach może zaoferować? No to już wszystko zależy. A co wy na to, aby kremy były tylko elementem gry? &#8222;No ale co panie kocie tutaj kombinujesz? Gra miała być o kremach!&#8221; &#8211; a no nie mam pomysłu jak można grać kremem, ale wiem jak można go wykorzystać &#8211; można się nim posmarować! 😅&#8230; mało odkrywcze 😆</p>



<p>Mamy już krem jako element gry &#8211; no już coś więcej niż nic. Wiemy że można nim się smarować &#8211; mało odkrywcze, ale zróbmy już na tym bizne&#8230;. BIZNES! W tym momencie pojawił mi pomysł, a nawet kilka! Gra w której wcielasz się biznesmena prowadzącego płatną klinikę, do której zatrudniasz lekarzy, a oni <s>sprzedają</s> wypisują kremy na każdą chorobę. Ból pleców? &#8211; Myk maść! Ból zęba? &#8211; myk żel! Ból d&#8230;olnej nogi? &#8211; Myk! Kaszel, grypa albo urwany palec? &#8211; Myk spray.. No wicie &#8211; krem nie musi być jedynym przedmiotem 😉</p>



<p>Oto nasza podstawa i mamy już początek pomysłu na grę. Oczywiście to za mało, aby zacząć, więc trzeba zrobić</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="683" src="https://enterv.pl/wp-content/uploads/2022/11/19362653-1024x683.webp" alt="" class="wp-image-509" srcset="https://enterv.pl/wp-content/uploads/2022/11/19362653-1024x683.webp 1024w, https://enterv.pl/wp-content/uploads/2022/11/19362653-300x200.webp 300w, https://enterv.pl/wp-content/uploads/2022/11/19362653-768x512.webp 768w, https://enterv.pl/wp-content/uploads/2022/11/19362653-1536x1024.webp 1536w, https://enterv.pl/wp-content/uploads/2022/11/19362653-2048x1365.webp 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading">Rozwinięcie</h2>



<p>Tutaj już z górki. Można sobie opisać jak mają wyglądać poszczególne elementy gry, jak chcemy, aby ona działała czy też. Puśćmy wodzę wyobraźni. Najlepiej wypisać wszystko, najpierw zacząć od rzeczy ogólnych i zostawiać sobie pole do kolejnych rozwinięć &#8211; czemu? &#8211; bo w ten sposób możesz coś potem &#8222;dowymyślić&#8221; i dodać nową treść do gry (albo dlc..). </p>



<p>Ja zacząłbym od tego jakich lekarzy możemy zatrudniać, jakieś staty czy coś. Zrobiłbym listę chorób, na które ludzie mogą chorować i listę leków którymi można leczyć. Pasowałoby też wymyślić to, jakie choroby dani lekarze umieją leczyć i na tej podstawie zrobić jakiś zarys rozgrywki.</p>



<p>Ważne, aby pomysł dało się zamienić na projekt i zacząć planować działania. Polecam też na takim etapie poza Excela i Worda użyć narzędzi takich jak np. Jira, czy Trello albo innych wspomagający proces projektowania i planowania. Tego jest cała masa na internecie i na pewno znajdziecie pod siebie coś odpowiedniego.</p>



<h2 class="wp-block-heading">Szukanie pomocy</h2>



<p>Dobrze jest, aby z dobrym projektem nie zostać samemu, w grupie zawsze się coś więcej zrobi. Dzisiaj wiem, gdy jak szukam kogoś do pomocy to potrzebuję też przedstawić pomysł i to co od danej osoby oczekuję. Ja szukałbym do mojej gry grafika, no ale nie byle pierwszego lepszego tylko takiego co ogarnia temat, co wie, że jak mu przestawię to co wymyśliłem np. jak ma wyglądać opakowanie żelu na kaszel to ten grafik to zrozumie, zamodeluje i pomoże to dodać do gry, aby i w grze wszystko dobrze wyglądało. </p>



<p>Oczywiście im większa gra tym więcej osób pasuje do niej zaangażować: artystów, &#8222;dźwiękowców&#8221;, muzyków, programistów, testerów, designerów&#8230; &#8211; każdemu z nich pasuje jasno powiedzieć czego od nich się oczekuje, co mają wytworzyć i jaki ma być tego efekt końcowy. Np.<br> &#8211; Hej Czarek, zrobisz mi kod na to, abym mógł zatrudniać w mojej grze lekarzy? Mam już listę tego na co mi oni i co będą robić.<br> &#8211; No cześć Łukasz, jasne, tylko powiedz jak to będzie duże?<br> &#8211; W sumie to taki lekarz ma mieć&#8230;<br>i taka rozmowa leci dalej i idzie dobrze, bo jak się ktoś coś dopyta o szczegóły to ty je masz albo na podstawie istniejących już danych łatwo będzie je ustalić i je podasz</p>



<h2 class="wp-block-heading">Podsumowanie</h2>



<p>Liczę na to, że jakkolwiek pomogłem. Wiem, że przedstawione przeze mnie sposoby i może nie są idealne, ale może skłonią do pogłębienia tak istotnego tematu, co w skrócie mógłbym uznać za to, że zachęciłem do nauki 😄</p>



<p></p>Artykuł <a href="https://enterv.pl/2022/11/29/gamedev-jak-planowac-i-jak-utworzyc-dobry-projekt/">Jak planować i jak utworzyć dobry projekt?</a> pochodzi z serwisu <a href="https://enterv.pl">enterv.pl</a>.]]></content:encoded>
					
					<wfw:commentRss>https://enterv.pl/2022/11/29/gamedev-jak-planowac-i-jak-utworzyc-dobry-projekt/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>PHP vs Python &#8211; krótki test</title>
		<link>https://enterv.pl/2022/11/21/programowanie-php-vs-python-krotki-test/</link>
					<comments>https://enterv.pl/2022/11/21/programowanie-php-vs-python-krotki-test/#comments</comments>
		
		<dc:creator><![CDATA[enterv]]></dc:creator>
		<pubDate>Mon, 21 Nov 2022 22:05:47 +0000</pubDate>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[php vs python]]></category>
		<category><![CDATA[programowanie]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[test prędkości]]></category>
		<guid isPermaLink="false">https://enterv.pl/?p=474</guid>

					<description><![CDATA[<p>Cześć moje słonie kochane 🐘 i węże tuląco-jadowite 🐍. W tym wpisie poznacie pewne różnice pomiędzy PHP, a Python oraz poznacie, co jest tak na prawdę szybsze</p>
Artykuł <a href="https://enterv.pl/2022/11/21/programowanie-php-vs-python-krotki-test/">PHP vs Python – krótki test</a> pochodzi z serwisu <a href="https://enterv.pl">enterv.pl</a>.]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading">Wstęp</h2>



<p>Cześć moje słonie kochane 🐘 i węże tuląco-jadowite 🐍. Nadszedł ten wiekopomny moment <s>(do którego mnie zmusiliscie)</s> do którego zostałem bardzo zachęcony, w którym napiszę o tym co jest lepsze: PHP czy Python?</p>



<p>Już na wstępie powiem, że żadne w powyższych, <strong>bo prawdziwy programista powinien umieć kontrolować wszystkimi napięciami, które powstają w komputerze tak, aby tym pisać m.in kod binarny, ale i też sterować każdym podzespołem. Wszystko inne to języki wyższych poziomów</strong> &#8211; tego pogrubionego fragmentu jak to coś nie brać na poważnie 😆</p>



<p>Więc&#8230; dzisiaj pomimo tego, że coś tutaj ukażę to niekoniecznie będzie to świadczyć o tym, który z tych języków będzie lepszy. Języki programowania są tylko różnymi narzędziami i bardzo łatwo je porównać do śrubokrętów, które powstały do konkretnych typów wkrętów (na internecie wpisać &#8222;typy śrubokrętów&#8221; to świadomość wskoczy na wyższy lvl) albo do różnych typów klejów, bo są takie do kartek, a inne są do tapet (też różne rodzaje), a jeszcze inne kleje są do drewna itd. itd&#8230; No tak samo są różne naczynia.. dobra chyba nie muszę dalej porównywać czegoś nierealnego z realnymi przedmiotami 🤣</p>



<h2 class="wp-block-heading">Przygotowanie</h2>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="683" src="https://enterv.pl/wp-content/uploads/2022/11/vecteezy_graphic-designer-learning-program-software-painting-on-computer_-1024x683.jpg" alt="" class="wp-image-479" srcset="https://enterv.pl/wp-content/uploads/2022/11/vecteezy_graphic-designer-learning-program-software-painting-on-computer_-1024x683.jpg 1024w, https://enterv.pl/wp-content/uploads/2022/11/vecteezy_graphic-designer-learning-program-software-painting-on-computer_-300x200.jpg 300w, https://enterv.pl/wp-content/uploads/2022/11/vecteezy_graphic-designer-learning-program-software-painting-on-computer_-768x512.jpg 768w, https://enterv.pl/wp-content/uploads/2022/11/vecteezy_graphic-designer-learning-program-software-painting-on-computer_-1536x1024.jpg 1536w, https://enterv.pl/wp-content/uploads/2022/11/vecteezy_graphic-designer-learning-program-software-painting-on-computer_.jpg 1920w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Aby cokolwiek móc przetestować, należy wymyślić jak coś przetestować i takie punktowe cusie, np. lista rzeczy do przetestowania, ma nam też coś powiedzieć i to nie jest wcale takie proste, zatem uznałem, że nie będę robić wyrafinowanych testów lecz przetestuję jakieś rzeczy, które w obu językach da się prosto utworzyć i uruchomić.</p>



<p>Mój test polegać będzie na pobraniu z jednego źródła danych (z pliku lokanego) dokumentu w formacie JSON, a następnie sprawdzić:</p>



<ol class="wp-block-list">
<li>Prędkość parsowania JSON na Obiekt</li>



<li>Szybkość z jaką połączy się wszystkie elementy z tablicy za pomocą pętli i konkatenacji (nie będę korzystać ze specjalnych metod służących temu)</li>



<li>Szybkości serializacji JSON do obiektu klasy DTO</li>



<li>Tak jak 3. tylko że będę chciał uzyskać błąd i przetestować szybkość obsługi wyjątku</li>



<li>Prędkość deserializacji z DTO na JSON i utworzeniu nowego pliku dokumentu JSON &#8211; z tego zrezygnowałem (wyjaśnię później)</li>
</ol>



<p>Więc co nam to udowodni? Oprócz tego że będę mógł zdać relację pisania obu skryptów to i też poznamy prędkości. </p>



<p>Do testów użyję PHP 8.2 oraz Python3. Każdy punkt zrealizuję jako osobny plik, a całość wrzucę na GitHub, abyście mogli mój test powtórzyć no albo czegoś się nauczyć albo przerobić pod własne testy.</p>



<h2 class="wp-block-heading">O pisaniu skryptów</h2>



<p>W obu przypadkach googlowałem proste rzeczy, a jak to pobrać dane z pliku, a jak to przerobić na JSON, a jak to mierzyć czas wykonania kodu. No i tutaj generalnie w obu językach nie miałem aż tak większego problemu, aby cokolwiek znaleźć. Z Pythonem miałem problem taki, że kompletnie jego składni nie znam, a nawet myślałem, że skoro średników nie trzeba to tym bardziej jakiś dwukropków i &#8222;selfiaków&#8221; nie będę potrzebować, więc problemy były ze nieznajomością narzędzia. Z tego powodu musiałem zrezygnować całkowicie z piątego punktu testu.</p>



<p>Co do PHP, generalnie poza drobnymi zmianami w nazwach zmiennych to większość kodu była kopiuj wklej z internetu. Struktury w obu językach staram się zrobić identico (z drobnymi różnicami w składniach). Więc jak w PHP zrobiłem foreach to na internecie szukałem odpowiednika dla Pythona i znalazłem for in. </p>



<p>Bardzo ważne było też dla mnie to, aby skrypty w obu językach wyglądały bardzo podobnie, aby w łatwy sposób dało się porównać co z czym jak szybko działa. Pisanie kodu zacząłem wczoraj (20 list 2022) o godzinie około 20:00 co z PHP skończyłem o 20:30, co jak z Pythonem zacząłem koło 21:00 to skończyłem o 23:30 i powiedziałem, że to nie jest język na moje nerwy.</p>



<h2 class="wp-block-heading">Porównanie</h2>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="611" src="https://enterv.pl/wp-content/uploads/2022/11/Research-of-tiny-employees-price-innovation-on-unbalanced-scales-1024x611.webp" alt="" class="wp-image-481" srcset="https://enterv.pl/wp-content/uploads/2022/11/Research-of-tiny-employees-price-innovation-on-unbalanced-scales-1024x611.webp 1024w, https://enterv.pl/wp-content/uploads/2022/11/Research-of-tiny-employees-price-innovation-on-unbalanced-scales-300x179.webp 300w, https://enterv.pl/wp-content/uploads/2022/11/Research-of-tiny-employees-price-innovation-on-unbalanced-scales-768x458.webp 768w, https://enterv.pl/wp-content/uploads/2022/11/Research-of-tiny-employees-price-innovation-on-unbalanced-scales-1536x917.webp 1536w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Jako iż jestem jeszcze przed analizą wyników na wstępie mogę powiedzieć co wydaje mi się, a wydaje mi się, że Python jest dużo wolniejszy od PHP no i tak, bo w PHP można przeiterować 5-cio-milionową elementów tablicy w miej niż sekundę używając tylko bardzo prosty foreach, co w Pythonie, aby takie samo zrobić wydajniej trzeba napisać jednak więcej kodu, ale bez kombinacji w kodzie jednak chciałem robić porównanie, no bo foreach i for in to dla mnie i pewnie dla wielu to samo i w założeniu działać ma tak samo. </p>



<p>Gdy miałem przygotowany 30 MB plik z danymi to PHP poradził sobie ze wszystkim, a Python drugiego punktu testu nie potrafił dokończyć w rozsądnym czasie. Tak w sumie przerwałem mu działanie po 2 minutach. PHP poradził sobie poniżej 1 sekundy (a dokładniej to w 0,199593&#8230; sek) tworząc zmienną ze 16968000 znakami.</p>



<p>No ale chciałem jednak dać szansę wężowi, aby nie było, że specjalnie na start go uwaliłem. No chociaż myślę, że język programowania, który jest tak długo &#8222;wspierany&#8221; i uznawany jest za język wysokiego poziomu powinien mieć w miarę dojrzałą formę foreach (nawet ten for in) tak, aby zawsze szybko to działało i już na tym etapie nasuwa mi się wniosek, że to nie jest język, w którym cele biznesowe da się osiągnąć stosując strukturę heksagonalną i wszelakich zasad programowania domenowego, i jeszcze aby to działało optymalnie. Zasada jest prosta: 20 mln itemów w tablicy i chcę je przeiterować. Dla mnie według zasady <a href="https://enterv.pl/2022/08/15/programowanie-zasada-kiss/" target="_blank" rel="noopener" title="Zasada KISS">KISS</a> powinienem był użyć tylko i wyłącznie foreach.</p>



<p>Zatem.. zmniejszyłem rozmiar pliku z danymi do około 300 KB (dużo dużo mniej) i dostałem następujące wyniki</p>







<h2 class="wp-block-heading">Wnioski</h2>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://enterv.pl/wp-content/uploads/2022/11/7720441-1024x1024.jpg" alt="" class="wp-image-484" srcset="https://enterv.pl/wp-content/uploads/2022/11/7720441-1024x1024.jpg 1024w, https://enterv.pl/wp-content/uploads/2022/11/7720441-300x300.jpg 300w, https://enterv.pl/wp-content/uploads/2022/11/7720441-150x150.jpg 150w, https://enterv.pl/wp-content/uploads/2022/11/7720441-768x768.jpg 768w, https://enterv.pl/wp-content/uploads/2022/11/7720441-1536x1536.jpg 1536w, https://enterv.pl/wp-content/uploads/2022/11/7720441.jpg 2000w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Trudno tutaj jednoznacznie powiedzieć że Python jest gorszy, bo mój test tego nie dowodzi. Raz że musiałbym ten język lepiej poznać to dwa w nim tak ja ja to zrobiłem nie pisze się. To co już jednak ustaliłem, że PHP działa jednak dużo szybciej niż zakładałem 😅 W wersji 5.4 takich czasów bym już nie uzyskał, więc widzę duży postęp w optymalizacji tego języka, co pewnie skłoni mnie do porównania prędkości pomiędzy wersjami, a co bardziej, bym miał kolejny powód do aktualizowania wszystkiego 😈</p>



<p>Jeśli chodzi o jakieś dalsze wnioski idące za zdobytymi przeze mnie cyferkami to zostawię wam moje misiaczki pole do popisu, bo może jest coś, co ja mogłem przeoczyć&#8230; na pewno jest 😆</p>



<h2 class="wp-block-heading">Podsumowanie</h2>



<p>Zatem poświęciłem dwa wieczory specjalnie pod ten pseudo-naukowy wyczyn, który zasadniczo mało co udowadnia. Za to mogłem ujrzeć wężowy odwłok odchodzący ku zachodzącemu słońcu na tle słoniowych chmur.. Czy straciłem czas?&#8230; 😬 Powiem tylko, że czas poświęconych dla moich kochanych misiaczków nigdy nie jest stracony 🫂</p>



<p class="has-small-font-size">Wolę PHP</p>



<p>Także do następnego miłego 😘</p>



<p>Repozytorium: <a href="https://github.com/EnterVPL/PHPvsPython" target="_blank" rel="noopener nofollow" title="">https://github.com/EnterVPL/PHPvsPython</a></p>Artykuł <a href="https://enterv.pl/2022/11/21/programowanie-php-vs-python-krotki-test/">PHP vs Python – krótki test</a> pochodzi z serwisu <a href="https://enterv.pl">enterv.pl</a>.]]></content:encoded>
					
					<wfw:commentRss>https://enterv.pl/2022/11/21/programowanie-php-vs-python-krotki-test/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
			</item>
		<item>
		<title>Krótka historia o początkach CrazyLazyCatBot</title>
		<link>https://enterv.pl/2022/10/19/crazylazycatbot/</link>
		
		<dc:creator><![CDATA[enterv]]></dc:creator>
		<pubDate>Wed, 19 Oct 2022 14:47:26 +0000</pubDate>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[bot]]></category>
		<category><![CDATA[catbot]]></category>
		<category><![CDATA[crazylazycatbot]]></category>
		<category><![CDATA[discord.js]]></category>
		<category><![CDATA[historia]]></category>
		<category><![CDATA[lazybot]]></category>
		<category><![CDATA[nest.js]]></category>
		<category><![CDATA[programowanie]]></category>
		<guid isPermaLink="false">https://enterv.pl/?p=447</guid>

					<description><![CDATA[<p>W tym artykule opowiem w skrócie historię powstania mojego bota. Pojawią się również sprawy techniczne, ale mam nadzieję, że wszystko będzie w zrozumiałym tonie</p>
Artykuł <a href="https://enterv.pl/2022/10/19/crazylazycatbot/">Krótka historia o początkach CrazyLazyCatBot</a> pochodzi z serwisu <a href="https://enterv.pl">enterv.pl</a>.]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading">Wstęp</h2>



<p>Cześć! Pewnie część z was od wielu miesięcy wie, że tworzę bota na mój koci discrod i też ta sama część wie, jak prezentuje się wersja testowa. </p>



<p>Do utworzenia bota wykorzystałem bibliotekę discord.js wraz z frameworkiem nest.js (z mojej strony to bardzo dzikie połączenie, ale to o tym później), a powstałe rezultaty są nawet obiecujące.</p>



<h2 class="wp-block-heading">Powód powstania bota</h2>



<p>Od wielu wielu lat chciałem mieć własnego bota, jako takie swoiste narzędzie całkowicie spersonalizowane pod potrzeby serwera. Drugim powodem i w moim odczuciu dużo mocniejszym to to, że mogę i chcę &#8211; ot taki kaprys 😅</p>



<p>Później czyli sierpień/wrzesień 2022 roku (nie tak dawno) zacząłem poszukiwania bota do zliczania XP. Myślałem nad Mee6, ale ten zaczął chcieć za to many many. Ok, nie mam nic przeciwko temu, ale że jestem zwolennikiem niewydawania bez potrzeby to znalazłem innego bota, ale tak na serio to żaden inny mi nie odpowiadał. Zatem &#8211; jakiegoś znalazłem i wrzuciłem na serwer, ale z tyłu głowy miałem to, że to nie jest do końca to. Z reszta większość fajnych opcji jest zablokowana i to był ten moment kiedy moja zachcianka zaczęła mieć rację bytu 💪</p>



<h2 class="wp-block-heading">Poznanie się z discord.js</h2>



<p>Początki były.. niecodzienne. Miałem duży problem z tym, aby w ogóle zacząć. To też z powodu tego, że u mnie ostatnio czasem krucho, ale też chodzi o to, że robiłem niby wszystko zgodnie z dokumentacją, ale bot po prostu nie chciał się odpalić. Mój skopiowany kod nie działał.</p>



<p>Straciłem kilka dni rozkmin na to jak prawidłowo skonfigurować bota i kolejne na utworzeniu komend zaczynających się od ukośnika. W końcu mnie olśniło! Skoro podaję jakiś token przez liba to może niepotrzebnie coś jest dopisane? Koniec końców wyszło na to, że za bardzo sobie pomieszałem to co było opisane na slackoverflow i tym co na github oraz tym co na dokumentacji. Usunąłem z tokenu to co sam dopisałem do niego i myk &#8211; lek na wszystko! To był jeden z tych dni kiedy sam siebie uznałem za debila.. Cóż.. każdemu mogło się zdarzyć 🙃</p>



<p>Po udanej naprawie postanowiłem pobawić się z tworzeniem komend i już było z górki. Jakieś tam parametry ustawiałem itd. &#8211; generalnie zabawa kodem. Potem uznałem, że wszystko spoko, ale pasuje to jakoś standaryzować  i uznałem, że skoro to tylko lib to mogę go upakować w jakimś frameworku jako jakiś osobny moduł czy inny twór.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="700" height="104" src="https://enterv.pl/wp-content/uploads/2022/10/nieSprawdzeXp.webp" alt="" class="wp-image-449" srcset="https://enterv.pl/wp-content/uploads/2022/10/nieSprawdzeXp.webp 700w, https://enterv.pl/wp-content/uploads/2022/10/nieSprawdzeXp-300x45.webp 300w" sizes="auto, (max-width: 700px) 100vw, 700px" /><figcaption class="wp-element-caption">Jak bardzo bot nie sprawdza XP, bo jest leniwy</figcaption></figure>



<h2 class="wp-block-heading">Większy poziom abstrakcji </h2>



<p>Wziąłem się za nest.js. Nie był to strzał w kolano, ale żeby zrozumieć ten lekki absurd, w który sam się wpakowałem to miejcie na uwadze 3 następujące rzeczy:</p>



<ul class="wp-block-list">
<li>pisanie w nest.js wiąże się z używaniem języka TypeScript, którego po prostu nie znam tak dobrze jak np. Dart czy PHP</li>



<li>nie znam nest.js.. to że potrafię w nim utworzyć DTO i kontrolery o niczym nie świadczy, to po prostu jest w dokumentacji podane na tacy 😅</li>



<li>dopiero poznaję discord.js, co oznacza, że mam sporo do nauki</li>
</ul>



<p>Z samym frameworkiem nie miałem problemów. Grzecznie utworzyłem moduł i piszę w nim jakbym tworzył całkowicie samodzielną aplikację. Nie wiem jak na długo zachowam taką hermetyczność, ale powiem, że jestem i tak z tego dumny.</p>



<figure class="wp-block-image size-full is-style-default"><img loading="lazy" decoding="async" width="335" height="67" src="https://enterv.pl/wp-content/uploads/2022/10/discordbotmodule.webp" alt="" class="wp-image-451" srcset="https://enterv.pl/wp-content/uploads/2022/10/discordbotmodule.webp 335w, https://enterv.pl/wp-content/uploads/2022/10/discordbotmodule-300x60.webp 300w" sizes="auto, (max-width: 335px) 100vw, 335px" /><figcaption class="wp-element-caption">DiscordBotModule</figcaption></figure>



<h2 class="wp-block-heading">Dalsze plany na bota</h2>



<p>Mam wypisaną całą listę zadań do wykonania, aby tego bota zrobić. Nie będę tutaj jej przytaczać, ale chcę zrobić system liczenia XP, a wraz tym tablicę wyników. Dodać komendę do wylosowania zdjęcia losowego pieska (bo na kotki jest już). A co potem? Potem się pomyśli. Jestem też otwarty na sugestie 😄</p>



<h2 class="wp-block-heading">Szczególne podziękowania</h2>



<p><strong>Dori</strong> zwany kiedyś Dorion300, bardzo usprawniłeś flow dotyczące bota. W ten projekt też wszedłeś bez większego zastanowienia i zaangażowałeś się tak jakby to był też Twój bot. Dzięki wielkie, z to że tak bardzo mi pomagasz i śmiało mogę oznajmić, że tak: to jest nasz wspólny bot 🫂 🥇</p>



<p><strong>Luki_86</strong> dzięki Tobie bot miauczy i czasami tym za bardzo spami. Podesłałeś też drugi fajny pomysł, który z pewnością wezmę pod uwagę 😁</p>



<h2 class="wp-block-heading">Podsumowanie</h2>



<p>Jak to bywa początki bywają trudne, ale też nie taki diabeł straszny jak go malują i tym optymistycznym akcentem zobaczymy się w kolejnym wpisie albo na kocim discordzie. Mrau 🐱</p>Artykuł <a href="https://enterv.pl/2022/10/19/crazylazycatbot/">Krótka historia o początkach CrazyLazyCatBot</a> pochodzi z serwisu <a href="https://enterv.pl">enterv.pl</a>.]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Semantyka w kodzie, by po roku było nadal jasno</title>
		<link>https://enterv.pl/2022/08/30/programowanie-jak-nazywac-aby-wiedziec-po-roku-o-co-chodzilo/</link>
		
		<dc:creator><![CDATA[enterv]]></dc:creator>
		<pubDate>Tue, 30 Aug 2022 07:35:18 +0000</pubDate>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[atrubuty]]></category>
		<category><![CDATA[automatyzacja procesów]]></category>
		<category><![CDATA[bezpieczeństwo]]></category>
		<category><![CDATA[camel case]]></category>
		<category><![CDATA[camelCase]]></category>
		<category><![CDATA[Cztery podstawowe konwencje nazewnictwa]]></category>
		<category><![CDATA[czytelność kodu]]></category>
		<category><![CDATA[dobre komentarze]]></category>
		<category><![CDATA[dokumentacja]]></category>
		<category><![CDATA[efektywność]]></category>
		<category><![CDATA[entuzjazm]]></category>
		<category><![CDATA[funkcjonalność]]></category>
		<category><![CDATA[innowacje]]></category>
		<category><![CDATA[integracja]]></category>
		<category><![CDATA[jak nazywać]]></category>
		<category><![CDATA[jak nazywać aby po roku wiedzieć]]></category>
		<category><![CDATA[jak pisać czysty kod]]></category>
		<category><![CDATA[jasność]]></category>
		<category><![CDATA[kebab-kase]]></category>
		<category><![CDATA[kod]]></category>
		<category><![CDATA[kodu]]></category>
		<category><![CDATA[komentarz]]></category>
		<category><![CDATA[konserwacja kodu]]></category>
		<category><![CDATA[liczenie wtf]]></category>
		<category><![CDATA[liczenie wtfow]]></category>
		<category><![CDATA[najlepsze praktyki]]></category>
		<category><![CDATA[narzędzia]]></category>
		<category><![CDATA[nauka programowania]]></category>
		<category><![CDATA[nazewnictwo kodu]]></category>
		<category><![CDATA[nazwy które coś znaczą]]></category>
		<category><![CDATA[o co chodziło]]></category>
		<category><![CDATA[odpowiednie koemntarze]]></category>
		<category><![CDATA[PascalCase]]></category>
		<category><![CDATA[pasja]]></category>
		<category><![CDATA[paslca case]]></category>
		<category><![CDATA[produktywność]]></category>
		<category><![CDATA[programowanie]]></category>
		<category><![CDATA[programowanie funkcyjne]]></category>
		<category><![CDATA[programowanie obiektowe]]></category>
		<category><![CDATA[programowanie po roku]]></category>
		<category><![CDATA[programowanie proceduralne]]></category>
		<category><![CDATA[programowanie zespołowe]]></category>
		<category><![CDATA[przegląd kodu]]></category>
		<category><![CDATA[przykład dobrego kodu]]></category>
		<category><![CDATA[przyszłość programowania]]></category>
		<category><![CDATA[semantyka]]></category>
		<category><![CDATA[skalowalność]]></category>
		<category><![CDATA[snake case]]></category>
		<category><![CDATA[snake_case]]></category>
		<category><![CDATA[społeczność programistów]]></category>
		<category><![CDATA[trend]]></category>
		<category><![CDATA[trwałość kodu]]></category>
		<category><![CDATA[tworzenie aplikacji]]></category>
		<category><![CDATA[utrzymanie kodu]]></category>
		<category><![CDATA[wsparcie]]></category>
		<category><![CDATA[współpraca z innymi językami]]></category>
		<category><![CDATA[wydajność]]></category>
		<category><![CDATA[zarobki]]></category>
		<category><![CDATA[zarządzanie projektem]]></category>
		<category><![CDATA[zasady programowania]]></category>
		<category><![CDATA[złe komentarze]]></category>
		<guid isPermaLink="false">https://enterv.pl/?p=347</guid>

					<description><![CDATA[<p>Wstęp Cześć moje pysie mysie ❤️ Zanim przejdziemy do części merytorycznej to chciałbym powiedzieć, że jestem w trakcie pisania innego artykułu nt. JavaScript-owego kodu o zamianie tekstu na emotki. Głównie ze względu na to jak ostatnio mało przy komputerze spędzam czasu ten artykuł tak długo tworzę. Liczę jednak na to że skończę go na początku [&#8230;]</p>
Artykuł <a href="https://enterv.pl/2022/08/30/programowanie-jak-nazywac-aby-wiedziec-po-roku-o-co-chodzilo/">Semantyka w kodzie, by po roku było nadal jasno</a> pochodzi z serwisu <a href="https://enterv.pl">enterv.pl</a>.]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading">Wstęp</h2>



<p>Cześć moje pysie mysie ❤️ </p>



<p>Zanim przejdziemy do części merytorycznej to chciałbym powiedzieć, że jestem w trakcie pisania innego artykułu nt. JavaScript-owego kodu o zamianie tekstu na emotki. Głównie ze względu na to jak ostatnio mało przy komputerze spędzam czasu ten artykuł tak długo tworzę. Liczę jednak na to że skończę go na początku września.</p>



<p>To tyle z ogłoszeń, a jeśli chodzi o nazywanie wszystkiego co masz w kodzie to tutaj nie ma jednej prostej drogi. Jeszcze trzeba się nastawić na to, że tutaj będę rzucał nazwami na lewo i prawo &#8211; nie zrażać się tylko googlować 😘 (z resztą ja przez google się o wszystkim dowiedziałem)</p>



<h2 class="wp-block-heading">Liczenie WTFów</h2>



<p>Jest to jedna z ciekawszych metod wyszukiwania rzeczy które mają złe nazwy. Używając tego też warto znać wzorce projektowe jak i kilka różnych zasad programowania.</p>



<p>Dobra zatem co tu trzeba robić? Weź sobie jakiś swój stary kod i wstaw sobie WTF za każdym razem gdy coś nie jest jasne na pierwszy rzut okiem. Nie dochodź o co chodzi: nie wiesz to nie wiesz i masz +1 WTF. Na końcu liczysz ile masz WTFów &#8211; im więcej tym gorzej. </p>



<p>Też fajnie by było gdyby ktoś bardziej doświadczony zrobił Ci code review i wystawił WTFy (albo lepiej konstruktywne komentarze) w kodzie.</p>



<p>Na takiej podstawie będziesz wiedzieć co jest do zmiany, a jeśli masz komentarze to możliwe że dowiesz się nawet jak te WTFy zmienić.</p>



<p>Żeby nie było, że sobie to wymyśliłem &#8211; programistyczne WTFy to nic nowego, a na internecie znajdziecie wiele stron gdzie polecają taką praktykę. No, a co znaczy ten skrót to już każdy powinien wiedzieć 🙃</p>



<h2 class="wp-block-heading">Nie wymyślaj nic nie znaczących nazw</h2>



<p>Są specjalne programy od tego jak bardzo nieczytelny ma być kod, chociaż inaczej się definiuje wszelkiego rodzaju aplikacje od minifikacji.</p>



<p>Ty swój kod pisz tak, aby tych WTFów było jak najmniej. Często spotykałem się z tym jak ktoś nazywa funkcje czy klasę &#8222;MojeCoś&#8221; albo &#8222;Moje2&#8221;. To że twoje to każdy się domyśli. No ale co to znaczy? Co to robi?</p>



<h3 class="wp-block-heading">Lepiej używać nazw które coś znaczą</h3>



<p>Więc tutaj też najlepiej znać wzorce projektowe dzięki czemu część nazwy masz już z samego wzorca. Piszesz coś co obsługuje zapytania do bazy danych? Pewnie chodzi o Repository. Piszesz coś czym przekażesz proste dane? Możliwe że użyjesz DTO. Chcesz zmienić stan aplikacji? Napiszesz Command (i pewnie CommandHandler) itd. itd.</p>



<p>Też mocno pomaga w nazywaniu to jakie masz namespaces albo po prostu ścieżki. Jeśli wszystko do zarządzania userami wstawisz w /src/UserBundle i jeszcze tam stworzysz konkretne podkatalogi to jesteś prawie w domu. Ja podobnie nazywam namespaces: oddają one konkretne katalogi &#8211; a przynajmniej jest to znana mi praktyka z języka PHP (ułatwia mocno autoload), ale nie wiem czy w innych językach też tak się robi</p>



<p>Fajnie też gdy uczysz się wzorców projektowych, wtedy one (gdy wiesz jakie użyć) podpowiadają część nazwy. Tworzysz fasadę? &#8211; no to w nazwie masz zawarte <em>Facade</em>. Robisz fabrykę? &#8211; <em>Factory</em>. Adapter? &#8211; no tutaj akurat tak samo <em>Adapter</em>. Większość nazw wzorców też oddaje to czym się zajmują: <em>Builder</em> buduje, <em>Factory<strong> </strong></em>produkuje, a czym? no np. <em>builderami</em> 😄Dlatego też zawszę będę polecać naukę wzorców, bo one są własnie po to, aby nam pomóc pisać kod, zwłaszcza taki, który wiemy, że trzeba go dużo zrobić.</p>



<p>Metody też fajnie nazywać tak jakby opisywały konkretną czynność. Tak jak bywa że nazwa klasy to coś w rodzaju Rzeczownika to metody to są czymś w rodzaju Czasownika. Mówię, że coś tego rodzaju, bo są odstępstwa od tych reguł jak np. UserCreated, które jest eventem, a coś co nasłuchuje po nim może się nazywać UserCreatedSubscriber, a metoda która będzie wywoływana to może być zwykły invoke. Jak chcesz coś dodać np. linki społecznościowe pod usera to masz w klasie User metodę addSocialLink, ew. jeśli ma być jeden tylko link to robisz setSocialLink (że ustaw, no bo już dodawać wtedy nie trzeba). Podobnie jest w przyrodzie &#8211; masz obiekt np. ptactwo i ono to co umie robić (czyli metody) to są ich czynności np. latają, siedzą, jedzą itd. Jeszcze z realnego życia można wziąć przedmioty nieożywione jak np. stół, któremu można nadać konkretną pozycję czyli stół da się przemieścić. Stół::przemieść, a z normalnego na nasze Table::setPosition 🤣</p>



<h3 class="wp-block-heading">Przykład kodu (troszkę abstrakcyjnie)</h3>



<p><em>Ja programuje aplikacje backendowe więc jeśli mam coś napisać to zaczynam od kontrolera, który działa pod jakimś tam URL i przyjmuje od zapytania jakieś argumenty (często to jest ciało zapytania). Czyli jest jakiś Route, który kieruje wykonanie kodu do konkretnej metody kontrolera tzw. akcji.</em></p>



<p>Załóżmy że tworzymy użytkownika. Jako iż wiem, że większość z tego co wymyślę będzie często ponownie wykorzystywane to też zaplanuje cały proces tworzenia kodu. Uwaga, cześć może być na początku nie zrozumiała:</p>



<ul class="wp-block-list">
<li>Będę operować na agregacie User. W moim przypadku będzie to też Encja. Klasa zatem będzie nazywać się User (tak łatwo się nazywa encje czy niektóre domeny). </li>



<li>Będę zmieniać stan bo będzie tworzony User, wiec będzie potrzebny WriteModel. U mnie sprawdzi się coś co utworzy na podstawie Encji User nowe dane w bazie danych. Będzie to UserRepository</li>



<li>Skoro będzie zmieniany stan to na podstawie wzorcu CQRS utworze Command i CommandHandler i nazwę je CreateUserCommand oraz analogicznie CreateUserCommandHandler. Command będzie swego rodzaju DTO, a Handler będzie miał w sobie logikę tworzenia Usera (będzie też jasno gdzie jest tworzenia Usera)</li>



<li>OK. Jeszcze coś co będzie warstwę wyżej, coś co wychwyci argumenty i przekaże je do Commanda. Tutaj załóżmy, że tworzymy REST API, przez które da się utworzyć Usera, więc przyda nam się controller od Userów i jego akcja do tworzenia Userów. To będzie nasza tzw. warstwa Port. Odpowiedni Route przekieruje request na akcję.</li>
</ul>



<p>Załóżmy, że argumentami są wysyłane w zapytaniu nazwa, hasło i email użytkownika. </p>



<p>Teraz ułóżmy sobie to w odpowiedniej kolejności:</p>



<ol class="wp-block-list">
<li>Route np. <strong>PUT /api/user</strong>, który przekieruje request na akcję <strong>UserController::create</strong> (nie, to nie będzie klasa statyczna, pomimo tego zapisu)</li>



<li><strong>UserController</strong> na podstawie argumentów uzupełni <strong>CreateUserCommand</strong> (a tak w zasadzie to ten Command oczekuje tych konkretnych danych)</li>



<li><strong>CreateUserCommand</strong> w &#8222;jakiś sposób&#8221; będzie użyty do utworzenia Usera. Tutaj jest wiele możliwości i też wiele zależy jaki język jest używany. w C# robi to się inaczej niż w PHP. Ja pokaże jeden z łatwiejszych/bardziej zrozumiałych sposobów czyli zwykłe wywołanie <strong>CommandHandlera</strong> w kontrolerze</li>



<li><strong>CreateUserCommandHandler</strong> używając danych z <strong>CreateUserCommand</strong> tworzy nową encję <strong>User</strong> ustawia jej poszczególne własności (np. konstruktorem albo setterami albo osobnymi serwisami &#8211; ważne żeby po prostu to osiągnąć)</li>



<li><strong>CreateUserCommandHandler</strong> używając utworzonej encji <strong>User</strong> zapisuje ją w bazie danych (czyli tworzy stan) używając <strong>UserRepository::save</strong> (to też nie jest klasa statyczna)</li>



<li>Skoro to Command, a nie Query (o co z tym chodzi to zapraszam do zapoznania się z CQRS), a route to <strong>PUT,</strong> a nie <strong>GET</strong> to nie zwracamy żadnych danych w response &#8211; czyli w odpowiedzi jest tylko status HTTP 201, który wprost mówi o tym, że został utworzony stan.</li>
</ol>



<p>Załóżmy jeszcze jedną rzecz taką dla ułatwienia: przykład kodu będzie na fikcyjnym frameworku z mechanizmem autowired , który jeszcze ma menadżer encji &#8211; dzięki temu nie będę musiał wszystkiego pisać 😇 </p>



<p>Wiem, że teraz nawaliłem jakimiś nazwami i rzeczami, które mogą wyglądać na nie zrozumiałe, ale ten dodatkowy wysiłek się przyda i ja wiem, że dla niektórych to piszę herezję, no bo po co cała klasa na utworzenie usera i po co na ta encja skoro można po prostu wszystko od razu przekazać do DB i mieć z głowy.. no niby można, ale wtedy pozbawiasz się możliwości fajnego rozszerzenia kodu. Kontroler trzyma wszystkie akcje, które można wykonać pod np. daną encję (u nas User). Można pobierać, zmieniać czy tworzyć, ale i nie tylko. Jeśli np. zapisujemy każde logowanie wraz z datą i godziną to możemy zrobić z tego statystyki logowania. Nasz UserController będzie dosyć prosty: będzie dziedziczyć domyślne funkcje frameworkowego Controller-a i używając atrybutów (czy jak kto woli dekoratorów) przypiszemy do niego konkretny route</p>



<pre title="UserController.ts" class="wp-block-code"><code lang="typescript" class="language-typescript line-numbers">import { Controller, Put, Body } from '@someFramework';
import { CreateUserCommand } from './CreateUserCommand';
import { CreateUserCommandHandler } from './CreateUserCommandHandler';
import { UserRepository } from './UserRepository';

// nastawiamy route na /api/user
// to "/api" załóżmy że wzięło się z niewidzialnego configu
@Controller('user')
export class UserController {

  // ustawiamy metodę put na tym create
  // będzie to endpoint PUT /api/user
  @Put()
  // ustawiamy że jeśli wszystko pódzie dobrze, to nam zwroci status http 201 czyli "utworzone"
  @HttpCode(201)
  // To co ma przyjść z requestu ma być zmapowane do CreateUserCommandHandler
  // Czyli ma też ma zawierać te samo pola co ta klasa
  create(@Body() createUserCommand: CreateUserCommand): void
  {
    // tworzymy nasz command handler
    const handler = new CreateUserCommandHandler(new UserRepository);
    // wykonujemy tworzenie usera
    handler.handle(createUserCommand);
    // całą resztą zajme się już framework, a my już nic więcej nie musimy
  }
}</code></pre>



<p>Command jest stricte sporym ułatwieniem i przechowuje najprostsze typy danych. Nasz CreateUserCommand będzie trzymał tylko nazwę, email i hasło usera. Każde jedno typu string. Wtedy też masz jasno z góry ustalony tzw. kontrakt (czyli w naszym przypadku to co przychodzi w body requestu).  Command jest swego rodzaju DTO tylko że pod konkretny cel, wszystkie inne DTO-sy mogą być ogólnego celu. Też jeden DTO może wymagać inny DTO jako własność, wtedy fajne drzewko można robić. DTO też może mieć jako własność ObjectValue. Natomiast DTO nie może przechowywać logiki &#8211; chodzi o to, aby nie był tym co coś zmienia czy tworzy, a ma być tym dzięki czemu można coś zmienić lub stworzyć. Jego odpowiedzialność jest z góry ustalona. To pudełko na rzeczy, które można tylko wykorzystać, a same z siebie nic nie robią. Też Command/DTO przydaje się jeśli chcesz mieć ustaloną strukturę, a nie chcesz wysyłać jako argument ze 20 zmiennych &#8211; wtedy masz tylko jedno DTO.</p>



<pre title="CreateUserCommand.ts" class="wp-block-code"><code lang="typescript" class="language-typescript line-numbers">export class CreateUserCommand {
    name: string;
    email: string;
    password: string;
}</code></pre>



<p>CommandHandler (w naszym przypadku CreateUserCommandHandler) to logika wykorzystania CommandHandlera. Przeważnie jest to dosyć prosta klasa: argumentem jest Command, który z góry ma ustalone jakie są dane i bez krępowania używasz ich. CommandHandler może tworzyć/zmieniać/usuwać stan &#8211; w naszym przypadku tworzy (bo mamy w nazwie Create). Jeśli chodzi o to jak swoją pracę wykonuje to już tutaj można albo w nim opisać to co się dzieje albo można stworzyć osobne serwisy, które zrobią za CommandHandler bardziej zaawansowaną robotę. U nas obejdzie się bez serwisu.</p>



<pre title="CreateUserCommandHandler" class="wp-block-code"><code lang="typescript" class="language-typescript">import { CreateUserCommand } from "./CreateUserCommand";
import { User } from "./User";
import { UserRepository } from "./UserRepository";

export class CreateUserCommandHandler {
    _userRepo: UserRepository;

    constructor(userRepo: UserRepository)
    {
        this._userRepo = userRepo;
    }

    handle(command: CreateUserCommand) : void
    {
        // tworzy usera
        const user = new User();

        // ustawia usera
        user.name = command.name;
        user.email = command.email;
        user.password = command.password;

        // zapisuje usera
        this._userRepo.save(user);
    }
}</code></pre>



<p>Wszelkie Repozytoria służą do komunikacji z bazą danych. No i tutaj może być różnie, bo mogą używać mechanizmów frameworka, ale czasami trzeba i tak zdefiniować przez np. jakiś QueryBuilder to co chcemy osiągnąć, zwłaszcza jak trzeba relacyjnie się odwoływać. Dla mnie Repozytoria jeśli chodzi o budowę są podobne do Kontrolerów, w sensie dane repozytorium jest miejscem dla różnych akcji pod bazę danych. Jest np. znajdź po ID, albo znajdź po atrybutach, no tylko z tą różnicą, że też można zapisywać. No&#8230; chyba że mamy bardziej zaawansowaną aplikację, gdzie zapis i odczyt realizujemy przez osobne repozytoria, bo np. chcemy mieć różne możliwości zapisu. Dla naszego ułatwienia przyjmijmy, że korzystamy z fikcyjnego frameworka, który ma menadżer encji, którym można utworzyć instancję repozytorium dla naszej klasy repozytorium (masło maślane &#8211; chodzi oto, że opakujemy frameworkowe repozytorium w ładne metody). Nasz UserReposiotry będzie służyć tylko do zapisywania.</p>



<pre title="UserRepository.ts" class="wp-block-code"><code lang="typescript" class="language-typescript line-numbers">import { em, IEntityRepository } from "@someFramework/EntityManager";
import { User } from "./User";

export class UserRepository {
    _repository: IEntityRepository

    constructor()
    {
        // Tworzy nam repozytorium na podstawie encji User
        // Dzięki temu mamy połączenie z tabelą user w DB
        this._repository = em.getRepository((new User).constructor.name)
    }

    save(user: User) : void
    {
        // Sprawdzamy czy trzeba dodać usera
        if(!this._repository.contain(user)) {
            // Jeśli nie jest zawarty to dodaj
            this._repository.persist(user);
        }

        // Commit do bazy danych
        this._repository.flush();
    }
}</code></pre>



<p>Nasza legendarna Encja User to będzie nic innego jak obiektowy reprezentant naszej bazy danych. Ci co kojarzą ORM to już pewnie wiedzą o co chodzi, a ci co nie.. No zobacz co to ORM 🥲 </p>



<pre title="User.ts" class="wp-block-code"><code lang="typescript" class="language-typescript line-numbers">import { ORMTable, ORMColumn, ORMId } from "@someFramework/ORM";

// Dzięki ORM wiadomo jaką tabele reprezentuje clasa User i jakie ma kolumny

@ORMTable('user')
export class User {

    @ORMId('AI')
    @ORMColumn('int')
    _id: number

    @ORMColumn('varchar(15)')
    _name: string;

    @ORMColumn('varchar(50)')
    _email: string;

    @ORMColumn('varchar(64)')
    _password: string;

    public get id(): number {
        return this._id;
    }

    public get name(): string
    {
        return this._name;
    }

    public set name(value: string)
    {
        this._name = value;
    }

    public get email(): string
    {
        return this._email;
    }

    public set email(value: string)
    {
        // any email valid
        this._email = value;
    }

    public set password(value: string)
    {
        // any password hasher
        this._password = value;
    }
}</code></pre>



<p>Tak trochę specjalnie przykład kodu zawiera błędy &#8211; czy potrafisz je wszystkie znaleźć i poprawić? 😉</p>



<p>Gdyby ktoś chciał wiedzieć to trochę (bo nie całkiem) wzorowałem się na użyciu frameworka <a rel="noreferrer noopener" href="https://nestjs.com/" target="_blank">NestJS</a> &#8211; nie umiem go picuś glancuś, więc mój kod na pewno z nim nie zadziała &#8211; ale TY możesz to naprawić! 😄 </p>



<h2 class="wp-block-heading">Zasady programowania</h2>



<p>Część zasad programowania odnosi się też do nazewnictwa, ale i co powinien zawierać jakościowy kod. Po części też dzięki temu, że wiemy co robić, nie zrobimy czegoś niepotrzebnego, więc i nazywania będzie tyle ile trzeba 😇</p>



<p>Tych zasad jest dużo i ich nauka też trochę schodzi czasu. Też na moim blogu znajdziecie opisy <strong><a href="https://enterv.pl/2022/08/15/programowanie-zasada-kiss/">KISS</a></strong> oraz <strong><a href="https://enterv.pl/2022/08/12/programowanie-zasada-pojedynczej-odpowiedzialnosci/">SRP</a></strong>. Chciałbym tak na prawdę opisać wszystkie jakie znam, ale.. kiedy ja na to czas znajdę? 😱 No ale ale, zawsze mogę pomóc podając kilka z nich. Poza wcześniej wypisanymi KISS i SRP na start jeszcze polecam <strong>SOLID</strong> (literka S oznacza to SRP i każda osobna literka to osobna zasada), <strong>YANGI</strong>, <strong>DRY</strong>, <strong>TDA</strong> oraz <strong>SCA</strong>. Naukę i kolejność poznawania oczywiście dobrać pod siebie 😘 Opiszę je w osobnych artykułach 😄</p>



<h2 class="wp-block-heading">Cztery podstawowe konwencje nazewnictwa</h2>



<p>Stricte one nie mówią wprost dokładnie jakich słów należy używać, ale używając ich w odpowiedni sposób, twój kod zyska na większej czytelności:</p>



<ol class="wp-block-list">
<li><strong>snake_case</strong> &#8211; chodzi o całe nazewnictwo gdzie słowa są pisane tylko z małych liter, a pomiędzy nimi jest znak podłogi czyli <strong>_</strong> &#8211; ja to spotykam najczęściej jako nazwy tabel w bazie danych, a wy? </li>



<li><strong>camelCase</strong> &#8211; moje najbardziej ulubione, jednakże robię od tego wyjątki. Chodzi o to, że nazwa zaczyna się z małej litery, a każde kolejne słowo z Wielkiej &#8211; w takim przypadku nie są potrzebne dodatkowe znaki. Ja to używam do nazw zmiennych i funkcji </li>



<li><strong>PascalCase</strong> &#8211; jest bardzo podobne do camelCase, z tą różnicą, że pierwsze słowo też zaczyna się od Wielkiej litery. Używam tego do nazywania Klas</li>



<li><strong>kebab-case</strong> &#8211; moim zdaniem bardzo osobliwy przypadek, ale też łatwo można się na to nadziać, zwłaszcza w XML albo wszelkich frameworkach (jak React czy Vue), gdzie tworzysz własne tagi. Jeszcze używane w CSS i jego pochodnych. Na pewno też jest wiele innych przykładów, które można znaleźć, ale póki co tylko to mi przyszło do głowy 😅</li>
</ol>



<h2 class="wp-block-heading">Odpowiednie komentarze</h2>



<p>Tak jak widać przykład kodu to większość z tych komentarzy (albo w sumie wszystkie) są zbędne. Odpowiednie formatowanie kodu ma sprawić to, że nasz kod jest zrozumiały &#8211; trzeba na to spojrzeć jak na książkę: czy lepiej się czyta książkę, gdzie musisz czytać każdy komentarz autora, aby wiedzieć o co chodzi czy po prostu wolisz z czytania treści (bez komentarzy) wiedzieć o czym jest fabuła? Pytanie oczywiście retoryczne &#8211; wiadomo, że fabuła naszego kodu musi być jasna 💪</p>



<p>Oczywiście zdarzają się przypadki kiedy wszystko idealnie nazwiesz, no ale.. coś jednak jest nie tak. Ci co znają Regex pewnie wiedzą o co chodzi 🙂</p>



<h3 class="wp-block-heading">Przykład złego komentarza</h3>



<p>Takiego fe fe komentarza nie robić:</p>



<pre class="wp-block-code"><code lang="typescript" class="language-typescript line-numbers">// Moja klasa, która jest encją User
class User
{
  // ID usera, które zmuszę, aby było int
  _id: number;
}</code></pre>



<p>No i widać, że te komentarze nic nie znaczą 🙁 &#8211; wiadomo, że to klasa i nawet nie ważne, że to encja czy co innego. Tak samo ID, nosz.. wiadomo, że w większości przypadkach musi to być INT, a number zawiera w sobie tez int.</p>



<h3 class="wp-block-heading">Przykład dobrego komentarza</h3>



<pre class="wp-block-code"><code lang="typescript" class="language-typescript line-numbers">// Minimum eight characters, at least one letter, one number and one special character
const passwordRegex = "^(?=.*[A-Za-z])(?=.*\d)(?=.*[@$!%*#?&amp;])[A-Za-z\d@$!%*#?&amp;]{8,}$"</code></pre>



<p>Pomimo tego, że nazwa nazwa w pełni oddaje tym czym jest ten obiekt to jednak bez komentarza trudniej rozszyfrować składnię Regex-a. Podobnie w książce czasami pojawi się obcojęzyczne słowo, którego nie znamy i komentarz nam wyjaśnia o co chodzi.</p>



<h3 class="wp-block-heading">Komentarz &#8211; dokumentacja</h3>



<p>Na przykładzie jezyka PHP jeszcze pokażę jak pisać dokumentację w kodzie za pomocą komentarzy. Przydaje się to czasami, gdy chcesz wygenerować dokumentację np. stronę internetową pod swój kod:</p>



<pre class="wp-block-code"><code lang="php" class="language-php line-numbers">&lt;?php

namespace App\Example\UserBundle\Domain\EventSubscriber;

use App\Example\UserBundle\Domain\UserRepository;
use App\Example\UserBundle\Domain\Event\UserCreated;

class UserCreatedSubscriber
{
 
    /**
     * @param UserRepository $userRepository
     */
    public function __construct(
        private UserRepository $userRepository
    ){
    }

    /**
     * @param UserCreated $event
     * @return void
     */
    public function __invoke(UserCreated $event) : void
    {
        // .. tutaj jakiś kod
    }
}</code></pre>



<p>Jak widać można się obejść bez tych komentarzy, ale z drugiej strony są one jakoś pomocne. Wielu programistów jest do nich przyzwyczajonych, więc tutaj myślę, że nikt nie skrzyczy za ich robienie &#8211; w moim przypadku mam zainstalowaną tyczkę, która sama mi taką dokumentację pisze, a dokładnie to dosłownie piszę znaki <em>/**</em>, a potem wystarczy enter i już mam wszystko na podstawie funkcji / metody.</p>



<h3 class="wp-block-heading">Komentarz &#8211; atrybut</h3>



<p>Niektóre języki programowania mogą nawet wymagać takich komentarzy, ale to już zostawię do własnej interpretacji. W Takim języku PHP przed wersją 8 trzeba było atrybuty pisać w komentarzach, co nie zawsze wyglądało dobrze, ale z drugiej strony i tak były tam gdzie miały być, więc jakoś było dobrze.</p>



<p>Tutaj raczej nie ma co pisać przykładów, bo jeśli nie piszesz w PHP to w innych językach programowania, do tego zagadnienia są inne rozwiązania. Np. w TypeScript są <em>@Dekoratory</em>, w które się nie zagłębiałem, ale pewnie dużo robią skoro atrybutów w tym języki nie widziałem</p>



<h2 class="wp-block-heading">Podsumowanie</h2>



<p>Zatem poznaliście kilka tajemnych technik pisania kodu, o które zostałem proszony byłem opisać. Jestem jeszcze w trakcie pisania dwóch innych artykułów &#8211; jeden to będzie poradnik z JS, a drugi konkurs, jednakże pewnie wcześniej pojawi się trzeci czyli podsumowanie miesiąca jakim jest Sierpień 😄</p>



<p>Wszystkim zaczynającym szkołę życzę miłych szkolnych dni i wytrwania do kolejnych wakacji 😉 Nauczycielom za to wyrozumiałości, no.. chociaż pewnie bardziej cierpliwość się przyda. Jak wy dajecie radę z tyloma.. hehe 😅 Rodzicom też cierpliwości i wytrwałości, aby wam się chciało na te wywiadówki chodzić no i pamiętajcie polecić swoim dzieciom mój blog, aby wyrosły na utalentowanych i samodzielnych programistów 😘 <sub>&#8211; będą dużo zarabiać to wam się dołożo do wakacji</sub></p>



<p>Dziękuję i do kolejnego! Meow 😺</p>Artykuł <a href="https://enterv.pl/2022/08/30/programowanie-jak-nazywac-aby-wiedziec-po-roku-o-co-chodzilo/">Semantyka w kodzie, by po roku było nadal jasno</a> pochodzi z serwisu <a href="https://enterv.pl">enterv.pl</a>.]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Jak zostałem programistą &#8211; historia</title>
		<link>https://enterv.pl/2022/08/06/jak-zostalem-programista/</link>
					<comments>https://enterv.pl/2022/08/06/jak-zostalem-programista/#comments</comments>
		
		<dc:creator><![CDATA[enterv]]></dc:creator>
		<pubDate>Sat, 06 Aug 2022 13:12:03 +0000</pubDate>
				<category><![CDATA[Ciekawostki]]></category>
		<category><![CDATA[Pozostałe]]></category>
		<category><![CDATA[Praca]]></category>
		<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[ciekawostki]]></category>
		<category><![CDATA[Czas stworzenia pierwszej gry]]></category>
		<category><![CDATA[Jak zacząłem pracować jako programista]]></category>
		<category><![CDATA[Kiedy zacząłem programować]]></category>
		<category><![CDATA[nauka]]></category>
		<category><![CDATA[Od zera do programera]]></category>
		<category><![CDATA[Ogarnięcie tego jak mało wiedziałem]]></category>
		<category><![CDATA[praca]]></category>
		<category><![CDATA[praca programisty]]></category>
		<category><![CDATA[programowanie]]></category>
		<category><![CDATA[Rezygnacja]]></category>
		<guid isPermaLink="false">https://enterv.pl/?p=267</guid>

					<description><![CDATA[<p>Cześć moi mili 😄 Dzisiaj opowiem wam historię o tym jak zostałem programistą. Będzie to niezwykła podróż od ekscytacji i determinacji do &#8222;wszystkojedności&#8221; i obojętności wobec przeciwności losu, aż w końcu miałem napad euforii i kilka zmian pracy 🙂 A zaczęło się.. .. od tego, jak byłem małym kilkuletnim szkrabem: od bombelka miałem styczność z [&#8230;]</p>
Artykuł <a href="https://enterv.pl/2022/08/06/jak-zostalem-programista/">Jak zostałem programistą – historia</a> pochodzi z serwisu <a href="https://enterv.pl">enterv.pl</a>.]]></description>
										<content:encoded><![CDATA[<p>Cześć moi mili 😄</p>



<p>Dzisiaj opowiem wam historię o tym jak zostałem programistą. Będzie to niezwykła podróż od ekscytacji i determinacji do &#8222;wszystkojedności&#8221; i obojętności wobec przeciwności losu, aż w końcu miałem napad euforii i kilka zmian pracy 🙂</p>



<h2 class="wp-block-heading">A zaczęło się..</h2>



<p>.. od tego, jak byłem małym kilkuletnim szkrabem: od <em><a rel="noreferrer noopener" href="https://pl.wiktionary.org/wiki/bombelek" data-type="URL" data-id="https://pl.wiktionary.org/wiki/bombelek" target="_blank">bombelka</a></em> miałem styczność z grami. To były czasy kiedy nie każdy miał komputer, no ale my mieliśmy konsolę PlayStation &#8211; ten wielki szary klocek do grania 😆 &#8211; wtedy poznałem legendarne produkcje takie jak Spyro The Dragon czy Crash Bandicoot oraz Tomb Raider. To było moje <a rel="noreferrer noopener" href="https://pl.wiktionary.org/wiki/bombelek" target="_blank"><em>bombelkowe</em></a> top 3 gier na PS one i były takie achy i ochy, bo mieliśmy jeszcze telewizor kineskopowy czarno-białym wyświetlaniem 🤣 &#8211; to były piękne czasy. Potem nastały kolorowe, bo kilka (tak ze 2-3) później był już kolorowy wyświetlacz &#8211; oczywiście dalej CRT.</p>



<p>Gierki się grało i oczka się psuło, aż w końcu każdy musiał mieć PC w domu. My mieliśmy takiego farta, bo jako jedyni mieliśmy komputer o tak dużej mocy 800 MHz z trybem turbo do 1600 MHz jak i ogromny dysk twardy o pojemności 500 MB (później nawet 2 GB było) &#8211; no normalnie każdy w klasie mi zazdrościł. Na tak mocnej stacji roboczej dawało się grać bombermany jak i inne ciekawe gierki. Generalne nie za wiele ich pamiętam (z nazw), no ale opylało się to i owo. Wtedy też postanowiłem, że chcę umieć tworzyć własne gry! Jednak zanim zacząłem realizować marzenia musiało trochę czasu minąć. To był czas kiedy jeszcze nie było tak dobrego internetu jak dzisiaj, a no i nie było aż tak dużo wiedzy na tym internecie. 100 kbps to czasami był szczyt szybkości. Dzisiaj jak ktoś ma 2 Mbps to często narzeka na powolność działania 😂 </p>



<h2 class="wp-block-heading">Czas stworzenia pierwszej gry</h2>



<p>Były to czasy burzliwe i dynamiczne, bo na polski rynek wchodziły pierwsze smartphony, które z początku były wyśmiewane, no bo jak to tak mieć tylko ekran, a gdzie klawiatura? a gdzie inne przyciski? a jak ktoś zadzwoni to jak to odebrać? no a jak się ekran zniszczy to nie zadzwonisz to co wtedy? itd., a tego typu pytań było dużo więcej. Pewnie niektórzy pamiętają, a niektórzy nie wiedzą o co mi chodzi i pewnie uważają że zmyślam 😀. Generalnie to co działo się około 13-15 lat temu było ciekawym zjawiskiem. Ja wtedy ten tradycyjny telefon komórkowy umiałem obsługiwać nie patrząc w ekranik &#8211; albo znałeś numer i go wpisywałeś i potem kliknąłeś w przycisk słuchawki albo wchodziłeś do listy kontaktów i w pamiętałeś, który to jest numer z góry. Jeszcze można było bindować pod przetrzymanie cyfry dany kontakt i wtedy to w ogóle było z górki. Na stan dzisiejszy tak łatwo nie ma i trzeba sobie zawsze wejść w kontakty 😎 no albo zrobić sobie skrót na pulpit czy tam ekran główny.</p>



<p>Więc te 13-15 lat temu zainstalowałem sobie Game Makera &#8211; obejrzałem kilka poradników o tym jak układać schematy blokowe (takie tamtejsze programowanie) żeby coś się w grze działo i yo &#8211; moja pierwsza gra była o niszczeniu komarów! W sumie nic nadzwyczajnego &#8211; pojawiały się na ekranie komary i musiałeś je myszką łapać &#8211; tak się zbierało punkty. Obecnie takie coś tylko że lepsze umiałbym zrobić w Godot&#8230; Ej tak w sumie to dobry pomysł! Prosta gra, ale na takiej mogę się nauczyć innych rzeczy np. powiązane z shaderami i zrobić milion innych udziwnień &#8211; tylko po to, aby się czegoś nauczyć!&#8230;</p>



<p>Wracając &#8211; jeden, z tamtych czasów, znajomy pokazał mi silnik RPG Maker i to było to co wtedy odpowiadało moim potrzebom &#8211; tak w końcu coś gdzie będę mógł stworzyć.. w sumie to chyba szkoda gadać, bo generalnie nic ciekawego mi nie wyszło. Jedną z lepszych gier jakie mi się udało na tym silniku zrobić wyszła dopiero dwa lata temu (wiadomość dla ludzi z przyszłości: pamiętajcie że ten wpis napisałem w 2022). Ale dobra. W sumie te 14 lat temu nic nie umiałem, także luz. </p>



<h2 class="wp-block-heading">Kiedy zacząłem programować?</h2>



<p>Skończyły się czasy gimbazy, były wakacje i szykowałem się do technikum &#8211; wtedy też pomyślałem, że się coś poduczę pod program nauczania i w ten oto sposób poznałem język Pascal! O nim w zasadzie nie ma co dużo mówić, bo jest bardzo niszowy, a jego konkurent język C wygrał i jest popularny dalej i to już było wiadomo te wiele lat temu. No ale cóż &#8211; i tak trzeba było umieć, bo oceny itd.</p>



<p>W języku Pascal moim najbardziej zaawansowanym projektem był program do rysowania w CMD. Dzisiaj ten sam wyczyn i w PHP bym mógł zrobić, a nawet to JPG czy SVG umiałbym to eksportować i mieć (bo mój pascalowy program nie miał zapisywania). Technikum był to czas kiedy uczyliśmy się tworzyć różne kalkulatory. Jednak wtedy to i tak to wszystko słabo umiałem i niewiele rozumiałem. Jednak coś dalej robiłem i kodu starałem się nie bać</p>



<h2 class="wp-block-heading">Rezygnacja</h2>



<p>Kiedy skończyłem technikum musiałem odnaleźć się w prawdziwym życiu. Od pracy dorywczej do pracy dorywczej żyjąc marzeniami o tym że będę świetnym programistą (jeszcze nie umiejąc programować obiektowo &#8211; co jest to bardzo ważna umiejętność) zmagałem się z kolejnymi odmowami na rynku pracy. Wtedy postanowiłem już zrezygnować z marzeń i poszedłem do urzędu pracy, po skierowanie na kurs. Wybrałem CNC. Jak na zielonego w temacie to jakoś się w tym odnalazłem, gdy dostałem się na staż. W między czasie uczyłem się programowania w PHP i programowania obiektowego oraz frameworków. Jednak coś poszło nie tak: w wypadku złamałem palec co w rezultacie przerwało staż i musiałem coś zrobić.</p>



<h2 class="wp-block-heading">Jak zacząłem pracować jako programista?</h2>



<p> &#8211; Ryzyk fizyk &#8211; pomyślałem i napisałem od nowa CV pod to całe programowanie. Wpisałem tam wszystko co wiedziałem o PHP i frameworku Yii. Wpisałem tam jakie książki przerabiałem i co z nich się nauczyłem &#8211; co umiałem i jakie jeszcze książki przerabiałem i co chcę się nauczyć i.. SUKCES!</p>



<p>Podczas rozmowy kwalifikacyjnej, którą m.in. przeprowadzał 2m człowiek, po usłyszeniu standardowego &#8211; Będziemy się z tb. kontaktować &#8211; coś we mnie pękło. Pomyślałem, że znowu chcą mnie odesłać z kwitkiem, więc na spokojnie wstałem, podszedłem do tego dwumetrowca i powiedziałem mu w prosto oczy:</p>



<p> &#8211; Mi bardzo zależy na tej pracy &#8211; Na co on</p>



<p> &#8211; Wiem i oddzwonimy w ciągu kilku dni. Obiecuję</p>



<p>Tego się nie spodziewałem i chyba on też. Jednak dobra, to była dla mnie też nowa sytuacja, więc uwierzyłem mu na słowo i bez żadnych agresji wychodząc pozdrowiłem i w domu zacząłem czekać przy okazji kontynuując naukę.</p>



<p>Minął jeden dzień i tu dzwonienie. Nic nie pomyślałem tylko odebrałem. Usłyszałem znajomy głos pana dwumetrowego</p>



<p> &#8211; Dzień dobry. Chcemy Ciebie zatrudnić. Czy jesteś zainteresowany?</p>



<p>Poziom euforii wskoczył z poziomu dno na poziom jak stąd do Jowisza. Oczywiście się zgodziłem. Umówiliśmy się na spisanie umowy i tam inne warunki i też odbyło się wprowadzenie do firmy. Nigdy też nie zapomnę tej daty rozpoczęcia pracy, bo rozmowie sprawdziłem czy był to Prima Aprilis &#8211; no słuchajcie no był ten dzień🤣 </p>



<p>Mimo wyjątkowego dnia na żarty to to zatrudnienie nim nie było. Mijały miesiące i dostawałem wynagrodzenie &#8211; więc tak &#8211; wszystko było jak należy.</p>



<h2 class="wp-block-heading">Ogarnięcie tego jak mało wiedziałem</h2>



<p>Z początku praca jednak łatwa nie była. Pierwsze dni to był ból głowy, bo musiałem uczyć się strasznie dużo w bardzo krótkim czasie. Wtedy sobie zdałem sprawę jak bardzo mało umiem. Moja głowa była wtedy bardzo napuchnięta, a każdy dzień był wyjątkowy inaczej.</p>



<p>Z tygodnia na tydzień było jednak coraz łatwiej, a moje myślenie zaczęło powoli wracać do normy.. no nie do końca, bo wtedy to miałem wrażenie jakby mój mózg się ruszał. Układałem kolejne to coraz lepsze mechanizmy.</p>



<p>Po dwóch latach zmieniłem zatrudnienie, gdzie bardziej się dowiedziałem o strukturach pracy przy wytwarzaniu oprogramowania jak. Poznałem kilka dosyć ciekawych narzędzi, wspomagające wspólne programowanie jak i dowiedziałem się co nie co o mocy planowania.</p>



<p>Po kolejnych dwóch latach &#8211; czyli stan dzisiejszy znowu zmieniłem zatrudnienie i jestem gdzie jestem, a do nauki znowu sporo rzeczy. To co się działo w tamtych firmach niewątpliwie wpłynęło na to co wiem i umiem. Wiem, że nie napisałem większych szczegółów, ale wiecie &#8211; też nie mogę 😅 &#8211; mimo tego wiem że stałem się dużo lepszym programistą niż tym, którym byłem 4 lata temu.</p>



<p>Dowiedziałem się, że znajomość samego języka czy też frameworka nie zrobia ze mnie kogoś, kto wie jak programować. To są tylko narzędzia, cel i plan to są już inne rzeczy. Sposób użycia narzędzi tych też coś innego. Teraz zamiast pisać na ślepo kod realizujący daną rzecz, myślę nad tym jak on ma wyglądać. Co w nim jest potrzebne? Zgłębiam kolejne zagadnienia programowania ze sztuką i czuję, że to jest to. &#8222;Ja to lubić&#8221;.</p>



<h2 class="wp-block-heading">Podsumowanie</h2>



<p>Więc, z tej ścinany tekstu wychodzi morał taki: ucz się ucz, ale ucz się na prawdę, a nie jak do szkoły i ucz się tego co lubisz i sprawia ci przyjemność. Pracuj w tym, a jak się nie uda to trudno, zawsze można znowu spróbować. 😄</p>



<p>Dziękuję, że jesteście i daliście radę z tą ścianą tekstu. Jesteście niesamowici! 😘</p>Artykuł <a href="https://enterv.pl/2022/08/06/jak-zostalem-programista/">Jak zostałem programistą – historia</a> pochodzi z serwisu <a href="https://enterv.pl">enterv.pl</a>.]]></content:encoded>
					
					<wfw:commentRss>https://enterv.pl/2022/08/06/jak-zostalem-programista/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title>Sztuczna inteligencja w programowaniu</title>
		<link>https://enterv.pl/2022/07/26/ai-w-programowaniu/</link>
		
		<dc:creator><![CDATA[enterv]]></dc:creator>
		<pubDate>Tue, 26 Jul 2022 13:30:00 +0000</pubDate>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[ai podpowiada kod]]></category>
		<category><![CDATA[ai w porgramowaniu]]></category>
		<category><![CDATA[copilat]]></category>
		<category><![CDATA[dev]]></category>
		<category><![CDATA[github copilot]]></category>
		<category><![CDATA[podpowiadanie kodu przez ai]]></category>
		<category><![CDATA[programowanie]]></category>
		<category><![CDATA[szybsze programowanie]]></category>
		<category><![CDATA[tabnine]]></category>
		<guid isPermaLink="false">https://enterv.pl/?p=210</guid>

					<description><![CDATA[<p>Meow moi kochani mistrzowie od kodowania. Dzisiejszy wpis będzie poświęcony ukochanej sztucznej inteligencji 💚 Oczywiście póki co nie ma co się bać tym że AI zastąpi programistów, przecież jeszcze nie umieją się domyślać o co chodzi w założeniach biznesowych 😄 Ale! Można zacząć się zaopatrywać jako operator sztucznej inteligencji albo uczyć się ją.. uczyć? &#8211; [&#8230;]</p>
Artykuł <a href="https://enterv.pl/2022/07/26/ai-w-programowaniu/">Sztuczna inteligencja w programowaniu</a> pochodzi z serwisu <a href="https://enterv.pl">enterv.pl</a>.]]></description>
										<content:encoded><![CDATA[<p>Meow moi kochani mistrzowie od kodowania.</p>



<p>Dzisiejszy wpis będzie poświęcony ukochanej sztucznej inteligencji 💚 Oczywiście póki co nie ma co się bać tym że AI zastąpi programistów, przecież jeszcze nie umieją się domyślać o co chodzi w założeniach biznesowych 😄 Ale! Można zacząć się zaopatrywać jako operator sztucznej inteligencji albo uczyć się ją.. uczyć? &#8211; no pewnie programować.</p>



<p>Weżniemy pod lupę GitHub Copilot oraz Tabnine i omówię ich darmowe wersje.</p>



<p>Będę od czasu do czasu pisać o szczegółach technicznych, ale gdyby coś było niezrozumiałe to sekcja komentarzy jest wasza 😀</p>



<h2 class="wp-block-heading">Na co AI w programowaniu?</h2>



<p>A no właśnie, dobre pytanie. Cel wykorzystania AI w programowaniu jak i wszędzie indziej jest podobny &#8211; ułatwić sobie życie. Wygląda to na taki ewolucyjny &#8222;must have&#8221;, abyśmy jako cywilizacja mogli dalej prężnie rozwijać się. Więc skoro to jest do ułatwiania życia to tak: w programowaniu ułatwia pisanie kodu zgodnie ze sztuką i pewnymi zasadami 🙂</p>



<h2 class="wp-block-heading">Tabnine</h2>



<p>Jest to pierwsze AI jakie się natknąłem w świecie programowania. Generalnie w wersji darmowej podpowiada nam kod, że tak to uproszczę, jedno-linijkowo. Jego instalacja i użytkowanie jest bajecznie proste.</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="541" src="https://enterv.pl/wp-content/uploads/2022/07/image-1024x541.png" alt="" class="wp-image-212" srcset="https://enterv.pl/wp-content/uploads/2022/07/image-1024x541.png 1024w, https://enterv.pl/wp-content/uploads/2022/07/image-300x158.png 300w, https://enterv.pl/wp-content/uploads/2022/07/image-768x405.png 768w, https://enterv.pl/wp-content/uploads/2022/07/image.png 1237w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Tabnine: szeroka gama integracji z różnymi środowiskami</figcaption></figure>



<p>Tabnine potrafi się domyśleć z kontekstu twojego kodu to jaki masz zamiar. Dosyć często upraszcza pisanie tzw. nudnego kodu, czyli rzeczy, które wiadomo że muszą być i zawsze wynikają z innego fragmentu kodu.</p>



<p>Technicznej rzecz biorąc to po tym jak zaczniesz pisać danią linie kodu (lub jej fragment np. argumenty) to AI pokaże listę propozycji tego jak można zakończyć tą linie kodu.  Ja stosując z PHP 7.4, gdzie nie da się jeszcze w argumencie konstruktora zrobić zasięg i przypisanie własności klasy jestem zmuszony pisać to po staremu, ale dzięki temu że mam wcześniej własności napisane to AI podpowiada mi co przyjmuje konstruktor oraz w jego ciele podpowiada mi przypisanie do własności i to tylko pisząc jeden znak co jedną linię kodu &#8211; nieźle tabnine. Oczywiście gettery i settery gdy tylko sobie je zacznę pisać też nieźle podpowiada. Jeszcze potrafi podpowiadać wykorzystanie innych obiektów i ich metod oraz własności.</p>



<p>Jeśli chodzi o to ile razy to AI mi się przydało to powiem, że około 36% kodu napisałem dzięki niemu:<br> &#8211; Ale chwila! &#8211; krzyknął pan w tylnym rzędzie &#8211; przecież tak chwaliłeś to AI, a tu tylko 36% kodu?<br> &#8211; No tak &#8211; zacząłem &#8211; ale proszę wziąć pod uwagę to, że ja dziennie tego kodu piszę dosyć sporo, nawet do 500 linijek dziennie, co po przeliczeniu daje nam około 180 linijek wspomaganych przez AI. Też są dni, kiedy wykorzystuję to AI bardziej, a tez dni kiedy dużo mniej, a i też zaznaczam że to darmowa wersja. Płatna jest o wiele wiele lepsza i wykorzystuje cały kod z internetu (a dokładnie to tylko z GitHub) do podpowiadania.</p>



<p>Czy polecam Tabnine? Tak, ale nie początkującym programistom. Takie podpowiadanie wiąże się z tym, że się człowiek gorzej uczy, ale jeśli chcesz albo musisz coś szybciej wykonać no to wtedy masz to 😉</p>



<p>Czy Tabnine ma wady? W moim przypadku jest jedna rażąca wada, ale to nie jest jakieś straszne: nie podpowiada mi namespaców (przestrzeni nazw), ale tutaj nie ma co płakać, bo to umie robić sam z siebie mój edytor, w którym pisze kod 😁</p>



<h2 class="wp-block-heading">GitHub Copilot</h2>



<p>To AI jest bardzo potężne! Miałem ten zaszczyt wypróbować wersję trail na 3 miesiące i o cie, jakie to mocne! Mogę powiedzieć, że Tabnine to przy tym pryszcz (aczkolwiek da się używać obu na raz). Copilot na podstawie nazwy klasy i całego kodu (nie tylko twojego) podpowiadać zgodnie ze sztuką i z pewnymi Twoimi zamiarami listę własności, całe metody, instrukcje warunkowe &#8211; ogólnie to co zaczynasz pisać to podpowiada jak tego użyć i z czym. Ledwo zaczynasz pisać nazwę klasy, a ten myk podpowiada własności i konstruktor. Piszesz command handler? Myk i gotowy!</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="789" src="https://enterv.pl/wp-content/uploads/2022/07/image-1-1024x789.png" alt="" class="wp-image-214" srcset="https://enterv.pl/wp-content/uploads/2022/07/image-1-1024x789.png 1024w, https://enterv.pl/wp-content/uploads/2022/07/image-1-300x231.png 300w, https://enterv.pl/wp-content/uploads/2022/07/image-1-768x592.png 768w, https://enterv.pl/wp-content/uploads/2022/07/image-1.png 1178w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Przykład Copilota ze strony GitHub</figcaption></figure>



<p>Załóżmy że masz Bundle (taki segregator pod różny kod) o nazwie UserBundle i tam masz encję User, repozytorium UserRepository i chcesz napisać Command i Command handler pod utworzenie nowego Usera. No to na spokojnie &#8211; tworzysz sobie foldery i inne tego typu, a w nich plik Command i co się dzieje? Ledwo napiszesz słowo class, a to już podpowiada nazwę CreateUserCommand oraz własności, jakby po prostu czytał w myślach że chcesz napisać DTO &#8211; ok akceptujesz to co ci się podoba, resztę wywalasz (dosyć często podpowiadanie jest nadmiarowe) i masz w 1 sekundę coś co się pisze trochę dłużej 😄</p>



<p>Czy po tych bardziej skomplikowanych nazwach czujecie co się dzieje? Czujecie tę moc?</p>



<p>Osobiście po utracie tego triala zacząłem lamentować, bo mój przyjaciel od kodu zniknął. Jednakże jest promień nadziei, że kiedyś sobie wykupię dostęp do tego narzędzia, do tego AI.</p>



<p>Komu polecam GitHub Copilot? No chyba leniom, co chcą pisać dużo kodu, w dobrej jakości w relatywnym krótkim czasie. Natomiast też odradzam początkującym, którzy na pewno nie będą wiedzieć co z tego kodu jest potrzebne, a co można wywalić i też nie będą do końca wiedzieć o co w nim chodzi. </p>



<h2 class="wp-block-heading">Inne AI podpowiadające kod</h2>



<p>Wiem że jest jeszcze Kite, ale to pominąłem ze względu na to, że ani razu tego nie użyłem. Wiecie: trudno się pisze o czymś czego się nie poznało. No ale może ktoś z was już próbował? Dajcie znać 😎</p>



<h2 class="wp-block-heading">Podsumowanie</h2>



<p>Oto jest nagroda za przeczytanie mojego wpisu 😘</p>



<p>To jak działa sztuczna inteligencja i jak bardzo jest trafna oczywiście wymaga czasu, ale już dzisiaj potrafi bardzo wiele. Tak jak widzieliście, odradzam stosowanie AI początkującym programistom, ale tylko dlatego, aby mieli większą szansę więcej się nauczyć. Osobom, które znają podstawy w tym OOP i kilka wzorców projektowych oraz przynajmniej kilka zasad programowania (przynajmniej samo SOLID) mogę takie AI polecić &#8211; wtedy czuć, że ten kod coś znaczy 😄</p>



<p>Dziękuję bardzo, że jesteście ze mną i do następnego!</p>Artykuł <a href="https://enterv.pl/2022/07/26/ai-w-programowaniu/">Sztuczna inteligencja w programowaniu</a> pochodzi z serwisu <a href="https://enterv.pl">enterv.pl</a>.]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
