<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[poznaj.dev]]></title><description><![CDATA[Jestem programistą JavaScript z ponad 10-letnim doświadczeniem. Publikuję na tym blogu, żeby uczyć umiejętności, które pomogą Ci osiągnąć sukces w Twoich biznes]]></description><link>https://poznaj.dev</link><generator>RSS for Node</generator><lastBuildDate>Sun, 13 Sep 2026 07:33:34 GMT</lastBuildDate><atom:link href="https://poznaj.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Jak zacząć mówić w języku obcym]]></title><description><![CDATA[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 lekc...]]></description><link>https://poznaj.dev/jak-zaczac-mowic-w-jezyku-obcym</link><guid isPermaLink="true">https://poznaj.dev/jak-zaczac-mowic-w-jezyku-obcym</guid><dc:creator><![CDATA[Marcin Wosinek]]></dc:creator><pubDate>Wed, 17 Aug 2022 04:22:55 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1660715152431/SxCX-lq6e.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>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.</p>
<p>Na większości moich zajęć językowych w szkole nauczyciel skupiał się bardzo mocno na:</p>
<ul>
<li>czytaniu artykułów na różne tematy – rzadko na takie, którymi byłbym choć trochę zainteresowany,</li>
<li>uczeniu się teorii gramatyki,</li>
<li>robieniu ćwiczeń, żeby „ćwiczyć” w tak sztucznym środowisku, że bardziej sztucznie się nie dało.</li>
</ul>
<p>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.</p>
<p>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.</p>
<h2 id="heading-moja-droga-w-nauce-jezyka">Moja droga w nauce języka</h2>
<p>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ć.</p>
<p>Wszystko się zmieniło, kiedy zmieniłem szkołę językową na taką, gdzie uczono metodą bezpośrednią – skupioną na zachęcaniu uczniów do <em>rozmawiania</em> 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.</p>
<p>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.</p>
<p>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.</p>
<h2 id="heading-w-jaki-sposob-uczylbym-sie-kolejnego-jezyka-teraz">W jaki sposób uczyłbym się kolejnego języka teraz?</h2>
<p>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?</p>
<h3 id="heading-kilka-e-lekcji-w-tygodniu">Kilka e-lekcji w tygodniu</h3>
<p>Mamy obecnie dostęp do ogromnej liczby platform e-learningowych – na przykład <a target="_blank" href="https://bit.ly/italki11">italki</a> – 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 <em>kilka</em> 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.</p>
<p>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.</p>
<h3 id="heading-skup-sie-na-mowieniu">Skup się na mówieniu</h3>
<p>Moje lekcje skupiałyby się tylko na rozmawianiu. Pierwszymi frazami, których bym się nauczył, byłyby:</p>
<ul>
<li>„jak powiedzieć...?”</li>
<li>„co to znaczy...?”</li>
</ul>
<p>Dzięki temu mógłbym zacząć używać języka docelowego już od pierwszych zajęć. </p>
<p>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ć:</p>
<ul>
<li>kim jestem, </li>
<li>co robię,</li>
<li>jakie mam plany na następny weekend,</li>
<li>czym się ostatnio zajmowałem,</li>
<li>aktualności, które dominują ostatnio wszystkie rozmowy – nie jakiekolwiek, ale te, o których nie da się nie mówić.</li>
</ul>
<p>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.</p>
<h3 id="heading-notuj">Notuj</h3>
<p>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.</p>
<h3 id="heading-powtarzaj-z-innym-nauczycielem">Powtarzaj z innym nauczycielem</h3>
<p>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.</p>
<h2 id="heading-korzystaj-z-programow-do-nauki-slownictwa">Korzystaj z programów do nauki słownictwa</h2>
<p>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:</p>
<ul>
<li><a target="_blank" href="https://bit.ly/SuperMemo11">SuperMemo</a> – płatny program, z którego często korzystałem podczas nauki języka angielskiego, francuskiego i niemieckiego,</li>
<li><a target="_blank" href="bit.ly/Anki11">Anki</a> – darmowy program na licencji open source, szczególnie przydatny, jeśli chcesz tworzyć własne listy słówek.</li>
</ul>
<p>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ś.</p>
<p>Co najbardziej spodobało mi się w SuperMemo:</p>
<ul>
<li>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,</li>
<li>rozmiar baz danych – na wszystkich poziomach nauki aplikacja oferowała dziesiątki tysięcy słówek,</li>
<li>powtarzanie w określonych odstępach czasu.</li>
</ul>
<p>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.</p>
<h2 id="heading-jakie-sa-twoje-wskazowki-do-nauki-jezykow-obcych">Jakie są Twoje wskazówki do nauki języków obcych?</h2>
<p>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!</p>
]]></content:encoded></item><item><title><![CDATA[Jak pisać lepiej — poradnik dla programistów]]></title><description><![CDATA[Niedawno dwóch znajomych programistów zwróciło mi uwagę na istotność umiejętności pisania. Warto skorzystać z ich rad, bo:

jeden z nich prowadzi firmę zajmującą się sprzedażą produktów online,
drugi w zaledwie kilka lat przeszedł drogę od ukończenia...]]></description><link>https://poznaj.dev/jak-pisac-lepiej-poradnik-dla-programistow</link><guid isPermaLink="true">https://poznaj.dev/jak-pisac-lepiej-poradnik-dla-programistow</guid><dc:creator><![CDATA[Marcin Wosinek]]></dc:creator><pubDate>Wed, 25 May 2022 04:46:57 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1653460653840/qEPfzNnH2.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Niedawno dwóch znajomych programistów zwróciło mi uwagę na istotność umiejętności pisania. Warto skorzystać z ich rad, bo:</p>
<ul>
<li>jeden z nich prowadzi firmę zajmującą się sprzedażą produktów online,</li>
<li>drugi w zaledwie kilka lat przeszedł drogę od ukończenia bootcampu do wiodącego programisty.</li>
</ul>
<p>Poniżej daję wam krótki poradnik na temat tego, jak poprawić teksty tworzone w ramach codziennych obowiązków zawodowych.</p>
<h2 id="heading-rozbij-swoje-dzielo-na-akapity">Rozbij swoje dzieło na akapity</h2>
<p>Pierwszym krokiem na drodze doskonalenia umiejętności pisania jest rozbicie myśli na mniejsze kawałki. Zamiast zrzucać na czytelnika ogromną ścianę tekstu, rób nowe akapity, gdy zmienia się wiodąca myśl. Taki podział tekstu sprawi, że będzie on ekonomiczny, mniej przytłaczający i łatwiejszy w czytaniu. Dzięki mniejszym fragmentom czytelnik nie straci tyle energii na lekturze.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1653460614609/p186q8yvJ.jpeg" alt="Image description" /></p>
<p>…i właśnie tak masz nie pisać.</p>
<h2 id="heading-korzystaj-z-dostepnych-opcji-formatowania">Korzystaj z dostępnych opcji formatowania</h2>
<p>Większość systemów, przez które będziesz wysyłać swoje wiadomości, będzie dawać możliwość formatowania tekstu. Najpewniej będą to:</p>
<ul>
<li>pogrubienia,</li>
<li>kursywa,</li>
<li>nagłówki,</li>
<li>podkreślenia,</li>
<li>przekreślenia.</li>
</ul>
<p>Korzystanie z tych elementów szybko sprawi, że Twój tekst będzie bardziej przystępny. Dzięki temu w prosty sposób skierujesz uwagę czytelnika na najważniejsze rzeczy, co zwiększy szansę na osiągnięcie celu Twojego tekstu.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1653460616444/_cbPafkDm.jpeg" alt="Image description" /></p>
<p>Diabeł tkwi w szczegółach.</p>
<h2 id="heading-ulatw-lekture-czytelnikowi">Ułatw lekturę czytelnikowi</h2>
<p>Życie swoim czytelnikom możesz ułatwić na dwa sposoby:</p>
<ul>
<li>korzystając z linków HTML,</li>
<li>umieszczając w tekście obrazki, aby coś zakomunikować albo wyjaśnić.</li>
</ul>
<p>Opcje te nie zawsze są dostępne. Kiedy na przykład używam Slacka, niezmiennie irytuje mnie, że nie mogę umieszczać obrazków między akapitami. </p>
<p>Dodatki tego typu znacznie poprawiają czytelność wysyłanego tekstu. Obrazki umieszczone w tekście widać od razu, a tekst nie jest przerywany przydługimi linkami.</p>
<p>Jest to kluczowe przy pracy z ticketami. Wyobraź sobie, że dodajesz do tekstu obrazek w Jira: wszystko będzie klarowne pod warunkiem, że obrazek jest jeden. Jeśli zespół doda kolejnych pięć obrazków w komentarzach, to wszystko stanie się nagle bardzo zagmatwane. Umieszczanie obrazków między fragmentami tekstu sprawia, że wiadomo od razu, który obrazek do czego się odnosi.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1653460618205/fIZid_62K.jpeg" alt="Image description" /></p>
<p>Internet oferuje linki od roku 1991, a obrazki od 1992. Używajmy ich!</p>
<h2 id="heading-przeczytaj-i-zredaguj-to-co-napisales">Przeczytaj i zredaguj to, co napisałeś</h2>
<p>Szczypta redakcji może bardzo poprawić jakość Twojego dzieła. Najlepiej zapisać szkic i wrócić do niego po pewnym czasie – po przerwie albo nawet następnego dnia. Przeczytanie całego tekstu przynajmniej raz przed publikacją powinno pozwolić Ci doszlifować sposób wyrażenia Twoich myśli, co poprawi ogólne wrażenia czytelnika.</p>
<p>Redakcja jest kluczem do dobrego odbioru tekstu. Zajmowanie się tym samemu powinno wystarczyć do większości pisanych przez Ciebie tekstów i jest jedną z podstawowych rzeczy, które jesteś winien swoim czytelnikom.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1653460620478/Zw5uMNiy1.jpeg" alt="Image description" /></p>
<h2 id="heading-ulepsz-swoj-tekst-za-pomoca-zautomatyzowanych-narzedzi">Ulepsz swój tekst za pomocą zautomatyzowanych narzędzi</h2>
<p>Maszyna potrafi poprawić Twój tekst nie tylko poprzez sprawdzenie go pod kątem poprawności ortograficznej. W dzisiejszych czasach mamy dostęp do zaawansowanych narzędzi, które potrafią robić takie rzeczy jak:</p>
<ul>
<li>wyłapywanie wyrazów napisanych prawidłowo, ale umieszczonych w złych miejscach (w przypadku języka angielskiego zawsze mi się to zdarza z <em>then</em> i <em>than</em>),</li>
<li>zaznaczanie strony biernej – pisanie w stronie czynnej „ożywia” tekst,</li>
<li>przeredagowywanie zdań tak, aby były łatwiejsze w odbiorze – przynajmniej zdaniem algorytmu.</li>
</ul>
<p>Jeśli do pisania podchodzisz poważnie, powinieneś zerknąć na aplikacje dostępne na rynku.</p>
<h3 id="heading-grammarly">Grammarly</h3>
<p>Jeśli na YouTubie pojawiają Ci się reklamy podobne do moich, na pewno słyszałeś o tym narzędziu. Korzystam z niego od lipca 2021 roku i jestem zadowolony. To był pierwszy postawiony przeze mnie krok na drodze do poprawienia jakości mojego bloga.</p>
<p>Plusy:</p>
<ul>
<li>rozumie kontekst wyrazów i sugeruje odpowiednie zmiany: podpowie Ci, czy chciałeś napisać <em>it's</em> czy <em>its</em>,</li>
<li>zwraca uwagę na nadużywane wyrazy i sugeruje zamienniki,</li>
<li>w wersji płatnej może zasugerować przeredagowanie zdania.</li>
</ul>
<p>Minusy:</p>
<ul>
<li>obsługuje tylko język angielski,</li>
<li>wtyczka dla Firefoxa na komputerach Mac ma problemy z Google Docs,</li>
<li>płatna wersja kosztuje 144 $ rocznie, co jest kwotą wyższą niż u konkurencji,</li>
<li>tu i ówdzie pojawiają się skargi na problemy z bezpieczeństwem i prywatnością. Z tego, co udało mi się sprawdzić, do największego naruszenia bezpieczeństwa doszło w 2018 roku i Grammarly szybko to naprawiło. Problemy związane z prywatnością mają związek z przetwarzaniem zachodzącym na serwerach firmy – korzystając z tego narzędzia, musisz zaufać, że stosuje się do swoich warunków świadczenia usług.</li>
</ul>
<h3 id="heading-languagetool">LanguageTool</h3>
<p>Plusy:</p>
<ul>
<li>obsługuje większą liczbę języków (korekta gramatyczna 5 języków europejskich), podstawowe funkcje dla 20 języków,</li>
<li>masz możliwość własnego hostingu darmowej wersji, dzięki czemu dane będą zawsze pod Twoją kontrolą.</li>
</ul>
<p>Minusy:</p>
<ul>
<li>kiepski marketing – o asystencie LanguageTool dowiedziałem się dopiero wtedy, kiedy sam zasięgnąłem języka.</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1653460622336/0vDoEh9GY.jpeg" alt="Image description" /></p>
<h2 id="heading-badz-najlepszym-przyjacielem-swoich-czytelnikow">Bądź najlepszym przyjacielem swoich czytelników</h2>
<p>Wszystkie podane wyżej wskazówki sprowadzają się do tego, żebyś myślał o osobach, które będą czytać Twój tekst. Twoim zadaniem jest sprawienie, żeby był on łatwy w odbiorze. Wymaga to empatii. Dodatkowy wysiłek powinien Ci się zwrócić: często zdarza się, że czytelnikami Twoich tekstów są: Twój szef albo ludzie, którzy mają wpływ na dalsze losy Twojej ścieżki zawodowej. Nawet jeśli piszesz coś dla kolegów z pracy, Twoje dzieło zostanie najpewniej przeczytane przez wiele par oczu – a reputacja osoby z dobrymi umiejętnościami komunikacji dobrze Ci zrobi.</p>
<h2 id="heading-co-dalej">Co dalej?</h2>
<p>Jeśli podoba Ci się ten artykuł, subskrybuj, żeby być na bieżąco, kiedy opublikuję nowy.</p>
]]></content:encoded></item><item><title><![CDATA[Jak czytać dokumentację]]></title><description><![CDATA[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 ...]]></description><link>https://poznaj.dev/jak-czytac-dokumentacje</link><guid isPermaLink="true">https://poznaj.dev/jak-czytac-dokumentacje</guid><dc:creator><![CDATA[Marcin Wosinek]]></dc:creator><pubDate>Wed, 18 May 2022 04:36:46 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1652879262047/NU8J3hY_k.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>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ę <em>ekhem</em> przyjazną instrukcję” (ang. Read The Friendly Manual) – albo prześlą Ci link do Let Me Google That For You.</p>
<p>Lepiej nie dopuszczać do takich sytuacji.</p>
<p>Zobaczmy zatem, jak rozwinąć umiejętność czytania dokumentacji.</p>
<h2 id="heading-otworz-ja">Otwórz ją</h2>
<p>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.</p>
<h2 id="heading-masz-jakis-problem-i-bardzo-dobrze">Masz jakiś problem? I bardzo dobrze!</h2>
<p>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.</p>
<p>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.</p>
<p>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.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1652879164108/ZFo7DpCqf.jpeg" alt="Image description" /></p>
<h2 id="heading-skorzystaj-z-funkcji-wyszukiwania">Skorzystaj z funkcji wyszukiwania</h2>
<p>Aby szybko uzyskać informacje na temat tego, jak rozwiązać problem, na który się natknąłeś, skorzystaj z narzędzi do wyszukiwania.</p>
<p>W przypadku bibliotek zewnętrznych możesz wykorzystać wyszukiwarki, dzięki czemu ograniczysz wyszukiwanie do strony internetowej projektu: po prostu dodaj do wyszukiwanej frazy <code>site:&lt;domain&gt;</code>:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1652879165920/xNrGYEQyi.png" alt="Image description" /></p>
<p>Funkcja ta działa w Google, Bing i DuckDuckGo.</p>
<p>W dokumentacji znajdującej się w kodzie możesz zastosować te same narzędzia, z których korzystasz do przeszukiwania bazy kodu:</p>
<ul>
<li>wyszukiwanie w edytorze,</li>
<li><code>ripgrep</code>,</li>
<li><code>git grep</code>.</li>
</ul>
<p>Przykład na podstawie <code>git grep</code>:</p>
<pre><code class="lang-SH">$ git grep <span class="hljs-string">'http\.post'</span>
src/auto/injector.js: *          <span class="hljs-variable">$http</span>.post(trackingUrl, trackedEvents);
src/ng/http.js:     *   <span class="hljs-variable">$http</span>.post(<span class="hljs-string">'/someUrl'</span>, data, config).<span class="hljs-keyword">then</span>(successCallback, errorCallback);
src/ng/http.js:     * - {@link ng.<span class="hljs-variable">$http</span><span class="hljs-comment">#post $http.post}</span>
</code></pre>
<p>Ręczne przeszukiwanie dokumentacji ma kilka zalet:</p>
<ul>
<li>możesz zapoznać się z jej strukturą,</li>
<li>znajdziesz wszystkie fragmenty dokumentacji dotyczące Twojego problemu.</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1652879168372/vsY8Rnh5a.png" alt="Image description" /></p>
<p>Dokumentacja API – suchy opis metod</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1652879171057/J9tdoyP7d.png" alt="Image description" /></p>
<p>Samouczek lub przewodnik dają większy kontekst.</p>
<h2 id="heading-nie-rozumiesz-nic-nie-szkodzi">Nie rozumiesz? Nic nie szkodzi!</h2>
<p>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.</p>
<p>Najbardziej problematyczne okazują się projekty komercyjne <em>closed source</em>. 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.</p>
<p>Projekty <em>open source</em> są zwykle „łatwiejsze w obsłudze”. Te bez dobrej dokumentacji mają mniejsze szanse na sukces.</p>
<h2 id="heading-dobry-przewodnik-nie-jest-zly">Dobry przewodnik nie jest zły</h2>
<p>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.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1652879172791/1LwugM9La.jpeg" alt="Image description" /></p>
<h2 id="heading-zanurz-sie-w-odpowiedniej-czesci-api">Zanurz się w odpowiedniej części API</h2>
<p>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.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1652879174761/HJh3Cknc7.png" alt="Image description" /></p>
<p>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.</p>
<h3 id="heading-wyniki">Wyniki</h3>
<p>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.</p>
<h3 id="heading-zmiana-danych-wejsciowych">Zmiana danych wejściowych</h3>
<p>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.</p>
<h2 id="heading-podsumowanie">Podsumowanie</h2>
<p>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.</p>
<h2 id="heading-chcesz-wiedziec-wiecej">Chcesz wiedzieć więcej?</h2>
<p>Przeczytaj o tym, <a target="_blank" href="https://poznaj.dev/jak-zajsc-daleko-stawiajac-male-kroki">jak zajść daleko, stawiając małe kroki</a>.</p>
]]></content:encoded></item><item><title><![CDATA[Jak pisać testy jednostkowe]]></title><description><![CDATA[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!
Czym są testy jednostkowe
Testy pozwalają na ustalenie wyraźnych oczekiwań w stosunku do kodu. Dają Ci możli...]]></description><link>https://poznaj.dev/jak-pisac-testy-jednostkowe</link><guid isPermaLink="true">https://poznaj.dev/jak-pisac-testy-jednostkowe</guid><category><![CDATA[JavaScript]]></category><category><![CDATA[Beginner Developers]]></category><category><![CDATA[Testing]]></category><dc:creator><![CDATA[Marcin Wosinek]]></dc:creator><pubDate>Wed, 27 Apr 2022 04:59:09 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1651040419346/BMBsCh7M6.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>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!</p>
<h2 id="heading-czym-sa-testy-jednostkowe">Czym są testy jednostkowe</h2>
<p>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.</p>
<p>Jest to program, który weryfikuje Twój program.</p>
<p>W przypadku projektów opartych na JavaScript będziesz zwykle korzystał z biblioteki testującej takiej jak:</p>
<ul>
<li>Jest,</li>
<li>Jasmine,</li>
<li>Chai.</li>
</ul>
<p>Są to jednak tylko narzędzia. Najważniejsze, żebyś miał na podorędziu coś, co w sposób automatyczny zweryfikuje Twoją aplikację.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1651040375625/pl0KTpDsy.jpeg" alt="Image description" /></p>
<h2 id="heading-jak-testy-jednostkowe-moga-ci-pomoc">Jak testy jednostkowe mogą Ci pomóc</h2>
<p>Pisanie testów ułatwi Ci życie na cztery sposoby:</p>
<ol>
<li>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.</li>
<li>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.</li>
<li>Pisanie testów <em>jednostkowych</em> 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ć.</li>
<li>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.</li>
</ol>
<h2 id="heading-zbuduj-strukture">Zbuduj strukturę</h2>
<p>Zanim zabierzesz się za testowanie funkcjonalności, upewnij się, że możesz przetestować <em>cokolwiek</em>. 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: <code>my-project/plane-ticket.js</code>, nazwą Twojego kodu testującego może być: <code>my-project/plane-ticket.spec.js</code>. </p>
<p>Zbuduj wszystko, co potrzebne do przetestowania danej klasy, a potem posprawdzaj podstawowe elementy:</p>
<ul>
<li>czy obiekt jest obiektem;</li>
<li>czy funkcja jest funkcją.</li>
</ul>
<p>Dzięki temu dowiedziesz swoich umiejętności testowania.</p>
<h2 id="heading-stworz-atrapy">Stwórz atrapy</h2>
<p>Atrapa (mock) to obiekt tworzony w celu zastąpienia zależności jednostki, którą testujesz. Jeżeli na przykład testujesz funkcję <code>saveBlogPost</code>, 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.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1651040377614/YLtOIBH6Y.jpeg" alt="Image description" /></p>
<h2 id="heading-utrzymuj-porzadek">Utrzymuj porządek</h2>
<p>Jak widzisz, w każdym teście dużo się dzieje. Możemy wyodrębnić trzy fazy całego procesu:</p>
<ol>
<li>tworzenie atrap;</li>
<li>uruchamianie kodu do sprawdzenia;</li>
<li>sprawdzanie oczekiwań.</li>
</ol>
<p>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.</p>
<h2 id="heading-programuj-w-oparciu-o-testy-test-driven-development">Programuj w oparciu o testy – test-driven development</h2>
<p>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ą <a target="_blank" href="https://poznaj.dev/jak-zajsc-daleko-stawiajac-male-kroki">iterację</a> procesu budowania kodu i tworzenia do niego testów.</p>
<p>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.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1651040379580/RLWmqctES.jpeg" alt="Image description" /></p>
<h3 id="heading-wyjatki-od-reguly">Wyjątki od reguły</h3>
<p>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.</p>
<h2 id="heading-brakujace-testy">Brakujące testy</h2>
<p>Możesz mieć pecha i pracować na przestarzałym kodzie bez testów i innych środków kontroli jakości – czyli na przykład <a target="_blank" href="https://poznaj.dev/jak-zarzadzac-delikatnym-przestarzalym-kodem">na czymś takim</a>. 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.</p>
<h2 id="heading-a-co-z-toba">A co z Tobą?</h2>
<p>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.</p>
]]></content:encoded></item><item><title><![CDATA[Jak zachwycić zadaniem rekrutacyjnym]]></title><description><![CDATA[Zobaczmy, jak sprawić, aby Twoje frontendowe zadanie rekrutacyjne wyszło jak najlepiej. 
Trzymaj się tego, co umiesz najlepiej
Perspektywa upieczenia dwóch pieczeni na jednym ogniu poprzez naukę lub ćwiczenie nowej technologii podczas starania się o ...]]></description><link>https://poznaj.dev/jak-zachwycic-zadaniem-rekrutacyjnym</link><guid isPermaLink="true">https://poznaj.dev/jak-zachwycic-zadaniem-rekrutacyjnym</guid><category><![CDATA[interview]]></category><dc:creator><![CDATA[Marcin Wosinek]]></dc:creator><pubDate>Wed, 20 Apr 2022 05:26:46 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1650451444115/2k9s5TV6G.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Zobaczmy, jak sprawić, aby Twoje frontendowe zadanie rekrutacyjne wyszło jak najlepiej. </p>
<h2 id="heading-trzymaj-sie-tego-co-umiesz-najlepiej">Trzymaj się tego, co umiesz najlepiej</h2>
<p>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.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1650451386992/7e_4FmgWM.jpeg" alt="Image description" /></p>
<p>Dobrze wiesz, która opcja dostanie lepszą ofertę.</p>
<h2 id="heading-latwosc-weryfikacji">Łatwość weryfikacji</h2>
<p>Zrób tak, żeby Twoja praca była łatwa do sprawdzenia. Z punktu widzenia rekrutera idealny proces weryfikacji wygląda następująco:</p>
<ul>
<li>otrzymanie działającego linku;</li>
<li>zobaczenie na własne oczy, że aplikacja działa, jak trzeba;</li>
<li>zagłębienie się w kod, aby zobaczyć, jak udało Ci się to uzyskać.</li>
</ul>
<p>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ę.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1650451389263/hiA5R37uZ.jpeg" alt="Image description" /></p>
<p>Podaj im wszystko na tacy</p>
<h3 id="heading-zrob-cos-interaktywnego">Zrób coś interaktywnego</h3>
<p>Gdy mamy do czynienia z frontendową aplikacją, najprostszym rozwiązaniem będzie wdrożenie jej na darmowy serwer:</p>
<ul>
<li>strony GitHub,</li>
<li>strony GitLab,</li>
<li>lub Netlify.</li>
</ul>
<h3 id="heading-zapomnij-o-wysylaniu-plikow-zip">Zapomnij o wysyłaniu plików ZIP</h3>
<p>Przesyłanie plików ZIP jest obarczone dwiema wadami, przez które możesz odpaść już w przedbiegach:</p>
<ul>
<li>niewygodne rozwiązanie,</li>
<li>otwieranie pliku ZIP stanowi zagrożenie dla bezpieczeństwa.</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1650451391195/mSKmC4gNN.jpeg" alt="Image description" /></p>
<p>Ciekawe, co jest w środku!</p>
<h2 id="heading-upewnij-sie-ze-wszystko-dziala">Upewnij się, że wszystko działa</h2>
<p>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.</p>
<h2 id="heading-dodaj-readmemd">Dodaj README.md</h2>
<p>Każdy typowy projekt potrzebuje pliku <code>README</code>, 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.</p>
<h3 id="heading-przedstaw-swoj-sposob-myslenia">Przedstaw swój sposób myślenia</h3>
<p>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.</p>
<h2 id="heading-niech-sie-blyszczy">Niech się błyszczy</h2>
<p>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.</p>
<h3 id="heading-niech-bedzie-ciekawie">Niech będzie ciekawie</h3>
<p>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 <code>/about</code>, żeby łatwiej mu było powiązać aplikację demonstracyjną z Twoim CV?</p>
<h3 id="heading-test-jednostkowy">Test jednostkowy</h3>
<p>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ć. </p>
<h3 id="heading-skonfiguruj-lint-i-prettier">Skonfiguruj Lint i Prettier</h3>
<p>Wiele profesjonalnych zespołów ujednolica swój styl programowania za pomocą automatycznych narzędzi. W przypadku front-endu będą to najpewniej ESLint &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ą.</p>
<h3 id="heading-wprowadzaj-rewizje-ktore-cos-wnosza">Wprowadzaj rewizje, które coś wnoszą</h3>
<p>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.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1650451393102/Eo0FhQkdr.jpeg" alt="Image description" /></p>
<h2 id="heading-a-co-z-toba">A co z Tobą?</h2>
<p>Jakim najlepszym projektem demo możesz się pochwalić? Prześlij link w komentarzach!</p>
]]></content:encoded></item><item><title><![CDATA[Jak współpracować z mentorem programowania]]></title><description><![CDATA[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ć:

przyjaźnie nastawiony kolega z pracy z większym doświadczeniem,
uczynny znajomy,
mentor...]]></description><link>https://poznaj.dev/jak-wspolpracowac-z-mentorem-programowania</link><guid isPermaLink="true">https://poznaj.dev/jak-wspolpracowac-z-mentorem-programowania</guid><category><![CDATA[JavaScript]]></category><category><![CDATA[mentorship]]></category><dc:creator><![CDATA[Marcin Wosinek]]></dc:creator><pubDate>Wed, 13 Apr 2022 05:37:18 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1649833232673/DEQe1b2SU.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>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ć:</p>
<ul>
<li>przyjaźnie nastawiony kolega z pracy z większym doświadczeniem,</li>
<li>uczynny znajomy,</li>
<li>mentor z zewnątrz – za którego usługi trzeba płacić (albo i nie).</li>
</ul>
<p>Co zrobić, żeby wycisnąć z takiej pomocy jak najwięcej?</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1649833128771/RKofw9Azx.jpeg" alt="Image description" /></p>
<p>Senior JS developer</p>
<h2 id="heading-dziel-sie-problemami-z-zycia-wzietymi">Dziel się problemami z życia wziętymi</h2>
<p>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:</p>
<ul>
<li>jeśli masz przed sobą wyzwanie techniczne, może Ci polecić alternatywne rozwiązania;</li>
<li>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;</li>
<li>jeśli jesteś przytłoczony liczbą dostępnych bibliotek, może Ci pomóc w wyborze i skupieniu się na jednej z nich;</li>
<li>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.</li>
</ul>
<h2 id="heading-badz-dobrym-uczniem">Bądź dobrym uczniem</h2>
<p>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.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1649833130818/79KfkTSYT.jpeg" alt="Image description" /></p>
<p>Traktuj mentora tak, jak traktowałbyś sowę.</p>
<h2 id="heading-ucz-sie-podczas-nauki">Ucz się... podczas nauki</h2>
<p>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 <a target="_blank" href="https://poznaj.dev/jak-uczyc-sie-podczas-pracy-nad-wlasnymi-projektami">własnym projektem</a>. Najlepiej byłoby, gdyby taki projekt był ogólnodostępny. Workflow mógłby wyglądać tak:</p>
<ol>
<li>Robisz pierwszą wersję sam.</li>
<li>Mentor daje Ci wskazówki.</li>
<li>Wprowadzasz zmiany na ich podstawie.</li>
</ol>
<p>Jawna praca nad własnym projektem pokazuje potencjalnemu pracodawcy trzy ważne rzeczy:</p>
<ul>
<li>jesteś wystarczająco zmobilizowany do dostarczenia projektu;</li>
<li>masz pomoc z zewnątrz i Twój rozwój nie będzie opierał się wyłącznie na zasobach pracodawcy;</li>
<li>pokazujesz, jak dobrze znosisz krytykę i jak wykorzystujesz informacje zwrotne.</li>
</ul>
<h2 id="heading-a-ty">A Ty?</h2>
<p>Jakie są Twoje doświadczenia z mentoringiem? Daj znać w komentarzach!</p>
]]></content:encoded></item><item><title><![CDATA[Po co nam wiersz poleceń (CLI)]]></title><description><![CDATA[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?
Prac...]]></description><link>https://poznaj.dev/po-co-nam-wiersz-polecen-cli</link><guid isPermaLink="true">https://poznaj.dev/po-co-nam-wiersz-polecen-cli</guid><category><![CDATA[Beginner Developers]]></category><category><![CDATA[cli]]></category><dc:creator><![CDATA[Marcin Wosinek]]></dc:creator><pubDate>Wed, 16 Mar 2022 05:56:57 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1647415691508/Lgq-efcIr.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>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?</p>
<h2 id="heading-pracuje-sie-szybko">Pracuje się szybko</h2>
<p>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.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1647415640405/00N4z_9Mah.jpeg" alt="Image description" /></p>
<p>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.</p>
<p>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.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1647415642194/kE0hk6syJ.jpeg" alt="Image description" /></p>
<h2 id="heading-zarzadzanie-zlozonoscia">Zarządzanie złożonością</h2>
<p>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 (<a target="_blank" href="https://peter.sh/experiments/chromium-command-line-switches">źródło</a>). Siedzą sobie tam i czekają, aż ich użyjesz. Są one jednak zazwyczaj niewidoczne – chyba że zaczniesz wczytywać się w dokumentację.</p>
<p>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:</p>
<ul>
<li>proste programy dla prostych przypadków użycia z przystępnym interfejsem
albo</li>
<li>profesjonalne programy z przytłaczającymi interfejsami, gdzie trudno o doszukanie się nawet najprostszych z opcji.</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1647415643864/0q93TCRsD.jpeg" alt="Image description" /></p>
<h2 id="heading-skrypty">Skrypty</h2>
<p>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 <code>git ls-files</code> możesz wyświetlić wszystkie pliki w swoim repozytorium, a następnie zastosować <code>grep</code>, aby je przefiltrować – wystarczy Ci do tego operator potoku:</p>
<pre><code>$ git ls<span class="hljs-operator">-</span>files <span class="hljs-operator">|</span> grep index
home<span class="hljs-operator">-</span>page<span class="hljs-operator">/</span>index.html
registration<span class="hljs-operator">/</span>index.html
index.js
</code></pre><p>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:</p>
<ul>
<li>tworzenie tysięcy folderów 
czy</li>
<li>wyszukiwanie wszystkich plików pasujących do wzoru lub zawierających taki wzór i wykonywanie na nich wszystkich operacji</li>
</ul>
<p>są całkiem proste i wymagają nieco pobuszowania w sieci, przeczytania dokumentacji i zastosowania metody prób i błędów.</p>
<h2 id="heading-interfejs-uzytkownika">Interfejs użytkownika</h2>
<p>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ń.</p>
<h2 id="heading-a-co-z-toba">A co z Tobą?</h2>
<p>Jakie masz doświadczenia z CLI? Jakich rzeczy chciałbyś się w ich zakresie nauczyć? Daj mi znać w komentarzach!</p>
]]></content:encoded></item><item><title><![CDATA[Jak zajść daleko, stawiając małe kroki]]></title><description><![CDATA[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.
Iteracja
Niewiel...]]></description><link>https://poznaj.dev/jak-zajsc-daleko-stawiajac-male-kroki</link><guid isPermaLink="true">https://poznaj.dev/jak-zajsc-daleko-stawiajac-male-kroki</guid><category><![CDATA[Beginner Developers]]></category><dc:creator><![CDATA[Marcin Wosinek]]></dc:creator><pubDate>Thu, 10 Mar 2022 11:21:02 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1646924593979/WONZWu1wq.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>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.</p>
<h2 id="heading-iteracja">Iteracja</h2>
<p>Niewielkie posunięcia, które nie wymykają się spod kontroli, są podstawą wielu metodologii popularnych w naszej branży, na przykład:</p>
<ul>
<li>Agile – opiera się całkowicie na nieustannym wprowadzaniu zmian w produkcie w celu odkrycia potrzeb klienta,</li>
<li>produkt o kluczowej funkcjonalności (ang. <em>minimum viable product – MVP</em>) – zakłada wydanie pierwszej funkcjonalnej wersji produktu, aby umożliwić sprawdzenie jej przez rynek, a następnie wprowadzanie kolejnych zmian.</li>
</ul>
<p>Zobaczmy, jak wykorzystać podobne podejście w życiu codziennym.</p>
<h3 id="heading-w-nauce">W nauce</h3>
<p>Najlepszym pomysłem byłoby:</p>
<ul>
<li>nauczenie się części materiału, a następnie</li>
<li>zastosowanie go w praktyce.</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1646924444700/UEh9wlq4JI.jpeg" alt="Image description" /></p>
<p>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.</p>
<h3 id="heading-w-pracy-nad-ticketem">W pracy nad ticketem</h3>
<p>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:</p>
<ul>
<li>refaktoryzacja kodu, nad którym masz zacząć pracować,</li>
<li>dodanie infrastruktury kodu – helperów, różnych rodzajów aktualizacji itd.,</li>
<li>wprowadzanie zmian w logice aplikacji,</li>
<li>dodanie testów integracyjnych do nowej funkcji.</li>
</ul>
<p>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.</p>
<p>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ć.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1646924446545/YEPZhQmCj.jpeg" alt="Image description" /></p>
<h3 id="heading-w-pracy-nad-projektami">W pracy nad projektami</h3>
<p>Niezależnie od tego, czy pracujesz w projektach komercyjnych, czy open source – wszędzie usłyszysz to samo:</p>
<ul>
<li>„wydawaj szybko, wydawaj często”,</li>
<li>„działaj szybko i popełniaj błędy”.</li>
</ul>
<p>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, <a target="_blank" href="https://poznaj.dev/jak-uczyc-sie-podczas-pracy-nad-wlasnymi-projektami">jak uczyć się podczas pracy nad własnymi projektami</a>.</p>
<h2 id="heading-unikaj-utykania-nad-problemem">Unikaj utykania nad problemem</h2>
<p>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!</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1646924448442/rvgKqUdag.jpeg" alt="Image description" /></p>
<h3 id="heading-nie-jestes-sam">Nie jesteś sam</h3>
<p>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:</p>
<ul>
<li>poprosić o pomoc zbyt szybko,</li>
<li>poprosić o pomoc zbyt późno.</li>
</ul>
<p>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:</p>
<ul>
<li>zespół pracuje pod dużą presją – trzeba zażegnać kryzys, więc żaden bardziej doświadczony programista nie ma czasu, żeby Ci pomóc;</li>
<li>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.</li>
</ul>
<p>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.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1646924450174/NvrVNxNJB.jpeg" alt="Image description" /></p>
<h3 id="heading-czasem-lepiej-odpuscic">Czasem lepiej odpuścić</h3>
<p>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.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1646924451902/-s1xvBoi9e.jpeg" alt="Image description" /></p>
<h2 id="heading-wypatruj-informacji-zwrotnej-w-kazdej-sytuacji">Wypatruj informacji zwrotnej w każdej sytuacji</h2>
<p>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ę:</p>
<ul>
<li>testy automatyczne wykonywane lokalnie lub w ramach CI,</li>
<li>weryfikacja kodu przez bardziej doświadczonego kolegę po fachu lub mentora,</li>
<li>zebranie informacji zwrotnej po prezentacji produktu na zewnątrz.</li>
</ul>
<p>Chcesz dowiedzieć się więcej? Przeczytaj artykuł o <a target="_blank" href="https://poznaj.dev/jak-przyspieszyc-prace-dzieki-informacji-zwrotnej">pętlach informacji zwrotnej</a>.</p>
]]></content:encoded></item><item><title><![CDATA[Jak przyspieszyć pracę dzięki informacji zwrotnej]]></title><description><![CDATA[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:

uczenie się,
zbudowanie działającej aplikacji,
zarabianie pieniędzy,

to masz do czynienia z s...]]></description><link>https://poznaj.dev/jak-przyspieszyc-prace-dzieki-informacji-zwrotnej</link><guid isPermaLink="true">https://poznaj.dev/jak-przyspieszyc-prace-dzieki-informacji-zwrotnej</guid><dc:creator><![CDATA[Marcin Wosinek]]></dc:creator><pubDate>Wed, 02 Mar 2022 06:25:14 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1646212557671/5uIj920r5.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>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:</p>
<ul>
<li>uczenie się,</li>
<li>zbudowanie działającej aplikacji,</li>
<li>zarabianie pieniędzy,</li>
</ul>
<p>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.</p>
<h2 id="heading-im-szybciej-tym-lepiej">Im szybciej, tym lepiej</h2>
<p>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.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1646212520582/15C7_d3iD.jpeg" alt="Image description" /></p>
<p>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.</p>
<h2 id="heading-codzienne-petle-informacji-zwrotnej">Codzienne pętle informacji zwrotnej</h2>
<p>Spróbujmy zebrać w jednym miejscu wszystkie pętle informacji zwrotnej, z którymi stykasz się codziennie jako programista.</p>
<h3 id="heading-zmiany-w-kodzie">Zmiany w kodzie</h3>
<p>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.</p>
<p>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.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1646212523766/iMZa-O0GE.jpeg" alt="Image description" /></p>
<h3 id="heading-codzienna-praca-nad-ticketem">Codzienna praca nad ticketem</h3>
<p>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.</p>
<p>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:</p>
<ol>
<li>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.</li>
<li>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.</li>
<li>Najważniejsza jest jednak informacja zwrotna dotycząca logiki programu. Poproś o weryfikację kodu, kiedy jeszcze aktualizujesz testy.</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1646212526429/nTmunYhk3.jpeg" alt="Image description" /></p>
<h3 id="heading-wersja-aplikacji">Wersja aplikacji</h3>
<p>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.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1646212528969/yV1lbvfiw.jpeg" alt="Image description" /></p>
<h3 id="heading-dopasowanie-produktu-do-rynku">Dopasowanie produktu do rynku</h3>
<p>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.</p>
<h2 id="heading-co-z-jakoscia-informacji-zwrotnej">Co z jakością informacji zwrotnej?</h2>
<p>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:</p>
<ul>
<li>negatywny wynik testu lub nieprawidłowe działanie funkcji,</li>
<li>zbyt wolne działanie aplikacji,</li>
<li>przyjmowanie nieoczekiwanych wartości przez inne wskaźniki wydajności,</li>
</ul>
<p>dobrze jest natychmiast rozpocząć proces naprawy. </p>
<p>Natomiast w przypadku opinii subiektywnych, które mogą dotyczyć:</p>
<ul>
<li>podejścia do kodowania,</li>
<li>nazewnictwa zmiennych lub metod,</li>
<li>innych spraw, które różni programiści zrealizowaliby na różne sposoby,</li>
</ul>
<p>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.</p>
<h2 id="heading-a-co-z-toba">A co z Tobą?</h2>
<p>Czy kiedykolwiek dostałeś informację zwrotną, która zmieniła bieg Twojej kariery? Daj mi znać w komentarzach – przeczytam na pewno!</p>
]]></content:encoded></item><item><title><![CDATA[Jak wykorzystać Netlify do procesu ciągłej integracji]]></title><description><![CDATA[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ża...]]></description><link>https://poznaj.dev/jak-wykorzystac-netlify-do-procesu-ciaglej-integracji</link><guid isPermaLink="true">https://poznaj.dev/jak-wykorzystac-netlify-do-procesu-ciaglej-integracji</guid><category><![CDATA[Netlify]]></category><category><![CDATA[NetlifyHackathon]]></category><category><![CDATA[ci-cd]]></category><category><![CDATA[JavaScript]]></category><dc:creator><![CDATA[Marcin Wosinek]]></dc:creator><pubDate>Thu, 24 Feb 2022 06:03:03 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1645691944564/OYfm3qmI4.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>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.</p>
<h2 id="heading-przykladowa-aplikacja">Przykładowa aplikacja</h2>
<p>Ż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:</p>
<ul>
<li>przypomina proste, rzeczywiste przypadki,</li>
<li>posiada kilka zależności npm,</li>
<li>zapewnia już większość tego, co potrzebujemy.</li>
</ul>
<p>Powstała aplikacja wygląda następująco:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1645691937278/io9IRx47b.png" alt="Image description" /></p>
<h2 id="heading-etapy-weryfikacji">Etapy weryfikacji</h2>
<p>Niedawno pisałem o <a target="_blank" href="https://poznaj.dev/czym-jest-ciagla-integracja-ci-i-jak-moze-ci-pomoc">działaniach</a>, które możesz podjąć dzięki CI. Pokażę Ci teraz, jak skonfigurować ten proces pod naszą przykładową aplikację.</p>
<h3 id="heading-budowanie">Budowanie</h3>
<p>Kod wygenerowany przez CRA robi wszystko, co będzie Ci potrzebne do procesu budowania:</p>
<pre><code class="lang-SH">$ npm run build

