<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Poznaj dev</title>
    <description>The latest articles on DEV Community by Poznaj dev (@poznaj-dev).</description>
    <link>https://dev.to/poznaj-dev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F5173%2F8923acd3-8c76-460e-8870-8d1bc12731a9.png</url>
      <title>DEV Community: Poznaj dev</title>
      <link>https://dev.to/poznaj-dev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/poznaj-dev"/>
    <language>en</language>
    <item>
      <title>Jak zacząć mówić w języku obcym</title>
      <dc:creator>Marcin Wosinek</dc:creator>
      <pubDate>Wed, 17 Aug 2022 04:22:00 +0000</pubDate>
      <link>https://dev.to/poznaj-dev/jak-zaczac-mowic-w-jezyku-obcym-17in</link>
      <guid>https://dev.to/poznaj-dev/jak-zaczac-mowic-w-jezyku-obcym-17in</guid>
      <description>&lt;p&gt;Oto opowieść o nauce języka, która urzeczywistnia się nader często: uczysz się języka jakiś czas (mówimy tu o miesiącach lub nawet latach), ale nie umiesz wydusić z siebie najprostszego zdania. Jeśli jednak spojrzeć na to, jak wygląda przeciętna lekcja języka obcego, nie ma tu powodów do zdziwienia.&lt;/p&gt;

&lt;p&gt;Na większości moich zajęć językowych w szkole nauczyciel skupiał się bardzo mocno na:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;czytaniu artykułów na różne tematy – rzadko na takie, którymi byłbym choć trochę zainteresowany,&lt;/li&gt;
&lt;li&gt;uczeniu się teorii gramatyki,&lt;/li&gt;
&lt;li&gt;robieniu ćwiczeń, żeby „ćwiczyć” w tak sztucznym środowisku, że bardziej sztucznie się nie dało.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Jeśli już dochodziło do konwersacji, to głównie z innymi uczniami – którzy byli na podobnym (zbyt niskim) poziomie znajomości języka obcego.&lt;/p&gt;

&lt;p&gt;Większość korepetycji polegała na tym samym – znowu była to strata czasu, ale uczęszczanie na nie wystawiało przynajmniej na kontakt z językiem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Moja droga w nauce języka
&lt;/h2&gt;

&lt;p&gt;Języka zacząłem się uczyć w typowy sposób – język angielski w szkole państwowej ze szczyptą pomocy w domu, a potem ze wsparciem w postaci dodatkowych zajęć w szkole językowej. Miałem dobre oceny, ale praktycznie nie potrafiłem mówić.&lt;/p&gt;

&lt;p&gt;Wszystko się zmieniło, kiedy zmieniłem szkołę językową na taką, gdzie uczono metodą bezpośrednią – skupioną na zachęcaniu uczniów do &lt;em&gt;rozmawiania&lt;/em&gt; w czasie zajęć. Odblokowało to moją zdolność mówienia i po raz pierwszy miałem możliwość uczenia się, w jaki sposób używać elementów słownictwa i gramatyki w konwersacji.&lt;/p&gt;

&lt;p&gt;Mniej więcej w tym samym czasie odkryłem program do powtarzania słówek – skuteczny sposób wkuwania słownictwa. Byłem tak zachwycony skutecznością nauki języka „po mojemu”, że zrobiłem z tego hobby, które trwało kilka dobrych lat. W tym czasie odstawiłem język angielski na bok i zacząłem się uczyć od zera francuskiego. Potem przeszedłem do niemieckiego – tym razem uzbrojony w szczerą chęć nauki. W okresie mojej „świetności” całkiem nieźle mówiłem po niemiecku i francusku, a stosowanie tych języków było istotnym elementem mojego życia towarzyskiego – mimo że mieszkałem w Krakowie.&lt;/p&gt;

&lt;p&gt;Ostatnim językiem, do którego się przyłożyłem, był język hiszpański, po tym, jak wyjechałem do Hiszpanii. Mimo że nie byłem już wtedy zafascynowany nauką języków, zanurzenie w naturalnym środowisku języka i ludzie zachęcający do jego nauki bardzo mnie motywowały.&lt;/p&gt;

&lt;h2&gt;
  
  
  W jaki sposób uczyłbym się kolejnego języka teraz?
&lt;/h2&gt;

&lt;p&gt;Tak więc nauczyłem się, jak uczyć się języków, na przykładzie angielskiego, a potem dopracowałem swoje metody, ucząc się francuskiego, niemieckiego i hiszpańskiego. Jak działałbym teraz, gdybym wrócił do uczenia się języków?&lt;/p&gt;

&lt;h3&gt;
  
  
  Kilka e-lekcji w tygodniu
&lt;/h3&gt;

&lt;p&gt;Mamy obecnie dostęp do ogromnej liczby platform e-learningowych – na przykład &lt;a href="https://bit.ly/italki11"&gt;italki&lt;/a&gt; – i możemy w rezultacie kontaktować się z rodzimymi użytkownikami języka, którego się uczymy, niezależnie od naszego miejsca zamieszkania. Chodziłbym na &lt;em&gt;kilka&lt;/em&gt; zajęć w tygodniu. Gdybym musiał liczyć się z wydatkami, ograniczyłbym je do 30- lub 45-minutowych sesji, ale poumieszczałbym je w różne dni tygodnia, aby mieć regularny kontakt z językiem.&lt;/p&gt;

&lt;p&gt;Wiem, że nie potrzebuję dużo wyjaśnień opartych na teorii, więc zdecydowałbym się na tańszych nauczycieli, którzy nie zajmują się nauczaniem zawodowo. Opcja ta byłaby nie tylko tańsza – dzięki niej uniknąłbym sytuacji, w których nauczyciel wnosiłby w moje lekcje nawyki nabyte w szkole, czego chciałbym uniknąć: na przykład tracenia czasu w ilościach sporych na omawianie subtelności gramatycznych. Chciałbym mieć opanowaną gramatykę – ale na poziomie intuicyjnym, a nie analitycznym.&lt;/p&gt;

&lt;h3&gt;
  
  
  Skup się na mówieniu
&lt;/h3&gt;

&lt;p&gt;Moje lekcje skupiałyby się tylko na rozmawianiu. Pierwszymi frazami, których bym się nauczył, byłyby:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;„jak powiedzieć...?”&lt;/li&gt;
&lt;li&gt;„co to znaczy...?”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dzięki temu mógłbym zacząć używać języka docelowego już od pierwszych zajęć. &lt;/p&gt;

&lt;p&gt;O czym bym mówił? Przy odrobinie szczęścia miałbym z nauczycielem na tyle dużo wspólnego, że rozmowa sama by się kleiła. Jeśli nie, zawsze znalazłyby się tematy, na które mógłbym się wypowiedzieć:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;kim jestem, &lt;/li&gt;
&lt;li&gt;co robię,&lt;/li&gt;
&lt;li&gt;jakie mam plany na następny weekend,&lt;/li&gt;
&lt;li&gt;czym się ostatnio zajmowałem,&lt;/li&gt;
&lt;li&gt;aktualności, które dominują ostatnio wszystkie rozmowy – nie jakiekolwiek, ale te, o których nie da się nie mówić.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Są to dokładnie te rzeczy, o których się mówi, kiedy spotyka się obcokrajowca, z którym chce się porozmawiać lub z którym trzeba coś załatwić: ludzie, z którymi spędzasz czas na wakacjach, teściowie, ludzie, z którymi rozmawiasz na spotkaniach za granicą itd.&lt;/p&gt;

&lt;h3&gt;
  
  
  Notuj
&lt;/h3&gt;

&lt;p&gt;Za każdym razem, gdy nauczyciel zwróciłby mi uwagę na nowe słówka czy wyrażenia, zapisywałbym je, żeby potem móc je powtarzać po godzinach. Kiedy intensywnie uczyłem się języka hiszpańskiego, miałem przyczepiony do ściany łańcuszek notatek, które starałem się czytać kilka razy dziennie. Same notatki przydawały się też podczas lekcji – jeśli ciągle zapominałem jakiegoś słowa, mogłem je po prostu znaleźć w swoich zapiskach.&lt;/p&gt;

&lt;h3&gt;
  
  
  Powtarzaj z innym nauczycielem
&lt;/h3&gt;

&lt;p&gt;W idealnym świecie każda moja lekcja w tygodniu byłaby z innym nauczycielem. W ten sposób mógłbym nauczyć się nowych słówek dotyczących tematów poruszanych u jednego nauczyciela, a potem mógłbym je wykorzystać, opowiadając o tym samym drugiemu nauczycielowi. Oprócz tego istniałoby dużo mniejsze prawdopodobieństwo, że skończyłyby mi się tematy do rozmowy z kimś, kogo widzę tylko raz, a nie kilka razy w tygodniu.&lt;/p&gt;

&lt;h2&gt;
  
  
  Korzystaj z programów do nauki słownictwa
&lt;/h2&gt;

&lt;p&gt;Powtarzanie w określonych odstępach czasu to świetny sposób na optymalizację nauki. Chodzi o powtarzanie słówek dokładnie w momencie, kiedy zaczynają zamazywać się w pamięci: z jednej strony dojdzie do ich zapamiętania, a z drugiej – nie będziesz spędzał nad nimi zbyt dużo czasu. Występują też papierowe wersje takich systemów, ale najskuteczniejszym sposobem jest zaprzęgnięcie do współpracy aplikacji, która zrobi wszystko za Ciebie. Przykłady programów:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://bit.ly/SuperMemo11"&gt;SuperMemo&lt;/a&gt; – płatny program, z którego często korzystałem podczas nauki języka angielskiego, francuskiego i niemieckiego,&lt;/li&gt;
&lt;li&gt;
&lt;a href="//bit.ly/Anki11"&gt;Anki&lt;/a&gt; – darmowy program na licencji open source, szczególnie przydatny, jeśli chcesz tworzyć własne listy słówek.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Obie aplikacje pytają o słówka, które powinieneś już znać, co pozwala na sprawdzenie swojej wiedzy, którą następnie oceniasz. Na podstawie tej oceny program umieszcza słówko w kalendarzu powtórek wcześniej, jeśli go nie pamiętałeś, albo później, jeśli je zapamiętałeś.&lt;/p&gt;

&lt;p&gt;Co najbardziej spodobało mi się w SuperMemo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pliki audio dla wszystkich słówek i przykładowe zdania – mogłem je powtarzać ze słuchu, nie tracąc czasu na rozszyfrowywanie alfabetu fonetycznego,&lt;/li&gt;
&lt;li&gt;rozmiar baz danych – na wszystkich poziomach nauki aplikacja oferowała dziesiątki tysięcy słówek,&lt;/li&gt;
&lt;li&gt;powtarzanie w określonych odstępach czasu.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Niestety dla rzadszych języków dostępnych było mniej materiałów – na przykład do nauki języka angielskiego i francuskiego można wybierać z nieprzebranej bazy zasobów, ale nie ma już takiego luksusu w przypadku języka polskiego czy baskijskiego.&lt;/p&gt;

&lt;h2&gt;
  
  
  Jakie są Twoje wskazówki do nauki języków obcych?
&lt;/h2&gt;

&lt;p&gt;Jak do tej pory szło Ci uczenie się języków? Masz jakieś wskazówki, którymi warto podzielić się z innymi czytelnikami? Czekam na nie w komentarzach!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Jak czytać dokumentację</title>
      <dc:creator>Marcin Wosinek</dc:creator>
      <pubDate>Wed, 18 May 2022 04:36:46 +0000</pubDate>
      <link>https://dev.to/poznaj-dev/jak-czytac-dokumentacje-26oj</link>
      <guid>https://dev.to/poznaj-dev/jak-czytac-dokumentacje-26oj</guid>
      <description>&lt;p&gt;Jeśli zadajesz pytania, na które odpowiedzi można łatwo znaleźć w dokumentacji, reakcje będą zależeć od atmosfery miejsca pracy, nastawienia Twojego zespołu lub od forum, na którym piszesz. Osoby przyjaźnie nastawione odeślą Cię do źródeł. Natomiast osoby nastawione „mniej” przyjaźnie potraktują Cię skrótowcem RTFM – „przeczytaj tę &lt;em&gt;ekhem&lt;/em&gt; przyjazną instrukcję” (ang. Read The Friendly Manual) – albo prześlą Ci link do Let Me Google That For You.&lt;/p&gt;

&lt;p&gt;Lepiej nie dopuszczać do takich sytuacji.&lt;/p&gt;

&lt;p&gt;Zobaczmy zatem, jak rozwinąć umiejętność czytania dokumentacji.&lt;/p&gt;

&lt;h2&gt;
  
  
  Otwórz ją
&lt;/h2&gt;

&lt;p&gt;Najważniejsza sprawa – jeśli masz jakiekolwiek trudności w pracy, zacznij od próby znalezienia odpowiedzi w dokumentacji. Największą zaletą takiego podejścia jest skuteczność: w wielu przypadkach w ten sposób znajdziesz potrzebne informacje. Musisz oddać się lekturze i nieco poszperać. Im dalej będziesz na swojej ścieżce zawodowej, tym więcej problemów będzie stawać Ci na drodze – nie ma gotowego przewodnika po wszystkich niuansach programowania.&lt;/p&gt;

