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

<channel>
	<title>Tech - HL Tech</title>
	<atom:link href="https://www.hltech.com/kategoria/tech/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.hltech.com/kategoria/tech/</link>
	<description>TECHNOLOGY THAT MATTERS</description>
	<lastBuildDate>Wed, 09 Apr 2025 15:42:14 +0000</lastBuildDate>
	<language>pl-PL</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	
	<item>
		<title>Jak pisać efektywne testy frontendów?</title>
		<link>https://www.hltech.com/tech/jak-pisac-efektywne-testy-frontendow/</link>
		
		<dc:creator><![CDATA[]]></dc:creator>
		<pubDate>Wed, 09 Apr 2025 15:30:31 +0000</pubDate>
				<category><![CDATA[Tech]]></category>
		<guid isPermaLink="false">https://www.hltech.com/?p=4604</guid>

					<description><![CDATA[<p>Pisanie testów automatycznych dla aplikacji frontendowych często nastręcza pewnych problemów. Łatwo w nich o niedociągnięcia, mylne założenia, szybkie rozwiązania będące złymi praktykami, a na dokładkę wszystko to jest dość czasochłonne.</p>
<p>The post <a href="https://www.hltech.com/tech/jak-pisac-efektywne-testy-frontendow/">Jak pisać efektywne testy frontendów?</a> appeared first on <a href="https://www.hltech.com">HL Tech</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Pisanie testów automatycznych dla aplikacji frontendowych często nastręcza pewnych problemów. Łatwo w nich o niedociągnięcia, mylne założenia, szybkie rozwiązania będące złymi praktykami, a na dokładkę wszystko to jest dość czasochłonne. Jednak praca włożona w szlifowanie umiejętności i używanie właściwych narzędzi pozwoliła stworzyć w HL Tech całkiem niezłą kulturę efektywnego testowania już na wczesnym etapie developmentu.</p>
<h2>Po co nam te testy?</h2>
<p>Shift-left approach to pojęcie istniejące w świecie testerskim od ponad dwudziestu lat. Zakłada ono weryfikację funkcjonalności już na początkowym etapie developmnetu oprogramowania. W ten sposób można stosunkowo wcześnie wykryć różnorodne nieścisłości. Mam tutaj na myśli błędy popełnione przez developerów, ale także braki w dizajnie czy niepełną analizę pomijającą tzw. scenariusze brzegowe.</p>
<p>Weryfikacja ta polega przede wszystkim na automatyzacji testów które sprawdzają, ,jak działa wdrażane rozwiązanie i czy nie wpłynie ono na uszkodzenie innych komponentów w ekosystemie. Pozwala to na tworzenie w zespołach kultury dobrej jakości i pełności oprogramowania. Developerzy stają się świadomi większej ilości wyzwań związanych z utrzymaniem funkcjonalności w ryzach zaplanowanego scenariusza, co finalizuje się lepszą jakością prac końcowych przekazywanych biznesowi do końcowej akceptacji.</p>
<p>Do właściwego wdrożenia shift-left w codzienny development niezbędna jest dobrze zaprojektowana warstwa dev-ops. Mam tutaj na myśli stworzenie ciągu zadań sprawdzających jakość kodu i oprogramowania, użytych narzędzi oraz wszystkich innych formalności związanych z etapem developmentu. Gdy wszystko to jest spełnione, nowe rozwiązanie może być w sposób automatyczny dostarczone klientom, w zasadzie nawet bez konieczności manualnej weryfikacji po stronie testera.</p>
<p>Zagadnienia te wybiegają jednak daleko poza tematykę tego artykułu. Chciałbym w nim bowiem przybliżyć, w jaki sposób podchodzimy do testowania aplikacji frontendowych w naszym codziennym developmencie.</p>
<h2>Weryfikacja jakości kodu</h2>
<p>Od kilku lat lubię obserwować, jak młodsi stażem koledzy zaczynają zdawać sobie sprawę, że jakość pisanych przez nich funkcjonalności także jest wynikiem pewnego rodzaju testowania. Mam tutaj na myśli statyczną analizę i automatyczną poprawę kodu źródłowego, realizowaną przez narzędzia pokroju Prettier, Eslint czy Typescript. Są one bowiem nieformalną, najniższą warstwą testów dbających o ogólną czytelność kodu, sprawdzających czy w wywoływanych komendach nie popełniamy literówek i czy nie wybiegamy poza ustalone ramy biznesowe zamknięte w typach danych, na których operujemy. </p>
<h2>Testowanie funkcjonalności na niskim poziomie</h2>
<p>Prawdziwe i świadome testowanie zaczyna się jednak na warstwie sprawdzeń jednostkowych i integracyjnych, które tak naprawdę są najważniejsze w naszym codziennym developmencie. Wynika to z prostego faktu, że weryfikują one funkcjonalność w oparciu o surowy kod źródłowy, nie wymagający żadnej kompilacji czy uprzedniej modyfikacji. Wykonujemy je przy użyciu narzędzi Jest lub Vitest, chociaż z powodu większej nowoczesności i ogólnej wydajności, przy nowych projektach zalecamy to drugie.</p>
<p>Warto w tym miejscu zrobić pewną przerwę celem wyjaśnienia, co w HL Tech rozumiemy pod pojęciem testów jednostkowych i integracyjnych. Internetowa wiedza jest bowiem bardzo niejednoznaczna w tym zakresie i powoduje sporo niejasności nawet dla doświadczonych developerów.</p>
<p>Otóż testami jednostkowymi nazywamy sprawdzenie wyników działania pewnej zamkniętej logiki. Chodzi tutaj o proste funkcje, które przy użyciu takich samych argumentów na wejściu zawsze dadzą te same wyniki końcowe. Dobrym przykładem może być mapper, walidator, czy wszelki helper operujący na ograniczonym zakresie wejścia. W takich scenariuszach sprawdzamy możliwie wszystkie kombinacje danych wejściowych, czasami wywołując je manualnie, a czasami próbując wykorzystać pewną reużywalność.</p>
<pre style="border: 1px solid #000;"><code style="padding: 1em; display: block;"><span style="font-weight: 400;">describe('isInRange', () =&gt; {</span>
<span style="font-weight: 400;">    it.each&lt;{value: number; result: boolean}&gt;([</span>
<span style="font-weight: 400;">        {value: -2, result: false},</span>
<span style="font-weight: 400;">        {value: -0, result: false},</span>
<span style="font-weight: 400;">        {value: 0, result: false},</span>
<span style="font-weight: 400;">        {value: 0.1, result: true},</span>
<span style="font-weight: 400;">        {value: 5, result: true},</span>
<span style="font-weight: 400;">        {value: 9.9, result: true},</span>
<span style="font-weight: 400;">        {value: 10, result: false},</span>
<span style="font-weight: 400;">        {value: 15, result: false},</span>
<span style="font-weight: 400;">    ])('returns $result if value is $value', ({value, result}) =&gt; {</span>
<span style="font-weight: 400;">        expect(isInRange(value)).toBe(result);</span>
<span style="font-weight: 400;">    });</span>
<span style="font-weight: 400;">});</span></code></pre>
<p>Przykład kodu testu jednostkowego.</p>
<p>Testami integracyjnymi w naszym ekosystemie nazywamy natomiast wszystkie testy oparte o renderowanie komponentu w środowisku JSDOM. W tej warstwie krytycznie ważne jest zrozumienie, na czym polega ta tytułowa integracja. W świecie frontendu wciąż obecne jest bowiem błędne przekonanie, że dotyczy ona połączeń pomiędzy częściami kodu &#8211; komponentami. Jednak takie podejście powoduje uzależnienie testów integracyjnych od szczegółów implementacyjnych, czyniąc je niemiarodajnymi i ciężkimi do utrzymania w przyszłości. W naszych projektach natomiast uznajemy każdą stronę w aplikacji za samostanowiącą całość, będącą najlepszym kandydatem do testów. W ich trakcie weryfikujemy, jak integrują się one z ich tzw. światem zewnętrznym &#8211; użytkownikiem czytającym dane na ekranie oraz korzystającym z aplikacji za pomocą myszki i klawiszy, adresem url w przeglądarce czy api, za pośrednictwem którego widok komunikuje się z backendem.</p>
<p>Testy takie opierają się na dokładnym symulowaniu sposobu, w jaki użytkownik korzysta z naszej aplikacji. Świetnie tutaj sprawdza się biblioteka user-event z funkcjami typu click() czy type() oraz Testing Library z selektorami, wśród których najważniejszym jest getByRole(). Integrację z adresem url realizujemy poprzez włączenie biblioteki obsługującej routing wewnątrz testowanego komponentu. W ten sposób jesteśmy w stanie sprawdzać aktualny adres url 'w przeglądarce&#8217; i potwierdzać wystąpienie oczekiwanych przekierowań. Komunikację z backendem mockujemy natomiast przy użyciu MSW. W tym przypadku jesteśmy bardzo skrupulatni &#8211; obsługujemy tylko te endpointy, które powinny być wywołane w trakcie testu i tylko z danymi, które przewidujemy wysłać/odebrać z dokładnością od ostatniego znaku. Nic więcej, nic mniej, ponieważ jakiekolwiek odstępstwo od planowanej integracji z backendem powoduje niewłaściwe procesowanie operacji finansowych. Dla nas może się to szybko przerodzić w znaczące kary nałożone przez rynkowego regulatora.</p>
<p>Testy integracyjne dzielimy na dwa etapy &#8211; Happy path i Negative path. Te pierwsze służą potwierdzeniu czy wyświetlane są wszystkie oczekiwane elementy i przejściu przez wszystkie akcje zmierzające do – najogólniej mówiąc &#8211; osiągnięcia sukcesu. Dobrym przykładem może być wypełnienie formularza i wysłanie danych zakończone poprawną odpowiedzią z serwera. Drugi etap natomiast humorystycznie nazywamy 'ścieżką zdrowia&#8217;, podczas której sprawdzamy zachowanie komponentu przy błędnych odpowiedziach z endpointów, czy niewłaściwych danych wprowadzanych przez użytkowników.</p>
<p>Tutaj muszę się przyznać, że powyższy opis jest tylko zajawką tematu, ponieważ testy integracyjne same w sobie są materiałem na sporej wielkości publikację. Umiejętność pisania miarodajnych, wydajnych i czytelnych scenariuszy jest więc wynikową żmudnego szlifowania warsztatu, poznawania dobrych praktyk i rozumienia całego ciągu zdarzeń wywoływanych każdą akcją na testowanym komponencie. Niestety, naturalna skłonność do korzystania ze skrótów bardzo często kończy się tworzeniem nieefektywnych scenariuszy. Sprawia to kłopoty nawet średnio-zaawansowanym developerom. Moją radą w takiej sytuacji jest cierpliwość i koncentracja na najdokładniejszym symulowaniu sposobu, w jaki użytkownik korzysta z testowanego komponentu. Reszta przyjdzie z czasem.</p>
<pre style="border: 1px solid #000;"><code style="padding: 1em; display: block;"><span style="font-weight: 400;">it('redirects client to /profile after successful sign up', async () =&gt; {</span>
<span style="font-weight: 400;">    // Given data used during test scenario</span>
<span style="font-weight: 400;">    const login = 'test-login';</span>
<span style="font-weight: 400;">    const password = 'test-password';</span>
<span style="font-weight: 400;">    const csrfToken = 'test-csrf-token';</span>
<span style="font-weight: 400;">    // And handler for POST /login endpoint successful call</span>
<span style="font-weight: 400;">    // Note: it handles api endpoint requested only with given requestBody definition</span>
<span style="font-weight: 400;">    </span><b><i>server</i></b><span style="font-weight: 400;">.use(loginHandler({login, password, csrfToken}, {isAuthenticated: true}));</span>
<span style="font-weight: 400;">    // And url to redirect to after successful sign up</span>
<span style="font-weight: 400;">    const redirectionUrl = '/profile';</span>
<span style="font-weight: 400;">    // When component renders</span>
<span style="font-weight: 400;">    // Note: render helper wraps View with open source libraries like React Router or React Query</span>
<span style="font-weight: 400;">    // It also starts the page within a /login url context and provides csrfToken to be mocked internally </span>
<span style="font-weight: 400;">    const {history} = renderPageWithinContexts(&lt;LoginView /&gt;, {path: '/login', csrfToken});</span>
<span style="font-weight: 400;">    // Then main header is displayed</span>
<span style="font-weight: 400;">    expect(await </span><b><i>screen</i></b><span style="font-weight: 400;">.findByRole('heading', {name: /log in to see your profile/i}));</span>
<span style="font-weight: 400;">    </span>
<span style="font-weight: 400;">    // When client fill a sign-up form</span>
<span style="font-weight: 400;">    await </span><b><i>userEvent</i></b><span style="font-weight: 400;">.</span><i><span style="font-weight: 400;">type</span></i><span style="font-weight: 400;">(</span><b><i>screen</i></b><span style="font-weight: 400;">.getByRole('textbox', {name: /login/i}), login);</span>
<span style="font-weight: 400;">    await </span><b><i>userEvent</i></b><span style="font-weight: 400;">.</span><i><span style="font-weight: 400;">type</span></i><span style="font-weight: 400;">(</span><b><i>screen</i></b><span style="font-weight: 400;">.getByRole('textbox', {name: /password/i}), password);</span>
<span style="font-weight: 400;">    await </span><b><i>userEvent</i></b><span style="font-weight: 400;">.</span><i><span style="font-weight: 400;">click</span></i><span style="font-weight: 400;">(</span><b><i>screen</i></b><span style="font-weight: 400;">.getByRole('button', {name: /sign up/i}));</span>
<span style="font-weight: 400;">    // Then they are redirected to /profile page</span>
<span style="font-weight: 400;">    await waitFor(() =&gt; expect(history.location.pathname).toEqual(redirectionUrl));</span>
<span style="font-weight: 400;">});</span></code></pre>
<p>Przykład kodu testu integracyjnego hipotetycznej strony do logowania.</p>
<h2>Testowanie działania aplikacji</h2>
<p>O ile poprzednia warstwa testów opiera się na sprawdzaniu wycinków aplikacji – jednostek logicznych, widoków czy stron, tak teraz skupiamy się na weryfikowaniu tzw. user journeys &#8211; realnych scenariuszy, koncentrujących się na osiągnięciu przez klienta oczekiwanego rezultatu. Do takiej weryfikacji najczęściej przydaje się nam Playwright. Testuje on produkcyjny bundle aplikacji wygenerowany lokalnie (testy funkcjonalne), lub zdeployowany na środowiska testowe (testy end-to-end / e2e).</p>
<p>Testy funkcjonalne najlepiej sprawdzają się w tzw. aplikacjach krokowych, gdzie klienci osiągają swój cel przez przejście kilku widoków tworzących razem ich tzw. journey. Za przykład może tutaj posłużyć tworzenie przelewu finansowego, który w większości systemów polega na wprowadzeniu danych, potwierdzeniu ich na podsumowaniu, wpisaniu kodu bezpieczeństwa i końcowym wysłaniu zgłoszenia do instytucji finansowej. Natomiast w przypadku aplikacji jednokrokowych, np. paneli przeznaczonych dla pracowników operacyjnych, które przypominają warstwę widoku dla operacji CRUD (create, read, update, delete), testy takie są niemal jednolite z naszymi testami integracyjnymi. Na tym etapie komunikacja z endpointami także jest zamockowana, a sama aplikacja testowana jest z użyciem prawdziwej przeglądarki, czego implementacją zajmuje się najczęściej Playwright.</p>
<p>Testy e2e skupiają się z kolei na zweryfikowaniu regresji krytycznych ścieżek w aplikacji. Za ich tworzenie odpowiedzialni są inżynierowie QA czy też tzw. testerzy. Jednak dzięki użyciu wspólnego języka Typescript i narzędzia Playwright, ich praca może być wykonywana lub weryfikowana także przez developerów frontendowych. Warstwa ta komunikuje się z prawdziwymi serwisami backendowymi, dzięki czemu dokonujemy regresji całości rozwiązania. Testy takie wykonują się każdorazowo po wdrożeniu zmian do głównej gałęzi jakiegokolwiek z komponentów ekosystemu (backend, frontend itp.).</p>
<h2>Coś więcej niż testowanie kodu</h2>
<p>Jeśli miałbym w jednym zdaniu opisać świat frontendu na przestrzeni kilku ostatnich lat, to nie zawahałbym się użyć słów &#8211; bardzo dynamiczny rozwój. Tworzenie tzw. 'ładnych widoczków&#8217; już dawno odeszło do lamusa. W dzisiejszych czasach na froncie skupiamy się bowiem także na semantyce kodu(aby być zgodnym ze standardami SEO), dbamy o wydajność aplikacji, które powinny jak najszybciej wyświetlać klientom oczekiwane dane, czy z uwagą obserwujemy metryki świadczące o – najogólniej mówiąc &#8211; komforcie i bezpieczeństwie związanym z korzystaniem z aplikacji. A to tylko drobny wycinek naszych codziennych odpowiedzialności.</p>
<p>Sprawdzenie tego wszystkiego także można zautomatyzować. 'Ładne widoczki&#8217; potwierdzamy poprzez testy wizualne z użyciem Playwright. Polegają one na tworzeniu tzw. snapshotów stron, które następnie zapisywane są do formatu graficznego. W ten sposób możemy potwierdzić, jak strona będzie wyglądać w przeglądarce i czy nie będziemy przypadkowo wprowadzać nieoczekiwanych zmian wizualnych. Metryki związane z wydajnością aplikacji, dobrymi praktykami czy zgodnością z SEO weryfikujemy natomiast poprzez automatyczne audyty snapshotów wykonane w Lighthouse.</p>
<h2>Testowanie accessibility</h2>
<p>Accessibility to temat niezwykle dla nas ważny. Oprócz wchodzącej w połowie 2025 roku w życie dyrektywy EAA, nakładającej obowiązek spełnienia standardów dostępności usług cyfrowych dla osób z niepełnosprawnościami, po prostu wymaga tego od nas ogromna liczba naszych najcenniejszych klientów.</p>
<p>Oczywiście najbardziej miarodajne testy accessibility są wykonywane przez prawdziwych użytkowników, podobnie jak testy ogólnego User Experience. Jednak część sprawdzeń jesteśmy w stanie zautomatyzować już na wczesnym etapie developmentu. Zwłaszcza jeśli mowa tutaj o standardach dotyczących generowanego kodu HTML &#8211; jego semantyki pozwalającej na lepszą integrację z assistive technologies, czy odpowiednio ułożonego wyglądu w zakresie użytych kontrastów, wielkości elementów itp.</p>
<p>Analizę statycznego kodu i wyglądu włączyliśmy do grupy tzw. testów snapshotów. Jesteśmy tutaj bardzo restrykcyjni i w nowych projektach nie pozwalamy na wprowadzenie żadnej zmiany, jeśli wykryty zostanie jakikolwiek błąd niezgodny z najpełniejszymi wytycznymi WCAG. Testowanymi aplikacjami sterujemy przy użyciu Playwright, po czym ich efekt analizujemy w Lighthouse i skanerami Axe.</p>
<pre style="border: 1px solid #000;"><code style="padding: 1em; display: block;"><span style="font-weight: 400;">public async assertSnapshots(snapshotTitle: string) {</span>
<span style="font-weight: 400;">    await </span><b><i>Promise</i></b><span style="font-weight: 400;">.all([</span>
<span style="font-weight: 400;">        this.assertAccessibilityChecks(snapshotTitle),</span>
<span style="font-weight: 400;">        this.performVisualSnapshotComparison(snapshotTitle),</span>
<span style="font-weight: 400;">        this.performAriaSnapshotComparison(snapshotTitle),</span>
<span style="font-weight: 400;">        this.performLighthouseFlowSnapshot(snapshotTitle),</span>
<span style="font-weight: 400;">    ]);</span>
<span style="font-weight: 400;">}</span>
<span style="font-weight: 400;"> </span>
<span style="font-weight: 400;">private async assertAccessibilityChecks(snapshotTitle: string) {</span>
<span style="font-weight: 400;">    // Perform static a11y analysis of given page (snapshot)</span>
<span style="font-weight: 400;">    const accessibilityChecks = await new AxeBuilder({page: this.page})</span>
<span style="font-weight: 400;">        .withTags(['wcag2a', 'wcag2aa', 'wcag21a', 'wcag21aa', 'wcag22aa'])</span>
<span style="font-weight: 400;">        .analyze();</span>
<span style="font-weight: 400;">    // Attach checks into test report</span>
<span style="font-weight: 400;">    await this.testInfo.attach(this.composeA11yReportName(snapshotTitle), {</span>
<span style="font-weight: 400;">        body: </span><b><i>JSON</i></b><span style="font-weight: 400;">.stringify(accessibilityChecks, null, 2),</span>
<span style="font-weight: 400;">        contentType: 'application/json',</span>
<span style="font-weight: 400;">    });</span>
<span style="font-weight: 400;">    // Ensure no a11y errors</span>
<span style="font-weight: 400;">    </span><b><i>expect</i></b><span style="font-weight: 400;">(accessibilityChecks.violations).toEqual([]);</span>
<span style="font-weight: 400;">}</span></code></pre>
<p>Typy testów snapshotów oraz przykład wywołania statycznej analizy Axe.</p>
<p>Oprócz tego dublujemy scenariusze testujące krytyczne ścieżki client journeys, nawigując wyłącznie przy użyciu klawiatury. W tym celu także posługujemy się Playwright, natomiast przypadki testowe skupiają się bardziej na weryfikowaniu aktualnie zaznaczonych elementów oraz wywoływaniu na nich akcji przy użyciu przycisków na klawiaturze. W ten sposób potwierdzamy, że nasze usługi dostępne są także dla użytkowników korzystających z tzw. assistive technologies.</p>
<h2>Wszystko powyżej to tylko zajawka</h2>
<p>Bez dwóch zdań, testowanie frontendów to ciężki kawałek developmentu. Niejednokrotnie najprostsze rozwiązania okazują się złym patternem, jak np. identyfikowanie elementów po strukturze HTML, czy poprzez specjalny atrybut data-test-id. Z drugiej strony funkcja getByRole() z Testing Library z racjonalnych powodów technologicznych nie grzeszy wydajnością. W ten sposób znajomość wszelkich tips&amp;tricks zmierzających do jej zwiększenia staje się swoistym weryfikatorem dojrzałości w zakresie pisania testów. A z każdym dniem okazuje się, że można poprawić coś jeszcze &#8211; aby scenariusze nie tylko były odporne na szczegóły implementacyjne aplikacji, ale też na elementy losowości danych, kolejności wystąpienia akcji czy konfiguracji środowisk na których są wykonywane.</p>
<p>Tematy te od lat omawiamy na naszych wewnętrznych meetupach, dzięki czemu z roku na rok potrafimy tworzyć testy coraz lepsze jakościowo. Zdajemy sobie sprawę, że wydłuża to czas developmentu funkcjonalności. Nie przesadzam stwierdzając, że napisanie wszystkich testów do nowej funkcjonalności zajmuje nieco więcej czasu niż napisanie jej samej. Co jednak osobiście doceniam w codziennej pracy w HL Tech, to to, że biznes jest świadomy wartości testów automatycznych i nigdy nie zadaje pytań o możliwość zastosowania jakiś półśrodków. Na rynku finansowym weryfikowalność jest na szczęście jedną z najważniejszych odgórnych regulacji.</p>
<p>The post <a href="https://www.hltech.com/tech/jak-pisac-efektywne-testy-frontendow/">Jak pisać efektywne testy frontendów?</a> appeared first on <a href="https://www.hltech.com">HL Tech</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Małe aplikacje – sposób na łatwiejszą pracę i szybsze dostarczanie nowych funkcjonalności</title>
		<link>https://www.hltech.com/tech/male-aplikacje-sposob-na-latwiejsza-prace-i-szybsze-dostarczanie-nowych-funkcjonalnosci/</link>
		
		<dc:creator><![CDATA[]]></dc:creator>
		<pubDate>Tue, 27 Sep 2022 15:07:24 +0000</pubDate>
				<category><![CDATA[Tech]]></category>
		<guid isPermaLink="false">https://www.hltech.com/?p=4061</guid>

					<description><![CDATA[<p>Ciekaw jestem, ilu z Was pamięta swoje pierwsze, szkoleniowe projekty developerskie. Ich celem było nauczenie podstaw różnorodnych zagadnień. Na przykład podłączenia się do źródła danych, bezpiecznej obsługi ich na backendzie, czy tworzenia schludnego widoku dla klienta.</p>
<p>The post <a href="https://www.hltech.com/tech/male-aplikacje-sposob-na-latwiejsza-prace-i-szybsze-dostarczanie-nowych-funkcjonalnosci/">Małe aplikacje – sposób na łatwiejszą pracę i szybsze dostarczanie nowych funkcjonalności</a> appeared first on <a href="https://www.hltech.com">HL Tech</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>Na początku był monolit</h2>
<p>Ciekaw jestem, ilu z Was pamięta swoje pierwsze, szkoleniowe projekty developerskie. Ich celem było nauczenie podstaw różnorodnych zagadnień. Na przykład podłączenia się do źródła danych, bezpiecznej obsługi ich na backendzie, czy tworzenia schludnego widoku dla klienta. Nawet jeśli poszliście o krok dalej i już staraliście się stosować separację warstw w Waszej aplikacji, najpewniej i tak wszystko to znajdowało się w jednym projekcie, w jednym repozytorium.</p>
<p><img decoding="async" class="alignnone size-medium wp-image-4062" src="https://www.hltech.com/wp-content/uploads/2022/09/blog-male-aplikacje-monolit-300x161.png" alt="" width="300" height="161" srcset="https://www.hltech.com/wp-content/uploads/2022/09/blog-male-aplikacje-monolit-300x161.png 300w, https://www.hltech.com/wp-content/uploads/2022/09/blog-male-aplikacje-monolit.png 744w" sizes="(max-width: 300px) 100vw, 300px" /></p>
<p>&nbsp;</p>
<p>W tamtym momencie nawet nie zdawaliście sobie sprawy, że jesteście świadkami narodzin kolejnego monolitu – struktury ściśle połączonych ze sobą elementów całej aplikacji. Oczywiście nie stanowiło to żadnego problemu, ponieważ projekt ten służył Wam do nauczenia się czegoś nowego. Na wiedzę związaną z architekturą czas miał przyjść nieco później. Niemniej wiele lat temu w podobny sposób stawiano fundamenty praktycznie każdej aplikacji. Z czasem nad ich monolitycznym kodem zaczęło pracować coraz więcej developerów, a projekty rozrastały się do niebotycznych rozmiarów.</p>
<h2>Pierwsze mikroserwisy</h2>
<p>Dlatego w pierwszych latach obecnego wieku zaczęło formować się pojęcie mikroserwisów. Jest to koncept architektoniczny, zgodnie z którym aplikacja składa się z wielu usług, o bardzo wąskiej odpowiedzialności. Zazwyczaj zamykają się one w jednej domenie biznesowej.</p>
<p>W ten sposób większe aplikacje zaczęły przyjmować formę zbioru modułów, a działy developerskie – zespołów domenowych lub produktowych. Pozytywnie wpłynęło to na łatwość tworzenia oprogramowania i ogólną wydajność pracy zespołów. Ich praca odbywała się w niemal całkowitej separacji. Developerzy mogli skupiać się na swoim wycinku biznesu, nie martwiąc się o funkcjonowanie całości.</p>
<h2>Monolity zbudowane z twardej skały</h2>
<p>Niestety, pomimo niewątpliwych zalet takiej architektury większość dużych organizacji do dziś obciążona jest jakąś formą monolitu. Zazwyczaj są to najstarsze i najważniejsze części systemu. Po ich utworzeniu zazwyczaj nie ma potrzeby żadnej modyfikacji. Wymagają one jedynie prac utrzymaniowych związanych np. z aktualizacją wersji wykorzystywanego oprogramowania.</p>
<p>Oczywiście, większość produktów, nad którymi pracujemy w HL Tech to zazwyczaj nowe funkcjonalności, ale niektóre zespoły mają okazję zetknąć się także z kodem napisanym kilkanaście lat temu. W takim przypadku naszym zadaniem jest odłupanie części monolitu i bezpieczne przeniesienie go (czyt. zazwyczaj przepisanie) do osobnego modułu. Przypomina to trochę operację na żywym organizmie. Dlatego przed przystąpieniem do prac trzeba poświęcić sporo czasu na dokładne poznanie funkcjonującego już produktu. I tutaj bonus. Poprzez kontakt z kilkunastoletnim kodem mamy doskonały podgląd na efekt historycznych decyzji – tych dobrych, ale z perspektywy czasu też tych nietrafionych. Jest to dla nas bardzo rozwojowe doświadczenie, ponieważ obserwacji takich nie da się szybko poczynić na projektach pisanych od zera.</p>
<h2>Granulacja na frontendzie</h2>
<p>Podejście z dzieleniem na mniejsze stosujemy także w mojej specjalizacji – na frontendzie. No bo pomyślcie — użytkowników systemu zazwyczaj można podzielić na kilka grup, a każda z nich będzie korzystała z innej jego części. Czy nie brzmi to jak dobry sposób podziału platformy na moduły? W ten sposób wchodzimy w temat architektury mikro-frontendów. Około 4 miesiące temu wraz z Łukaszem Fiszerem miałem okazję dokładniej ją zaprezentować podczas Dev.js Summit 2022.</p>
<p>Architektura mikro-frontendów bez dwóch zdań wspomaga wydajność codziennej pracy developerów. Dla klientów i ich potrzeb jest z kolei niewidoczna. Nie wpływa bowiem na łatwość czy szybkość działania aplikacji. Na szczęście śledząc nowinki ze świata developmentu widać, że pojawiające się technologie coraz lepiej wspierają także te potrzeby. Przyjrzyjmy się części z nich.</p>
<h2>Pobieraj tylko to, co użytkownik aktualnie potrzebuje</h2>
<p>Nowoczesne aplikacje frontendowe w większości wykorzystują podejście zwane Client Side Rendering (CSR). Oznacza to, że wchodząc na wskazany adres url, przeglądarka najpierw pobiera cały kod Java Script, a następnie generuje widok strony.</p>
<p>Niestety produkcyjne wersje większości aplikacji pisanych w React to tak naprawdę dwa duże pliki Java Script. Wymusza to na kliencie pobranie całego kodu, włącznie ze stronami, których być może nawet nie ma zamiaru przeglądać. Powoduje to nadmierny ruch w Internecie, a wyliczenia na większym zakresie danych opóźniają moment wyświetlenia widoku.</p>
<p>Jednym z łatwiejszych i popularniejszych usprawnień tego procesu jest podejście zwane lazy loading. Polega ono na tym, że w momencie wejścia na stronę, przeglądarka pobiera tylko to, co jest potrzebne do jej wyświetlenia – kod frameworka i aktualnego widoku. W ten sposób można przyspieszyć start aplikacji nawet o kilkaset milisekund.</p>
<h2>Rendering odmieniony przez wszystkie przypadki</h2>
<p>Gdy zorientowano się, że mniejsza liczba wyliczeń Java Script przyspiesza start aplikacji, zaczęto zadawać sobie pytanie: czy aby na pewno wyświetlenie każdego elementu musi być efektem działania skryptu? Okazało się, że nie. Proces ten można usprawnić, w czym pomogło podejście Island architecture.</p>
<p>Zgodnie z nim widok każdej strony można podzielić na odizolowane od siebie obszary. Za przykład niech posłuży stopka aplikacji. Jest ona niezależna od całej reszty, a dodatkowo przez miesiące nie podlega żadnym zmianom, wygląda i działa dokładnie tak samo na każdej z podstron. To otwiera drogę do techniki Server Side Rendering (SSR) w jej najbardziej wydajnym kształcie. Zgodnie z nią serwer tylko raz generuje statyczny kod HTML komponentu i każdemu klientowi wysyła zapisany w wewnętrznej pamięci efekt tej operacji. W ten sposób przeglądarka klienta nie musi wykonywać kosztownych wyliczeń Java Script, otrzymuje finalny kod, który może bezpośrednio wyświetlić na ekranie.</p>
<p>Zagadnienie to można rozszerzyć nawet na całe strony. Zwłaszcza te, które nie wymagają bieżącej komunikacji z backendem. Świetnie sprawdza się to w obszarach podobnych do blogów – artykułach, elementach typu Frequently Asked Questions czy prezentacyjnych kartach produktu. W takim przypadku generujemy kod HTML całej strony i tym samym niemal do zera ograniczamy czasochłonne wyliczenia Java Script po stronie klienta. To podejście nazywamy Static Site Generation (SSG).</p>
<h2>Inne sposoby na lepszą wydajność</h2>
<p>Lazy loading przyspiesza czas wyświetlenia widoku dzięki rezygnacji z pobierania danych aktualnie nam niepotrzebnych. Gdy jednak klient chce wejść na inną stronę, jej kod musi zostać dociągnięty z serwera. Na szczęście nowe trendy na rynku pozwalają na przyspieszenie tego procesu w taki sposób, że staje się on prawie niezauważalny.</p>
<p>Ciekawe i wielopoziomowe rozwiązanie dostarcza nowy framework o nazwie Remix. Przykładowo — jego twórcy zauważyli, że od czasu najechania kursorem myszy nad przycisk, do jego naciśnięcia przez użytkownika, zwyczajowo mija kilkaset milisekund. Jeśli przycisk ten odpowiada za przejście do nowej strony, kod z nią związany możemy zacząć pobierać już na akcji hover, zamiast – jak dotychczas – na akcji click.</p>
<p><iframe title="YouTube video player" src="https://www.youtube.com/embed/4jT7iKdqoW4" width="560" height="315" frameborder="0" allowfullscreen="allowfullscreen"></iframe></p>
<p>Framework udostępnia też możliwości łatwego sterowania zaawansowanym keszowaniem. Dzięki temu treści statyczne (np. grafika, CSS, HTML) odkładane są w punktach dostępowych Content Delivery Network (CDN). W przypadku dostawców o rozbudowanych sieciach, punkty wejściowe do niej mogą znajdować się nawet w kilku miejscach kraju. Oznacza to, że jeśli jakiś klient wszedł na daną stronę, każdy kolejny z jego okolicy dostęp do tej samej treści uzyska już w przeciągu kilkudziesięciu milisekund.</p>
<p><iframe title="YouTube video player" src="https://www.youtube.com/embed/bfLFHp7Sbkg" width="560" height="315" frameborder="0" allowfullscreen="allowfullscreen"></iframe></p>
<p>Jeśli jednak musimy wyświetlić dane „na żywo”, wymagające ciągłej komunikacji z serwerem, Remix architektonicznie faworyzuje wspomnianą wcześniej Island architecture. W ten sposób każda część strony wywołuje zapytanie po dane niezbędne do wyświetlenia w jej obszarze. Żądanie inicjuje się natychmiastowo, wykonuje w sposób równoległy, a pobrane dane pojawiają się w widoku niezależnie od siebie.</p>
<p><iframe title="YouTube video player" src="https://www.youtube.com/embed/95B8mnhzoCM" width="560" height="315" frameborder="0" allowfullscreen="allowfullscreen"></iframe></p>
<p>Wszystkie te zabiegi mają jeden wspólny cel — zmniejszenie czasu od wejścia na stronę do wyświetlenia zgromadzonych na niej danych. Tam, gdzie można, klient otrzymuje wygenerowaną wcześniej statyczną treść. Natomiast funkcjonalności wymagające wyliczeń na serwerze są istotnie przyspieszone, a czas spędzony na ich przeprocesowanie blokuje tylko niewielkie części aplikacji.</p>
<h2>Dziel i bądź wydajny</h2>
<p>Wszystko to pokazuje jak dzielenie na mniejsze zakresy i odpowiedzialności, pozytywnie wpływa na całościową wydajność. Co ciekawe, zasada ta zdaje się sprawdzać wszędzie.</p>
<p>Od strony organizacyjnej — pracując w jednej domenie, nie muszę znać i rozumieć wszystkich zasad biznesowych obowiązujących w firmie. Zaczynając nowy projekt, proces jego produkcji staram się podzielić na etapy, a te następnie na mniejsze zadania. Dzięki temu łatwiej jestem w stanie zrozumieć każdy ich aspekt, wiarygodnie wycenić czas realizacji a prace zamknąć w regularne sprinty.</p>
<p>Od strony specjalistycznej – jako frontend developer nie muszę znać wszystkich szczegółów z zakresu backendu, devops, bezpieczeństwa czy zarządzania bazami danych. Mogę skupić się na wysokiej specjalizacji w swoim technologicznym zakresie.</p>
<p>Od strony developerskiej — tworząc małe aplikacje, jestem w stanie bardzo szybko ogarnąć ich kod. Niewielka odpowiedzialność i tym samym poziom skomplikowania funkcjonalności pozytywnie wpływają na ich wydajność i bezpieczeństwo. W ten sposób mogę szybciej dostarczyć nowe rozwiązania i treści do naszych klientów.</p>
<p>The post <a href="https://www.hltech.com/tech/male-aplikacje-sposob-na-latwiejsza-prace-i-szybsze-dostarczanie-nowych-funkcjonalnosci/">Małe aplikacje – sposób na łatwiejszą pracę i szybsze dostarczanie nowych funkcjonalności</a> appeared first on <a href="https://www.hltech.com">HL Tech</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How we build an accessible design system at HL Tech</title>
		<link>https://www.hltech.com/tech/how-we-build-an-accessible-design-system-at-hl-tech/</link>
		
		<dc:creator><![CDATA[]]></dc:creator>
		<pubDate>Sun, 29 Nov 2020 22:45:55 +0000</pubDate>
				<category><![CDATA[Tech]]></category>
		<guid isPermaLink="false">https://www.hltech.com/?p=2552</guid>

					<description><![CDATA[<p>Who are we? HL Tech is a technology centre focused on providing cutting-edge software solutions for Hargreaves Lansdown &#8211; an award-winning investment service provider on the British Market. We believe in quality and innovation, that is why we implemented best practices into our daily workflow. But more than that, we are a team of specialists [&#8230;]</p>
<p>The post <a href="https://www.hltech.com/tech/how-we-build-an-accessible-design-system-at-hl-tech/">How we build an accessible design system at HL Tech</a> appeared first on <a href="https://www.hltech.com">HL Tech</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="p1"><b>Who are we?</b></p>
<p class="p1">HL Tech is a technology centre focused on providing cutting-edge software solutions for Hargreaves Lansdown &#8211; an award-winning investment service provider on the British Market. We believe in quality and innovation, that is why we implemented best practices into our daily workflow. But more than that, we are a team of specialists willing to learn and share knowledge.</p>
<p class="p1"><b>Accessibility rules (pun intended) </b></p>
<p class="p1">Implementation of Web Content Accessibility Guidelines 1.0 first published in 1999 and subsequent updates throughout the Internet was a long and painful process. People responsible for the creation of early websites often overlooked or were unaware of these rules. The Internet was still a new medium, and like all new things, it had its infancy problems.</p>
<p class="p1">Because of limited technological advancement companies and web designers alike reached for solutions such as Adobe Flash (back then owned by Macromedia) or rich imagery often using animated GIFs to convey their message. The goal was to stand out, be visible, even overly flashy. </p>
<p class="p1">The downside? The content was not accessible by default to many people because screen readers struggled with reading Flash websites and images replacing text brought the same problem. Navigation through such websites was exhausting if not impossible for some who were not able to use computer mice or keyboard comfortably. The web, unfortunately, was mostly created for able-bodied people.</p>
<p class="p1">You may ask &#8211; why should we spend time thinking about the minority? Because all of us can be a part of it at any moment in our lives. </p>
<p><img decoding="async" class="alignnone size-medium wp-image-2558" src="https://www.hltech.com/wp-content/uploads/2020/11/img_1-300x146.png" alt="" width="300" height="146" srcset="https://www.hltech.com/wp-content/uploads/2020/11/img_1-300x146.png 300w, https://www.hltech.com/wp-content/uploads/2020/11/img_1-1024x499.png 1024w, https://www.hltech.com/wp-content/uploads/2020/11/img_1-768x374.png 768w, https://www.hltech.com/wp-content/uploads/2020/11/img_1.png 1034w" sizes="(max-width: 300px) 100vw, 300px" /> </p>
<p class="p1">A spectrum of permanent, temporary, and situational disabilities (credit: <a href="https://www.microsoft.com/en-us/design/inclusive"><span class="s1">Microsoft</span><span class="s2">’</span><span class="s1">s Inclusive Design</span></a>)</p>
<p class="p1">The simplest example &#8211; an injured arm. Good luck with using a website where you cannot use Tab key to jump around the content or purchase stuff from the online store where you need to manoeuvre with a mouse and activate each address field by a single click. </p>
<p class="p1"><b>That is why accessibility guidelines are not for a few, but everyone.</b></p>
<p class="p1"><b>Shared responsibility</b></p>
<p class="p1">Although originally WCAG was aimed to be a guidebook for <a href="https://www.w3.org/TR/WAI-WEBCONTENT/%2523content-developer"><span class="s1">Web content developers</span></a> and web-developers, the roles have shifted. Many new professions originated in the process of specialisation. Imagine a regular commercial website &#8211; we can positively assume that most of its design, search engine optimisation and content is not usually done by the same person.</p>
<p class="p1"><b>Where lies the responsibility for making products accessible?</b></p>
<p class="p1">At <span class="s3">’</span>HL Tech<span class="s3">’ </span>we understand that this is a shared responsibility, as it should be. Of course, some areas are better off being solved by developers, while others left for UI/UX designers. Still, we should all learn from each other. It is not uncommon for our teams to talk about ARIA (Accessible Rich Internet Applications) codes and design patterns used in our applications, naming conventions of the buttons or contrast.</p>
<p class="p1"><b>Design system as an opportunity </b></p>
<p class="p1">When we first began working on our design system we knew that expertise from many departments would come in handy. This year-long journey originated with three simple goals: user-friendliness, ease of use for developers and look consistent with our brand. Luckily we have many talents within the company &#8211; such as Aneta Górka, a Senior Front End Developer in the Design, UX &amp; Optimisation department who gave a brilliant talk and hosted workshops on web accessibility to widen our horizons. Conversations have started, knowledge of our teams grew, and we took this opportunity to do the right thing and add accessibility requirements to our workflow.</p>
<p class="p1">Our design process usually consists of three steps: identifying a need for the new component, designing it in line with our brand and third, a crucial one, is code review with a team of front-end developers.</p>
<p class="p1">We care for the quality of our React elements base. Nothing will go unnoticed, whether it is contrast and size of the text, missing icon, validation rules, proper ARIA snippets or text. </p>
<p class="p1">Together we created something we can rely on in our day-to-day work &#8211; we know the quality of our projects is top-notch.</p>
<p class="p1"><b>Designs system help us to be more efficient.</b></p>
<p class="p1">When we finish our design and review process for a new element, we test it from many angles. Firstly, our design team checks if the proportions, colours, contrast, WCAG requirements, HTML structure and brand standards are in line with the designs, then it is tested in isolation by our skilled Front End team to make sure it also performs up to our high standards.</p>
<p><img fetchpriority="high" decoding="async" class="alignnone size-medium wp-image-2560" src="https://www.hltech.com/wp-content/uploads/2020/11/img_2-300x209.png" alt="" width="300" height="209" srcset="https://www.hltech.com/wp-content/uploads/2020/11/img_2-300x209.png 300w, https://www.hltech.com/wp-content/uploads/2020/11/img_2-768x534.png 768w, https://www.hltech.com/wp-content/uploads/2020/11/img_2.png 1004w" sizes="(max-width: 300px) 100vw, 300px" /></p>
<p class="p1">
Our Field Text component has an option to visually hide input&#8217;s label while still being read by screen readers. </p>
<p class="p1">Having this well-crafted library makes not only my job easier by having a working rendition of my design assets, but also is an easy way for developers to translate high-fidelity mockups into working products. It takes just one look to know which element needs to be used.</p>
<p class="p1">But most importantly, we do not have to worry if we broke some of the accessibility rules, one would need to try hard to do so.</p>
<p class="p1">TB</p>
<p>The post <a href="https://www.hltech.com/tech/how-we-build-an-accessible-design-system-at-hl-tech/">How we build an accessible design system at HL Tech</a> appeared first on <a href="https://www.hltech.com">HL Tech</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>QCon New York 2019</title>
		<link>https://www.hltech.com/tech/qcon-new-york-2019/</link>
		
		<dc:creator><![CDATA[]]></dc:creator>
		<pubDate>Wed, 28 Aug 2019 10:12:05 +0000</pubDate>
				<category><![CDATA[Tech]]></category>
		<guid isPermaLink="false">https://www.hltech.com/bez-kategorii/qcon-new-york-2019/</guid>

					<description><![CDATA[<p>In June I attended QCon conference held in New York. I would like to share with you my impressions. QCon is a 3 day conference + 2 days of workshop. I attended the conference part. QCon is split to different tracks. Most of them are technical, but there are some concentrating on soft skills as [&#8230;]</p>
<p>The post <a href="https://www.hltech.com/tech/qcon-new-york-2019/">QCon New York 2019</a> appeared first on <a href="https://www.hltech.com">HL Tech</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>In June I attended QCon conference held in New York. I would like to share with you my impressions.</p>
<p>QCon is a 3 day conference + 2 days of workshop. I attended the conference part. QCon is split to different tracks. Most of them are technical, but there are some concentrating on soft skills as well.</p>
<p>What I find interesting are Ask Me Anything sessions. Speakers from each track spent 1 hour answering questions from the audience. I attended some of them and the best one was Domain Driven Design AMA with Vaughn Vernon from Kalele, Indu Alagarsamy from Particular Software and Stuart Charlton from Pivotal. They shared their experience in implementing DDD in different companies. Even though I already participated in projects utilizing DDD approach, I think it is always good to hear what fellow developers went through and learn from their mistakes/success stories as well.</p>
<p>&nbsp;</p>
<p>There were some nice presentations during the conference. First one belonged to “Modern CS in the real world” track. Talk of Colm MacCárthaigh was about PID loops and how they are used to keep AWS systems stable. PID loops measure system behavior after signal (of any kind) is sent to the system. Metrics are constantly gathered. Difference between expected and actual value is calculated and signal is so modified that the actual value gets closer to the expected one.  It was really interesting to see this mechanism used in modern IT systems to solve common problems in production environment.</p>
<p>First of them are open loops. They occur when actions take place in the system (of any kind) and consequences of these actions are not measured. The solution is to close the loop i. e. start constant measures of the consequences.</p>
<p>Second are power laws. They occur in systems, where there are many small elements cooperating with each other to provide greater value. Sample of such configuration are IT systems and microservices environment. When one of the systems fail for any reason, for example due to broken contracts between services (how to avoid this you can read about Judge Dredd, an Open Source framework for contract testing in [1]), errors cascade to direct neighbors and exponentially further to other services. According to Colm, compartmentalization is the best solution of this problem. More compartments mean relatively smaller blast radius.</p>
<p>There are some other problems like lags (old information is sometimes worse than no information which are sometimes hard to avoid (spiky loads etc.), false functions (misleading metrics and dependencies between them leading to wrong analysis – to avoid this situation it is advisable to base analysis on basic metrics like CPU), edge triggering which means switching mode when particular threshold of value of the metric is reached (in case of controlling the new mode often kicks in at a time of high-stress).</p>
<p>&nbsp;</p>
<p>Another interesting subject for me was presented during “Software defined infrastructure: Kubernetes, service mesh and beyond” track. I would like to mention 2 presentations here. First one, “The Service Mesh: It’s about Traffic” by Oliver Gould from Linkerd, introduced the audience to the definition of service mesh – it is infrastructure layer for handling service-to-service communication. Service mesh does the following things: load balancing, service discovery, routing, tracing, handles traffic policies, secures service to service communication. Linkerd was described as sample implementation of the concept. It is worth mentioning that there are more than one solution implementing service mesh concept like Istio. In order to avoid dependency to one technology, Service Mesh Interface is introduced. It is API used to isolate concept of Service Mesh of corresponding implementations. Definition of this API and its features were nicely described by Brendan Burns (from Microsoft Azure and Kubernetes co-founder) in his talk “Introduction to SMI (the Service Mesh Interface)”.</p>
<p>&nbsp;</p>
<p>One of the best features of QCon was sharing experience from success and failure stories by fellow senior developers, technical leaders and architects. Here I would like to mention “Time Predictions in Uber Eats” talk by Zi Wang, whereby he described how Uber uses machine learning to accurately predict delivery times, “Machine-Learned Indexes – Research from Google” by Alex Beutel, whereby he goes through resent research on using machine learning algorithms to improve traditional data processing systems, “Conquering Microservices Complexity @Uber With Distributed Tracing” by Yuri Shkuro, whereby he describes methodology and solution that uses data mining to learn typical behaviour of systems from massive amounts of distributed traces, compares it with pathological behaviour during outages, and uses complexity reduction and intuitive visualizations to guide the user towards actionable insights about the root cause of the outages. The solution is built using modules available in the open source as part of Jaeger (distributed tracing system developed by Yuri Shkuro himself), Uber’s distributed tracing platform and an incubating project at Cloud Native Computing Foundation.</p>
<p>&nbsp;</p>
<p>Visiting New York and participating in QCon 2019 was a good decision I had a chance to participate in many interesting talks, meet fellow developers from American companies, discuss with them in Ask Me Anything sessions and listen to inspiring talks.</p>
<p>[1] <a href="https://dzone.com/articles/contract-testing-in-hl-tech-judge-dredd">https://dzone.com/articles/contract-testing-in-hl-tech-judge-dredd</a></p>
<p>The post <a href="https://www.hltech.com/tech/qcon-new-york-2019/">QCon New York 2019</a> appeared first on <a href="https://www.hltech.com">HL Tech</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Program praktyk okiem programisty: nowoczesne technologie i realny projekt</title>
		<link>https://www.hltech.com/tech/program-praktyk-okiem-programisty-nowoczesne-technologie-i-realny-projekt/</link>
		
		<dc:creator><![CDATA[]]></dc:creator>
		<pubDate>Wed, 27 Feb 2019 09:20:25 +0000</pubDate>
				<category><![CDATA[Tech]]></category>
		<guid isPermaLink="false">http://www.hltech.com?p=71</guid>

					<description><![CDATA[<p>Przed jakim wyzwaniem postawiliśmy naszych praktykantów?</p>
<p>The post <a href="https://www.hltech.com/tech/program-praktyk-okiem-programisty-nowoczesne-technologie-i-realny-projekt/">Program praktyk okiem programisty: nowoczesne technologie i realny projekt</a> appeared first on <a href="https://www.hltech.com">HL Tech</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Zarządzanie kapitałem wartym 86,1 miliarda funtów, które zostały zainwestowane przez ponad milion klientów Hargreaves Lansdown to ogromne wyzwanie. Z tego względu efektywny proces obsługi klienta jest tutaj kluczowy. By to osiągnąć, firma powinna korzystać z nowoczesnych, intuicyjnych i szybkich aplikacji, które w tym pomogą. Jako centrum technologiczne tworzące rozwiązania dla Hargreaves Lansdown, czyli wiodącej firmy zajmującej się zarządzaniem funduszami inwestycyjnymi i emerytalnymi w Wielkiej Brytanii, dbamy o unowocześnienie oprogramowania. To właśnie o przygotowanie aplikacji wspierającej proces obsługi klientów poprosiliśmy studentów, których zaprosiliśmy do odbycia praktyk w ramach naszego programu „Internship that matters”. Poniżej kilka słów o merytorycznych i technicznych aspektach tego programu.</p>
<h3>Potrzeba biznesowa a realizacja projektu</h3>
<p>Dział obsługi klienta w Hargreaves Lansdown potrzebował intuicyjnej, przejrzystej i szybkiej aplikacji, która poprawi efektywność obsługi klienta przy jednoczesnym braku zmiany procesów i procedur. Aplikacja miała zastąpić jedną z wielu funkcji systemu służącego do obsługi klienta w ramach dużego projektu, którego celem jest podzielenie dużej monolitycznej aplikacji na mniejsze komponenty. W ten sposób chcieliśmy ułatwić i uniezależnić rozwój poszczególnych funkcji systemu.</p>
<p>Spośród projektów możliwych do realizacji został wybrany taki, który mógł być zrealizowany w okresie trzymiesięcznych praktyk – przygotowanie aplikacji dla działu obsługi klienta w siedzibie Hargreaves Lansdown w Bristolu. Następnie wybraliśmy technologię, w ramach których będzie realizowany projekt – wszystko po to, aby przygotować dwutygodniowe szkolenie.</p>
<p>W projekcie uczestniczyło dziesięciu praktykantów oraz product owner będący reprezentantem biznesu i określający oczekiwania wobec aplikacji. Ja z kolei pełniłem rolę opiekuna technicznego i merytorycznego. W projekt zaangażowany był także software development manager oraz wielu innych programistów, którzy szkolili praktykantów.</p>
<p>System był rozwijany iteracyjnie przy użyciu Scruma. Każda iteracja miała demo, którego celem było przedstawienie użytkownikom efektów pracy w poprzedzającej iteracji oraz zebranie informacji zwrotnej. Taki proces wymuszał ciągłą gotowość do wprowadzania zmian w kolejnych iteracjach, aby było to możliwe musieliśmy zadbać o wysoką jakość kodu oraz testów.</p>
<h3>Kandydat idealny, czyli jaki</h3>
<p>Implementacja aplikacji a następnie wdrożenie na produkcję jest bardzo dużym wyzwaniem dla osób bez doświadczenia. Co więcej praca przy takim projekcie w zespole składającym się z 10 osób jest sama w sobie wyzwaniem i wymaga sprawnej komunikacji w zespole. W związku z tym w czasie procesu rekrutacji skoncentrowaliśmy się na kilku cechach, które dla nas były kluczowe.</p>
<ul>
<li>Po pierwsze: determinacja i zaangażowanie członków zespołu, ponieważ są to elementy ułatwiające pracę w projekcie, który ma określone wymagania funkcjonalne, jakościowe oraz ramy czasowe.</li>
<li>Po drugie: otwartość i przyjazne nastawienie, ponieważ cechy te znacznie ułatwiają komunikację, wymianę wiedzy i doświadczeń.</li>
<li>Ponadto ceniliśmy u kandydatów także zainteresowanie tematyką wytwarzania oprogramowania (bazy danych, projektowanie, technologie web itp.).</li>
</ul>
<p>Naszym zdaniem dobry inżynier oprogramowania powinien nie tylko znać dobrze język programowania czy bibliotekę, ale również umieć wymienić wiedzę z kolegą z zespołu, omówić problem z product ownerem, czy dobrze uargumentować swoje wybory podejmowane odnośnie rozwiązań informatycznych.</p>
<h3>Technologie, które wykorzystaliśmy</h3>
<p>Aplikacja została podzielona na dwa komponenty – frontend, stanowiący interfejs użytkownika oraz backend wystawiający API dla frontendu, zawierający logikę biznesową, element integracji z bazą danych oraz systemami uwierzytelniania użytkownika. Komponent frontendu komunikował się z backendem przy pomocy Fetch API, co zapewniało asynchroniczną komunikację. Fronted i backend miał odrębne repozytoria kodu źródłowego, dzięki czemu można było zastosować dopasowane do potrzeb technologie, biblioteki, narzędzia zarządzania zależnościami czy procesy budowania i wdrażania.</p>
<p>Zarówno frontend jak i backend był wdrażany na środowisko Kubernets, które automatycznie zarządzało zasobami takimi jak interfejsy sieciowe, procesory, pamięć RAM itp. Komponenty były dostarczane jako kontenery Docker’owe, a każda zaimplementowana i zaakceptowana przez zespół funkcja aplikacji była automatycznie wdrażana przy pomocy Jenkins’a, czyli narzędzia realizującego wcześniej skonfigurowany potok. Jego kluczowe etapy to: kompilacje, testowanie, przygotowywanie i budowanie paczki zawierającej działającą aplikację, przygotowywanie kontenera Docker i ostatecznie wdrażanie kontenera na środowisko Kubernetes.</p>
<p>Implementacja logiki biznesowej w komponencie backend była realizowana przy wykorzystaniu języka Java i Spring Boot (ułatwiający konfigurację samodzielnej aplikacji). Backend wymagał integracji z bazą danych przy użyciu Spring Data JPA oraz Hibernate. Aby ograniczyć komunikację z bazą zastosowaliśmy cache L2 oraz cache zapytań. Z kolei chcąc ograniczyć dostęp do aplikacji i zapewnić uwierzytelnianie oraz autoryzację użyliśmy Spring Security. Spring MVC posłużył nam do wystawienia metod HTTP dla aplikacji fronted. Testy integracyjne i jednostkowe były pisane przy użyciu Spock’a wykorzystującego język Groovy.</p>
<p>Frontend jako interfejs graficzny był realizowany przy użyciu technologii Web. Całość składała się z wielu małych komponentów takich jak przyciski, etykiety, pola tekstowe, pola rozwijane z automatycznym uzupełnianiem itp. Jako języka programowania użyliśmy Typescript’u, który jest „transpilowany” do Javasriptu. Jego kluczową zaletą jest statyczne typowanie, co umożliwia wykrywanie wielu błędów na etapie kompilacji oraz znacząco poprawia czytelność kodu. Wykorzystaliśmy także bibliotekę React oraz Material UI, co znacząco przyspieszyło implementację. Architektura Redux zakłada jednokierunkowy przepływ danych. Wywołania backendu są realizowane asynchronicznie przy użyciu Fetch API. Do zarządzania zależnościami i budowania aplikacji użyliśmy Yarna, Npm’a i Webpacka.</p>
<h3>Postęp w pozyskiwaniu wiedzy i umiejętności</h3>
<p>W okresie trzymiesięcznych praktyk w każdej kolejnej iteracji widać było postęp i większą samodzielność w tych obszarach. Pod koniec członkowie zespołu znacznie sprawniej radzili sobie w trakcie analizy i planowania, potrafili przewidzieć szereg konsekwencji przy wyborze konkretnego rozwiązania. Efektem tego był wzrost ilości proponowanych zmian oraz samodzielnie dostarczanych funkcji.</p>
<p>Podsumowując, do programu praktyk zaprosiliśmy 10 osób, które nie miały wcześniej żadnych doświadczeń zawodowych poza działaniami podejmowanymi w związku ze studiami lub  programowaniem we własnym zakresie. Dzięki ogromnemu zaangażowaniu i chęci uczenia się, zespół wykorzystał w pełni możliwości, jakie stwarzał program praktyk – a my przekonaliśmy się, że w tych osobach tkwi ogromny potencjał. Dlatego zdecydowaliśmy się kontynuować współpracę z chłopakami.</p>
<h3>Co dalej?</h3>
<p>Aplikacja wytworzona przez praktykantów przygotowywana jest do wdrożenia, a my implementujemy kolejne funkcjonalności. Praktykanci dołączyli do innych zespołów projektowych, gdzie będą mieli okazję zapoznać się z kolejnymi technologiami i pracować z doświadczonymi programistami.</p>
<p>The post <a href="https://www.hltech.com/tech/program-praktyk-okiem-programisty-nowoczesne-technologie-i-realny-projekt/">Program praktyk okiem programisty: nowoczesne technologie i realny projekt</a> appeared first on <a href="https://www.hltech.com">HL Tech</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