&gt; netlify-ci@0.1.0 build
&gt; react-scripts build

Creating an optimized production build...
Compiled successfully.

File sizes after gzip:

  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
…
</code></pre>
<p>Netlify wybiera skrypt <code>build</code> z repozytorium wygenerowanego przez CRA automatycznie jako polecenie budowania i wszystko działa bez żadnych problemów:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1645691939792/HWGRzAZwx.png" alt="Image description" /></p>
<h3 id="heading-testy">Testy</h3>
<p>Kod wygenerowany przez CRA obejmuje konfigurację pozwalającą na uruchamianie testów jednostkowych i jeden test przykładowy. Skrypt <code>npm test</code> 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:</p>
<pre><code class="lang-SH">$ npm <span class="hljs-built_in">test</span> -- --watchAll=<span class="hljs-literal">false</span>

&gt; netlify-ci@0.1.0 <span class="hljs-built_in">test</span>
&gt; react-scripts <span class="hljs-built_in">test</span> <span class="hljs-string">"--watchAll=false"</span>

 PASS  src/App.test.js
  ✓ renders learn react link (16 ms)

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        0.644 s, estimated 1 s
Ran all <span class="hljs-built_in">test</span> suites.
</code></pre>
<p>Zdefiniujmy teraz nowy skrypt w <code>package.json</code>, aby mieć go na podorędziu:</p>
<pre><code class="lang-JSON">{
  …
  <span class="hljs-attr">"scripts"</span>: {
    …
    <span class="hljs-attr">"test"</span>: <span class="hljs-string">"react-scripts test"</span>,
    <span class="hljs-attr">"test:ci"</span>: <span class="hljs-string">"react-scripts test --watchAll=false"</span>,
    …
  },
</code></pre>
<h3 id="heading-analiza-statyczna">Analiza statyczna</h3>
<p>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:</p>
<ul>
<li>ESLint – ze względu na to, że ostrzega Cię przed potencjalnymi problemami występującymi w kodzie,</li>
<li>Prettier – bo pozwala Ci w sposób automatyczny zachować jednorodny styl programowania.</li>
</ul>
<h2 id="heading-nowy-skrypt-ci">Nowy skrypt CI</h2>
<p>Aby pomyślnie uruchomić CI/CD, wykonaj następujące działania na stworzonym kodzie:</p>
<ul>
<li><code>npm install</code> – zapewnia zależności, realizowane domyślnie przez Netlify,</li>
<li><code>npm run test:ci</code> – zmodyfikowane polecenie testowania,</li>
<li><code>npm run build</code> – oryginalne polecenie budowania,</li>
<li><strong>wdrożenie</strong> – realizowane przez Netlify.</li>
</ul>
<p>Build powinien być zależny od testów: jeśli one zawiodą, proces wykonywania powinien się zatrzymać – dlatego zastosuję '&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:</p>
<pre><code class="lang-JSON">{
  …
  <span class="hljs-attr">"scripts"</span>: {
    …
    <span class="hljs-attr">"test:ci"</span>: <span class="hljs-string">"react-scripts test --watchAll=false"</span>,
    <span class="hljs-attr">"ci"</span>: <span class="hljs-string">"npm run test:ci &amp;&amp; npm run build"</span>,
    …
  },
  …
}
</code></pre>
<h3 id="heading-przykladowe-uruchomienie">Przykładowe uruchomienie</h3>
<p>Po całej konfiguracji skrypty będą zachowywać się tak:</p>
<ul>
<li>jeżeli testy buildów dadzą wynik negatywny, pulpit Netlify pokaże uruchomienie zakończone niepowodzeniem;</li>
<li>jeżeli wszystko działa jak należy, aplikacja zostanie wdrożona.</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1645691942322/PNpH4lriFK.png" alt="Image description" /></p>
<h3 id="heading-wykorzystanie-zasobow">Wykorzystanie zasobów</h3>
<p>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.</p>
<h2 id="heading-linki">Linki</h2>
<ul>
<li><a target="_blank" href="https://netlify-ci.netlify.app/">Wdrożona aplikacja</a>,</li>
<li>[przykładowe repozytorium] (https://github.com/how-to-js/es-modules).</li>
</ul>
<h2 id="heading-co-zrobilbys-dalej">Co zrobiłbyś dalej?</h2>
<p>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 <a target="_blank" href="https://strawpoll.com/co8pv72pr">ankiecie</a>:</p>
<div class="hn-embed-widget" id="strawpoll-ci-2"></div>]]></content:encoded></item><item><title><![CDATA[Czym jest ciągła integracja (CI) i jak może Ci pomóc]]></title><description><![CDATA[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 kompila...]]></description><link>https://poznaj.dev/czym-jest-ciagla-integracja-ci-i-jak-moze-ci-pomoc</link><guid isPermaLink="true">https://poznaj.dev/czym-jest-ciagla-integracja-ci-i-jak-moze-ci-pomoc</guid><category><![CDATA[Continuous Integration]]></category><category><![CDATA[Beginner Developers]]></category><dc:creator><![CDATA[Marcin Wosinek]]></dc:creator><pubDate>Wed, 16 Feb 2022 05:44:16 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1644995677711/maaMvp3mh.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>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.</p>
<h2 id="heading-pilny-wspolpracownik">Pilny współpracownik</h2>
<p>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 <em>pull request</em>, nawet jeśli pracujesz nad projektem sam. Twoje zmiany zostaną <em>zweryfikowane</em> 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.</p>
<p>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.</p>
<h2 id="heading-jak-jest-zorganizowane-ci">Jak jest zorganizowane CI</h2>
<p>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.</p>
<p>Jeśli wszystkie zadania zostaną wykonane prawidłowo, commit <em>przejdzie weryfikację pomyślnie</em>; jeśli któreś z nich nie zostanie wykonane, commit <em>nie przejdzie weryfikacji</em>. 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ć.</p>
<p>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.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1644995391559/ZUsFkvWlV.jpeg" alt="Image description" /></p>
<h2 id="heading-zadania-ktorymi-moze-zajac-sie-ci">Zadania, którymi może zająć się CI</h2>
<p>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.</p>
<h3 id="heading-budowanie">Budowanie</h3>
<p>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ć.</p>
<h3 id="heading-analiza-statyczna">Analiza statyczna</h3>
<p>Analiza statyczna zakłada sprawdzenie kodu bez jego uruchamiania. W projektach frontendowych często można spotkać się z narzędziami takimi jak:</p>
<ul>
<li>ESLint,</li>
<li>HTMLHint,</li>
<li>Stylelint.</li>
</ul>
<p>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:</p>
<ul>
<li>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,</li>
<li>zidentyfikuje wszelkie rozbieżności w wersjach i konfiguracjach, które mogą występować w różnych środowiskach programistycznych</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1644995394493/fVuP_zqMM.jpeg" alt="Image description" /></p>
<h3 id="heading-wykonywanie-testow">Wykonywanie testów</h3>
<p>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:</p>
<ul>
<li>jeden z programistów doprowadzi do regresji bazy kodu,</li>
<li>pozostali członkowie zespołu naniosą na tę regresję zmiany,</li>
<li>ktoś w końcu wykona testy, które wykryją początkową regresję,</li>
<li>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.</li>
</ul>
<p>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 <code>git blame</code> lub <code>git bisect</code>, ale dużo prościej jest, kiedy wiesz, w którym momencie testy przestały działać.</p>
<p>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.</p>
<h3 id="heading-wdrazanie">Wdrażanie</h3>
<p>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.</p>
<h2 id="heading-minusy">Minusy</h2>
<p>Jakie są minusy CI?</p>
<h3 id="heading-skomplikowana-konfiguracja">Skomplikowana konfiguracja</h3>
<p>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.</p>
<h3 id="heading-zaleznosc-od-zewnetrznego-dostawcy">Zależność od zewnętrznego dostawcy</h3>
<p>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.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1644995396881/GOKIeE4Zo.jpeg" alt="Image description" /></p>
<h3 id="heading-koszt">Koszt</h3>
<p>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.</p>
<h2 id="heading-a-co-z-toba">A co z Tobą?</h2>
<p>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.
Tak więc daj mi znać w <a target="_blank" href="https://strawpoll.com/co8pv72pr">ankiecie</a>! Twoje zdanie jest dla mnie bardzo cenne. Dzięki!</p>
<div class="hn-embed-widget" id="strawpoll-ci-2"></div><h2 id="heading-co-dalej">Co dalej?</h2>
<p>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 <a target="_blank" href="https://poznaj.dev/jak-dodawac-testy-end-to-end-do-projektu">zacząć pracę z testami E2E</a>.</p>
]]></content:encoded></item><item><title><![CDATA[Po co nam bundlery JavaScript]]></title><description><![CDATA[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?
Mniej plików JS
Swego czasu liczba plików JS wykorzystywanych przez witrynę internet...]]></description><link>https://poznaj.dev/po-co-nam-bundlery-javascript</link><guid isPermaLink="true">https://poznaj.dev/po-co-nam-bundlery-javascript</guid><category><![CDATA[JavaScript]]></category><category><![CDATA[Beginner Developers]]></category><dc:creator><![CDATA[Marcin Wosinek]]></dc:creator><pubDate>Wed, 09 Feb 2022 06:04:01 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1644399506319/sPzGPafxY5.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>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?</p>
<h2 id="heading-mniej-plikow-js">Mniej plików JS</h2>
<p>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.</p>
<p>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ż:</p>
<ul>
<li>pozwalają na przechowywanie bazy kodu podzielonej na wiele dobrze zorganizowanych plików,</li>
<li>pakują kod w duże pliki do wrzucenia na serwer.</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1644397584888/dlrhFNWtU.jpeg" alt="Image description" /></p>
<h2 id="heading-prosty-import-z-nodemodules">Prosty import z <code>node_modules</code></h2>
<p>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ś:</p>
<ul>
<li>opublikować <code>node_modules</code> na serwerze produkcyjnym,</li>
<li>zastosować ścieżkę względną od Twojego pliku do pliku, który chcesz importować.</li>
</ul>
<p>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:</p>
<pre><code class="lang-JS"><span class="hljs-comment">// in ./src/core.js </span>
<span class="hljs-keyword">var</span> _ = <span class="hljs-built_in">require</span>(<span class="hljs-string">'../node_modules/lodash/lodash.js'</span>);