&lt;h2&gt;
  
  
  Masz jakiś problem? I bardzo dobrze!
&lt;/h2&gt;

&lt;p&gt;Większość dokumentacji jest zwykle rzeczowa do bólu, a ich zadaniem jest udzielenie odpowiedzi na ewentualne pytania – nie jest to porywająca lektura. Dużo łatwiej skupić się na niej, kiedy szukasz rozwiązania problemu.&lt;/p&gt;

&lt;p&gt;Nie cierpię czytać dokumentacji tylko po to, żeby rozeznać się w projekcie. Nie ma znaczenia, czy chodzi o nowy projekt, czy o nieznaną mi bibliotekę. Mam wrażenie, że to strata czasu, bo nie mam kontekstu, na którym mógłbym się oprzeć, i trudno jest zrozumieć powiązania między rzeczami, o których czytam.&lt;/p&gt;

&lt;p&gt;Wolę zrobić coś po swojemu, potknąć się i wrócić do dokumentacji z konkretnym pytaniem. W takim wypadku przynajmniej wiem, czego nie wiem, i jestem zmotywowany do uzupełnienia braków w wiedzy.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--teiD5XSh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xgd1q5ydub5v1zsea77r.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--teiD5XSh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xgd1q5ydub5v1zsea77r.jpg" alt="Image description" width="880" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Skorzystaj z funkcji wyszukiwania
&lt;/h2&gt;

&lt;p&gt;Aby szybko uzyskać informacje na temat tego, jak rozwiązać problem, na który się natknąłeś, skorzystaj z narzędzi do wyszukiwania.&lt;/p&gt;

&lt;p&gt;W przypadku bibliotek zewnętrznych możesz wykorzystać wyszukiwarki, dzięki czemu ograniczysz wyszukiwanie do strony internetowej projektu: po prostu dodaj do wyszukiwanej frazy &lt;code&gt;site:&amp;lt;domain&amp;gt;&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HBa09xSa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n50sohcrlc7ugez3i9oa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HBa09xSa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n50sohcrlc7ugez3i9oa.png" alt="Image description" width="880" height="837"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Funkcja ta działa w Google, Bing i DuckDuckGo.&lt;/p&gt;