<span class="hljs-comment">// in ./src/app/main.js</span>
<span class="hljs-keyword">var</span> _ = <span class="hljs-built_in">require</span>(<span class="hljs-string">'../../node_modules/lodash/lodash.js'</span>);
</code></pre>
<p>Bundlery pozwolą Ci na uzyskanie tego samego prościej:</p>
<pre><code class="lang-JS"><span class="hljs-comment">// anywhere</span>
<span class="hljs-keyword">var</span> _ = <span class="hljs-built_in">require</span>(<span class="hljs-string">'lodash'</span>);
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1644397587539/-ukZe_F8S.jpeg" alt="Image description" /></p>
<h2 id="heading-import-innych-rodzajow-plikow">Import innych rodzajów plików</h2>
<p>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:</p>
<pre><code class="lang-JS"><span class="hljs-keyword">import</span> ‘./core.js’;
<span class="hljs-keyword">import</span> ‘./style.css’;

<span class="hljs-keyword">const</span> template = <span class="hljs-built_in">require</span>(‘./view.html’);
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1644397589827/gR0NwBW-8.jpeg" alt="Image description" /></p>
<h2 id="heading-transpilacja-kodu">Transpilacja kodu</h2>
<p>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.</p>
<h3 id="heading-minifikacja-kodu">Minifikacja kodu</h3>
<p>Jeśli piszesz swój kod tak, jak trzeba, to:</p>
<ul>
<li>nadajesz zmiennym sensowne nazwy,</li>
<li>stosujesz wcięcia,</li>
<li>zostawiasz komentarze dla pozostałych programistów.</li>
</ul>
<p>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.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1644397592172/JLoWSeFd1.jpeg" alt="Image description" /></p>
<h3 id="heading-downgrade-do-starszych-wersji-przegladarek">Downgrade do starszych wersji przeglądarek</h3>
<p>Kiedy kod poszerza wachlarz swoich funkcji, w pewnym momencie dochodzi do sytuacji, w której:</p>
<ul>
<li>developerzy chcą zacząć już z niego korzystać,</li>
<li>nie jest on obsługiwany przez wszystkie przeglądarki.</li>
</ul>
<p>Na szczęście sytuacja taka utrzymuje się już znacznie krócej dzięki przeglądarkom typu <em>evergreen</em>, 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.</p>
<h3 id="heading-odmiany-javascript">Odmiany JavaScript</h3>
<p>Obok standardowego JavaScript możesz korzystać z wielu jego odmian:</p>
<ul>
<li>TypeScript,</li>
<li>PureScript,</li>
<li>Elm,</li>
<li>CoffeeScript.</li>
</ul>
<p>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.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1644397594721/g8TlR4gGu.jpeg" alt="Image description" /></p>
<h2 id="heading-osobne-buildy-dla-roznych-przypadkow-uzycia">Osobne buildy dla różnych przypadków użycia</h2>
<p>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.</p>
<h2 id="heading-a-co-z-toba">A co z Tobą?</h2>
<p>Z jakiego bundlera JS chcesz skorzystać w ramach swojego kolejnego projektu? Daj mi znać w <a target="_blank" href="https://strawpoll.com/2gpdcr2g3">ankiecie</a>, żebym wiedział, na czym skupić się tutaj w przyszłości:</p>
<div class="hn-embed-widget" id="strawpoll-bundler"></div><h2 id="heading-co-dalej">Co dalej?</h2>
<p>Możesz przeczytać mój artykuł o tym, <a target="_blank" href="https://poznaj.dev/jak-korzystac-z-natywnych-modulow-es">jak korzystać z natywnych modułów ES</a>, lub obejrzeć jeden z moich wideokursów:</p>
<ul>
<li>[wideokurs na temat esbuild] (https://bit.ly/esbuild-course),</li>
<li>[wideokurs na temat webpack] (https://bit.ly/esbuild-course).</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Jak dodawać testy end-to-end do projektu]]></title><description><![CDATA[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że...]]></description><link>https://poznaj.dev/jak-dodawac-testy-end-to-end-do-projektu</link><guid isPermaLink="true">https://poznaj.dev/jak-dodawac-testy-end-to-end-do-projektu</guid><category><![CDATA[JavaScript]]></category><dc:creator><![CDATA[Marcin Wosinek]]></dc:creator><pubDate>Wed, 02 Feb 2022 09:03:55 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1643796412997/OEZyEyv3k.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>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.</p>
<h2 id="heading-czym-sa-testy-end-to-end">Czym są testy end-to-end</h2>
<p>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ą.</p>
<p>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.</p>
<h2 id="heading-dobierz-odpowiednie-narzedzia">Dobierz odpowiednie narzędzia!</h2>
<p>Pakiet E2E można zbudować na wiele różnych sposobów:</p>
<ul>
<li>Cypress</li>
<li>Playwright</li>
<li>Protractor</li>
<li>Selenium</li>
<li>TestCafe</li>
</ul>
<p>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.</p>
<p>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? Daj mi znać, biorąc udział w <a target="_blank" href="https://strawpoll.com/zc6v2fkff">ankiecie</a>:</p>
<div class="hn-embed-widget" id="strawpoll-e2e"></div><h2 id="heading-proste-testy-na-lokalnym-sprzecie">Proste testy na lokalnym sprzęcie</h2>
<p>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ć:</p>
<ul>
<li>on <code>/login</code>– czy pojawiają się pola wprowadzania hasła i nazwy użytkownika,</li>
<li>on <code>/product/12</code> – czy wyświetlana jest nazwa produktu,</li>
<li>itd.</li>
</ul>
<p>Nawet przy pomocy tak prostych testów możesz udowodnić, że:</p>
<ol>
<li>aplikacja się uruchamia, a wszystkie trasy wyświetlają się razem z kluczowymi elementami interfejsu UI;</li>
<li>potrafisz tworzyć testy E2E.</li>
</ol>
<p>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!</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1643796334189/wRzdiauUq.jpeg" alt="Image description" /></p>
<h2 id="heading-podziel-sie-dobra-nowina-z-zespolem">Podziel się dobrą nowiną z zespołem</h2>
<p>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.</p>
<p>Kolejnym krokiem jest przetestowanie ścieżki <em>happy path</em> 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.</p>
<h2 id="heading-co-dalej">Co dalej</h2>
<p>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 <a target="_blank" href="https://poznaj.dev/jak-zarzadzac-delikatnym-przestarzalym-kodem">zarządzaniu delikatnym przestarzałym kodem</a>.</p>
]]></content:encoded></item><item><title><![CDATA[Jak zarządzać delikatnym przestarzałym kodem?]]></title><description><![CDATA[Witamy w prawdziwym świecie! Przeszedłeś przez wszystkie zbytnio uproszczone przykłady dydaktyczne i zaciągnąłeś się do swojego pierwszego zespołu IT. Po zrobieniu kilku zadań rozgrzewkowych najpewniej zdasz sobie sprawę, że w Twoim projekcie znajduj...]]></description><link>https://poznaj.dev/jak-zarzadzac-delikatnym-przestarzalym-kodem</link><guid isPermaLink="true">https://poznaj.dev/jak-zarzadzac-delikatnym-przestarzalym-kodem</guid><dc:creator><![CDATA[Marcin Wosinek]]></dc:creator><pubDate>Wed, 26 Jan 2022 06:11:04 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1643180653133/mSQo9TS4h.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Witamy w prawdziwym świecie! Przeszedłeś przez wszystkie zbytnio uproszczone przykłady dydaktyczne i zaciągnąłeś się do swojego pierwszego zespołu IT. Po zrobieniu kilku zadań rozgrzewkowych najpewniej zdasz sobie sprawę, że w Twoim projekcie znajdują się fragmenty starego kodu, z którym trudno się pracuje. Jeśli masz szczęście, ktoś w zespole będzie chciał ochronić Cię przed zbytnim zapuszczaniem się w te mroczne zakątki programowania, ale sytuacja taka prędzej czy później się zmieni. W pewnym momencie będziesz musiał zmierzyć się z rzeczywistością – duża część Twojej codziennej pracy będzie polegać na utrzymywaniu przestarzałej bazy kodu. Czytaj dalej, a dowiesz się, jak uprościć to zadanie najbardziej, jak tylko się da.</p>
<h2 id="heading-przejrzyj-kod">Przejrzyj kod</h2>
<p>Otwórz kod i nieco się z nim zapoznaj. Kod przed Twoimi oczami będzie pewnie zagmatwany, pliki będą za duże, a cała reszta będzie przypominać jeden wielki bałagan. Dobrze by było, gdybyś najpierw skupił się na strukturze plików i znalazł pewne wzorce. W projekcie, który trwa już długo i w którym nikt nie zadał sobie trudu, żeby popracować nad spójnością, najpewniej znajdziesz rywalizujące designy zastosowane w pozornie dowolny sposób. W takim wypadku spróbuj zdiagnozować wagę problemu, a systematyzację zostaw na później.</p>
<h2 id="heading-zaktualizuj-plik-readme">Zaktualizuj plik README</h2>
<p>Po przejrzeniu kodu trzeba będzie ocenić stan dokumentacji. Gdzieś powinien znajdować się jakiś plik README. Może ostatnia data jego edycji woła o pomstę do nieba, ale przynajmniej wyjaśni Ci sposób myślenia, zgodnie z którym stworzono bazę kodu. Możesz spróbować zaktualizować jego treść, jeśli natkniesz się na fragmenty, które nijak mają się do rzeczywistości. Na początek dobrze będzie wprowadzić zmiany, o których mowa w mailach i innej korespondencji dotyczącej projektu, i upewnić się, że ich opis znajdzie się w pliku README razem z odpowiednimi odnośnikami. Aktualizuj też plik regularnie, tak aby kolejna osoba pracująca nad projektem miała lżejszy początek.</p>
<h2 id="heading-rozpracuj-budowanie-projektu">Rozpracuj budowanie projektu</h2>
<p>Niedawno pracowałem nad kursem dotyczącym upgrade’u Angular, którego ostatnia aktualizacja miała miejsce trzy lata temu. Pierwsze filmy dotyczyły Angular 4 – wersji, która jest tak stara, że nie jest kompatybilna z najnowszym Node.js i najnowszymi procesorami. Przed zainstalowaniem jej na moim sprzęcie musiałem przejść przez serię wymuszonych upgrade’ów – a był to tylko niewielki, przykładowy projekt. Natomiast projekt, nad którym Tobie dane będzie pracować, będzie prawdopodobnie w dużo gorszym stanie.</p>
<p>W idealnym świecie wszystko, czego potrzebujesz do zbudowania projektu, będzie:</p>
<ol>
<li>ujęte w pliku README lub innej dokumentacji,</li>
<li>nadal aktualne,</li>
<li>działać jak należy.</li>
</ol>
<p>W większości przypadków Twój projekt nie spełni jednak tych trzech warunków, przez co sam będziesz musiał coś wymyślić. Jeśli projekt nie działa, możesz poszukać problemu i dowiedzieć się, co jest jego przyczyną.</p>
<p>Jeśli dokumentacja nie zawiera pomocnych informacji, kolejnym miejscem, do którego powinieneś się udać, jest plik <code>package.json</code>. <code>”scripts”</code> może zawierać jakieś wbudowane polecenie. Twoją ostatnią deską ratunku jest szukanie śladów narzędzi do budowania aplikacji, które były popularne w przeszłości, i rozpoczęcie swego rodzaju prac archeologicznych nad JavaScript:</p>
<ul>
<li>grunt,</li>
<li>gulp,</li>
<li>webpack,</li>
<li>browserify,</li>
<li>require.js.</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1643180607425/PRbc-ddID.jpeg" alt="Image description" /></p>
<h2 id="heading-a-teraz-wdrozenie">A teraz wdrożenie</h2>
<p>Tu też możesz mieć nieco zabawy. Brak wiedzy o tym, gdzie znajdują się Twoje programy, może być dość frustrujący: obawiasz się przez to tego, co się stanie, jeśli przestaną one działać. Mieliśmy kiedyś taką sytuację, że przez kilka miesięcy próbowaliśmy dociec, gdzie „żyje” nasz wewnętrzny chatbot. Informacje tego typu powinny być prostsze w znalezieniu w przypadku systemów krytycznych, ale szukanie ich i tak zajmuje więcej czasu, niż można byłoby się spodziewać.</p>
<p>Wyszukanie wszystkich szczegółowych informacji o procesie wdrożenia w środowisku produkcyjnym może być czasochłonne. Szyki może pokrzyżować Ci to, że nie masz prawidłowego użytkownika bądź brakuje informacji uwierzytelniających w niektórych obszarach, a poza tym wszystko musisz sprawdzać dwa razy, żeby mieć pewność, że niczego nie zepsujesz. Gratulacje! Właśnie nauczyłeś się wprowadzać zmiany w kodzie na własnym sprzęcie. Zmiany, które będą mogły wejść do środowiska produkcyjnego. Twoja praca będzie mogła komuś pomóc.</p>
<h2 id="heading-zbadaj-aktualnie-stosowane-srodki-zapewniania-jakosci-qa">Zbadaj aktualnie stosowane środki zapewniania jakości (QA)</h2>
<p>Podobnie jak w przypadku buildu – spróbuj znaleźć wszelkie dostępne Ci informacje na temat:</p>
<ul>
<li>testów integracyjnych,</li>
<li>testów jednostkowych,</li>
<li>lintingu.</li>
</ul>
<p>Jeśli nie będzie ich w dokumentacji ani w skryptach <code>package.json</code>, możesz poszukać narzędzi, które były popularne w przeszłości. </p>
<ul>
<li>Testy integracyjne:<ul>
<li>protractor,</li>
<li>selenium.</li>
</ul>
</li>
<li>Testy jednostkowe:<ul>
<li>jasmine,</li>
<li>mocha,</li>
<li>sinon.</li>
</ul>
</li>
<li>Linting:<ul>
<li>jslint,</li>
<li>jshint,</li>
<li>tslint.</li>
</ul>
</li>
</ul>
<p>Jeżeli dokopałeś się do śladów stosowania zautomatyzowanych środków QA, staraj się korzystać z tych środków jak najczęściej. Wszystko, co robili programiści przed Tobą, może okazać się bardzo wartościowe i naprawdę szkoda byłoby to wszystko wyrzucić do kosza.</p>
<h2 id="heading-wprowadz-test-dymny">Wprowadź test dymny</h2>
<p>Jeśli chcesz odnowić stary silnik, za pierwszym razem uruchomisz go bez żadnego obciążenia, żeby zobaczyć, czy działa i czy się nie pali. Nazywa się to testem dymnym – wszystko jest w porządku, dopóki nie ma dymu. To samo tyczy się kodu przestarzałego: jeśli nie masz czym dokładnie przetestować aplikacji, przynajmniej ją zbuduj i sprawdź, czy uruchamia się prawidłowo. Zanim będziesz w stanie uruchamiać automatycznie bardziej skomplikowane testy, lepiej wyjdziesz na wprowadzaniu prostych zmian i korzystaniu z tej samej podstawowej procedury, aby upewnić się, że wszystko działa tak, jak trzeba.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1643180609770/kRxfVZE8_.jpeg" alt="Image description" /></p>
<h2 id="heading-zacznij-od-drobnych-zmian">Zacznij od drobnych zmian</h2>
<p>Jesteś już na dobrej drodze, jeśli chodzi o przywracanie projektu do życia; nadeszła pora na wprowadzanie zmian w kodzie. Niech te pierwsze zmiany będą malutkie, takie, że nikt ich nawet nie zauważy. Możesz:</p>
<ul>
<li>zaktualizować jedną z bibliotek,</li>
<li>zmienić nazwę niektórych zmiennych lokalnych,  </li>
<li>przeprowadzić refaktoryzację denerwującego antywzorca występującego w jednym miejscu.</li>
</ul>
<p>Pamiętaj, że celem jest wprowadzenie zmiany, która nie będzie powodować żadnych skutków ubocznych.</p>
<h2 id="heading-przeprowadz-wdrozenie-do-srodowiska-produkcyjnego">Przeprowadź wdrożenie do środowiska produkcyjnego</h2>
<p>Rozwiń kod przy pomocy swoich drobnych zmian i wdróż go we wszystkich środowiskach, w tym w środowisku produkcyjnym. Celem jest przetarcie szlaku dla tego odtworzonego procesu – przelanie zmian w kodzie z Twojej głowy na urządzenia klientów. Zadanie jest wymagające, dlatego właśnie ograniczamy zakres zmian do minimum. Twoim zadaniem jest zwiększenie swojej pewności siebie i zaufania interesariuszy.</p>
<h2 id="heading-dodaj-testy-integracyjne">Dodaj testy integracyjne</h2>
<p>Testy integracyjne najprawdopodobniej będziesz musiał zbudować od zera. Chodzi tu o ten etap testowania, w którym sprawdza się, czy wszystko jest należycie zintegrowane i czy działa prawidłowo. Testy te znane są również pod nazwą end-to-end (e2e), ponieważ często polegają na jednoczesnej weryfikacji frontendu i backendu. Warto zacząć od nich, bo nie będzie miało znaczenia, że Twoja aplikacja prawidłowo wylicza na przykład podatek VAT, jeśli będzie wyłączać się po każdej próbie rozpoczęcia nowej transakcji. Na pierwszy rzut oka sensowniejszym pomysłem może wydawać się stworzenie prostych testów dla wielu stron, a nie precyzyjnych skryptów tylko dla kilku z nich. Proste testy, obejmujące choćby sprawdzenie trasy albo tego, czy kluczowe elementy interfejsu są nadal dostępne, mogą być bardzo wartościowe – wyłapią przypadki całkowitego rozsypywania się stron.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1643180612039/HDX9pRa8T.jpeg" alt="Image description" /></p>
<h2 id="heading-przygotuj-i-zacznij-dodawac-testy-jednostkowe">Przygotuj i zacznij dodawać testy jednostkowe</h2>
<p>Po upewnieniu się, że aplikacja działa, jak trzeba, możesz przejść do szczegółów: sprawdzić, czy działają wszystkie jednostki – klasy, funkcje itd. Możesz je przetestować z poziomu interfejsu użytkownika, ale testy end-to-end:</p>
<ul>
<li>długo się pisze – zebranie odpowiednich danych w jednym miejscu zajmuje sporo czasu;</li>
<li>działają powoli – utrzymywanie uruchomionych baz danych, backendu i przeglądarki wymaga dużo zasobów.</li>
</ul>
<p>Zamiast wpychać do ustawień integracji wszystkie przypadki brzegowe, jakie tylko przyjdą Ci na myśl, lepiej jest mieć na podorędziu osobny test przeznaczony do zajmowania się drobiazgami. Innymi słowy – potrzebne Ci będą testy jednostkowe. Testy te:</p>
<ul>
<li>są o rzędy wielkości szybsze od testów e2e,</li>
<li>nie łączą się z backendem ani z bazą danych,</li>
<li>pozwalają na testowanie najdrobniejszych elementów aplikacji niezależnie od otaczającego je kodu i workflow.</li>
</ul>
<p>Chcesz dowiedzieć się więcej? Tutaj dowiesz się, dlaczego według mnie <a target="_blank" href="https://poznaj.dev/po-co-komu-testy-jednostkowe">warto pisać testy jednostkowe</a>.</p>
<h2 id="heading-kod-lint">Kod lint</h2>
<p>Lintery to programy do statycznej analizy kodu, których zadaniem jest identyfikacja wspólnych źródeł różnych problemów. Dobrze jest mieć ustawioną regularną weryfikację kodu, która sprawdza, czy wszystko działa prawidłowo. <a target="_blank" href="https://eslint.org/">eslint</a>, popularny linter dla JavaScript i TypeScript pozwala na szeroko zakrojoną konfigurację. Możesz ustawić plik konfiguracyjny tak, żeby wyłapywać tylko najbardziej problematyczne kwestie, naprawić całą bazę kodu i zintegrować ją przy pomocy Twojego edytora kodu. Aby uzyskać jeszcze więcej wartości, możesz zacząć dokonywać na tym pliku różnych iteracji – włączając lub wyłączając różne zasady i dodając wtyczki obejmujące konkretne frameworki. Dzięki temu sprawisz, że kod z czasem się poprawi; jednocześnie poszczególne kroki będą niewielkie i nie zabiorą Ci zbyt dużo czasu już na samym początku.</p>
<h2 id="heading-trzymaj-sie-jednego-stylu-kodowania">Trzymaj się jednego stylu kodowania</h2>
<p>Stosowanie tego samego formatowania upraszcza czytanie kodu: unikniesz dziwnie sformatowanych miejsc, które przyciągają uwagę z niewłaściwych powodów. Konsekwencja w bazie kodu wprowadza poczucie porządku i daje spokój ducha, jeśli chodzi o aktualny stan projektu. Styl kodowania to temat zaciętych dyskusji. Nie przykładam szczególnej wagi do formatowania; zależy mi tylko na zachowaniu konsekwencji niezależnie od tego, kto i kiedy napisał kod, i chciałbym, aby ustalony styl był wykorzystywany automatycznie. Na szczęście istnieją narzędzia takie jak <a target="_blank" href="https://prettier.io/">prettier</a>, które w mgnieniu oka formatują całe projekty i pozwalają zespołowi zadecydować tylko o niektórych kwestiach. Co oznacza możliwość przerzucenia samego formatowania i niekończących się dyskusji na ten temat na zewnętrzne narzędzie!</p>
<h2 id="heading-przeprowadz-latwe-aktualizacje-bibliotek">Przeprowadź łatwe aktualizacje bibliotek</h2>
<p>Czas na finalną rozgrzewkę. Możesz spróbować zaktualizować niektóre zależności z jednej wersji do wersji nowszej – na przykład z wersji 1.2.3 do 1.2.4. Wszystkie biblioteki zewnętrzne wykorzystywane przez Twój kod są najpewniej przestarzałe. Ich aktualizacja będzie wymagać dużo pracy, ale będzie warto: nowsze wersje będą pewnie miały nowe funkcje, poprawki bezpieczeństwa i więcej materiałów dostępnych online. Nawet wprowadzenie łatki nie jest trywialną zmianą, a z całą już wykonaną przez Ciebie pracą w zanadrzu możesz oczekiwać jednego z dwóch rezultatów:</p>
<ul>
<li>po aktualizacji pojawią się błędy, które zostaną wyłapane przez jedną z warstw weryfikacyjnych;</li>
<li>wszystko będzie działać, jak należy – podczas testów i w środowisku produkcyjnym, już po wdrożeniu.</li>
</ul>
<p>Pamiętaj, nie spiesz się z tymi aktualizacjami! Wprowadź jedną, wdróż ją i poczekaj na reakcję. Pamiętaj, uczysz ludzi wiary we wprowadzane przez Ciebie zmiany i ostatnią rzeczą, na której Ci zależy, jest regresja. </p>
<h2 id="heading-wprowadz-jak-najmniejsze-jak-najprostsze-ulepszenie-w-interfejsie-uzytkownika">Wprowadź jak najmniejsze, jak najprostsze ulepszenie w interfejsie użytkownika</h2>
<p>Jak dotąd Twoja praca była dla użytkowników niemalże niewidoczna – chyba że mimo wszystko udało Ci się zamieszać w środowisku produkcyjnym. Gdy organizację całej infrastruktury masz już za sobą, możesz zająć się dodawaniem wartości! Wybierz jak najdrobniejszy i najprostszy problem – literówkę na stronie albo brakujący margines na przycisku. Twoim celem jest pokazanie sobie i innym, że potrafisz naprawiać błędy i wprowadzać zmiany w kodzie bez psucia innych rzeczy. Nie zepsuj tego, porywając się z motyką na słońce.</p>
<h2 id="heading-wdroz-proces-ciaglej-integracji-ci">Wdróż proces ciągłej integracji (CI)</h2>
<p>Jeśli projekt zacznie przeżywać swoją drugą młodość, możesz spodziewać się napływu większej liczby żądań zmian. W takim wypadku sensownym posunięciem będzie wprowadzenie ciągłej integracji. Jeśli chcesz dowiedzieć się więcej, daj mi znać w akciecie:</p>
<div class="hn-embed-widget" id="strawpoll-ci"></div><h2 id="heading-co-dalej">Co dalej?</h2>
<p>Gratulacje! Właśnie zostałeś osobą, do której wszyscy będą się zwracać, kiedy pojawią się problemy z przestarzałym kodem. Ciesz się z nowo nabytego bezpieczeństwa zawodowego – opisaną tu pracę trzeba wykonać, a ludzie raczej się do niej nie kwapią. W takim momencie aż prosi się, żebyś sprawdził, czy Twoje wynagrodzenie stoi na poziomie rynkowym i odzwierciedla wartość, którą wnosisz do firmy – <a target="_blank" href="https://poznaj.dev/jak-dostac-podwyzke-w-branzy-it">więcej na ten temat przeczytasz tutaj</a>.</p>
]]></content:encoded></item><item><title><![CDATA[Jak dostać podwyżkę w branży IT?]]></title><description><![CDATA[Wszyscy dobrze wiemy, że kariera w IT to bardzo dobry wybór pod względem finansowym. Mimo to nadal możesz regularnie strzelać sobie w stopę, zadowalając się niższym wynagrodzeniem niż to, które Twoja firma może Ci zaoferować. Nawet niewielka różnica ...]]></description><link>https://poznaj.dev/jak-dostac-podwyzke-w-branzy-it</link><guid isPermaLink="true">https://poznaj.dev/jak-dostac-podwyzke-w-branzy-it</guid><category><![CDATA[Career]]></category><dc:creator><![CDATA[Marcin Wosinek]]></dc:creator><pubDate>Sat, 22 Jan 2022 13:13:51 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1642920825864/GKufNV0nz.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Wszyscy dobrze wiemy, że kariera w IT to bardzo dobry wybór pod względem finansowym. Mimo to nadal możesz regularnie strzelać sobie w stopę, zadowalając się niższym wynagrodzeniem niż to, które Twoja firma może Ci zaoferować. Nawet niewielka różnica w pensji stanie się okrągłą sumką po pomnożeniu przez 12 miesięcy i wszystkie lata Twojej pracy. Poniżej piszę o tym, jak być na bieżąco z okazjami do lepszych zarobków.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1642920781112/26P7l843y.jpeg" alt="Image description" /></p>
<h2 id="heading-porozmawiaj-o-pensji-z-kolegami-z-pracy">Porozmawiaj o pensji z kolegami z pracy</h2>
<p>Sposób, w jaki postrzega się rozmowy o pieniądzach, zależy od kultury. Dorastałem w Polsce, przez co rozmawianie o moich dochodach przez długi czas kojarzyło mi się ze zwyczajnym przechwalaniem się. Rzeczywiście mogłoby to tak wyglądać, gdyby dobrze opłacany specjalista mówił o swoich zarobkach komuś, kto ledwo wiąże koniec z końcem, pracując za minimalne wynagrodzenie. Warto jednak zauważyć, że konwersacje tego typu między osobami pracującymi na podobnych stanowiskach dadzą jeden z dwóch rezultatów:</p>
<ul>
<li>albo okaże się, że pensje rozmówców różnią się minimalnie,</li>
<li>albo któryś z rozmówców – może Ty – zda sobie sprawę z tego, że jest wynagradzany niedostatecznie. Może to wynikać z kilku powodów:<ul>
<li>brak umiejętności technicznych,</li>
<li>brak umiejętności negocjacyjnych,</li>
<li>pracodawca nie dysponuje finansowymi możliwościami pozwalającymi na wypłacanie wyższego wynagrodzenia.</li>
</ul>
</li>
</ul>
<p>A co z tymi, którzy w rezultacie takiej rozmowy dowiedzą się, że zarabiają lepiej? Na pewno nic na tym nie stracą.</p>
<p>Oprócz kulturowego tabu jedynym powodem do nierozmawiania o pieniądzach jest sytuacja, w której wynik finansowy firmy interesuje Cię bardziej niż dobro Twoje i Twoich kolegów. Może tak być na przykład wtedy, gdy Twój udział w kapitale firmy jest dla Ciebie ważniejszy niż Twoje wynagrodzenie, albo całym sercem wierzysz w misję swojego pracodawcy.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1642920783062/FIfkgttaQ.jpeg" alt="Image description" /></p>
<p>** Przeprowadzaj regularną analizę rynku pracy
Jeśli działasz tak jak ja, to, na czym aktualnie skupiasz się w ramach pracy zawodowej, zmienia się wielokrotnie na przestrzeni lat. Czasami spędzam dużo czasu na uczeniu się nowych rzeczy czy angażowaniu w społeczności techniczne, a czasami miewam miesiące, podczas których cała moja aktywność w IT sprowadza się wyłącznie do wykonywania obowiązków pracowniczych. Rynek pracy zmienia się nieustannie: na popularności zyskują nowe technologie, na rynek lokalny wchodzą spółki oferujące lepsze warunki zatrudnienia, firmy z siedzibą w odległych lokalizacjach szukają ludzi do pracy zdalnej. Warto obiecać sobie regularną analizę takich zmian. Przeznaczenie nawet tylko jednego popołudnia w roku na przeszukanie ofert pracy da Ci świadomość sytuacji panującej poza murami Twojego obecnego pracodawcy.</p>
<h2 id="heading-nie-licz-na-ruch-ze-strony-swojej-firmy">Nie licz na ruch ze strony swojej firmy</h2>
<p>Twojemu pracodawcy zawsze będzie zależeć na utrzymaniu status quo w zakresie swojej działalności. Możliwe, że ocena Twojego kierownika będzie zależeć od tego, ile osób już odeszło z jego zespołu, ale taki scenariusz da mu jedynie niewielką motywację do utrzymania Twojego wynagrodzenia na poziomie rynkowym. Motywacja ta będzie jeszcze mniejsza, jeśli powiesz mu, że lubisz swoją pracę i że na ten moment nie szukasz niczego nowego. Jeśli polityka firmy zakłada regularne podwyżki, będzie to najpewniej podyktowane indeksacją płac, a nie zmianami na rynku pracy IT. Jeśli dostaniesz awans i wejdziesz w nowy przedział płacowy, co wiązać się będzie z podwyżką, będzie to wyglądać jak krok do przodu w aspekcie finansowym, ale równie dobrze możesz wtedy znaleźć się przy dolnej granicy nowych widełek płacowych.</p>
<h2 id="heading-przygotuj-sie-na-negocjacje">Przygotuj się na negocjacje</h2>
<p>W 2019 r. kupiłem sobie na urodziny książkę [Fearless Salary Negotiation] (https://bit.ly/FearlessSalaryNegotiation). To był najlepszy prezent, jaki kiedykolwiek dostałem, a jego koszt spłacił się bardzo szybko. Książka zawiera multum praktycznych wskazówek – poradnik, co krok po kroku zrobić, zanim rozpoczniemy negocjowanie swojego wynagrodzenia. Lwią część tego procesu stanowią rozmowy z nowymi firmami, ale istnieje wiele działań, które przydadzą się w szerszym kontekście, a jeden z rozdziałów książki poświęcony jest awansom i podwyżkom.</p>
<p>Jeśli nie dysponujesz wolnymi środkami, autor książki udostępnia jej treść za darmo (https://bit.ly/FearlessSalaryNegotiationFree). A na jego stronie internetowej można zapoznać się z jego poradami w skrótowej formie: [Jak zredagować e-mail do kierownika rozpoczynający rozmowy o podwyżkę] (https://bit.ly/FearlessSalaryNegotiationRaise).</p>
<h2 id="heading-po-prostu-popros">Po prostu poproś!</h2>
<p>Rozmowa z kierownikiem o wynagrodzeniu może być stresująca. Należyte przygotowanie powinno pomóc Ci osiągnąć cel i poradzić sobie ze stresem. Spójrz na to z innej perspektywy – rozsądny kierownik powinien docenić, że z własnej inicjatywy zaczynasz rozmowę na tematy finansowe, zamiast od razu zatrudnić się u konkurencji. A jeśli okaże się, że kierownik jest nierozsądny? Będzie to po prostu sygnał, że warto zacząć interesować się inną firmą.</p>
<h2 id="heading-nie-wstydz-sie-powiedz-kolegom">Nie wstydź się; powiedz kolegom</h2>
<p>Kiedy już dostaniesz upragnioną podwyżkę, pochwal się swoim kolegom z pracy! Standardowa praktyka w branży polegająca na skakaniu między różnymi firmami w celu podwyższania wynagrodzenia sprawia, że Twoi doświadczeni koledzy w każdej chwili mogą zostać zastąpieni kimś, kto nie wie o Twoim projekcie nic, przez co znacząco zwiększy się zakres pracy, za którą będziesz odpowiedzialny. Podzielenie się dobrą nowiną może zainspirować członków Twojego zespołu do pójścia w Twoje ślady, a także podnieść ich morale i sprawić, że zostaną w obecnym miejscu pracy na dłużej. Dzięki temu Twoja praca będzie prostsza i przyjemniejsza.</p>
<h2 id="heading-co-dalej">Co dalej?</h2>
<p>Refleksja nad pracą zawodową z Twojej strony i próby zapewnienia sobie jak najlepszych warunków pracy to dobry znak. Skoro dotarłeś do końca tego artykułu – proponuję Ci zastanowić się, czy Twoja aktualna posada do Ciebie pasuje. Pomoże Ci w tym <a target="_blank" href="https://poznaj.dev/jak-ocenic-swoje-aktualne-miejsce-pracy">poradnik na temat tego, jak ocenić swoje aktualne miejsce pracy</a>. Jeśli w głowie już rodzą Ci się pytania, cały czas szukam chętnych na <a target="_blank" href="https://how-to.dev/free-mentoring">darmowy mentoring w zakresie JS i programowania</a> – jeśli jesteś chętny, daj mi znać!</p>
]]></content:encoded></item><item><title><![CDATA[Jak uczyć się podczas pracy nad własnymi projektami]]></title><description><![CDATA[Złota rada dla początkujących programistów podaje, że najwięcej uczysz się podczas pracy nad własnymi projektami. Jest ona dobra, ale czasem trudno jest jej słuchać – zwłaszcza jeśli stawiasz na ścieżce IT swoje pierwsze kroki. W artykule tym opisuję...]]></description><link>https://poznaj.dev/jak-uczyc-sie-podczas-pracy-nad-wlasnymi-projektami</link><guid isPermaLink="true">https://poznaj.dev/jak-uczyc-sie-podczas-pracy-nad-wlasnymi-projektami</guid><dc:creator><![CDATA[Marcin Wosinek]]></dc:creator><pubDate>Thu, 13 Jan 2022 08:11:25 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1642061929700/_Klsmclv8.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Złota rada dla początkujących programistów podaje, że najwięcej uczysz się podczas pracy nad własnymi projektami. Jest ona dobra, ale czasem trudno jest jej słuchać – zwłaszcza jeśli stawiasz na ścieżce IT swoje pierwsze kroki. W artykule tym opisuję krok po kroku, jak w prosty sposób rozpocząć pracę nad własnymi projektami i uczyć się podczas ich realizacji. Moje przykłady opierają się na stosie do tworzenia frontendowych aplikacji internetowych – HTML + CSS + JS – ale przedstawione tu podejście możesz zastosować do każdej wykorzystywanej przez Ciebie technologii.</p>
<h2 id="heading-wybierz-prosty-przypadek-uzycia">Wybierz prosty przypadek użycia</h2>
<p>Krok pierwszy: nie porywaj się z motyką na słońce. Pracownikom z branży IT często zdarza się budować swego rodzaju klony popularnych stron internetowych. Prowadzi to jednak do mnożenia się funkcji, co uniemożliwia skuteczną pracę nad nimi. Jeśli chcesz inspirować się istniejącymi produktami, spróbuj maksymalnie je uprościć:</p>
<ul>
<li>Jeśli klonujesz Reddita, stwórz stałą, hardcodowaną listę linków (na przykład do najlepszych stron internetowych o programowaniu), gdzie ludzie mogą głosować za lub przeciw ALBO stwórz długą listę, do której po prostu dodajesz linki.</li>
<li>Jeśli klonujesz Airbnb, ogranicz się do wyświetlenia nieruchomości – bez rezerwacji i bez dodawania nowych właściwości.</li>
<li>Jeśli klonujesz Ubera, stwórz stronę z podsumowaniem zamówienia – przejazd z punktu A do punktu B.</li>
</ul>
<p>Możesz też zacząć pracować nad nieco już wyświechtanymi produktami: aplikacją z listą rzeczy do zrobienia lub stroną blogową. Może Ci się to wydawać monotonne i nudne, ale taki przypadek użycia jest przynajmniej zrozumiały i nie powinien być przytłaczający.</p>
<h2 id="heading-naszkicuj-interfejs">Naszkicuj interfejs</h2>
<p>Po wyborze przypadku użycia weź kartkę papieru i długopis i narysuj swój interfejs. Zacznij od jednej strony, maksymalnie dwóch stron. Na początku szkic na papierze będzie idealny: celem jest szybka iteracja, a mało zaawansowane rozwiązanie nadaje się do tego wyśmienicie. Pracując nad wspólnymi projektami, członkowie zespołu tworzą design przy pomocy wyszukanych aplikacji, ale korzystanie z nich jest czasochłonne – trzeba zainstalować aplikację, nauczyć się interfejsu itd., co spowalnia pracę. Szkic nada kształt Twoim myślom, a kiedy będzie gotowy, będziesz na niego zerkać tylko raz na jakiś czas, budując swój interfejs.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1642061854842/z0FjkllHj8.png" alt="simple reddit like interface" /></p>
<p>Złota rada dla początkujących programistów podaje, że najwięcej uczysz się podczas pracy nad własnymi projektami. Jest ona dobra, ale czasem trudno jest jej słuchać – zwłaszcza jeśli stawiasz na ścieżce IT swoje pierwsze kroki. W artykule tym opisuję krok po kroku, jak w prosty sposób rozpocząć pracę nad własnymi projektami i uczyć się podczas ich realizacji. Moje przykłady opierają się na stosie do tworzenia frontendowych aplikacji internetowych – HTML + CSS + JS – ale przedstawione tu podejście możesz zastosować do każdej wykorzystywanej przez Ciebie technologii.</p>
<h2 id="heading-wybierz-prosty-przypadek-uzycia">Wybierz prosty przypadek użycia</h2>
<p>Krok pierwszy: nie porywaj się z motyką na słońce. Pracownikom z branży IT często zdarza się budować swego rodzaju klony popularnych stron internetowych. Prowadzi to jednak do mnożenia się funkcji, co uniemożliwia skuteczną pracę nad nimi. Jeśli chcesz inspirować się istniejącymi produktami, spróbuj maksymalnie je uprościć:</p>
<ul>
<li>Jeśli klonujesz Reddita, stwórz stałą, hardcodowaną listę linków (na przykład do najlepszych stron internetowych o programowaniu), gdzie ludzie mogą głosować za lub przeciw ALBO stwórz długą listę, do której po prostu dodajesz linki.</li>
<li>Jeśli klonujesz Airbnb, ogranicz się do wyświetlenia nieruchomości – bez rezerwacji i bez dodawania nowych właściwości.</li>
<li>Jeśli klonujesz Ubera, stwórz stronę z podsumowaniem zamówienia – przejazd z punktu A do punktu B.</li>
</ul>
<p>Możesz też zacząć pracować nad nieco już wyświechtanymi produktami: aplikacją z listą rzeczy do zrobienia lub stroną blogową. Może Ci się to wydawać monotonne i nudne, ale taki przypadek użycia jest przynajmniej zrozumiały i nie powinien być przytłaczający.</p>
<h2 id="heading-naszkicuj-interfejs">Naszkicuj interfejs</h2>
<p>Po wyborze przypadku użycia weź kartkę papieru i długopis i narysuj swój interfejs. Zacznij od jednej strony, maksymalnie dwóch stron. Na początku szkic na papierze będzie idealny: celem jest szybka iteracja, a mało zaawansowane rozwiązanie nadaje się do tego wyśmienicie. Pracując nad wspólnymi projektami, członkowie zespołu tworzą design przy pomocy wyszukanych aplikacji, ale korzystanie z nich jest czasochłonne – trzeba zainstalować aplikację, nauczyć się interfejsu itd., co spowalnia pracę. Szkic nada kształt Twoim myślom, a kiedy będzie gotowy, będziesz na niego zerkać tylko raz na jakiś czas, budując swój interfejs.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1642061856571/ZRyqAma1b.png" alt="Link: label, url, totalVotes" /></p>
<h2 id="heading-zbuduj-interfejs">Zbuduj interfejs</h2>
<p>Po tych wszystkich przygotowaniach będziesz gotowy na pracę z kodem. Interfejs użytkownika jest najbardziej namacalnym i prawdopodobnie najprostszym elementem projektu. Stwórz plik HTML i ewentualnie dodaj CSS, jeśli będziesz mieć ochotę na upiększenie swojej aplikacji. Celem jest wykreowanie tego, co narysowałeś wcześniej, i wyświetlenie w jak najciekawszy sposób. Pamiętaj – zwłaszcza jeśli bawisz się w stylizację – że „gotowe jest lepsze niż idealne”: nie spędzaj na tym etapie zbyt dużo czasu, chyba że CSS i design to umiejętności, na których chcesz się skupić.</p>
<h2 id="heading-stworz-dane-fikcyjne-i-zaktualizuj-interfejs-tak-aby-je-wyswietlal">Stwórz dane fikcyjne i zaktualizuj interfejs tak, aby je wyświetlał</h2>
<p>Kiedy skończysz już pracę z HTML i hardcodowanymi danymi, będziesz mógł przejść do stworzenia dynamicznego interfejsu. Na tym etapie wzbogacisz swój projekt przy pomocy języka JS. Możesz się ograniczyć do zwykłego JS i odtworzyć kod HTML jako DOM, albo dodać ramę JS, którą już znasz lub której chcesz się nauczyć. Będziesz musiał stworzyć tymczasową strukturę danych w zmiennej i odtworzyć JS formularza HTML na podstawie danych w tej zmiennej.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1642061858225/iFKjqDeBR4.png" alt="data = {label: 'mdn', url: '', totalVotes: 6}" /></p>
<h2 id="heading-zbuduj-interfejs">Zbuduj interfejs</h2>
<p>Po tych wszystkich przygotowaniach będziesz gotowy na pracę z kodem. Interfejs użytkownika jest najbardziej namacalnym i prawdopodobnie najprostszym elementem projektu. Stwórz plik HTML i ewentualnie dodaj CSS, jeśli będziesz mieć ochotę na upiększenie swojej aplikacji. Celem jest wykreowanie tego, co narysowałeś wcześniej, i wyświetlenie w jak najciekawszy sposób. Pamiętaj – zwłaszcza jeśli bawisz się w stylizację – że „gotowe jest lepsze niż idealne”: nie spędzaj na tym etapie zbyt dużo czasu, chyba że CSS i design to umiejętności, na których chcesz się skupić.</p>
<h2 id="heading-stworz-dane-fikcyjne-i-zaktualizuj-interfejs-tak-aby-je-wyswietlal">Stwórz dane fikcyjne i zaktualizuj interfejs tak, aby je wyświetlał</h2>
<p>Kiedy skończysz już pracę z HTML i hardcodowanymi danymi, będziesz mógł przejść do stworzenia dynamicznego interfejsu. Na tym etapie wzbogacisz swój projekt przy pomocy języka JS. Możesz się ograniczyć do zwykłego JS i odtworzyć kod HTML jako DOM, albo dodać ramę JS, którą już znasz lub której chcesz się nauczyć. Będziesz musiał stworzyć tymczasową strukturę danych w zmiennej i odtworzyć JS formularza HTML na podstawie danych w tej zmiennej.</p>
]]></content:encoded></item><item><title><![CDATA[Jak korzystać z natywnych modułów ES]]></title><description><![CDATA[W niniejszym artykule prezentuję przykłady modułów ECMAScript (ES) – co można z nimi zrobić i jakie są ich ograniczenia. Moduły ES są obsługiwane przez wszystkie przeglądarki wydane po maju 2018 roku, więc możesz założyć, że można z nich bezpiecznie ...]]></description><link>https://poznaj.dev/jak-korzystac-z-natywnych-modulow-es</link><guid isPermaLink="true">https://poznaj.dev/jak-korzystac-z-natywnych-modulow-es</guid><category><![CDATA[JavaScript]]></category><dc:creator><![CDATA[Marcin Wosinek]]></dc:creator><pubDate>Sun, 09 Jan 2022 12:52:13 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1644137659764/-RhAmfb7W.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>W niniejszym artykule prezentuję przykłady modułów ECMAScript (ES) – co można z nimi zrobić i jakie są ich ograniczenia. Moduły ES są obsługiwane przez wszystkie przeglądarki wydane po maju 2018 roku, więc możesz założyć, że można z nich bezpiecznie korzystać w większości przypadków.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1641732799313/R8S9OnMGd.png" alt="Image description" /></p>
<p><a target="_blank" href="https://caniuse.com/es6-module">źródło</a></p>
<h2 id="heading-kodowanie-bez-modulow-es">Kodowanie bez modułów ES</h2>
<p>Przed powstaniem modułów ES wszystkie JS trzeba było importować globalnie. Każdy plik miał dostęp do wcześniej zdefiniowanych zmiennych i mógł zostawić informację dla kodu wykonywanego później. Kolejność importowania miała znaczenie, zwłaszcza że elementy zaimportowane później mogły zmienić te, które zostały zaimportowane wcześniej. Starsze importy wyglądały mniej więcej tak:</p>
<p><code>display-data.js</code>:</p>
<pre><code class="lang-JS"><span class="hljs-built_in">document</span>.body.innerHTML = <span class="hljs-string">"lorem ipsum"</span>;
</code></pre>
<p><code>log.js</code>:</p>
<pre><code class="lang-JS"><span class="hljs-built_in">console</span>.log(<span class="hljs-string">"Some test info"</span>);
</code></pre>
<p><code>index.html</code>:</p>
<pre><code class="lang-HTML"><span class="hljs-tag">&lt;<span class="hljs-name">html</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">http-equiv</span>=<span class="hljs-string">"content-type"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"text/html; charset=utf-8"</span> /&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>No modules<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">link</span> <span class="hljs-attr">rel</span>=<span class="hljs-string">"shortcut icon"</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"#"</span> /&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span>

  <span class="hljs-tag">&lt;<span class="hljs-name">body</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"./display-data.js"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"./log.js"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</span>
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1641732801157/_-mRGhQPg.png" alt="Image description" /></p>
<p><a target="_blank" href="https://how-to-js.github.io/es-modules/no-modules/">Konkretny przykład w akcji</a>.</p>
<h3 id="heading-problemy">Problemy</h3>
<p>Podejście to jest problematyczne głównie z dwóch powodów:</p>
<ol>
<li><p>Zanieczyszcza zakresu globalnego przez kod. Jeśli kilka plików określa tę samą wartość, będą one ze sobą kolidować i będą się na siebie wzajemnie nadpisywać: powodzenia w szukaniu i naprawianiu powstałych w związku z tym bugów. Przykład:
<code>data-1.js</code>:</p>
<pre><code class="lang-JS"><span class="hljs-keyword">var</span> data = “lorem ipsum”;
</code></pre>
<p><code>data-2.js</code>:</p>
<pre><code class="lang-JS"><span class="hljs-keyword">var</span> data = “sin dolor”;
</code></pre>
<p><code>index.html</code>:</p>
<pre><code class="lang-HTML"><span class="hljs-tag">&lt;<span class="hljs-name">html</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span>
 <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">http-equiv</span>=<span class="hljs-string">"content-type"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"text/html; charset=utf-8"</span> /&gt;</span>
 <span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>Name collision<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
 <span class="hljs-tag">&lt;<span class="hljs-name">link</span> <span class="hljs-attr">rel</span>=<span class="hljs-string">"shortcut icon"</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"#"</span> /&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span>

<span class="hljs-tag">&lt;<span class="hljs-name">body</span>&gt;</span>
 <span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"./data-1.js"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
 <span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"./data-2.js"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
 <span class="hljs-tag">&lt;<span class="hljs-name">script</span>&gt;</span><span class="javascript">
   <span class="hljs-built_in">document</span>.body.innerHTML = data;
 </span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</span>
</code></pre>
<p><a target="_blank" href="https://how-to-js.github.io/es-modules/name-collision/">Przykład</a>.
Obchodzenie tego problemu polegało najczęściej na wykorzystywaniu natychmiastowo wywoływanego wyrażenia funkcyjnego. Pozwalało to na izolację bloków kodu i chroniło przed zanieczyszczeniem zakresu globalnego, ale jednocześnie sprawiało, że kod stawał się bardziej zagmatwany.</p>
</li>
<li><p>Wszelkimi zależnościami trzeba zarządzać ręcznie. Jeśli jeden plik zależy od drugiego, pliki te trzeba zaimportować w odpowiedniej kolejności. Na przykład:
<code>log-data.js</code>:</p>
<pre><code class="lang-JS"><span class="hljs-built_in">console</span>.log(data);
</code></pre>
<p><code>data.js</code>:</p>
<pre><code class="lang-JS"><span class="hljs-keyword">const</span> data = ‘some data’;
</code></pre>
<p><code>display-data.js</code>:</p>
<pre><code class="lang-JS"><span class="hljs-built_in">document</span>.html = data;
</code></pre>
<p><code>index.html</code>:</p>
<pre><code class="lang-HTML"><span class="hljs-tag">&lt;<span class="hljs-name">html</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span>
 <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">http-equiv</span>=<span class="hljs-string">"content-type"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"text/html; charset=utf-8"</span> /&gt;</span>
 <span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>File order<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
 <span class="hljs-tag">&lt;<span class="hljs-name">link</span> <span class="hljs-attr">rel</span>=<span class="hljs-string">"shortcut icon"</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"#"</span> /&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span>