&lt;p&gt;W dokumentacji znajdującej się w kodzie możesz zastosować te same narzędzia, z których korzystasz do przeszukiwania bazy kodu:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;wyszukiwanie w edytorze,&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ripgrep&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;git grep&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Przykład na podstawie &lt;code&gt;git grep&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s1"&gt;'http\.post'&lt;/span&gt;
src/auto/injector.js: &lt;span class="k"&gt;*&lt;/span&gt;         &lt;span class="nv"&gt;$http&lt;/span&gt;.post&lt;span class="o"&gt;(&lt;/span&gt;trackingUrl, trackedEvents&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
src/ng/http.js:     &lt;span class="k"&gt;*&lt;/span&gt;   &lt;span class="nv"&gt;$http&lt;/span&gt;.post&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/someUrl'&lt;/span&gt;, data, config&lt;span class="o"&gt;)&lt;/span&gt;.then&lt;span class="o"&gt;(&lt;/span&gt;successCallback, errorCallback&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
src/ng/http.js:     &lt;span class="k"&gt;*&lt;/span&gt; - &lt;span class="o"&gt;{&lt;/span&gt;@link ng.&lt;span class="nv"&gt;$http&lt;/span&gt;&lt;span class="c"&gt;#post $http.post}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ręczne przeszukiwanie dokumentacji ma kilka zalet:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;możesz zapoznać się z jej strukturą,&lt;/li&gt;
&lt;li&gt;znajdziesz wszystkie fragmenty dokumentacji dotyczące Twojego problemu.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_lhJYucY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/26fbu0jne4pu9fp721ld.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_lhJYucY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/26fbu0jne4pu9fp721ld.png" alt="Image description" width="880" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dokumentacja API – suchy opis metod&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wqAuRP0a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/eldcct1uxlvdig67i0sv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wqAuRP0a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/eldcct1uxlvdig67i0sv.png" alt="Image description" width="880" height="567"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Samouczek lub przewodnik dają większy kontekst.&lt;/p&gt;

&lt;h2&gt;
  
  
  Nie rozumiesz? Nic nie szkodzi!
&lt;/h2&gt;

&lt;p&gt;Dokumentacja dokumentacji nierówna. Często nie są one łatwe w odbiorze. Ich twórcy mogą zakładać, że czytelnik posiada już pewną wiedzę o systemie, i nie wszystko będzie wprost opisane. Przez takie sytuacje nowi członkowie zespołu mogą czuć się zbici z tropu.&lt;/p&gt;

&lt;p&gt;Najbardziej problematyczne okazują się projekty komercyjne &lt;em&gt;closed source&lt;/em&gt;. Jeśli za utrzymywanie bazy kodu i jej dokumentacji odpowiada niewielki zespół, mogą minąć miesiące, zanim przeczyta go nowa para oczu, próbując rozeznać się w tym wszystkim.&lt;/p&gt;

&lt;p&gt;Projekty &lt;em&gt;open source&lt;/em&gt; są zwykle „łatwiejsze w obsłudze”. Te bez dobrej dokumentacji mają mniejsze szanse na sukces.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dobry przewodnik nie jest zły
&lt;/h2&gt;

&lt;p&gt;Jeśli w projekcie dostępny jest samouczek albo przewodnik, dobrze jest z niego skorzystać. Jeśli często borykasz się z podobnym problemem, znajdź dotyczący go fragment i po prostu go przeczytaj. Dobrze zrobiony przewodnik da Ci kontekst potrzebny do pełnego zrozumienia wykorzystywanego mechanizmu.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--x0JZ-ZGQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wbjo717chjlx3nmllosx.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--x0JZ-ZGQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wbjo717chjlx3nmllosx.jpg" alt="Image description" width="880" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Zanurz się w odpowiedniej części API
&lt;/h2&gt;

&lt;p&gt;Opis API to najbardziej techniczna z dokumentacji. Jest zwykle rzeczowa i brakuje jej opisów kontekstów, w których możesz zastosować konkretną metodę. Przedstawia wszystkie klasy, metody, argumenty i dane wyjściowe będące na Twoim podorędziu.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vpnuNI7y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fveb142m3yn7n1ujy31d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vpnuNI7y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fveb142m3yn7n1ujy31d.png" alt="Image description" width="880" height="751"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Jeżeli opis ten jest dostępny, zapoznaj się z różnymi fragmentami dotyczącymi tych samych lub podobnych rzeczy. Często jest tak, że rozwiązanie polega na odesłaniu do innej metody – więc jeśli nadal nic nie wiesz po przeczytaniu jakiegoś fragmentu, sprawdź, czy opis innych metod nie będzie bardziej przydatny.&lt;/p&gt;

&lt;h3&gt;
  
  
  Wyniki
&lt;/h3&gt;

&lt;p&gt;W przypadku metod będziesz spotykał się albo ze zmianą stanu wewnętrznego obiektu, albo z danymi wyjściowymi. Przewodnik po API powinien dobrze opisywać oba te przypadki.&lt;/p&gt;

&lt;h3&gt;
  
  
  Zmiana danych wejściowych
&lt;/h3&gt;

&lt;p&gt;Często zdarza się, że metody akceptują dane wejściowe w wielu kombinacjach argumentów. Dokumentacja opisze Ci pełen wachlarz możliwości wprowadzenia wszystkiego, czego potrzebujesz.&lt;/p&gt;

&lt;h2&gt;
  
  
  Podsumowanie
&lt;/h2&gt;

&lt;p&gt;Czytanie dokumentacji jest istotną umiejętnością, której można się nauczyć tylko przez praktykę. Nie zniechęcaj się, jeśli na początku będzie Ci szło opornie; z czasem będziesz sobie radził coraz lepiej.&lt;/p&gt;

&lt;h2&gt;
  
  
  Chcesz wiedzieć więcej?
&lt;/h2&gt;

&lt;p&gt;Przeczytaj o tym, &lt;a href="https://poznaj.dev/jak-zajsc-daleko-stawiajac-male-kroki"&gt;jak zajść daleko, stawiając małe kroki&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>programowanie</category>
    </item>
    <item>
      <title>Jak pisać testy jednostkowe</title>
      <dc:creator>Marcin Wosinek</dc:creator>
      <pubDate>Wed, 27 Apr 2022 04:59:09 +0000</pubDate>
      <link>https://dev.to/poznaj-dev/jak-pisac-testy-jednostkowe-7j</link>
      <guid>https://dev.to/poznaj-dev/jak-pisac-testy-jednostkowe-7j</guid>
      <description>&lt;p&gt;Początkującym programistom starsi koledzy po fachu często radzą, aby testowali swój kod. To dobra rada – zobaczmy, jak wprowadzić ją w życie!&lt;/p&gt;

&lt;h2&gt;
  
  
  Czym są testy jednostkowe
&lt;/h2&gt;

&lt;p&gt;Testy pozwalają na ustalenie wyraźnych oczekiwań w stosunku do kodu. Dają Ci możliwość maszynowego sprawdzenia, czy Twój kod spełnia te oczekiwania.&lt;/p&gt;

&lt;p&gt;Jest to program, który weryfikuje Twój program.&lt;/p&gt;

&lt;p&gt;W przypadku projektów opartych na JavaScript będziesz zwykle korzystał z biblioteki testującej takiej jak:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Jest,&lt;/li&gt;
&lt;li&gt;Jasmine,&lt;/li&gt;
&lt;li&gt;Chai.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Są to jednak tylko narzędzia. Najważniejsze, żebyś miał na podorędziu coś, co w sposób automatyczny zweryfikuje Twoją aplikację.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jK3MPAUN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sjixinyf3nky3b6vjtpd.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jK3MPAUN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sjixinyf3nky3b6vjtpd.jpg" alt="Image description" width="880" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Jak testy jednostkowe mogą Ci pomóc
&lt;/h2&gt;

&lt;p&gt;Pisanie testów ułatwi Ci życie na cztery sposoby:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Jest to szybki i sprawdzony sposób na sprawdzenie, czy kod działa, jak należy. Nie musisz myśleć o przypadkach brzegowych, zajmą się nimi testy jednostkowe.&lt;/li&gt;
&lt;li&gt;Dobre pokrycie kodu to zawór bezpieczeństwa, który pozwala na nieco śmielszą refaktoryzację kodu. Zwiększysz w ten sposób prawdopodobieństwo tego, że Twoja baza kodu będzie znajdować się w niezmiennie dobrym stanie.&lt;/li&gt;
&lt;li&gt;Pisanie testów &lt;em&gt;jednostkowych&lt;/em&gt; zmusza Cię do myślenia o jednostkach i o tym, jak rozdzielić między nie odpowiedzialność: w rezultacie Twój kod stanie się modułowy i łatwiej będzie go utrzymać.&lt;/li&gt;
&lt;li&gt;Testy jednostkowe zrobią z Ciebie szybszego programistę. Najpierw będziesz musiał zainwestować czas na stworzenie przypadku testowego – pozwoli Ci to jednak potem na bezwysiłkowe uruchamianie go raz za razem. Inwestycja przyniesie Ci dywidendy już we wstępnej fazie programowania.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Zbuduj strukturę
&lt;/h2&gt;

&lt;p&gt;Zanim zabierzesz się za testowanie funkcjonalności, upewnij się, że możesz przetestować &lt;em&gt;cokolwiek&lt;/em&gt;. Zainstaluj bibliotekę testującą i skonfiguruj testujący skrypt. Kiedy będziesz już coś miał, zacznij tworzyć rusztowanie pod niektóre z Twoich testów. Musisz przyjąć konwencję nazewnictwa. Jeśli na przykład Twój kod znajduje się w: &lt;code&gt;my-project/plane-ticket.js&lt;/code&gt;, nazwą Twojego kodu testującego może być: &lt;code&gt;my-project/plane-ticket.spec.js&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;Zbuduj wszystko, co potrzebne do przetestowania danej klasy, a potem posprawdzaj podstawowe elementy:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;czy obiekt jest obiektem;&lt;/li&gt;
&lt;li&gt;czy funkcja jest funkcją.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dzięki temu dowiedziesz swoich umiejętności testowania.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stwórz atrapy
&lt;/h2&gt;

&lt;p&gt;Atrapa (mock) to obiekt tworzony w celu zastąpienia zależności jednostki, którą testujesz. Jeżeli na przykład testujesz funkcję &lt;code&gt;saveBlogPost&lt;/code&gt;, będzie Ci zależeć na przejęciu żądania HTTP, zanim zostanie ono wysłane przez funkcję. Będziesz chciał się dowiedzieć, przy pomocy czego Twoja funkcja wysyła żądanie, i zastąpić to atrapą. Korzystanie z atrap powinno być proste, jeżeli budujesz kod, korzystając ze wstrzykiwania zależności.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BtSXYcY5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/12d6a7l248gxikp2nhcq.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BtSXYcY5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/12d6a7l248gxikp2nhcq.jpg" alt="Image description" width="880" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Utrzymuj porządek
&lt;/h2&gt;

&lt;p&gt;Jak widzisz, w każdym teście dużo się dzieje. Możemy wyodrębnić trzy fazy całego procesu:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;tworzenie atrap;&lt;/li&gt;
&lt;li&gt;uruchamianie kodu do sprawdzenia;&lt;/li&gt;
&lt;li&gt;sprawdzanie oczekiwań.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Zachowanie tego podziału w kodzie ma sens: dzięki temu łatwiej będzie go czytać. Prostym sposobem na jego organizację jest zebranie wszystkich linii razem i dodanie komentarza określającego, jaka to część kodu.&lt;/p&gt;

&lt;h2&gt;
  
  
  Programuj w oparciu o testy – test-driven development
&lt;/h2&gt;

&lt;p&gt;Programowanie oparte na testach to często spotykane podejście pozwalające na tworzenie schludnie wyglądającego kodu z dobrym pokryciem testami. Zaczynasz od dodania testu do funkcji, zanim zostanie ona wprowadzona. Uruchamiasz testy, które powinny dać wynik negatywny – jeśli tak się nie stanie, będzie to oznaczać, że coś jest bardzo nie tak: Twoim zadaniem będzie zbadać co. Natomiast po uzyskaniu w teście wyniku negatywnego dodaj do kodu brakującą implementację. Zgodnie z założeniami problem zostanie naprawiony. Jeśli wszystko pójdzie zgodnie z planem, będzie to inwestycja w ulepszenie Twojego rozwiązania – zarówno po stronie kodu, jak i testu – bez zmieniania logiki. Pozwoli Ci to na szybką &lt;a href="https://poznaj.dev/jak-zajsc-daleko-stawiajac-male-kroki"&gt;iterację&lt;/a&gt; procesu budowania kodu i tworzenia do niego testów.&lt;/p&gt;

&lt;p&gt;Praktykowanie takiego podejścia powinno zagwarantować regularne pisanie testów do logiki. W tej sytuacji nie odczuwacz pokusy, żeby ominąć krok obejmujący pisanie testów – a dzieje się tak często, kiedy przesuwasz ich tworzenie na koniec sprintu.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--x-V1pNPv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hc0c4toe0pinshj8h9po.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--x-V1pNPv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hc0c4toe0pinshj8h9po.jpg" alt="Image description" width="880" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Wyjątki od reguły
&lt;/h3&gt;

&lt;p&gt;Aby gdzieś dotrzeć, musisz wiedzieć, dokąd idziesz. Jeżeli chcesz rozeznać się w tym, jakie rozwiązania są wykonalne, daj sobie na chwilę spokój z testami. Po rekonesansie albo je dodaj, albo podejdź do problemu jeszcze raz, tym razem opierając się na testach.&lt;/p&gt;

&lt;h2&gt;
  
  
  Brakujące testy
&lt;/h2&gt;

&lt;p&gt;Możesz mieć pecha i pracować na przestarzałym kodzie bez testów i innych środków kontroli jakości – czyli na przykład &lt;a href="https://poznaj.dev/jak-zarzadzac-delikatnym-przestarzalym-kodem"&gt;na czymś takim&lt;/a&gt;. W takim wypadku lepiej zastosować się do powiedzenia „lepiej późno niż wcale”: pracując nad bazą kodu, pisz jednocześnie testy. Idąc tą drogą, poprawisz sytuację na przyszłość, a może nawet znajdziesz podstępny bug ukryty gdzieś na rubieżach przypadków brzegowych.&lt;/p&gt;

&lt;h2&gt;
  
  
  A co z Tobą?
&lt;/h2&gt;

&lt;p&gt;Jak trudna jest dla Ciebie nauka testowania? W Internecie można spotkać się ze skargami ludzi, którzy mają problemy ze znalezieniem dobrych materiałów dydaktycznych. Daj mi znać, jak to dotychczas wyglądało u Ciebie.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>testowanie</category>
      <category>polski</category>
    </item>
    <item>
      <title>Jak zachwycić zadaniem rekrutacyjnym</title>
      <dc:creator>Marcin Wosinek</dc:creator>
      <pubDate>Wed, 20 Apr 2022 05:26:46 +0000</pubDate>
      <link>https://dev.to/poznaj-dev/jak-zachwycic-zadaniem-rekrutacyjnym-3k5f</link>
      <guid>https://dev.to/poznaj-dev/jak-zachwycic-zadaniem-rekrutacyjnym-3k5f</guid>
      <description>&lt;p&gt;Zobaczmy, jak sprawić, aby Twoje frontendowe zadanie rekrutacyjne wyszło jak najlepiej. &lt;/p&gt;

&lt;h2&gt;
  
  
  Trzymaj się tego, co umiesz najlepiej
&lt;/h2&gt;

&lt;p&gt;Perspektywa upieczenia dwóch pieczeni na jednym ogniu poprzez naukę lub ćwiczenie nowej technologii podczas starania się o pracę jest kusząca. Na pewno swego czasu dla mnie taka była. Ale to nie w taki sposób dojdziesz do kodu najlepszej jakości. Lepiej wyjdziesz na trzymaniu się tego, co znasz najlepiej, i uczeniu się nowych rzeczy przy okazji pracy nad odrębnymi projektami.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aOOboDHz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ct02lgsipr6jk8h3wtt0.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aOOboDHz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ct02lgsipr6jk8h3wtt0.jpg" alt="Image description" width="880" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dobrze wiesz, która opcja dostanie lepszą ofertę.&lt;/p&gt;

&lt;h2&gt;
  
  
  Łatwość weryfikacji
&lt;/h2&gt;

&lt;p&gt;Zrób tak, żeby Twoja praca była łatwa do sprawdzenia. Z punktu widzenia rekrutera idealny proces weryfikacji wygląda następująco:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;otrzymanie działającego linku;&lt;/li&gt;
&lt;li&gt;zobaczenie na własne oczy, że aplikacja działa, jak trzeba;&lt;/li&gt;
&lt;li&gt;zagłębienie się w kod, aby zobaczyć, jak udało Ci się to uzyskać.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Weryfikacja kodu bez wiedzy o tym, czy działa, wydaje się pozbawiona sensu. Jeżeli kod nie będzie działał prawidłowo, to, jak on wygląda, nie będzie miało większego znaczenia. Jeśli natomiast sprawdzenie, czy kod działa, będzie problematyczne, może to zniechęcić do zagłębienia się w Twoją pracę.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dP0z-C2g--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/prboxofc1tr8jwad0bl4.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dP0z-C2g--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/prboxofc1tr8jwad0bl4.jpg" alt="Image description" width="880" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Podaj im wszystko na tacy&lt;/p&gt;

&lt;h3&gt;
  
  
  Zrób coś interaktywnego
&lt;/h3&gt;

&lt;p&gt;Gdy mamy do czynienia z frontendową aplikacją, najprostszym rozwiązaniem będzie wdrożenie jej na darmowy serwer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;strony GitHub,&lt;/li&gt;
&lt;li&gt;strony GitLab,&lt;/li&gt;
&lt;li&gt;lub Netlify.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Zapomnij o wysyłaniu plików ZIP
&lt;/h3&gt;

&lt;p&gt;Przesyłanie plików ZIP jest obarczone dwiema wadami, przez które możesz odpaść już w przedbiegach:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;niewygodne rozwiązanie,&lt;/li&gt;
&lt;li&gt;otwieranie pliku ZIP stanowi zagrożenie dla bezpieczeństwa.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5zb2vhxc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n9ltic5wviu7uif5gxzn.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5zb2vhxc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n9ltic5wviu7uif5gxzn.jpg" alt="Image description" width="880" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ciekawe, co jest w środku!&lt;/p&gt;

&lt;h2&gt;
  
  
  Upewnij się, że wszystko działa
&lt;/h2&gt;

&lt;p&gt;I że działa na różnych przeglądarkach i urządzeniach. Nie musi być piękne, ale musi działać – niezależnie od tego, czy weryfikator siedzi przed komputerem, czy trzyma w ręku smartfon.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dodaj README.md
&lt;/h2&gt;

&lt;p&gt;Każdy typowy projekt potrzebuje pliku &lt;code&gt;README&lt;/code&gt;, a zadanie rekrutacyjne potrzebuje go tym bardziej. Powinieneś pokrótce przedstawić zadanie, które wykonujesz, i dodać link do działającej aplikacji. Potem możesz dodać dokumentację podsumowującą – opis frameworka, z którego skorzystałeś, oraz przedstawienie, w jaki sposób zbudować czy przetestować Twój kod.&lt;/p&gt;

&lt;h3&gt;
  
  
  Przedstaw swój sposób myślenia
&lt;/h3&gt;

&lt;p&gt;Przedstaw weryfikatorowi swój sposób rozumowania. Jeżeli korzystasz z pewnych wzorców czy dobrych praktyk, wyraźnie się do nich odnieś w dokumentacji. Jeśli w pewnym miejscu pójdziesz na kompromis, opisz go i wyjaśnij, dlaczego postąpiłeś tak, a nie inaczej.&lt;/p&gt;

&lt;h2&gt;
  
  
  Niech się błyszczy
&lt;/h2&gt;

&lt;p&gt;Aby się czymś wyróżnić, możesz dodać do swojego zadania któryś z elementów przedstawionych poniżej. Będzie to nieco wykraczać poza to, co miałeś wykonać, ale pokaże, że dobrze poruszasz się po zadaniach, które będziesz wykonywał w pracy każdego dnia.&lt;/p&gt;

&lt;h3&gt;
  
  
  Niech będzie ciekawie
&lt;/h3&gt;

&lt;p&gt;Dodaj do swojego projektu kilka ścieżek. Uwagę weryfikatora na swoim zadaniu utrzymasz dłużej poprzez dodanie kilku dodatkowych stron. Może krótkie &lt;code&gt;/about&lt;/code&gt;, żeby łatwiej mu było powiązać aplikację demonstracyjną z Twoim CV?&lt;/p&gt;

&lt;h3&gt;
  
  
  Test jednostkowy
&lt;/h3&gt;

&lt;p&gt;Konfiguracja testów jednostkowych może być świetnym elementem, na którego przykładzie pochwalisz się swoim skupieniem na jakości. Nie musisz objąć testem całego kodu: kilka testów pokazujących, że wiesz, o co chodzi, powinno wystarczyć. &lt;/p&gt;

&lt;h3&gt;
  
  
  Skonfiguruj Lint i Prettier
&lt;/h3&gt;

&lt;p&gt;Wiele profesjonalnych zespołów ujednolica swój styl programowania za pomocą automatycznych narzędzi. W przypadku front-endu będą to najpewniej ESLint &amp;amp; Prettier. Zrobienie tego samego w zadaniu rekrutacyjnym będzie miłym akcentem – jeśli w zespole znajdują się programiści, którym zależy na spójności, z pewnością to docenią.&lt;/p&gt;

&lt;h3&gt;
  
  
  Wprowadzaj rewizje, które coś wnoszą
&lt;/h3&gt;

&lt;p&gt;Git (albo, ogólniej rzecz biorąc, kontrola wersji) jest w branży IT narzędziem kluczowym do pracy zespołowej. Zespół wykorzystuje we współpracy repozytorium Git, więc dobre komunikaty o rewizjach są nieodzowne. Jeśli stworzysz historię rewizji sensowną dla zadania rekrutacyjnego, bardzo ładnie pokaże to, jak będzie wyglądać Twój wkład w projekt firmy.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5QLH37gr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d0fl1qolm8xh8efdqnxz.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5QLH37gr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d0fl1qolm8xh8efdqnxz.jpg" alt="Image description" width="880" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A co z Tobą?
&lt;/h2&gt;

&lt;p&gt;Jakim najlepszym projektem demo możesz się pochwalić? Prześlij link w komentarzach!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>beginners</category>
      <category>polish</category>
      <category>interview</category>
    </item>
    <item>
      <title>Jak współpracować z mentorem programowania</title>
      <dc:creator>Marcin Wosinek</dc:creator>
      <pubDate>Wed, 13 Apr 2022 05:37:18 +0000</pubDate>
      <link>https://dev.to/poznaj-dev/jak-wspolpracowac-z-mentorem-programowania-cd8</link>
      <guid>https://dev.to/poznaj-dev/jak-wspolpracowac-z-mentorem-programowania-cd8</guid>
      <description>&lt;p&gt;Kontakt z bardziej doświadczonym programistą, który chce Ci pomóc w rozwoju zawodowym, może znacznie przyspieszyć Twoje postępy w branży IT. Kimś takim może być:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;przyjaźnie nastawiony kolega z pracy z większym doświadczeniem,&lt;/li&gt;
&lt;li&gt;uczynny znajomy,&lt;/li&gt;
&lt;li&gt;mentor z zewnątrz – za którego usługi trzeba płacić (albo i nie).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Co zrobić, żeby wycisnąć z takiej pomocy jak najwięcej?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--B-_T1PbX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9m6o4670eqzlcein36s2.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--B-_T1PbX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9m6o4670eqzlcein36s2.jpg" alt="Image description" width="880" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Senior JS developer&lt;/p&gt;

&lt;h2&gt;
  
  
  Dziel się problemami z życia wziętymi
&lt;/h2&gt;

&lt;p&gt;Twój mentor ma dużo większe doświadczenie „w terenie” niż Ty. Może się nim z Tobą podzielić – o ile powiesz mu o swoich trudnościach. Na przykład:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;jeśli masz przed sobą wyzwanie techniczne, może Ci polecić alternatywne rozwiązania;&lt;/li&gt;
&lt;li&gt;jeśli nie zgadzasz się ze współpracownikiem, może ocenić sytuację i nakierować Cię na lepsze rozwiązanie podobnego sporu w przyszłości;&lt;/li&gt;
&lt;li&gt;jeśli jesteś przytłoczony liczbą dostępnych bibliotek, może Ci pomóc w wyborze i skupieniu się na jednej z nich;&lt;/li&gt;
&lt;li&gt;jeśli Twoja sytuacja zawodowa ma się nie najlepiej, może pomóc Ci w przygotowaniu się do rozmowy o podwyżce lub w szukaniu nowej pracy. W tym wypadku lepiej by było, gdyby mentor nie pracował w firmie, w której aktualnie pracujesz.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Bądź dobrym uczniem
&lt;/h2&gt;

&lt;p&gt;Mentoring jest przyjemny, o ile Ty – uczeń – jesteś otwarty na naukę. Zwracaj uwagę na zalecenia swojego mentora. Jeśli poleci Ci artykuł, przeczytaj go; jeśli zarekomenduje książkę, zdobądź ją i przeczytaj; jeżeli będzie wychwalał kurs, kup go i ukończ. Jeśli dostaniesz informacje zwrotne z weryfikacji kodu, przynajmniej zareaguj na jego propozycje: omów ich zalety i wady, nawet jeśli nie wykorzystasz ich akurat w tej konkretnej sytuacji.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2A9f5W_V--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/oub37vq1f4qwrie24xrg.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2A9f5W_V--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/oub37vq1f4qwrie24xrg.jpg" alt="Image description" width="880" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Traktuj mentora tak, jak traktowałbyś sowę.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ucz się... podczas nauki
&lt;/h2&gt;

&lt;p&gt;Jeżeli Twoja praca nie stanowi źródła problemów programistycznych, stwórz je sobie sam. Możesz poprosić mentora o weryfikację Twojego kodu w ramach pracy nad &lt;a href="https://poznaj.dev/jak-uczyc-sie-podczas-pracy-nad-wlasnymi-projektami"&gt;własnym projektem&lt;/a&gt;. Najlepiej byłoby, gdyby taki projekt był ogólnodostępny. Workflow mógłby wyglądać tak:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Robisz pierwszą wersję sam.&lt;/li&gt;
&lt;li&gt;Mentor daje Ci wskazówki.&lt;/li&gt;
&lt;li&gt;Wprowadzasz zmiany na ich podstawie.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Jawna praca nad własnym projektem pokazuje potencjalnemu pracodawcy trzy ważne rzeczy:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;jesteś wystarczająco zmobilizowany do dostarczenia projektu;&lt;/li&gt;
&lt;li&gt;masz pomoc z zewnątrz i Twój rozwój nie będzie opierał się wyłącznie na zasobach pracodawcy;&lt;/li&gt;
&lt;li&gt;pokazujesz, jak dobrze znosisz krytykę i jak wykorzystujesz informacje zwrotne.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A Ty?
&lt;/h2&gt;

&lt;p&gt;Jakie są Twoje doświadczenia z mentoringiem? Daj znać w komentarzach!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>mentorowanie</category>
      <category>polski</category>
    </item>
    <item>
      <title>Po co nam wiersz poleceń (CLI)</title>
      <dc:creator>Marcin Wosinek</dc:creator>
      <pubDate>Wed, 16 Mar 2022 05:56:57 +0000</pubDate>
      <link>https://dev.to/poznaj-dev/po-co-nam-wiersz-polecen-cli-1m6h</link>
      <guid>https://dev.to/poznaj-dev/po-co-nam-wiersz-polecen-cli-1m6h</guid>
      <description>&lt;p&gt;Graficzny interfejs użytkownika (GUI) stał się standardem w latach 90. XX wieku. Zastąpił on wcześniej stosowany interfejs tekstowy. Dzięki temu komputery stały się ogólnodostępne. Dlaczego więc niektórzy nadal pracują na terminalach tekstowych?&lt;/p&gt;

&lt;h2&gt;
  
  
  Pracuje się szybko
&lt;/h2&gt;

&lt;p&gt;Klawiatura to najszybsze i najdokładniejsze urządzenie do wprowadzania danych do komputera. Każdy palec ma w zasięgu kilka klawiszy i nawet przeciętny użytkownik potrafi wystukać od dwóch do trzech liter na sekundę. W porównaniu z tym mysz wypada słabo – ma tylko kilka klawiszy, rolkę i osie x i y. Nadaje się wyłącznie do wyboru opcji widocznych na ekranie, które zostały określone wcześniej. A między kliknięciami zawsze będzie kilkusekundowa przerwa.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Ws1B2bCS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kwv5lwqpjij3zkesxjuz.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Ws1B2bCS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kwv5lwqpjij3zkesxjuz.jpg" alt="Image description" width="880" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ze względu na te wady większość aplikacji graficznych zawiera skróty klawiszowe. Wydajne korzystanie z komputera wymaga nauczenia się wielu z nich na pamięć; patrzenie, jak ktoś kopiuje i przekleja pliki ręcznie, bez korzystania ze skrótów systemowych, zakrawa w dzisiejszych czasach o torturę. Większość GUI nie jest jednak dobra w uczeniu użytkownika skrótów klawiszowych – to często na jego barkach spoczywa ciężar szukania skrótów klawiaturowych dla opcji, z których korzysta najczęściej.&lt;/p&gt;

&lt;p&gt;W przypadku CLI wszystko natomiast opiera się na tekście. Niektóre aplikacje uruchamia się w jednym długim wierszu poleceń, np. Git, grep, sed itd. Inne z kolei otwiera się w interfejsie tekstowym, gdzie obsługiwane są przy pomocy skrótów klawiszowych – na przykład Vim czy Emacs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QPUnUKZU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4m2d8hviahjrhzhmoprp.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QPUnUKZU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4m2d8hviahjrhzhmoprp.jpg" alt="Image description" width="880" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Zarządzanie złożonością
&lt;/h2&gt;

&lt;p&gt;Program tekstowy obsługuje dowolną liczbę parametrów, ale wystarczy, że znasz te, które są Ci potrzebne. Zastanawiałeś się kiedyś nad tym, jak dużo takich parametrów posiada przeglądarka internetowa Chromium? Ponad 1000 (&lt;a href="https://peter.sh/experiments/chromium-command-line-switches"&gt;źródło&lt;/a&gt;). Siedzą sobie tam i czekają, aż ich użyjesz. Są one jednak zazwyczaj niewidoczne – chyba że zaczniesz wczytywać się w dokumentację.&lt;/p&gt;

&lt;p&gt;Takie bogactwo możliwości jest nieosiągalne dla aplikacji opartych na GUI. Rzadziej stosowane opcje albo zaśmiecają ekran, albo kryją się w ogromnych, wielowarstwowych menu. W rezultacie dostajemy:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;proste programy dla prostych przypadków użycia z przystępnym interfejsem
albo&lt;/li&gt;
&lt;li&gt;profesjonalne programy z przytłaczającymi interfejsami, gdzie trudno o doszukanie się nawet najprostszych z opcji.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_FZFXzy4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k0fwxz55xqw4dz9wgl15.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_FZFXzy4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k0fwxz55xqw4dz9wgl15.jpg" alt="Image description" width="880" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Skrypty
&lt;/h2&gt;

&lt;p&gt;Programy tekstowe przyjmują tekst jako dane wejściowe i dane wyjściowe oddają również w postaci tekstu. Na poziomie dane wejściowe/wyjściowe wszystkie programy CLI są kompatybilne: przy pomocy &lt;code&gt;git ls-files&lt;/code&gt; możesz wyświetlić wszystkie pliki w swoim repozytorium, a następnie zastosować &lt;code&gt;grep&lt;/code&gt;, aby je przefiltrować – wystarczy Ci do tego operator potoku:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git ls-files | grep index
home-page/index.html
registration/index.html
index.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Operator potoku daje Ci dostęp do supermocy obliczeniowych, do których świat graficzny dostępu nie ma i nigdy mieć nie będzie. Działania takie jak:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;tworzenie tysięcy folderów 
czy&lt;/li&gt;
&lt;li&gt;wyszukiwanie wszystkich plików pasujących do wzoru lub zawierających taki wzór i wykonywanie na nich wszystkich operacji&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;są całkiem proste i wymagają nieco pobuszowania w sieci, przeczytania dokumentacji i zastosowania metody prób i błędów.&lt;/p&gt;

&lt;h2&gt;
  
  
  Interfejs użytkownika
&lt;/h2&gt;

&lt;p&gt;Z tych powodów wiersz poleceń stanowi w wielu programach główny interfejs. Jako użytkownik jesteś więc niemalże zmuszony do jego stosowania. Najlepszym przykładem będzie tu Git: można dostać do niego jakieś GUI, ale korzystanie z nich tworzy jeszcze jeden poziom abstrakcji nad danymi, którymi zarządzasz. Jeśli z Gita korzystasz codziennie, nauka jego CLI da Ci bardzo dużo. Moim zdaniem GUI pozwala Ci na osiągnięcie 80% swoich celów, ale możesz też natknąć się na jeden z tych dziwniejszych przypadków, którym będziesz mógł się zająć wyłącznie przy pomocy wiersza poleceń.&lt;/p&gt;

&lt;h2&gt;
  
  
  A co z Tobą?
&lt;/h2&gt;

&lt;p&gt;Jakie masz doświadczenia z CLI? Jakich rzeczy chciałbyś się w ich zakresie nauczyć? Daj mi znać w komentarzach!&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>polish</category>
    </item>
    <item>
      <title>Jak zajść daleko, stawiając małe kroki</title>
      <dc:creator>Marcin Wosinek</dc:creator>
      <pubDate>Thu, 10 Mar 2022 11:21:02 +0000</pubDate>
      <link>https://dev.to/poznaj-dev/jak-zajsc-daleko-stawiajac-male-kroki-269a</link>
      <guid>https://dev.to/poznaj-dev/jak-zajsc-daleko-stawiajac-male-kroki-269a</guid>
      <description>&lt;p&gt;Wszyscy czasem bierzemy na siebie zadania, które przekraczają nasze możliwości – wynika to z naszej niezdolności do prawidłowej oceny złożonych zadań. Zastanówmy się, co z tym zrobić w odniesieniu do Twojej przygody programistycznej.&lt;/p&gt;

&lt;h2&gt;
  
  
  Iteracja
&lt;/h2&gt;

&lt;p&gt;Niewielkie posunięcia, które nie wymykają się spod kontroli, są podstawą wielu metodologii popularnych w naszej branży, na przykład:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Agile – opiera się całkowicie na nieustannym wprowadzaniu zmian w produkcie w celu odkrycia potrzeb klienta,&lt;/li&gt;
&lt;li&gt;produkt o kluczowej funkcjonalności (ang. &lt;em&gt;minimum viable product – MVP&lt;/em&gt;) – zakłada wydanie pierwszej funkcjonalnej wersji produktu, aby umożliwić sprawdzenie jej przez rynek, a następnie wprowadzanie kolejnych zmian.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Zobaczmy, jak wykorzystać podobne podejście w życiu codziennym.&lt;/p&gt;

&lt;h3&gt;
  
  
  W nauce
&lt;/h3&gt;

&lt;p&gt;Najlepszym pomysłem byłoby:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;nauczenie się części materiału, a następnie&lt;/li&gt;
&lt;li&gt;zastosowanie go w praktyce.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--naE3j4Ed--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5jsed4sh5qi56pfswowj.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--naE3j4Ed--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5jsed4sh5qi56pfswowj.jpg" alt="Image description" width="880" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;W dobrym kursie lub w dobrej książce będziesz regularnie dostawał wyzwania, które pozwolą Ci sprawdzić Twoje postępy. Jeśli uczysz się bez takich luksusów, tego rodzaju zadania będziesz musiał tworzyć sobie sam. W obu przypadkach najlepszą informacją zwrotną będzie to, czy Twój kod działa, jak należy – więc powinieneś albo wykorzystać to, czego uczysz się przy swoim dodatkowym projekcie, albo zacząć nowy.&lt;/p&gt;

&lt;h3&gt;
  
  
  W pracy nad ticketem
&lt;/h3&gt;

&lt;p&gt;Czy często zdarza Ci się utknąć nad ticketem? Możliwe, że próbujesz robić zbyt wiele rzeczy naraz. Poszczególne zadania można zwykle podzielić na kilka części:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;refaktoryzacja kodu, nad którym masz zacząć pracować,&lt;/li&gt;
&lt;li&gt;dodanie infrastruktury kodu – helperów, różnych rodzajów aktualizacji itd.,&lt;/li&gt;
&lt;li&gt;wprowadzanie zmian w logice aplikacji,&lt;/li&gt;
&lt;li&gt;dodanie testów integracyjnych do nowej funkcji.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;W większości przypadków warto zrobić osobną rewizję z każdą z tych zmian: nie ma sensu weryfikować lub cofać refaktoryzacji razem z implementacją zmian w logice. Podział na osobne rewizje, a nawet propozycje zmian pozwalają na szybszą weryfikację kodu, co przyspieszy Twoje postępy.&lt;/p&gt;

&lt;p&gt;A co jeśli nie jesteś zaznajomiony z kodem wystarczająco dobrze, aby zaplanować działania z wyprzedzeniem, albo po prostu zapomniałeś i wprowadziłeś wszystkie zmiany jednocześnie? Nie martw się: wiedza, którą zdobyłeś przy pierwszej próbie, nie pójdzie na marne – daj sobie chwilę oddechu, zacznij nową gałąź i zastosuj lub przerób część tej dużej rewizji, nad którą zacząłeś pracować.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--K1MnAxb4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9n86la9ftbdjg8hqloiw.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--K1MnAxb4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9n86la9ftbdjg8hqloiw.jpg" alt="Image description" width="880" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  W pracy nad projektami
&lt;/h3&gt;

&lt;p&gt;Niezależnie od tego, czy pracujesz w projektach komercyjnych, czy open source – wszędzie usłyszysz to samo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;„wydawaj szybko, wydawaj często”,&lt;/li&gt;
&lt;li&gt;„działaj szybko i popełniaj błędy”.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Możesz to zastosować nawet w pracy nad swoim osobistym projektem do nauki. Zamiast planować dużą, końcową wersję produktu, spróbuj jak najbardziej uprościć to, co budujesz. Kilka rad w tej kwestii znajdziesz w moim artykule na temat tego, &lt;a href="https://poznaj.dev/jak-uczyc-sie-podczas-pracy-nad-wlasnymi-projektami"&gt;jak uczyć się podczas pracy nad własnymi projektami&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Unikaj utykania nad problemem
&lt;/h2&gt;

&lt;p&gt;Twoim głównym celem w pracy na podstawie iteracji jest unikanie utknięcia z problemem. Dobrze jest przeznaczyć czas na zbadanie nowego tematu; jako programista musisz być odporny na frustrację wynikającą z niewiedzy na temat tego, jak coś działa albo jak naprawić bug. Odporność ta jednak jest jak miecz obosieczny i może zwrócić się przeciwko Tobie. Korzyści ze zgłębiania tematu będą coraz mniejsze, aż w końcu takie dokształcanie się stanie się zwyczajnym marnotrawstwem czasu. A kiedy do tego dojdzie, będziesz już dobrze obeznany w temacie i na dobrej drodze do naprawienia problemu, a co za tym idzie – niełatwo będzie Ci odpuścić. Zobaczmy, jak uniknąć takich pułapek!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5cqrE3Bc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fxrlxdtxyfzavttkp3o8.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5cqrE3Bc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fxrlxdtxyfzavttkp3o8.jpg" alt="Image description" width="880" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Nie jesteś sam
&lt;/h3&gt;

&lt;p&gt;Najczęściej nie pracujesz sam: w Twoim środowisku znajdują się ludzie, którzy mogą Ci pomóc. Jako początkujący programista możesz tu popełnić błąd w dwojaki sposób:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;poprosić o pomoc zbyt szybko,&lt;/li&gt;
&lt;li&gt;poprosić o pomoc zbyt późno.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Co to znaczy „zbyt szybko”, a co „zbyt późno”? To zależy od sytuacji Twojego zespołu. Na myśl od razu przychodzą mi dwie sytuacje:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;zespół pracuje pod dużą presją – trzeba zażegnać kryzys, więc żaden bardziej doświadczony programista nie ma czasu, żeby Ci pomóc;&lt;/li&gt;
&lt;li&gt;przejmujesz projekt po programiście, który kończy pracę za dwa tygodnie, więc Twoim głównym zadaniem jest uzyskanie od niego jak najwięcej informacji.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Radzę określić w zespole konkretne zasady, a potem się ich trzymać. Jeżeli ustalicie, że cztery godziny walki z ticketem bez żadnych rezultatów to za dużo, to po bezskutecznym upływie tych czterech godzin poproś o pomoc.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1-dXgcme--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0zc8h19ivzc60bya6fbl.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1-dXgcme--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0zc8h19ivzc60bya6fbl.jpg" alt="Image description" width="880" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Czasem lepiej odpuścić
&lt;/h3&gt;

&lt;p&gt;Pomysł nie stanie się nagle lepszy tylko dlatego, że przeznaczyłeś na jego wprowadzenie bardzo dużo czasu. Wręcz przeciwnie: takim działaniem tylko pokażesz, że nie jest wykonalny albo że nie jest tak prosty, jak zakładałeś. Miej świadomość efektu utopionych kosztów – najlepiej będzie z wyprzedzeniem określić czas, jaki chcesz przeznaczyć na zadanie, zanim odpuścisz jego realizację, a następnie porzucić zadanie, jeśli zajmie Ci ono więcej czasu, niż chciałeś na nie przeznaczyć. Odpuszczenie ticketu w zależności od jego rodzaju może znaczyć pozostawienie go innemu programiście lub całkowite zaniechanie pracy nad nim, przynajmniej w danym momencie.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jMIqFg7v--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/o837xgwltfkkmmz7hqod.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jMIqFg7v--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/o837xgwltfkkmmz7hqod.jpg" alt="Image description" width="880" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Wypatruj informacji zwrotnej w każdej sytuacji
&lt;/h2&gt;

&lt;p&gt;Każdy etap interakcji jest momentem, w którym możemy – i powinniśmy – uzyskać feedback. Dzięki niemu wprowadzimy potrzebne korekty i upewnimy się, że zmierzamy w dobrą stronę. Istnieje bardzo dużo rodzajów informacji zwrotnej, na które można zwrócić uwagę:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;testy automatyczne wykonywane lokalnie lub w ramach CI,&lt;/li&gt;
&lt;li&gt;weryfikacja kodu przez bardziej doświadczonego kolegę po fachu lub mentora,&lt;/li&gt;
&lt;li&gt;zebranie informacji zwrotnej po prezentacji produktu na zewnątrz.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Chcesz dowiedzieć się więcej? Przeczytaj artykuł o &lt;a href="https://poznaj.dev/jak-przyspieszyc-prace-dzieki-informacji-zwrotnej"&gt;pętlach informacji zwrotnej&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>polish</category>
    </item>
    <item>
      <title>Jak przyspieszyć pracę dzięki informacji zwrotnej</title>
      <dc:creator>Marcin Wosinek</dc:creator>
      <pubDate>Wed, 02 Mar 2022 06:25:14 +0000</pubDate>
      <link>https://dev.to/poznaj-dev/jak-przyspieszyc-prace-dzieki-informacji-zwrotnej-42k3</link>
      <guid>https://dev.to/poznaj-dev/jak-przyspieszyc-prace-dzieki-informacji-zwrotnej-42k3</guid>
      <description>&lt;p&gt;Pętla informacji zwrotnej to kluczowy element wszystkich systemów kontroli, z wyjątkiem tych trywialnych. A jeżeli zależy Ci na innych celach, takich jak:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;uczenie się,&lt;/li&gt;
&lt;li&gt;zbudowanie działającej aplikacji,&lt;/li&gt;
&lt;li&gt;zarabianie pieniędzy,&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;to masz do czynienia z systemem kontroli, który trywialny nie jest. Spójrzmy wobec tego na najważniejsze cechy skutecznej pętli informacji zwrotnej i zastanówmy się, jak mógłbyś ją wykorzystać w swojej karierze programistycznej.&lt;/p&gt;

&lt;h2&gt;
  
  
  Im szybciej, tym lepiej
&lt;/h2&gt;

&lt;p&gt;Im szybciej dowiesz się, czy wszystko idzie zgodnie z planem, tym lepiej. Posuwanie się do przodu po omacku nic Ci nie da. Jeśli jesteś na dobrej drodze, informacja zwrotna zmotywuje Cię do dalszego działania. Jeśli natomiast robisz coś źle, uzyskany feedback pozwoli Ci to zmienić. Wyobraź sobie, jak skomplikowana byłaby jazda na rowerze, gdyby sygnał z Twoich oczu dochodził do mózgu z choćby milisekundowym opóźnieniem: prowadziłbyś rower, jakbyś był pijany.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jY-JsaX_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1aifupd7hgqaojs2ju7y.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jY-JsaX_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1aifupd7hgqaojs2ju7y.jpg" alt="Image description" width="880" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;W zależności od złożoności systemu podejmowanie działań na podstawie uzyskanej wiedzy wymaga czasu. Jeśli dowiesz się, że Twoja aktualna ścieżka zawodowa nie jest dla Ciebie, nadal będziesz musiał przeznaczyć kilka lat na nauczenie się nowego fachu. Ale zdecydowanie wolałbyś zdobyć tę informację na pierwszym semestrze studiów, a nie po ich ukończeniu.&lt;/p&gt;

&lt;h2&gt;
  
  
  Codzienne pętle informacji zwrotnej
&lt;/h2&gt;

&lt;p&gt;Spróbujmy zebrać w jednym miejscu wszystkie pętle informacji zwrotnej, z którymi stykasz się codziennie jako programista.&lt;/p&gt;

&lt;h3&gt;
  
  
  Zmiany w kodzie
&lt;/h3&gt;

&lt;p&gt;Praca nad kodem wymaga sprawdzania wpływu wprowadzanych zmian na jego zachowanie. Testy automatyczne są szybkim i dobrym sposobem na pozyskiwanie informacji zwrotnej. Pisanie ich wymaga na początku nakładu czasu, ale jednocześnie zwiększa Twoją produktywność, nie mówiąc już o ich długofalowym wpływie na jakość, jeśli stosowane są regularnie.&lt;/p&gt;

&lt;p&gt;Gdy mam przed sobą logikę, która jest skomplikowana, lubię zaczynać pracę od napisania testów. Zrozumienie wszystkich szczegółów projektu jest trudne i wolę zrobić to podczas tworzenia testów, a nie za każdym razem, kiedy wprowadzam w kodzie zmiany.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sf6JoZ1K--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pusaowh5z7b29tin60a7.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sf6JoZ1K--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pusaowh5z7b29tin60a7.jpg" alt="Image description" width="880" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Codzienna praca nad ticketem
&lt;/h3&gt;

&lt;p&gt;Jeśli działasz w dobrze zorganizowanym zespole, ktoś będzie weryfikować Twoją pracę. Jest to świetny sposób na to, żeby się dowiedzieć, w jaki sposób zespół wykonuje swoje zadania, a także dokształcić się z programowania. Praca nad ticketem przez dzień czy dwa tylko po to, aby dostać ponad 40 propozycji zmian naraz, może być frustrująca.&lt;/p&gt;

&lt;p&gt;Aby temu zapobiec, możesz podzielić swoją pracę na kilka mniejszych etapów i prosić o informacje zwrotne po zakończeniu każdego z nich:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Po przeczytaniu ticketu przekaż jego treść swoimi słowami osobie, która rozumie, czego on dotyczy. Jeśli czegoś nie zrozumiałeś, będzie ona mogła skorygować Twój sposób myślenia.&lt;/li&gt;
&lt;li&gt;Napisz plan rozwiązania problemu – i daj go innemu programiście do weryfikacji, zanim przeznaczysz czas na jego wdrożenie. Możliwe, że zwróci Ci uwagę na coś, co Ci umknęło.&lt;/li&gt;
&lt;li&gt;Najważniejsza jest jednak informacja zwrotna dotycząca logiki programu. Poproś o weryfikację kodu, kiedy jeszcze aktualizujesz testy.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JEXuDfAo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cfoidox27rhtwamlilya.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JEXuDfAo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cfoidox27rhtwamlilya.jpg" alt="Image description" width="880" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Wersja aplikacji
&lt;/h3&gt;

&lt;p&gt;W miarę jak sprint posuwa się do przodu, rośnie zbiór zmian czekających na dostarczenie. Czekanie w takiej sytuacji miałoby sens tylko wtedy, gdybyś w tym czasie robił coś konstruktywnego, na przykład realizował złożony protokół testowania aplikacji. Jeśli jednak nie są wykonywane żadne sensowne testy, to tylko opóźniasz moment, w którym zaczniesz dostawać feedback od użytkowników. Zamiast tego proces wdrażania staraj się przeprowadzać jak najczęściej. Dzięki temu unikniesz wydania jednego dużego release’u zawierającego wszystkie zmiany (i bugi) wprowadzone przez Twój zespół przez całe kilka tygodni sprintu – zamiast tego będziesz wydawał zmiany po trochu, co kilka dni.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VHIId75y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/koy6bdrrel5ovigayo39.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VHIId75y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/koy6bdrrel5ovigayo39.jpg" alt="Image description" width="880" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Dopasowanie produktu do rynku
&lt;/h3&gt;

&lt;p&gt;Aspekt ten znajduje zastosowanie nawet na szerszą skalę. Metody takie jak Agile czy Lean Startup wskazują, że najlepiej jest wydać produkt jak najszybciej, co pozwoli na zebranie feedbacku od klientów.&lt;/p&gt;

&lt;h2&gt;
  
  
  Co z jakością informacji zwrotnej?
&lt;/h2&gt;

&lt;p&gt;Nie każda informacja zwrotna ma taką samą wartość. Wszystko dzieje się na pewnym kontinuum – od dokładnych wyników testów do subiektywnej opinii osoby udzielającej informacji zwrotnej. W przypadku informacji obiektywnych, takich jak:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;negatywny wynik testu lub nieprawidłowe działanie funkcji,&lt;/li&gt;
&lt;li&gt;zbyt wolne działanie aplikacji,&lt;/li&gt;
&lt;li&gt;przyjmowanie nieoczekiwanych wartości przez inne wskaźniki wydajności,&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;dobrze jest natychmiast rozpocząć proces naprawy. &lt;/p&gt;

&lt;p&gt;Natomiast w przypadku opinii subiektywnych, które mogą dotyczyć:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;podejścia do kodowania,&lt;/li&gt;
&lt;li&gt;nazewnictwa zmiennych lub metod,&lt;/li&gt;
&lt;li&gt;innych spraw, które różni programiści zrealizowaliby na różne sposoby,&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;sytuacja wymaga wyważonego podejścia. Możliwe, że pracujesz wbrew konwencji przyjętej w projekcie albo Twoje nazewnictwo wprowadza zamęt – takimi problemami najlepiej zająć się od razu. Zdarza się jednak, że niektóre osoby dzielą się sposobem, w jaki poradziliby sobie z konkretnym problemem, tak po prostu, wiedzione chęcią omówienia metodologii pracy nad projektem.&lt;/p&gt;

&lt;h2&gt;
  
  
  A co z Tobą?
&lt;/h2&gt;

&lt;p&gt;Czy kiedykolwiek dostałeś informację zwrotną, która zmieniła bieg Twojej kariery? Daj mi znać w komentarzach – przeczytam na pewno!&lt;/p&gt;

</description>
      <category>polish</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Jak wykorzystać Netlify do procesu ciągłej integracji</title>
      <dc:creator>Marcin Wosinek</dc:creator>
      <pubDate>Thu, 24 Feb 2022 06:03:03 +0000</pubDate>
      <link>https://dev.to/poznaj-dev/jak-wykorzystac-netlify-do-procesu-ciaglej-integracji-47k1</link>
      <guid>https://dev.to/poznaj-dev/jak-wykorzystac-netlify-do-procesu-ciaglej-integracji-47k1</guid>
      <description>&lt;p&gt;Netlify to dostawca hostingu, z którego usług możesz korzystać na potrzeby swoich statycznych stron internetowych czy aplikacji webowych. Opcja darmowa daje 300 minut czasu na proces budowania, co powinno wystarczyć do skonfigurowania ciągłego wdrażania (CD) w projekcie, w którym nie wprowadza się dużo rewizji. Pokażę Ci, jak – korzystając z tych zasobów – dodać prosty proces ciągłej integracji do swojego buildu.&lt;/p&gt;

&lt;h2&gt;
  
  
  Przykładowa aplikacja
&lt;/h2&gt;

&lt;p&gt;Żeby za bardzo nie komplikować sprawy, oprę się na przykładzie aplikacji wygenerowanej w Create React App (CRA). Dzięki temu będziemy mieć do dyspozycji aplikację, która:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;przypomina proste, rzeczywiste przypadki,&lt;/li&gt;
&lt;li&gt;posiada kilka zależności npm,&lt;/li&gt;
&lt;li&gt;zapewnia już większość tego, co potrzebujemy.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Powstała aplikacja wygląda następująco:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7sl302z8d3pgbmz5p9yn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7sl302z8d3pgbmz5p9yn.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Etapy weryfikacji
&lt;/h2&gt;

&lt;p&gt;Niedawno pisałem o &lt;a href="https://poznaj.dev/czym-jest-ciagla-integracja-ci-i-jak-moze-ci-pomoc" rel="noopener noreferrer"&gt;działaniach&lt;/a&gt;, które możesz podjąć dzięki CI. Pokażę Ci teraz, jak skonfigurować ten proces pod naszą przykładową aplikację.&lt;/p&gt;

&lt;h3&gt;
  
  
  Budowanie
&lt;/h3&gt;

&lt;p&gt;Kod wygenerowany przez CRA robi wszystko, co będzie Ci potrzebne do procesu budowania:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;npm run build

&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; netlify-ci@0.1.0 build
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; react-scripts build

Creating an optimized production build...
Compiled successfully.

File sizes after &lt;span class="nb"&gt;gzip&lt;/span&gt;:

  43.71 kB  build/static/js/main.1fb16459.js
  1.78 kB   build/static/js/787.c84d5573.chunk.js
  541 B     build/static/css/main.073c9b0a.css
…
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Netlify wybiera skrypt &lt;code&gt;build&lt;/code&gt; z repozytorium wygenerowanego przez CRA automatycznie jako polecenie budowania i wszystko działa bez żadnych problemów:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxe6thwklly7093y4i1xr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxe6thwklly7093y4i1xr.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Testy
&lt;/h3&gt;

&lt;p&gt;Kod wygenerowany przez CRA obejmuje konfigurację pozwalającą na uruchamianie testów jednostkowych i jeden test przykładowy. Skrypt &lt;code&gt;npm test&lt;/code&gt; został stworzony do programowania: uruchamia się w trybie interaktywnym, a jego domyślna konfiguracja zakłada obserwowanie plików. Uruchomienie w kontekście CI wymaga jednej iteracji:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;npm &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nt"&gt;--watchAll&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt;

&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; netlify-ci@0.1.0 &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; react-scripts &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="s2"&gt;"--watchAll=false"&lt;/span&gt;

 PASS  src/App.test.js
  ✓ renders learn react &lt;span class="nb"&gt;link&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;16 ms&lt;span class="o"&gt;)&lt;/span&gt;

Test Suites: 1 passed, 1 total
Tests:      1 passed, 1 total
Snapshots:   0 total
Time:       0.644 s, estimated 1 s
Ran all &lt;span class="nb"&gt;test &lt;/span&gt;suites.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Zdefiniujmy teraz nowy skrypt w &lt;code&gt;package.json&lt;/code&gt;, aby mieć go na podorędziu:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;…&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;…&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"test"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"react-scripts test"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"test:ci"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"react-scripts test --watchAll=false"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;…&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Analiza statyczna
&lt;/h3&gt;

&lt;p&gt;Kod warto wzbogacić o analizę statyczną. Podstawowa konfiguracja powinna być dość prosta, ale nie będę jej omawiał w tym artykule. Jeśli chcesz rozwinąć się w tym temacie, polecam zacząć od:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ESLint – ze względu na to, że ostrzega Cię przed potencjalnymi problemami występującymi w kodzie,&lt;/li&gt;
&lt;li&gt;Prettier – bo pozwala Ci w sposób automatyczny zachować jednorodny styl programowania.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Nowy skrypt CI
&lt;/h2&gt;

&lt;p&gt;Aby pomyślnie uruchomić CI/CD, wykonaj następujące działania na stworzonym kodzie:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;npm install&lt;/code&gt; – zapewnia zależności, realizowane domyślnie przez Netlify,&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;npm run test:ci&lt;/code&gt; – zmodyfikowane polecenie testowania,&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;npm run build&lt;/code&gt; – oryginalne polecenie budowania,&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;wdrożenie&lt;/strong&gt; – realizowane przez Netlify.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Build powinien być zależny od testów: jeśli one zawiodą, proces wykonywania powinien się zatrzymać – dlatego zastosuję '&amp;amp;&amp;amp;'. W ramach konfiguracji Netlify polecenie to może jednak uruchomić tylko jeden input. Stworzenie nowego skryptu przeznaczonego do tego przypadku użycia pozwala zająć się obiema kwestiami:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;…&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;…&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"test:ci"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"react-scripts test --watchAll=false"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ci"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npm run test:ci &amp;amp;&amp;amp; npm run build"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;…&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;…&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Przykładowe uruchomienie
&lt;/h3&gt;

&lt;p&gt;Po całej konfiguracji skrypty będą zachowywać się tak:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;jeżeli testy buildów dadzą wynik negatywny, pulpit Netlify pokaże uruchomienie zakończone niepowodzeniem;&lt;/li&gt;
&lt;li&gt;jeżeli wszystko działa jak należy, aplikacja zostanie wdrożona.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F535kkwqto7po297z00id.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F535kkwqto7po297z00id.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Wykorzystanie zasobów
&lt;/h3&gt;

&lt;p&gt;W ramach przeprowadzonych przeze mnie uruchomień testy nie miały praktycznie żadnego wpływu na czas budowania, czyli zasób, który Netlify sprawdza, aby kontrolować stopień wykorzystywania systemu. Będzie się to oczywiście zmieniać, w miarę jak Twój projekt będzie się rozrastał i będziesz do niego dodawał kolejne testy. W pewnym momencie dobrze będzie zainwestować w konfigurację dedykowanego rozwiązania CI, a z Netlify korzystać tylko na potrzeby hostingu.&lt;/p&gt;

&lt;h2&gt;
  
  
  Linki
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://netlify-ci.netlify.app/" rel="noopener noreferrer"&gt;Wdrożona aplikacja&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/how-to-js/es-modules" rel="noopener noreferrer"&gt;przykładowe repozytorium&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Co zrobiłbyś dalej?
&lt;/h2&gt;

&lt;p&gt;Uruchamianie CI na Netlify to tylko tymczasowe rozwiązanie. Z jakiego narzędzia skorzystałbyś w następnej kolejności? Chciałbym wiedzieć, co ciekawi czytelników mojego bloga. Daj mi znać w &lt;a href="https://strawpoll.com/co8pv72pr" rel="noopener noreferrer"&gt;ankiecie&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>ci</category>
      <category>netlify</category>
      <category>polish</category>
    </item>
    <item>
      <title>Czym jest ciągła integracja (CI) i jak może Ci pomóc</title>
      <dc:creator>Marcin Wosinek</dc:creator>
      <pubDate>Wed, 16 Feb 2022 05:44:16 +0000</pubDate>
      <link>https://dev.to/poznaj-dev/czym-jest-ciagla-integracja-ci-i-jak-moze-ci-pomoc-5h0b</link>
      <guid>https://dev.to/poznaj-dev/czym-jest-ciagla-integracja-ci-i-jak-moze-ci-pomoc-5h0b</guid>
      <description>&lt;p&gt;Ciągła integracja (CI) to proces weryfikacji projektu po każdorazowym wprowadzeniu zmiany w bazie kodu. Czym dokładnie jest integracja? To zależy od tego, jak skonfigurujesz ten proces: może być to coś tak prostego jak instalacja zależności i kompilacja projektu albo skomplikowana operacja polegająca na uruchamianiu wielu różnych skryptów celem stwierdzenia, czy Twój kod znajduje się w odpowiednim stanie.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pilny współpracownik
&lt;/h2&gt;

&lt;p&gt;Proces CI możesz traktować, jak pilnego współpracownika, który zawsze jest gotowy do pracy, tylko czekając na Twoje zmiany, aby móc je sprawdzić przed scaleniem ich do gałęzi głównej. W przypadku korzystania z CI warto mieć w workflow &lt;em&gt;pull request&lt;/em&gt;, nawet jeśli pracujesz nad projektem sam. Twoje zmiany zostaną &lt;em&gt;zweryfikowane&lt;/em&gt; przez maszynę, a umieszczenie ich na osobnej gałęzi pozwoli Ci na naprawę wszelkich wykrytych błędów, zanim zostaną scalone do gałęzi głównej.&lt;/p&gt;

&lt;p&gt;Bez CI każdy programista odpowiada za weryfikację wszystkich wprowadzanych przez siebie zmian. Prędzej czy później któryś z członków zespołu zapomni o takiej weryfikacji – może oryginalne zmiany są w porządku, ale co będzie, jeśli po przeprowadzeniu rebase’a lub scalenia pojawi się problem? Jeśli nie korzystasz z procesu CI, pozwalasz mniej uważnym kolegom z zespołu na wrzucanie zmian z błędami i zapominanie o nich, a cały bałagan będą musieli po nich sprzątać inni.&lt;/p&gt;

&lt;h2&gt;
  
  
  Jak jest zorganizowane CI
&lt;/h2&gt;

&lt;p&gt;Ciągła integracja sprawdza Twoje rewizje. Każda zmiana kodu pociąga za sobą wykonanie kilku różnych zadań w określonym porządku. Możesz wykorzystać dane wyjściowe z jednego zadania jako dane wejściowe w drugim zadaniu; możesz na przykład zbudować aplikację, a potem wykorzystać powstały dzięki temu pakiet do przeprowadzenia testów aplikacji. CI zarządza się zwykle z poziomu pliku konfiguracyjnego, który znajduje się w repozytorium – dzięki temu CI ewoluuje razem z Twoją bazą kodu.&lt;/p&gt;

&lt;p&gt;Jeśli wszystkie zadania zostaną wykonane prawidłowo, commit &lt;em&gt;przejdzie weryfikację pomyślnie&lt;/em&gt;; jeśli któreś z nich nie zostanie wykonane, commit &lt;em&gt;nie przejdzie weryfikacji&lt;/em&gt;. W idealnej sytuacji sama zawartość commitu decyduje o wyniku CI: nie będą miały znaczenia usługi zewnętrzne ani nie będzie żadnego losowego elementu, który mógłby namieszać.&lt;/p&gt;

&lt;p&gt;CI pokazuje wynik dla najnowszej rewizji. Gałąź główna powinna dawać wynik pozytywny w zdecydowanej większości przypadków; jakiekolwiek problemy wykryte w tym miejscu będą wpływać na cały zespół, jeśli więc dojdzie do regresji, naprawianie ich powinno być priorytetem. Gałęzie funkcjonalności należy scalać dopiero, gdy przejdą przez CI z wynikiem pozytywnym.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frjj68fu54z0w7abx427y.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frjj68fu54z0w7abx427y.jpg" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Zadania, którymi może zająć się CI
&lt;/h2&gt;

&lt;p&gt;W procesie CI możesz umieścić wszelkie skrypty, które wykonujesz w swoim środowisku lokalnym. W przypadku większych projektów takich skryptów może być bardzo dużo. Przyjrzyjmy się jednak zadaniom tego procesu, które pojawią się najpewniej w każdym projekcie, niezależnie od jego wielkości.&lt;/p&gt;

&lt;h3&gt;
  
  
  Budowanie
&lt;/h3&gt;

&lt;p&gt;Najprostszym testem, który możesz przeprowadzić na swoim kodzie, jest sprawdzenie, czy się kompiluje. Dzięki temu wyłapiesz wszystkie zależności, które zostały zainstalowane, ale nie zapisane, wszelkie rozbieżności typu TypeScript, które przedostały się do rewizji. Błędy te można łatwo usunąć, kiedy programista pracuje nad zadaniem, ale kiedy zostaną one udostępnione pozostałym członkom zespołu, mogą dezorientować i denerwować.&lt;/p&gt;

&lt;h3&gt;
  
  
  Analiza statyczna
&lt;/h3&gt;

&lt;p&gt;Analiza statyczna zakłada sprawdzenie kodu bez jego uruchamiania. W projektach frontendowych często można spotkać się z narzędziami takimi jak:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ESLint,&lt;/li&gt;
&lt;li&gt;HTMLHint,&lt;/li&gt;
&lt;li&gt;Stylelint.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Programy te dają najlepsze rezultaty, jeśli integruje się je z edytorem kodu. Sprawdzenie ich wyniku w ramach procesu CI stanowi dodatkową weryfikację, która może Ci pomóc w dwojaki sposób:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;zidentyfikuje każdego programistę, który zapomniał o wykonaniu tych programów u siebie – dzięki czemu możemy go poprosić, aby naprawił swoje zmiany, zanim zepsuje większy fragment kodu,&lt;/li&gt;
&lt;li&gt;zidentyfikuje wszelkie rozbieżności w wersjach i konfiguracjach, które mogą występować w różnych środowiskach programistycznych&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F19elix45y474uqu3vx1z.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F19elix45y474uqu3vx1z.jpg" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Wykonywanie testów
&lt;/h3&gt;

&lt;p&gt;Korzystanie z procesu CI i wykonywanie w jego ramach testów jest kluczowe, jeśli poważnie podchodzisz do zautomatyzowanych testów w swojej aplikacji. Testy te mają sens, jeśli wykonuje się je bardzo często – a nie ma na to chyba lepszego momentu niż zaraz przed wprowadzeniem zmian do głównej gałęzi. Zaniechanie tego prędzej czy później sprawi, że:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;jeden z programistów doprowadzi do regresji bazy kodu,&lt;/li&gt;
&lt;li&gt;pozostali członkowie zespołu naniosą na tę regresję zmiany,&lt;/li&gt;
&lt;li&gt;ktoś w końcu wykona testy, które wykryją początkową regresję,&lt;/li&gt;
&lt;li&gt;ten ktoś traci cenny czas na rozwiązywanie problemów, których nie spowodował, związanych ze zmianami, o których może nie mieć pojęcia.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Głównym wyzwaniem w takiej sytuacji jest to, że kiedy w końcu zaczniesz diagnozować problemy, nie będziesz nawet wiedział, kiedy one powstały: w poprzednim commicie, a może tydzień temu? Sprawę można załatwić poprzez &lt;code&gt;git blame&lt;/code&gt; lub &lt;code&gt;git bisect&lt;/code&gt;, ale dużo prościej jest, kiedy wiesz, w którym momencie testy przestały działać.&lt;/p&gt;

&lt;p&gt;Podkreślę tu coś jeszcze: pisanie testów jest inwestycją w jakość. Jest to praca, którą trzeba wykonać każdego dnia. Jeśli to robisz, warto, żebyś skonfigurował CI – dzięki temu opracowywane przez Ciebie testy dadzą najlepsze rezultaty.&lt;/p&gt;

&lt;h3&gt;
  
  
  Wdrażanie
&lt;/h3&gt;

&lt;p&gt;CI często idzie w parze z ciągłym wdrażaniem (CD), a połączenie to często skraca się do CI/CD. Jest tak dlatego, że kompilacja i weryfikacja kodu prowadzi do powstania gotowego do wdrożenia produktu – przynajmniej na serwer testowy. Proces CD z prawdziwego zdarzenia wezwałby Cię do wprowadzenia tego produktu do środowiska produkcyjnego, ale mogłoby to być jeszcze większym wyzwaniem, bo wystawiałoby użytkowników projektu na potencjalne regresje.&lt;/p&gt;

&lt;h2&gt;
  
  
  Minusy
&lt;/h2&gt;

&lt;p&gt;Jakie są minusy CI?&lt;/p&gt;

&lt;h3&gt;
  
  
  Skomplikowana konfiguracja
&lt;/h3&gt;

&lt;p&gt;Konfiguracja ciągłej integracji może Ci zabrać sporo czasu, zwłaszcza jeśli zajmujesz się nią po raz pierwszy. Weryfikacja nawet najprostszych zmian w konfiguracji może być czasochłonna, bo musisz ją przeprowadzić na zewnętrznym serwerze, do którego nie masz bezpośredniego dostępu.&lt;/p&gt;

&lt;h3&gt;
  
  
  Zależność od zewnętrznego dostawcy
&lt;/h3&gt;

&lt;p&gt;Jeśli zintegrujesz CI ze swoim workflow, będziesz zależny od dostawcy tego procesu. Jeśli usługa będzie niedostępna, nie będziesz mógł scalać albo zostaniesz pozbawiony zaworu bezpieczeństwa, do którego już zdążyłeś się przyzwyczaić. Może to być frustrujące, szczególnie jeśli zdarza się dość często.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1m2mzc7h4s3q30hzn6ox.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1m2mzc7h4s3q30hzn6ox.jpg" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Koszt
&lt;/h3&gt;

&lt;p&gt;Wielu dostawców CI oferuje opcję darmową, która powinna wystarczyć do prostych ćwiczeń lub projektów demo. Do projektów, nad którymi pracuje się na okrągło, prawie na pewno potrzebna będzie opcja płatna oraz dodatkowy czas, w którym CI będą mogły wykonać Twoje skrypty. Będzie to jednak najprawdopodobniej warte swojej ceny, nawet przy założeniu, że CI zaoszczędzi każdemu z programistów w Twoim zespole jedynie kilka minut pracy dziennie.&lt;/p&gt;

&lt;h2&gt;
  
  
  A co z Tobą?
&lt;/h2&gt;

&lt;p&gt;Jesteś zainteresowany pogłębianiem wiedzy na temat konfiguracji CI? Myślę o napisaniu bardziej szczegółowych artykułów na temat konfigurowania narzędzi CI. Jeśli będę wiedział, jakie narzędzie interesuje Cię najbardziej, będę mógł tworzyć treści pod tym kątem.&lt;br&gt;
Tak więc daj mi znać w &lt;a href="https://strawpoll.com/co8pv72pr" rel="noopener noreferrer"&gt;ankiecie&lt;/a&gt;! Twoje zdanie jest dla mnie bardzo cenne. Dzięki!&lt;/p&gt;

&lt;h2&gt;
  
  
  Co dalej?
&lt;/h2&gt;

&lt;p&gt;Aby wycisnąć z CI jeszcze więcej, warto przeprowadzać w ramach tego procesu testy end-to-end (E2E). Konfiguracja E2E na CI to nie lada wyzwanie. Będę o tym pisał w kolejnym artykule. Tymczasem zachęcam do lektury poradnika, w którym tłumaczę, jak &lt;a href="https://poznaj.dev/jak-dodawac-testy-end-to-end-do-projektu" rel="noopener noreferrer"&gt;zacząć pracę z testami E2E&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Po co nam bundlery JavaScript</title>
      <dc:creator>Marcin Wosinek</dc:creator>
      <pubDate>Wed, 09 Feb 2022 06:04:01 +0000</pubDate>
      <link>https://dev.to/poznaj-dev/po-co-nam-bundlery-javascript-2jee</link>
      <guid>https://dev.to/poznaj-dev/po-co-nam-bundlery-javascript-2jee</guid>
      <description>&lt;p&gt;JavaScript jest językiem interpretowanym, nie potrzebuje kompilacji. Twoja przeglądarka wykonuje ten sam kod, który piszesz. Po co więc stosować bundlery JavaScript?&lt;/p&gt;

&lt;h2&gt;
  
  
  Mniej plików JS
&lt;/h2&gt;

&lt;p&gt;Swego czasu liczba plików JS wykorzystywanych przez witrynę internetową była kluczową sprawą, ponieważ duża liczba takich plików o niewielkim rozmiarze powodowała spadki wydajności. Przeglądarki ładowały każdy plik na podstawie odrębnego żądania HTTP. Każde żądanie wymagało połączenia między przeglądarką a serwerem, a to za każdym razem zajmowało nieco czasu. Aktualnie, dzięki protokołowi HTTP/2, liczba plików nie tworzy już takich problemów. Nadal jednak pakowanie plików razem ma sens. Każde żądanie jest zapisywane osobno w pamięci podręcznej, więc duża liczba plików sprawia, iż trudniej jest zapewnić, że przeglądarka nie załaduje z tej pamięci nieodświeżonego kodu.&lt;/p&gt;

&lt;p&gt;Poza tym do 2018 roku wiele przeglądarek nie obsługiwało modułów ES. Ładowało się wiele plików z HTML i wszystkie dzieliły zakres globalny. Bundlery JS rozwiązują oba problemy, ponieważ:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pozwalają na przechowywanie bazy kodu podzielonej na wiele dobrze zorganizowanych plików,&lt;/li&gt;
&lt;li&gt;pakują kod w duże pliki do wrzucenia na serwer.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--yf5AZ2By--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wxn54yl63gvbs3h3u6a3.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yf5AZ2By--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wxn54yl63gvbs3h3u6a3.jpg" alt="Image description" width="880" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Prosty import z &lt;code&gt;node_modules&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Bundlery dają Ci możliwość importowania zależności, co jest dużo wygodniejsze niż ładowanie ich jako modułów ES. Aby wykorzystać pakiety węzłów otrzymane z przeglądarki, musiałbyś:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;opublikować &lt;code&gt;node_modules&lt;/code&gt; na serwerze produkcyjnym,&lt;/li&gt;
&lt;li&gt;zastosować ścieżkę względną od Twojego pliku do pliku, który chcesz importować.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Stosowanie ścieżki względnej jest problematyczne, bo zmusza Cię to do pisania importu na nieco różne sposoby, w zależności od tego, jak głęboko w strukturze folderowej akurat się znajdujesz. W przypadku Lodash będziesz mieć coś takiego:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// in ./src/core.js &lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../node_modules/lodash/lodash.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// in ./src/app/main.js&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../../node_modules/lodash/lodash.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bundlery pozwolą Ci na uzyskanie tego samego prościej:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// anywhere&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;lodash&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--S4yO9S83--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j6drylhad3jodpg3yuag.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--S4yO9S83--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j6drylhad3jodpg3yuag.jpg" alt="Image description" width="880" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Import innych rodzajów plików
&lt;/h2&gt;

&lt;p&gt;Twoja baza kodu składa się nie tylko z JavaScript. Jeżeli porządkujesz swój kod według komponentów lub ścieżek, każdy taki element będzie mieć swój własny szablon i swoją własną stylizację. Natywne moduły ES nie pozwalają na importowanie typów zasobów innych niż JS. Przez to ograniczenie byłbyś zmuszony zaimportować CSS z HTML, ale reszta byłaby importowana w JavaScript – co sprawiłoby, że musiałbyś zsynchronizować dwa niezwiązane ze sobą pliki. Bundlery JS obchodzą ten problem, pozwalając Ci zarządzać wszystkimi zależnościami bezpośrednio z Twoich plików JS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="err"&gt;‘&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;core&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;&lt;span class="err"&gt;’&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="err"&gt;‘&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;css&lt;/span&gt;&lt;span class="err"&gt;’&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;template&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;‘&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;html&lt;/span&gt;&lt;span class="err"&gt;’&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HMQSC9P0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7l2vo9x3w2qljktdcqh2.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HMQSC9P0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7l2vo9x3w2qljktdcqh2.jpg" alt="Image description" width="880" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Transpilacja kodu
&lt;/h2&gt;

&lt;p&gt;Duża część JavaScript to tak naprawdę nie tylko JavaScript: jest on pisany w językach takich jak TypeScript, a następnie kompiluje się go do JavaScript. Taka kompilacja z jednego kodu do drugiego nazywa się transpilacją. Poddawana jest jej większość kodu pisanego w JavaScript. Poniżej tłumaczę, dlaczego tak jest.&lt;/p&gt;

&lt;h3&gt;
  
  
  Minifikacja kodu
&lt;/h3&gt;

&lt;p&gt;Jeśli piszesz swój kod tak, jak trzeba, to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;nadajesz zmiennym sensowne nazwy,&lt;/li&gt;
&lt;li&gt;stosujesz wcięcia,&lt;/li&gt;
&lt;li&gt;zostawiasz komentarze dla pozostałych programistów.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To wszystko to tylko szum, który dla interpretera nie znaczy zupełnie nic. Minifikacja jest pierwszym krokiem na drodze redukcji rozmiaru payload. Usuwa wszystko, co nie ma wpływu na działanie aplikacji.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gTtNwtsF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/31ltri765ycu1b4prcbw.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gTtNwtsF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/31ltri765ycu1b4prcbw.jpg" alt="Image description" width="880" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Downgrade do starszych wersji przeglądarek
&lt;/h3&gt;

&lt;p&gt;Kiedy kod poszerza wachlarz swoich funkcji, w pewnym momencie dochodzi do sytuacji, w której:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;developerzy chcą zacząć już z niego korzystać,&lt;/li&gt;
&lt;li&gt;nie jest on obsługiwany przez wszystkie przeglądarki.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Na szczęście sytuacja taka utrzymuje się już znacznie krócej dzięki przeglądarkom typu &lt;em&gt;evergreen&lt;/em&gt;, ale nadal istnieje zapotrzebowanie na projekty pokroju Babel. Kompilator ten pozwala Ci na korzystanie z najnowszej wersji języka podczas kodowania i na transpilowanie kodu do wersji obsługiwanej przez starszą wersję przeglądarki.&lt;/p&gt;

&lt;h3&gt;
  
  
  Odmiany JavaScript
&lt;/h3&gt;

&lt;p&gt;Obok standardowego JavaScript możesz korzystać z wielu jego odmian:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;TypeScript,&lt;/li&gt;
&lt;li&gt;PureScript,&lt;/li&gt;
&lt;li&gt;Elm,&lt;/li&gt;
&lt;li&gt;CoffeeScript.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bundlery JavaScript radzą sobie z jednolitym mieszaniem różnych odmian w jednym projekcie – co wydaje się kiepskim pomysłem dopóty, dopóki nie zaczniesz pracować z przestarzałym kodem i dopóki nie będziesz potrzebować dużej dozy elastyczności, żeby wybrać odpowiednie priorytety.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kvsCZObI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/020djuq4103bis9pysx1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kvsCZObI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/020djuq4103bis9pysx1.jpg" alt="Image description" width="880" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Osobne buildy dla różnych przypadków użycia
&lt;/h2&gt;

&lt;p&gt;Kiedy zaczniesz już kompilować swój kod bundlerem, otworzą się przed Tobą nowe możliwości. Najpewniej od samego początku kompilujesz kod w jeden sposób na potrzeby środowiska produkcyjnego, a inny na potrzeby programowania lokalnego. Jeśli piszesz testy jednostkowe, możesz być ciekaw, jak dobrze weryfikują one Twój kod. Istnieją narzędzia, które dadzą Ci dokładną odpowiedź na to pytanie – są to tzw. narzędzia mierzące pokrycie kodu. Wymagają one dedykowanego buildu obejmującego narzędzia zliczające, ile razy test podczas wykonywania „odwiedza” daną linię kodu.&lt;/p&gt;

&lt;h2&gt;
  
  
  A co z Tobą?
&lt;/h2&gt;

&lt;p&gt;Z jakiego bundlera JS chcesz skorzystać w ramach swojego kolejnego projektu? Daj mi znać w &lt;a href="https://strawpoll.com/2gpdcr2g3"&gt;ankiecie&lt;/a&gt;, żebym wiedział, na czym skupić się tutaj w przyszłości.&lt;/p&gt;

&lt;h2&gt;
  
  
  Co dalej?
&lt;/h2&gt;

&lt;p&gt;Możesz przeczytać mój artykuł o tym, &lt;a href="https://poznaj.dev/jak-korzystac-z-natywnych-modulow-es"&gt;jak korzystać z natywnych modułów ES&lt;/a&gt;, lub obejrzeć jeden z moich wideokursów:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://bit.ly/esbuild-course"&gt;wideokurs na temat esbuild&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://bit.ly/esbuild-course"&gt;wideokurs na temat webpack&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>javascript</category>
      <category>polish</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Jak dodawać testy end-to-end do projektu</title>
      <dc:creator>Marcin Wosinek</dc:creator>
      <pubDate>Wed, 02 Feb 2022 09:03:55 +0000</pubDate>
      <link>https://dev.to/poznaj-dev/jak-dodawac-testy-end-to-end-do-projektu-61b</link>
      <guid>https://dev.to/poznaj-dev/jak-dodawac-testy-end-to-end-do-projektu-61b</guid>
      <description>&lt;p&gt;Gratulacje! Tworzenie testów end-to-end (E2E) to dość zaawansowany temat, który może okazać się wartościowy dla Twojego projektu. Testy te potrafią wyłapywać potencjalne problemy przed scaleniem zmian w gałęzi głównej – kiedy jeszcze daleko do wdrożenia do środowiska produkcyjnego. Im wcześniej wykryjesz bug, tym łatwiej będzie Ci go naprawić. Testy E2E pozwalają na szeroko zakrojoną weryfikację wszelkich zmian zaraz po ich udostępnieniu.&lt;/p&gt;

&lt;h2&gt;
  
  
  Czym są testy end-to-end
&lt;/h2&gt;

&lt;p&gt;Testy E2E to skrypty, które „używają” aplikacji tak, jak zrobiłby to użytkownik. Otwierają przeglądarkę, ładują adres URL, klikają w elementy interfejsu użytkownika (UI), na przykład przyciski, i oczekują pewnych rezultatów. Testy przeprowadza komputer i są one dużo szybsze i mniej zawodne od ludzi. Poza tym nigdy się nie nudzą.&lt;/p&gt;

&lt;p&gt;Ich jedynym słabym punktem jest to, że potrzebują precyzyjnych poleceń i zdarza się, że ich zaprogramowanie jest bardziej skomplikowane niż funkcja, którą mają testować. Pisanie testów stanowi element programowania i jest powiązane z aplikacją, która ma być testowana. Mimo to jest to zadanie, do którego wielu programistów nie podchodzi z entuzjazmem. Jeżeli rozwiniesz się w tej dziedzinie, może stać się to Twoją wyjątkową kompetencją, która pozwoli Ci błyszczeć w zawodzie.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dobierz odpowiednie narzędzia!
&lt;/h2&gt;

&lt;p&gt;Pakiet E2E można zbudować na wiele różnych sposobów:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cypress&lt;/li&gt;
&lt;li&gt;Playwright&lt;/li&gt;
&lt;li&gt;&lt;del&gt;Protractor&lt;/del&gt;&lt;/li&gt;
&lt;li&gt;Selenium&lt;/li&gt;
&lt;li&gt;TestCafe&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sytuacja wygląda tu tak samo jak w przypadku innych decyzji dotyczących stosów technologii: dobrze jest gruntownie zapoznać się z wszystkimi możliwościami. Każdy pisany przez Ciebie test będzie ściśle związany z wybraną przez Ciebie platformą. Istnieje możliwość migracji z jednego narzędzia do testowania do drugiego, ale jest to przedsięwzięcie przypominające wymianę frameworka na frontendzie.&lt;/p&gt;

&lt;p&gt;Moje doświadczenia ograniczają się głównie do Protractora, niedocenianego rozwiązania opartego na Angular. Aktualnie przeprowadzam migrację testów do Cypress i jestem pod wrażeniem postępu w dziedzinie narzędzi do testowania, do jakiego doszło na przestrzeni minionych lat. A Ty z jakiego narzędzia E2E chcesz korzystać w swoim kolejnym projekcie? &lt;a href="https://strawpoll.com/zc6v2fkff"&gt;Daj mi znać, biorąc udział w ankiecie&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Proste testy na lokalnym sprzęcie
&lt;/h2&gt;

&lt;p&gt;Niech Twoje pierwsze testy będą wręcz banalne. Weź dowolny lokalny testowy URL, jaki masz pod ręką, i uruchom na nim swoje skrypty. Nie musisz nawet sprawdzać workflow aplikacji. Po prostu napisz kilka testów, po jednym dla każdej trasy, i sprawdź, czy na danej stronie pojawiają się elementy interfejsu UI. Możesz na przykład sprawdzić:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;on &lt;code&gt;/login&lt;/code&gt;– czy pojawiają się pola wprowadzania hasła i nazwy użytkownika,&lt;/li&gt;
&lt;li&gt;on &lt;code&gt;/product/12&lt;/code&gt; – czy wyświetlana jest nazwa produktu,&lt;/li&gt;
&lt;li&gt;itd.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nawet przy pomocy tak prostych testów możesz udowodnić, że:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;aplikacja się uruchamia, a wszystkie trasy wyświetlają się razem z kluczowymi elementami interfejsu UI;&lt;/li&gt;
&lt;li&gt;potrafisz tworzyć testy E2E.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I tym sposobem temat E2E zacznie się rozkręcać – zespół będzie mieć kilka testów do wyboru, a jeden z jego członków (czyli Ty) będzie chętny i zdolny do pisania kolejnych!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--A9Vszggg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/02gq2evor7rzsu3wt7tv.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--A9Vszggg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/02gq2evor7rzsu3wt7tv.jpg" alt="Image description" width="880" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Podziel się dobrą nowiną z zespołem
&lt;/h2&gt;

&lt;p&gt;Nie będziesz musiał być tu zbyt nachalny, przynajmniej na początku. Upewnij się tylko, że wszyscy wiedzą, że testy E2E są dostępne, i doprowadź do sytuacji, w której od każdego programisty oczekiwać się będzie, że przeprowadzi je przed scaleniem jakichkolwiek zmian w gałęzi głównej. Na tym etapie zauważysz wszelkie różnice między lokalnymi konfiguracjami używanymi przez Twoich kolegów po fachu – inne domeny lub porty, z których korzystają lokalnie. Możesz opanować sytuację przez dopilnowanie, żeby wszyscy używali tego samego adresu URL, albo przez sprawienie, że URL testowy będzie łatwy w konfiguracji, a nie zakodowany „na twardo”. Oba podejścia są w porządku. Ja zdecydowałem się na dopilnowanie, aby wszyscy korzystali z tego samego adresu URL localhosta; w moim przypadku zespół nie miał nic przeciwko.&lt;/p&gt;

&lt;p&gt;Kolejnym krokiem jest przetestowanie ścieżki &lt;em&gt;happy path&lt;/em&gt; w odniesieniu do workflow – czyli jak powinna działać aplikacja, kiedy wszystko funkcjonuje, jak należy. Innymi słowy – piszesz testy, które sprawdzają, czy przycisk „Dodaj do koszyka” rzeczywiście dodaje wybrane produkty do koszyka i czy przycisk „Kupuję i płacę” kieruje użytkownika na stronę dostawcy usług płatniczych. Testy takie trudniej się pisze, ale sprawdzają najważniejsze elementy aplikacji. Skrypty te powinny pomóc Ci w przekonaniu kolegów o przydatności E2E. A Twoje testy będą stawać się coraz bardziej zaawansowane.&lt;/p&gt;

&lt;h2&gt;
  
  
  Co dalej
&lt;/h2&gt;

&lt;p&gt;Jeśli masz jakiekolwiek pytania lub wątpliwości w temacie testów E2E, podziel się nimi w komentarzach! Przeczytam je i postaram się odpowiedzieć na nie jak najlepiej. A jeśli jeszcze mało Ci czytania, zapraszam do zapoznania się z moim artykułem o &lt;a href="https://poznaj.dev/jak-zarzadzac-delikatnym-przestarzalym-kodem"&gt;zarządzaniu delikatnym przestarzałym kodem&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>polish</category>
      <category>testing</category>
    </item>
  </channel>
</rss>