<span class="hljs-tag">&lt;<span class="hljs-name">body</span>&gt;</span>
 <span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"./log-data.js"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
 <span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"./data.js"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
 <span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"./display-data.js"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</span>
</code></pre>
<p>Jak widać <a target="_blank" href="https://how-to-js.github.io/es-modules/file-order/">tutaj</a>, część wyświetlająca dane działa, jak należy, a część z logowaniem danych – nie.</p>
</li>
</ol>
<h2 id="heading-moduly-es-w-akcji">Moduły ES w akcji</h2>
<p>Co się zmieni, gdy to samo zrobimy z modułami ES? Przede wszystkim zależności definiowane są na poziomie kodu. Jeśli więc chcesz, żeby plik wykorzystywał wartości z innego pliku, definiujesz to bezpośrednio w tym pliku. Podejście to wiele zmienia, zwłaszcza w zakresie czytania kodu: aby poznać cały kontekst stosowany przez konkretny plik, wystarczy go otworzyć i przeczytać.</p>
<p>Jak zatem stosować moduły ES?</p>
<p><code>data.js</code>:</p>
<pre><code class="lang-JS"><span class="hljs-keyword">export</span> <span class="hljs-keyword">const</span> data = <span class="hljs-string">"lorem ipsum"</span>;
</code></pre>
<p><code>display-data.js</code>:</p>
<pre><code class="lang-JS"><span class="hljs-keyword">import</span> { data } <span class="hljs-keyword">from</span> <span class="hljs-string">"./data.js"</span>;

<span class="hljs-built_in">document</span>.body.innerHTML = data;
</code></pre>
<p><code>index.html</code>:</p>
<pre><code class="lang-HTML"><span class="hljs-tag">&lt;<span class="hljs-name">html</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">http-equiv</span>=<span class="hljs-string">"content-type"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"text/html; charset=utf-8"</span> /&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>Simple modules<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">link</span> <span class="hljs-attr">rel</span>=<span class="hljs-string">"shortcut icon"</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"#"</span> /&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span>

  <span class="hljs-tag">&lt;<span class="hljs-name">body</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"module"</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"./display-data.js"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</span>
</code></pre>
<p>Główne zmiany wprowadzone w kodzie:</p>
<ol>
<li>dodanie <code>type=”module”</code> do importu <code>&lt;script&gt;</code> w pliku HTML;</li>
<li>zastosowanie eksportowych i importowych słów kluczowych w plikach JS w celu zdefiniowania i załadowania modułów.</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1641732802950/gXvwJtryp.png" alt="Image description" /></p>
<p><a target="_blank" href="https://how-to-js.github.io/es-modules/simple-modules/">Działający przykład</a>.</p>
<h2 id="heading-import-tego-samego-pliku-przez-kilka-innych-plikow">Import tego samego pliku przez kilka innych plików</h2>
<p>Opisywany przykład można urozmaicić poprzez zaimportowanie tych samych plików dwukrotnie. Jako że każdy z plików musi być niezależny od tego drugiego, import zostanie dodany dwa razy – osobno dla każdego pliku. Przeglądarki zarządzają importem prawidłowo i ładują dany plik tylko raz.</p>
<p><code>data.js</code>:</p>
<pre><code class="lang-JS"><span class="hljs-keyword">export</span> <span class="hljs-keyword">const</span> data = <span class="hljs-string">"lorem ipsum"</span>;
</code></pre>
<p><code>display-data.js</code>:</p>
<pre><code class="lang-JS"><span class="hljs-keyword">import</span> { data } <span class="hljs-keyword">from</span> <span class="hljs-string">"./data.js"</span>;

<span class="hljs-built_in">document</span>.body.innerHTML = data;
</code></pre>
<p><code>log-data.js</code>:</p>
<pre><code class="lang-JS"><span class="hljs-keyword">import</span> { data } <span class="hljs-keyword">from</span> <span class="hljs-string">"./data.js"</span>;

<span class="hljs-built_in">console</span>.log(data);
</code></pre>
<p><code>index.html</code>:</p>
<pre><code class="lang-HTML"><span class="hljs-tag">&lt;<span class="hljs-name">html</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">http-equiv</span>=<span class="hljs-string">"content-type"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"text/html; charset=utf-8"</span> /&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>Shared import<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">link</span> <span class="hljs-attr">rel</span>=<span class="hljs-string">"shortcut icon"</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"#"</span> /&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span>

  <span class="hljs-tag">&lt;<span class="hljs-name">body</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"module"</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"./display-data.js"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"module"</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"./log-data.js"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</span>
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1641732805162/vBaTXc6Yd.png" alt="Image description" /></p>
<p><a target="_blank" href="https://how-to-js.github.io/es-modules/shared-import/">Przykład</a></p>
<h2 id="heading-leniwe-ladowanie-aka-lazy-load">Leniwe ładowanie aka lazy load</h2>
<p>Lazy load opóźnia ładowanie aplikacji do chwili, w której kod zaczyna być potrzebny. Ta technika optymalizacji jest bardziej skomplikowana niż ładowanie wszystkiego od razu, ale pozwala na większą kontrolę nad tym, co i kiedy się ładuje. W poniższym przykładzie ładuję i wyświetlam dane z około półsekundowym opóźnieniem:</p>
<p><code>display-data.js</code>:</p>
<pre><code class="lang-JS"><span class="hljs-built_in">setTimeout</span>(
  <span class="hljs-function">() =&gt;</span>
    <span class="hljs-keyword">import</span>(<span class="hljs-string">"./data.js"</span>).then(<span class="hljs-function">(<span class="hljs-params">{ data }</span>) =&gt;</span> {
      <span class="hljs-built_in">document</span>.body.innerHTML = data;
    }),
  <span class="hljs-number">500</span>
);
</code></pre>
<p><code>data.js</code>:</p>
<pre><code class="lang-JSON">export const data = <span class="hljs-string">"lorem ipsum"</span>;
</code></pre>
<p><code>index.html</code>:</p>
<pre><code class="lang-HTML"><span class="hljs-tag">&lt;<span class="hljs-name">html</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">http-equiv</span>=<span class="hljs-string">"content-type"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"text/html; charset=utf-8"</span> /&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>Lazy load<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">link</span> <span class="hljs-attr">rel</span>=<span class="hljs-string">"shortcut icon"</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"#"</span> /&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span>

  <span class="hljs-tag">&lt;<span class="hljs-name">body</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"module"</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"./display-data.js"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</span>
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1641732807195/v1eYg4cZb.png" alt="Image description" /></p>
<p>[Przykład lazy load] (https://how-to-js.github.io/es-modules/lazy-load/)</p>
<h2 id="heading-czy-modul-es-obejmuje-wszystko-czego-potrzeba-w-nowoczesnym-js">Czy moduł ES obejmuje wszystko, czego potrzeba w nowoczesnym JS?</h2>
<p>Chociaż natywne moduły ES znacznie poprawiają wcześniejsze modele wprowadzania nowych elementów, brakuje im kilku cech kluczowych w nowoczesnym procesie programowania w JavaScript. Aktualnie nie można wykonać następujących działań:</p>
<ol>
<li>Importu typów innych niż JS. Obecnie przygotowywane są inne pliki [JSON] (https://tc39.es/proposal-json-modules/), ale minie jeszcze trochę czasu, zanim będą one obsługiwane przez przeglądarki.</li>
<li>Importu zewnętrznych bibliotek tak jak w Node.js. Można by skopiować pliki podczas kompilacji i zaimportować je z lokalizacji w <code>node_modules</code>, ale proces ten wydaje się dużo bardziej skomplikowany niż zwyczajne <code>import “library”</code>.</li>
<li>Transpilacji. Wiele nowoczesnych kodów JS pisze się w różnych językach – na przykład w TypeScript. Nawet czysty JS wymaga transpilacji do obsługi starszych przeglądarek lub wykorzystywania najnowszych funkcji języków.</li>
</ol>
<p>Z tych względów większość projektów wykorzystuje narzędzia typu JS bundler, czyli swego rodzaju kompilatorów, które przygotowują build na poszczególne wdrożenia. Jeśli zaciekawił Cię temat bundlerów, daj znać w komentarzu i sprawdź poniższe linki.</p>
<h2 id="heading-linki">Linki</h2>
<ul>
<li>[Repozytorium przykładów] (https://github.com/how-to-js/es-modules),</li>
<li>[wszystkie przykłady] (https://how-to-js.github.io/es-modules/),</li>
<li>[mój wideokurs na temat esbuild] (https://bit.ly/esbuild-course),</li>
<li>[mój wideokurs na temat webpack] (https://bit.ly/esbuild-course.)</li>
</ul>
<h2 id="heading-podsumowanie">Podsumowanie</h2>
<p>W niniejszym artykule omówiłem istotne przypadki użycia modułów ES. Kolejnym krokiem będzie skonfigurowanie JS bundlera tak, aby obejść ograniczenia modułów natywnych.</p>
]]></content:encoded></item><item><title><![CDATA[Po co komu testy jednostkowe?]]></title><description><![CDATA[Jeśli jesteś młodszym programistą, testy jednostkowe mogą zamieszać Ci w głowie. Co gorsza, testy wykorzystywane jako przykłady często wprowadzają jeszcze więcej zamieszania. Kiedy widzisz coś takiego:

masz pełne prawo wątpić w jakikolwiek sens ich ...]]></description><link>https://poznaj.dev/po-co-komu-testy-jednostkowe</link><guid isPermaLink="true">https://poznaj.dev/po-co-komu-testy-jednostkowe</guid><dc:creator><![CDATA[Marcin Wosinek]]></dc:creator><pubDate>Sun, 09 Jan 2022 12:26:03 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1641731907352/FKj0_cgaM.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Jeśli jesteś młodszym programistą, testy jednostkowe mogą zamieszać Ci w głowie. Co gorsza, testy wykorzystywane jako przykłady często wprowadzają jeszcze więcej zamieszania. Kiedy widzisz coś takiego:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1641731907352/FKj0_cgaM.png" alt="Image description" /></p>
<p>masz pełne prawo wątpić w jakikolwiek sens ich pisania. Poniżej przedstawiam powody, dla których jednak warto je pisać.</p>
<h2 id="heading-czym-sa-testy-jednostkowe">Czym są testy jednostkowe?</h2>
<p>Testy jednostkowe to proste skrypty, które sprawdzają, czy dana jednostka – klasa, funkcja, moduł itd. – działa tak, jak powinna. Powinny być raczej nieskomplikowane i obejmować szczęśliwą ścieżkę (happy path) kodu plus garść przypadków brzegowych, czyli tzw. edge cases. Z powodów opisanych poniżej przyczyniają się one do sukcesu projektu.</p>
<h2 id="heading-przyspiesz-testowanie-w-trakcie-programowania">Przyspiesz testowanie w trakcie programowania</h2>
<p>Kiedy zaczynasz zajmować się budowaniem aplikacji, testowanie kodu z poziomu interfejsu użytkownika wydaje się rozwiązaniem całkowicie normalnym. Proces ten może stać się jednak szybszy i mniej zawodny po napisaniu skryptu, który będzie sprawdzał kod za Ciebie. Gdy już przygotujesz takie testy, uruchamianie ich raz za razem nie będzie wymagać żadnych dodatkowych procesów myślowych; możesz je przeprowadzać tak często, jak tylko chcesz. Przeprowadzanie testów prowadzi też do skrócenia pętli sprzężenia zwrotnego, co ułatwi Ci skupienie i poprawi produktywność.</p>
<h2 id="heading-odkryj-przypadki-brzegowe">Odkryj przypadki brzegowe</h2>
<p>Pisanie testów jednostkowych od razu przywodzi mi na myśl przypadki brzegowe – wszystkie sytuacje, które występują rzadko, są nieoczekiwane lub po prostu błędne. To normalne, że pisząc logikę, skupiasz się na ścieżce happy path, czyli na tym, co typowe i co ma się wydarzyć. Pisząc testy, możesz wprowadzić kontrole przypadków brzegowych i określić, co ma się dziać, gdy wystąpi którykolwiek z nich. Dzięki temu Twój kod będzie odporniejszy na wszelkie nieoczekiwane scenariusze.</p>
<h2 id="heading-upewnij-sie-ze-twoj-kod-sklada-sie-z-jednostek">Upewnij się, że Twój kod składa się z jednostek</h2>
<p>Podczas dodawania testów jednostkowych do kodu zobaczysz, co jest łatwe do przetestowania, a co przetestować jest trudniej. W miarę rozrastania się kodu i zwiększania jego poziomu skomplikowania korzystanie z testów zmusi Cię do dzielenia kodu na łatwe do zarządzania elementy. To świetna sytuacja – dzięki temu Twój kod osiągnie jeszcze lepszą jakość. Każdy segment, któremu przypisano zbyt dużo odpowiedzialności, będzie wymagał wykładniczo więcej testów jednostkowych. W takich przypadkach dobrze jest zatrzymać się na chwilę i przemyśleć, jak zorganizować logikę.</p>
<h2 id="heading-interaktywna-dokumentacja">Interaktywna dokumentacja</h2>
<p>Testy staną się dodatkowym zasobem dla osoby, która będzie pracować na kodzie po Tobie: dzięki nim dowie się, jaki jest cel kodu i jak ma on działać. To tak jakby dodatkowa dokumentacja z bonusami:</p>
<ol>
<li>Testy są często bardziej precyzyjne niż opisy znajdujące się we właściwej dokumentacji.</li>
<li>Testy można przeprowadzać na kodzie w aktualnej wersji, aby upewnić się, że wszystkie instrukcje pozostają prawidłowe; w procesie czytania, rozumienia i sprawdzania kodu nie musisz polegać na człowieku.</li>
</ol>
<h2 id="heading-zabezpieczenie-dla-przyszlych-zmian">Zabezpieczenie dla przyszłych zmian</h2>
<p>Testy jednostkowe wykonują się tak szybko, że jedynym sensownym podejściem jest uruchamianie ich po każdej aktualizacji niezależnie od tego, jak mała się ona wydaje. Istnieje możliwość ustawienia w swoim repozytorium kodu ciągłej integracji (CI) tak, aby akceptował on tylko te zmiany, które przejdą wszystkie testy z wynikiem pozytywnym. Dzięki temu zapewnisz niczym nie zaburzoną integrację zmian bez względu na wprowadzane zmiany:</p>
<ul>
<li>drobne aktualizacje, które „nie powinny niczego zepsuć”,</li>
<li>aktualizacje zewnętrznych bibliotek,</li>
<li>szybkie i nie do końca precyzyjne próby wprowadzenia niewielkich zmian.</li>
</ul>
<p>Testy jednostkowe chronią kod źródłowy przed wszelkimi niewielkimi regresjami, które objęte są ich zakresem.</p>
<h2 id="heading-podsumowanie">Podsumowanie</h2>
<p>Testy jednostkowe są kluczowym elementem utrzymywania kodu na wysokim poziomie. Można je traktować jak jedną z nóg metaforycznego stołu:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1641731909369/eGsF8zlqt.png" alt="Image description" /></p>
<p>nogę tę można oczywiście wyjąć, ale przez to stół będzie mniej stabilny. Zajmij się ich pisaniem, a pomogą Ci otrzymać wysoką jakość kodu i zwiększą bezpieczeństwo Twoich aplikacji.</p>
]]></content:encoded></item><item><title><![CDATA[Jak ocenić swoje aktualne miejsce pracy]]></title><description><![CDATA[Jak zapewne wiesz, specjaliści IT mogą teraz przebierać w ofertach, jeśli akurat zdecydują się na zmianę pracy. Niezależnie od podjętej decyzji – pozostanie w tej samej firmie lub szukanie innych możliwości – warto ocenić swoje aktualne miejsce pracy...]]></description><link>https://poznaj.dev/jak-ocenic-swoje-aktualne-miejsce-pracy</link><guid isPermaLink="true">https://poznaj.dev/jak-ocenic-swoje-aktualne-miejsce-pracy</guid><category><![CDATA[Career]]></category><dc:creator><![CDATA[Marcin Wosinek]]></dc:creator><pubDate>Sat, 04 Dec 2021 21:01:22 GMT</pubDate><content:encoded><![CDATA[<p>Jak zapewne wiesz, specjaliści IT mogą teraz przebierać w ofertach, jeśli akurat zdecydują się na zmianę pracy. Niezależnie od podjętej decyzji – pozostanie w tej samej firmie lub szukanie innych możliwości – warto ocenić swoje aktualne miejsce pracy. Poniżej przedstawiam listę, która pomoże Ci sprawdzić, czy dane stanowisko jest dla Ciebie, czy też nie.</p>
<h2 id="heading-czynnik-ludzki">Czynnik ludzki</h2>
<p>Mimo że wspomniana branża wymaga przesiadywania przed ekranem komputera, interakcje społeczne są bardzo istotnym elementem pracy w IT. To kluczowy czynnik decydujący o tym, czy ludzie zostają w firmie, czy szukają pracy gdzie indziej. Na co powinieneś zwrócić uwagę?</p>
<h3 id="heading-1-czy-twoi-koledzy-z-pracy-sa-zyczliwi-i-pomocni">1. Czy Twoi koledzy z pracy są życzliwi i pomocni?</h3>
<p>To przykre, że w tej branży tak często spotyka się z niemiłym lub mało pomocnym podejściem do nowych pracowników. Prawda jest taka, że nawet w małych projektach nikt nie będzie w stanie zrobić wszystkiego od A do Z – zaczynając od określenia wymagań, przez stworzenie aplikacji, na wdrożeniu i pomaganiu użytkownikom kończąc. Każda osoba w zespole potrzebuje pozostałych jego członków do skutecznej realizacji swoich obowiązków, więc często najlepsze, co możesz zrobić, to pomóc kolegom z pracy.</p>
<h3 id="heading-2-czy-kierownictwo-bardzo-naciska-na-swoich-pracownikow">2. Czy kierownictwo bardzo naciska na swoich pracowników?</h3>
<p>Jest to kolejny istotny czynnik wpływający na jakość Twojego miejsca pracy – czy przełożony chroni Cię przed czynnikami zewnętrznymi, czy raczej przerzuca presję z góry na Ciebie? Nie mogę wypowiadać się w imieniu każdego developera, ale ja jestem szczęśliwszy i bardziej produktywny, kiedy nie muszę walczyć ze stresem – mam tendencję do zbyt mocnego angażowania się i nie potrzebuję forsującego środowiska, które oczekuje, że pracownicy będą realizować wszystkie zadania mimo niemożliwych terminów.</p>
<h3 id="heading-3-czy-masz-do-dyspozycji-dobry-sprzet-i-dobre-narzedzia">3. Czy masz do dyspozycji dobry sprzęt i dobre narzędzia?</h3>
<p>Twoja ocena pracownicza zależy od Twojej produktywności, ta z kolei zależy od komputera, na którym pracujesz, zainstalowanych na nim narzędzi programistycznych i usługodawców zewnętrznych, z których pomocy korzystasz. W większości przypadków czas przeznaczony na programowanie jest droższy niż cena komputerów i narzędzi. Z biznesowego punktu widzenia oczywistym jest, że firma powinna wydać na te narzędzia tyle, ile trzeba, i zagwarantować, że ludzie będą wykorzystywać swój czas jak najproduktywniej. A jeśli tak się nie stanie... ot, masz dobry powód, aby zacząć wątpić w umiejętności przywódcze swojego kierownictwa.</p>
<h3 id="heading-4-jak-bardzo-wiedza-czlonkow-zespolu-sie-pokrywa">4. Jak bardzo wiedza członków zespołu się pokrywa?</h3>
<p>Jeśli nikt Ci nie pomaga, będzie Ci ciężko. Jeśli nikt w zespole nie robi na co dzień rzeczy, którymi Ty się zajmujesz, kiedy tylko coś się zepsuje, a Ciebie nie będzie już na miejscu, będą próbowali się z Tobą skontaktować. Sytuacja może być trudna, jeśli zespół jest zbyt mały, aby zapewnić pokrywanie się wiedzy między jego poszczególnymi członkami, ale nie powinno to sprawić, że zgadzasz się na bycie niezastąpionym.</p>
<h3 id="heading-5-czy-inspekcje-kodu-sa-regularnie-przeprowadzane">5. Czy inspekcje kodu są regularnie przeprowadzane?</h3>
<p>Inspekcje kodu to minimum potrzebne do zagwarantowania, że wszyscy członkowie zespołu mają aktualne informacje o jego zmianach. Warto omówić kierunek, w którym Twój zespół prowadzi kod źródłowy. W przeciwnym razie w pewnym momencie może się okazać, że jesteś jedynym developerem odpowiedzialnym za konkretny moduł. A to szybka droga do większej presji, jeśli coś z tym modułem trzeba będzie zrobić.</p>
<h3 id="heading-6-czy-w-twoim-zespole-retrospektywy-odbywaja-sie-regularnie">6. Czy w Twoim zespole retrospektywy odbywają się regularnie?</h3>
<p>Retrospektywy to świetna okazja na zwiększenie produktywności zespołu i dojście do tego, jak członkowie zespołu mogą sobie pomagać. Jeśli regularnie nie omawiacie w zespole problematycznych kwestii, to nie ma możliwości dostrzeżenia rozwiązań będących na wyciągnięcie ręki. Albo między członkami zespołu kumulują się nierozwiązane problemy, które można byłoby rozwiązać, gdyby znalazło się miejsce na ich konstruktywne omówienie.</p>
<h2 id="heading-aspekt-technologiczny">Aspekt technologiczny</h2>
<p>Nawet w sektorze IT niektóre firmy nie są na bieżąco z aktualnymi praktykami stosowanymi w branży. Niestosowanie ich jest złudnym sposobem na zaoszczędzenie czasu, bo procesy zapewniania jakości nie wychwycą wtedy regresji, które powrócą później jako problem wymagający natychmiastowej uwagi. Poniższe kwestie są niezmiernie ważne i bardzo ułatwią życie każdemu developerowi.</p>
<h3 id="heading-1-reczne-zapewnianie-jakosci-qa">1. Ręczne zapewnianie jakości (QA)</h3>
<p>Pierwszą linią obrony przed regresjami i niespełnionymi wymaganiami jest testowanie ręczne. Z punktu widzenia developera mogę powiedzieć, że dobrze mieć „plecy” w postaci kolegi po fachu sprawdzającego aplikację, zanim wprowadzone przeze mnie zmiany pójdą do produkcji. QA to kolejny przykład sytuacji, w której dobro firmy i Twoje są zbieżne – po prostu łatwiej jest znaleźć i naprawić bugi, zanim znajdą się w środowisku produkcyjnym. Dodatkowo oszczędzi to stresu wszystkim developerom zaangażowanym w projekt.</p>
<h3 id="heading-2-analizy-statyczne">2. Analizy statyczne</h3>
<p>Zautomatyzowany proces zapewniania jakości na poziomie podstawowym. Dzięki narzędziom typu <a target="_blank" href="https://eslint.org/">eslint</a> i <a target="_blank" href="https://prettier.io/">prettier</a> na frontendzie oraz <a target="_blank" href="https://flake8.pycqa.org/en/latest/">Flake8</a> i <a target="_blank" href="https://black.readthedocs.io/en/stable/">black</a> w Pythonie możesz zapewnić konsekwentny styl kodowania i ochronić się przed wprowadzeniem do swojego kodu źródłowego prostych błędów. Konfiguracja tych narzędzi i wprowadzenie początkowych zmian zajmie trochę czasu, ale najtrudniejsze będzie zaangażowanie wszystkich członków zespołu i dopilnowanie, żeby używali tych narzędzi konsekwentnie – zwłaszcza przed scalaniem zmian w gałęzi głównej.</p>
<h3 id="heading-3-test-jednostkowy">3. Test jednostkowy</h3>
<p>Kolejne zautomatyzowane i szybkie narzędzie do weryfikacji kodu. Testy jednostkowe wyłapują drobne regresje wynikające z refaktoryzacji, aktualizacji bibliotek lub ze zmian kodu wprowadzanych przez osoby nierozumiejące tak naprawdę, jak działa kod. Jeśli w Twoim miejscu pracy brakuje metody QA, całkiem możliwe, że Ty i Twoi koledzy tracicie mnóstwo czasu na naprawianie bugów, które można było wychwyci.</p>
<h3 id="heading-4-testy-end-to-end-e2e-inaczej-integracyjne">4. Testy end-to-end (E2E), inaczej integracyjne</h3>
<p>Testy integracyjne są testami najbardziej wymagającymi pod kątem pisania i utrzymania. Testy jednostkowe testują kod w izolacji – z wykorzystaniem dużej liczby atrap projektu i danych fikcyjnych. Te pierwsze z kolei są przeprowadzane jak najbliżej środowiska produkcyjnego. W przypadku projektów webowych do dyspozycji są narzędzia typu <a target="_blank" href="https://www.cypress.io/">cypress</a>, które umożliwiają przeprowadzanie testów na aplikacji frontendowej, serwerze backendowym i bazie danych. Liczba zmiennych utrudnia konfigurację, ale narzędzie potrafi wyłapać problemy na wszystkich trzech warstwach. Jest jednak pewien haczyk – po znalezieniu problemu będzie potrzeba czasu, aby stwierdzić, która warstwa go powoduje.</p>
<h3 id="heading-5-ciagla-integracja-ci">5. Ciągła integracja (CI)</h3>
<p>Uruchamianie tych wszystkich testów na sprzęcie developerów przed commitem byłoby niepraktyczne. Ale jeśli nie będziesz tego robił regularnie, spadnie jakość kodu źródłowego i dojdzie do nagromadzenia błędów. Rozwiązaniem jest uruchamianie skryptu na zewnętrznej maszynie po każdym commicie lub stworzeniu gałęzi w repozytorium. Dodatkową korzyścią jest to, że dzięki temu będziesz mieć oficjalny log stanu kodu – jeśli więc przedostanie się do niego jakaś zmiana breaking change, łatwo znajdziesz commit, który do tego doprowadził.</p>
<h3 id="heading-6-dokumentacja">6. Dokumentacja</h3>
<p>Jedyną rzeczą gorszą od pisania dokumentacji jest jej brak, kiedy jest potrzebna. Każdy niebanalny projekt wymaga opisania, przynajmniej w kilku słowach, jak go uruchomić i jaką ma strukturę. Ja na dokumentację patrzę jak na prezent dla moich kolegów z przyszłości – jest to coś, na czym mogą się oprzeć, próbując zrozumieć moją pracę, kiedy mnie nie ma już w zespole. Albo kiedy jestem na wakacjach i ostatnią rzeczą, której mi potrzeba do szczęścia, jest telefon z pracy.</p>
<h2 id="heading-mysl-przyszlosciowo">Myśl przyszłościowo</h2>
<p>Pozwolę sobie przywołać tutaj ulubione pytanie z rozmów kwalifikacyjnych: „Gdzie widzisz siebie za 5 lat?” – upewnij się, że firma nie pcha Cię w miejsce, w którym nie chciałbyś się znaleźć.</p>
<h3 id="heading-1-ile-mozesz-sie-nauczyc">1. Ile możesz się nauczyć?</h3>
<p>Jako developer nigdy nie przestajesz się uczyć, ale w niektórych miejscach będziesz robił to efektywniej niż w innych. Jeśli otaczają Cię ludzie z większym doświadczeniem, którzy na dodatek są chętni do pomocy, mam dobre wieści: jesteś w świetnym miejscu do rozwoju. Jeśli z drugiej strony pracujesz sam lub wykonujesz powtarzalne czynności, Twoja nauka w miejscu pracy w końcu stanie. W takim wypadku możesz się uczyć po godzinach, ale możesz też przygotowywać się do rozmowy kwalifikacyjnej.</p>
<h3 id="heading-2-czy-twoja-pensja-spelnia-standardy-rynkowe">2. Czy Twoja pensja spełnia standardy rynkowe?</h3>
<p>Nie ma potrzeby pracowania w firmie, która płaci Ci poniżej stawki rynkowej. No chyba że pracujesz dla organizacji charytatywnej z wartościami spójnymi z Twoimi. Aby określić stawkę rynkową, możesz skorzystać z <a target="_blank" href="https://fearlesssalarynegotiation.com/book/value/market-value-overview/">tego rozwiązania</a>, a potem inwestować kilka godzin rocznie, aby mieć pewność, że od razu zauważysz, kiedy dostajesz za mało. W przeciwnym razie część Twojego czasu w pracy będzie wolontariatem dla firmy, która zdecydowanie nie jest NGO.</p>
<h3 id="heading-3-czy-umiejetnosci-ktorych-potrzebuje-spolka-sa-zgodne-z-twoimi-preferencjami">3. Czy umiejętności, których potrzebuje spółka, są zgodne z Twoimi preferencjami?</h3>
<p>Czy spółka jest zdecydowana na migrację do Pythona, a Ty mimo wszystko dalej uwielbiasz stawiać te swoje średniki? Kiepskie procesy zapewniania jakości sprawiają, że jesteś raczej specjalistą ds. wsparcia klienta, a nie developerem? A może w zespole nigdy nie będzie specjalisty DevOps i ktoś będzie się musiał tego nauczyć? We wszystkich tych przypadkach może być tak, że nie pasujesz do przyszłości, którą oferuje Ci firma. A to dobry powód do zastanowienia się, czy chcesz dalej dla niej pracować.</p>
<h3 id="heading-4-czy-spolka-trzyma-sie-kurczowo-technologii-bez-przyszlosci">4. Czy spółka trzyma się kurczowo technologii bez przyszłości?</h3>
<p>W 2021 roku pracuję na AngularJS, a jednocześnie:</p>
<ol>
<li>nie polecam swojej firmie migracji do innej platformy programistycznej – byłaby to zbyt duża inwestycja;</li>
<li>nie polecałbym tego stosu aplikacji świeżo upieczonym pracownikom;</li>
<li>sam bym się teraz nie chciał uczyć Angular, a co dopiero AngularJS.</li>
</ol>
<p>Tak więc w zależności od tego, jak widzisz w branży swoją przyszłość, możesz iść w kierunku bardziej popularnych narzędzi albo czegoś o bardziej świetlanej przyszłości niż stos, który był fajny w 2013.</p>
<h3 id="heading-5-zespol-sie-rozwija-czy-kurczy">5. Zespół się rozwija czy kurczy?</h3>
<p>Rozwijasz się razem ze swoją firmą czy ze swoim zespołem? To, że zacząłeś wcześnie, sprawia, że będziesz w pewien sposób odpowiedzialny za ludzi dochodzących później. Dzięki temu płynnie przejdziesz od zadań dla programisty średniego szczebla do zadań dla senior developerów i dalej. Ta sama zasada działa w drugą stronę – jeśli liczebność Twojego zespołu topnieje, w pewnym momencie możesz obudzić się bez juniorów, dla których możesz być mentorem, i bez programistów, którymi możesz zarządzać. Podsumowując – niewielki, ale rozwijający się zespół jest idealnym środowiskiem dla osoby skupionej na rozwoju kariery.</p>
<h3 id="heading-6-dalbys-sobie-reke-uciac-za-realizowany-projekt">6. Dałbyś sobie rękę uciąć za realizowany projekt?</h3>
<p>Twój sukces finansowy zależy od stanu zatrudniającej Cię firmy, niezależnie od jej modelu wynagradzania – nawet jeśli zarabiasz czystą gotówkę. Jeśli spółka radzi sobie dobrze i się rozwija, bardzo prawdopodobne, że utrzyma się na poziomie obowiązujących standardów rynkowych, a Twój pasek pracowniczy będzie wskazywał coraz większą sumę, chociaż Ty nie będziesz wnosił w spółkę więcej wkładu niż dotychczas. Jeśli z drugiej strony stan spółki idzie w dół, jej budżet zacznie się zmniejszać, co z kolei może doprowadzić do któregokolwiek z wyżej wymienionych problemów.</p>
<h2 id="heading-podsumowanie">Podsumowanie</h2>
<p>Dobrze jest od czasu do czasu ocenić firmę, dla której pracujesz. Upewnij się, że nie siedzisz w miejscu, w którym nie powinno Cię już dawno być – nikt inny tego za Ciebie nie zrobi. Daj mi znać w komentarzu, jak radzi sobie Twoja firma i czy Twoim zdaniem istnieją jeszcze inne aspekty, które warto brać pod uwagę, oceniając swoje stanowisko pracy.</p>
<h2 id="heading-linki">Linki</h2>
<p>Oryginalnie opublikowane <a target="_blank" href="https://how-to.dev/how-to-evaluate-your-current-workplace">po angielsku</a>.</p>
]]></content:encoded></item><item><title><![CDATA[Jak uprofesionalnić twój poboczny projekt w pracy]]></title><description><![CDATA[Załóżmy że nie jesteś programistą, ale udało Ci się zautomatyzować część zadań za pomocą małego skryptu. Gratuluję! Utrzymujesz kod na produkcji i dostarczasz wartość za jego pomocą. Z tego artykułu dowiesz się, jak możesz wprowadzić swój kod na nowy...]]></description><link>https://poznaj.dev/jak-uprofesionalnic-twoj-poboczny-projekt-w-pracy</link><guid isPermaLink="true">https://poznaj.dev/jak-uprofesionalnic-twoj-poboczny-projekt-w-pracy</guid><dc:creator><![CDATA[Marcin Wosinek]]></dc:creator><pubDate>Tue, 16 Nov 2021 16:54:07 GMT</pubDate><content:encoded><![CDATA[<p>Załóżmy że nie jesteś programistą, ale udało Ci się zautomatyzować część zadań za pomocą małego skryptu. Gratuluję! Utrzymujesz kod na produkcji i dostarczasz wartość za jego pomocą. Z tego artykułu dowiesz się, jak możesz wprowadzić swój kod na nowy poziom i uzyskać wartościowe umiejętności programistyczne.</p>
<h2 id="heading-zaczynamy">Zaczynamy!</h2>
<p>Najprawdopodobniej, Twój kod:</p>
<p>– to zbitka fragmentów kodów znalezionych w internecie;
– działa w większości przypadków, ale czasami ulega awarii;
– może być obsługiwany tylko przez Ciebie.</p>
<p>Na dodatek masz wrażenie, że to nie jest prawdziwe programowanie.</p>
<h2 id="heading-mozliwe-ulepszenia">Możliwe ulepszenia</h2>
<p>Jest kilka rzeczy, które możesz poprawić w takim kodzie. Korzyści będą dla obu stron:</p>
<p>– firma będzie mogła korzystać z kodu, nawet kiedy opuścisz swoje aktualne stanowisko,
– Ty będziesz miał możliwość uzyskać cenne umiejętności &amp; zademonstrujesz je w praktyce.</p>
<p>Rzeczy, które możesz dodać do Twojego projektu:</p>
<ol>
<li>kontrola wersji – na przykład git,</li>
<li>dokumentacja,</li>
<li>testy automatyczne,</li>
<li>ciągła integracja (continuous integration).</li>
</ol>
<h2 id="heading-kontrola-wersji">Kontrola wersji</h2>
<p>Kontrola wersji jest standardem przy każdym programowaniu na poważnie.  Pozwala Ci ona dokumentować zmiany w miarę postępów i szybko przywrócić przeszłą wersję kodu. Jeśli nie używasz kontroli wersji, marnujesz firmowe zasoby (Twój czas) i ryzykujesz bez potrzeby własną frustrację. Aktualnie GitHub i GitLab oferują darmowy hosting, również dla prywatnych projektów.</p>
<h2 id="heading-dokumentacja">Dokumentacja</h2>
<p>Ulubiony temat developerów do narzekania – albo dlatego, że muszą pisać dokumentację, albo dlatego, że pracują na nieudokumentowanym kodzie. Najlepiej zacznij przynajmniej z <code>README</code> i w miarę jak projekt będzie się rozwijać, poszukaj sposobu, żeby dokumentować różne jego fragmenty.</p>
<h2 id="heading-testy-automatyczne">Testy automatyczne</h2>
<p>Najważniejsze to zacząć testować jak najwcześniej. Zawszę są pilniejsze rzeczy niż testowanie, ale możesz przynajmniej zbudować infrastrukturę do testowania i zacząć pisać testy jeden po drugim. Na pewno będą one wartościowe, kiedy projekt zrobi się bardziej skomplikowany lub będzie go przejmować ktoś inny.</p>
<h2 id="heading-ciagla-integracja-ci">Ciągła integracja (CI)</h2>
<p>To trochę sporo, jeśli pracujesz zupełnie sam, ale robi się naprawdę ważne, kiedy inny zaczynają pracować nad kodem. CI obniża próg wejścia do projektu – oprócz Twojego komputera jest jeszcze jedna maszyna, na której system działa. W miarę jak inne osoby będą dołączać do projektu, będziesz mieć centralne miejsce, w którym zmiany będą weryfikowane – bez angażowania Ciebie, autora aplikacji.</p>
<h2 id="heading-linki">Linki</h2>
<ul>
<li><a target="_blank" href="https://how-to.dev/how-to-professionalize-your-little-work-project">oryginaly artykuł po angielsku</a></li>
</ul>
<h2 id="heading-podsumowanie">Podsumowanie</h2>
<p>Żeby sprofesjonalizować poboczny projekt w pracy, możesz użyć listy przedstawionej w tym artykule i powoli zacząć dodawać te elementy.</p>
]]></content:encoded></item></channel></rss>