Wyniki egzaminu

Informacje o egzaminie:
  • Zawód: Technik programista
  • Kwalifikacja: INF.04 - Projektowanie, programowanie i testowanie aplikacji
  • Data rozpoczęcia: 9 czerwca 2026 00:01
  • Data zakończenia: 9 czerwca 2026 00:11

Egzamin zdany!

Wynik: 35/40 punktów (87,5%)

Wymagane minimum: 20 punktów (50%)

Nowe
Analiza przebiegu egzaminu- sprawdź jak rozwiązywałeś pytania
Pochwal się swoim wynikiem!
Szczegółowe wyniki:
Pytanie 1

Który z wymienionych aktów prawnych odnosi się do ochrony danych osobowych w krajach Unii Europejskiej?

A. DMCA
B. Open Source Initiative
C. GDPR (RODO)
D. Creative Commons
GDPR (RODO) to akt prawny dotyczący ochrony danych osobowych w Unii Europejskiej. Wprowadza on jednolite zasady przetwarzania danych, zwiększając ochronę prywatności obywateli. RODO daje użytkownikom prawo do dostępu do swoich danych, ich poprawiania, a także żądania ich usunięcia (prawo do bycia zapomnianym). Firmy muszą transparentnie informować o celach przetwarzania danych oraz zapewniać odpowiedni poziom zabezpieczeń. Niezastosowanie się do przepisów RODO skutkuje wysokimi karami finansowymi.

Pytanie 2

Jakie kroki należy podjąć, aby skutecznie zabezpieczyć dane na komputerze?

A. Systematycznie aktualizować oprogramowanie i wykonywać kopie zapasowe
B. Dzielić się hasłami do plików z współpracownikami
C. Nie używać kopii zapasowych
D. Przechowywać dane na niezabezpieczonych nośnikach przenośnych
Regularne aktualizowanie oprogramowania oraz tworzenie kopii zapasowych to kluczowe działania zapewniające bezpieczeństwo danych na komputerze. Aktualizacje łatają luki w zabezpieczeniach i eliminują błędy, które mogą zostać wykorzystane przez hakerów. Kopie zapasowe chronią dane przed utratą spowodowaną awarią sprzętu, atakiem ransomware lub przypadkowym usunięciem. Najlepszą praktyką jest przechowywanie kopii zapasowych w różnych miejscach – lokalnie i w chmurze – co dodatkowo zwiększa poziom zabezpieczenia przed nieprzewidzianymi sytuacjami.

Pytanie 3

Który z komponentów interfejsu użytkownika umożliwia użytkownikowi wprowadzanie danych tekstowych?

A. Przycisk
B. Pasek narzędziowy
C. Pole tekstowe
D. Dialog wyboru pliku
Pole tekstowe to element interfejsu użytkownika, który pozwala użytkownikowi na wprowadzanie danych tekstowych. Jest to jeden z najczęściej używanych komponentów UI w aplikacjach desktopowych, mobilnych i webowych. Pole tekstowe umożliwia wprowadzanie haseł, adresów e-mail, wiadomości i innych danych. W nowoczesnych aplikacjach często zawiera walidację, która sprawdza poprawność wpisywanych danych w czasie rzeczywistym. Dzięki swojej elastyczności, pola tekstowe mogą być wykorzystywane w różnorodnych formularzach, ankietach i systemach rejestracji użytkowników, co czyni je nieodzownym elementem aplikacji o dowolnym przeznaczeniu.

Pytanie 4

Jakie funkcje realizuje polecenie "git clone"?

A. Łączy dwa branche w repozytorium
B. Usuwa zdalne repozytorium
C. Tworzy lokalną kopię już istniejącego repozytorium
D. Rejestruje zmiany w historii repozytorium
Polecenie "git clone" to w zasadzie jedna z pierwszych rzeczy, które poznaje się na początku pracy z Gitem. Służy ono do skopiowania całego istniejącego repozytorium – czyli pobiera zarówno wszystkie pliki, jak i całą historię commitów. To jest ogromnie przydatne, bo nie tylko masz najnowszy kod, ale od razu całą historię zmian, branche, tagi i inne rzeczy. Standardowo używa się tego polecenia, kiedy chcesz zacząć pracę nad projektem, który jest już na jakimś zdalnym serwerze (np. Githubie albo GitLabie). W praktyce wygląda to tak, że podajesz adres repozytorium, wpisujesz "git clone https://adres.repo.git" i po kilku chwilach masz pełną kopię projektu u siebie na dysku. Co ciekawe, narzędzie od razu ustawia Ci zdalne połączenie do pierwotnego repozytorium jako "origin", więc potem możesz spokojnie wykonywać polecenia typu git fetch, git pull czy git push. Moim zdaniem to super wygodne, bo cała struktura repozytorium, nawet z podfolderami czy nietypowymi ustawieniami, zostaje zachowana. Warto pamiętać, że git clone to nie tylko kopiowanie plików – to pobieranie całej bazy danych Git, więc masz możliwość cofania się w historii czy przeglądania wszystkich commitów lokalnie i offline. Z mojego doświadczenia: często nowi użytkownicy nie doceniają jeszcze, jak ważne jest to, żeby zawsze pracować na pełnej kopii, a nie wycinku repo. To podstawa bezpiecznej i efektywnej pracy zespołowej.

Pytanie 5

Jakie jest zastosowanie języka XAML przy tworzeniu aplikacji desktopowych?

A. Do optymalizacji działania aplikacji
B. Do zarządzania bazami danych
C. Do obsługi zdarzeń klawiatury
D. Do projektowania graficznego interfejsu użytkownika
XAML (Extensible Application Markup Language) to język znaczników wykorzystywany w technologii WPF (Windows Presentation Foundation) oraz UWP (Universal Windows Platform) do projektowania graficznego interfejsu użytkownika (GUI). XAML pozwala na definiowanie układów, przycisków, etykiet oraz innych elementów interaktywnych w aplikacjach desktopowych. Dzięki XAML, projektowanie interfejsu jest intuicyjne, a kod interfejsu jest oddzielony od logiki aplikacji, co sprzyja przejrzystości projektu. XAML wspiera animacje, style i szablony, co umożliwia budowę nowoczesnych, dynamicznych aplikacji. Jego elastyczność i możliwość współpracy z C# sprawiają, że XAML jest niezastąpiony w środowisku Windows.

Pytanie 6

Jakie rozwiązanie jest najbardziej odpowiednie przy projektowaniu aplikacji, która ma funkcjonować na różnych systemach operacyjnych?

A. Koncentrowanie się wyłącznie na estetyce aplikacji
B. Pełne dopasowanie aplikacji do systemu Windows
C. Wykorzystanie technik responsywnego projektowania interfejsu
D. Opracowanie dedykowanego kodu dla każdej platformy
Przy projektowaniu aplikacji na różne systemy operacyjne łatwo wpaść w pułapkę starych nawyków albo uproszczonego myślenia, co często prowadzi do nietrafionych decyzji projektowych. Częstą pokusą jest pisanie osobnego, dedykowanego kodu dla każdej platformy. Kto kiedyś pisał natywne aplikacje pod Windowsa i MacOS ten wie, jak szybko taki model staje się koszmarem w utrzymaniu. Z mojego doświadczenia wynika, że taka fragmentacja powoduje, że każda zmiana musi być wdrażana i testowana osobno, co prowadzi do rozjazdu funkcjonalności i wzrostu kosztów – a to jest dokładnie odwrotność tego, czego oczekuje się od nowoczesnego software’u. Z kolei pełne dopasowanie tylko do Windowsa całkowicie pomija wymagania użytkowników innych platform i zamyka aplikację na szerokie grono odbiorców. Takie podejście bywa wygodne na początku, ale ogranicza potencjał produktu i w praktyce jest sprzeczne z dzisiejszymi oczekiwaniami rynku, gdzie multiplatformowość to już standard, nie luksus. Skupianie się wyłącznie na estetyce aplikacji to chyba najczęstszy błąd początkujących – ładny wygląd nie gwarantuje użyteczności, dostępności ani funkcjonalności na różnych systemach operacyjnych. Branża IT od lat promuje podejście user-centered design, gdzie ważniejsza od samej estetyki jest adaptacja interfejsu do różnorodnych urządzeń i warunków użytkowania. Responsywny design bazuje na elastyczności oraz automatycznym dostosowywaniu się do środowiska, co pozwala uniknąć masy problemów z kompatybilnością i znacznie poprawia doświadczenie użytkownika. W mojej opinii, ignorowanie tych aspektów to częsty powód niepowodzeń nawet ambitnych projektów. Warto patrzeć szerzej i planować rozwiązania, które są przyszłościowe, modularne oraz skalowalne.

Pytanie 7

Programista może wykorzystać framework Angular do realizacji aplikacji:

A. rodzaju back-end
B. rodzaju front-end
C. na komputerze
D. mobilnej
Angular to świetne narzędzie do tworzenia aplikacji front-endowych. Chodzi o to, że odpowiada za to, co widzi użytkownik i jak może z tym interagować. Dzięki Angular możemy budować dynamiczne i responsywne aplikacje webowe. Z tego co widzę, używamy tam komponentów, modułów i rzeczy typu dwukierunkowe wiązanie danych, co naprawdę ułatwia życie. Bez wątpienia, Angular jest jednym z najpopularniejszych frameworków do robienia interfejsów użytkownika, co tylko potwierdza jego efektywność.

Pytanie 8

Narzędzie przeznaczone do rozwijania aplikacji w systemie WPf (ang. Windows Presentation Foundation) to

A. NetBeans
B. Visual Studio
C. PyCharm
D. XamarinStudio
Visual Studio to narzędzie, które według mnie jest praktycznie niezbędne do profesjonalnej pracy z WPF (Windows Presentation Foundation). WPF to technologia Microsoftu do budowania nowoczesnych, graficznych interfejsów użytkownika na platformie Windows. Visual Studio posiada wbudowane wsparcie dla projektów WPF – od kreatora nowych aplikacji, przez podpowiedzi składni XAML, aż po graficzny edytor interfejsów, tzw. designer. Na co dzień, gdy projektuję UI w WPF, doceniam funkcje takie jak live preview, debugger XAML czy możliwość natychmiastowego podglądu zmian. Z Visual Studio korzystają praktycznie wszyscy programiści .NET na świecie, bo daje ono dostęp nie tylko do edycji kodu, ale też do narzędzi takich jak NuGet, integracja z systemami kontroli wersji (np. Git), testowanie jednostkowe czy automatyczne refaktoryzacje. Warto wiedzieć, że Microsoft stale rozwija Visual Studio pod kątem WPF, dbając nie tylko o nowości w językach C# i VB.NET, ale też o wygodę pracy z XAML-em oraz wsparcie dla wzorców projektowych, takich jak MVVM. Z praktycznego punktu widzenia, jeśli chcesz tworzyć prawdziwie profesjonalne aplikacje WPF, to Visual Studio jest – moim zdaniem – bezkonkurencyjne. Często nawet początkujący szybko zauważają, jak bardzo przyspiesza ono codzienną pracę i rozwiązywanie problemów typowych dla tej technologii.

Pytanie 9

Który z etapów umożliwia zwiększenie efektywności aplikacji przed jej wydaniem?

A. Tworzenie interfejsu graficznego
B. Testowanie jednostkowe
C. Optymalizacja kodu
D. Dodawanie komentarzy do kodu
Optymalizacja kodu to kluczowy etap poprawy wydajności aplikacji przed jej publikacją. Polega na eliminacji zbędnych operacji, poprawie algorytmów oraz minimalizacji użycia zasobów, co pozwala na szybsze działanie aplikacji i zmniejszenie jej zapotrzebowania na pamięć. Optymalizacja kodu obejmuje również refaktoryzację, czyli przekształcenie kodu w bardziej czytelną i efektywną formę bez zmiany jego funkcjonalności. Dzięki optymalizacji aplikacje działają płynniej, szybciej się ładują i oferują lepsze doświadczenie użytkownika, co ma kluczowe znaczenie dla SEO oraz pozycjonowania aplikacji w wyszukiwarkach. Dodatkowo, zoptymalizowany kod jest łatwiejszy w utrzymaniu i rozwijaniu, co przekłada się na długoterminowe korzyści dla zespołu deweloperskiego.

Pytanie 10

Który z poniższych składników NIE jest konieczny do stworzenia klasy w C++?

A. Zastosowanie słowa kluczowego class
B. Deklaracja atrybutów klasy
C. Definicja destruktora
D. Definicja funkcji członkowskich klasy
Do utworzenia klasy w C++ nie jest wymagana definicja destruktora. Destruktor to specjalna metoda klasy, która jest wywoływana automatycznie w momencie zniszczenia obiektu, ale jego obecność jest opcjonalna. Klasy, które nie operują bezpośrednio na zasobach zewnętrznych, takich jak dynamiczna pamięć lub pliki, często nie potrzebują destruktora, ponieważ domyślny destruktor generowany przez kompilator jest wystarczający. Aby utworzyć klasę, wystarczy deklaracja pól i metod oraz użycie słowa kluczowego 'class'. To sprawia, że C++ pozwala na szybkie definiowanie prostych klas, które można później rozwijać w miarę potrzeby.

Pytanie 11

Która z poniższych struktur danych jest najbardziej odpowiednia do przechowywania unikalnych elementów?

A. Tablica
B. Zbiór (Set)
C. Kolejka priorytetowa
D. Sekwencja
Zbiór, czyli Set, to taki specjalny rodzaj struktury danych, który trzyma tylko unikalne elementy. To znaczy, że nie znajdziesz tam powtórzeń – jak masz listę użytkowników czy tagów, to świetnie, bo zbiór to idealnie rozwiązuje. Jest przy tym bardzo szybki w operacjach jak dodawanie, usuwanie czy wyszukiwanie. To dlatego zbory są używane w różnych algorytmach, zwłaszcza gdy chodzi o przetwarzanie dużych ilości danych i zarządzanie unikalnymi zasobami. Fajna sprawa, nie?

Pytanie 12

Algorytmu Euklidesa, przedstawionego na schemacie, należy użyć do obliczenia.

Ilustracja do pytania
A. Największego Wspólnego Dzielnika
B. najmniejszej liczby pierwszej w danym zakresie
C. Najmniejszej Wspólnej Wielokrotności
D. największego elementu w zbiorze liczb
Algorytm Euklidesa to klasyczna metoda stosowana do wyznaczania największego wspólnego dzielnika (NWD) dwóch liczb całkowitych. Działa na zasadzie iteracyjnego odejmowania mniejszej liczby od większej aż do momentu, gdy obie liczby staną się równe. Wtedy ta wspólna wartość jest największym wspólnym dzielnikiem. Algorytm jest bardzo efektywny, nawet dla dużych liczb, co czyni go powszechnie stosowanym w praktycznych zastosowaniach, takich jak kryptografia czy optymalizacja komputerowa. W kryptografii, szczególnie w systemach kluczy publicznych, takich jak RSA, obliczanie NWD jest kluczowe dla generowania kluczy. Algorytm Euklidesa jest też podstawą dla bardziej zaawansowanych algorytmów, takich jak rozszerzony algorytm Euklidesa, który umożliwia obliczenie również współczynników liczbowych używanych w teoretycznych dowodach matematycznych. Jego implemetacja jest również często wykorzystywana w bibliotekach matematycznych języków programowania, co świadczy o jego uniwersalności i znaczeniu w dzisiejszej technologii.

Pytanie 13

Który z algorytmów ma złożoność O(n²)?

A. Merge Sort
B. Dijkstra
C. Binary Search
D. Bubble Sort
Bubble Sort to algorytm o złożoności O(n²), co oznacza, że jego czas wykonania rośnie kwadratowo wraz ze wzrostem liczby elementów wejściowych. Algorytm porównuje sąsiadujące elementy i zamienia je miejscami, jeśli są w złej kolejności. Proces ten powtarza się wielokrotnie, aż do uzyskania pełnego posortowania tablicy. Ze względu na swoją prostotę, Bubble Sort jest często wykorzystywany do nauki podstaw algorytmiki, ale w praktyce rzadko stosuje się go do sortowania dużych zbiorów danych, ponieważ jest nieefektywny w porównaniu do bardziej zaawansowanych algorytmów, takich jak QuickSort czy Merge Sort.

Pytanie 14

Co to jest JWT (JSON Web Token)?

A. Biblioteka JavaScript do walidacji formularzy webowych
B. Standard definiujący sposób bezpiecznego przekazywania informacji jako obiekt JSON
C. Protokół komunikacyjny do transferu danych między klientem a serwerem
D. Format zapisu danych używany w bazach NoSQL
JWT, czyli JSON Web Token, jest standardem, który definiuje sposób bezpiecznego przekazywania informacji między dwiema stronami w postaci obiektu JSON. Tokeny JWT są powszechnie wykorzystywane w systemach autoryzacji i autoryzacji, umożliwiając przekazywanie zweryfikowanych i podpisanych danych. Struktura tokena składa się z trzech części: nagłówka, ładunku (payload) oraz podpisu. Nagłówek zazwyczaj określa typ tokena oraz algorytm użyty do podpisania, ładunek zawiera dane, które chcemy przesłać, a podpis jest generowany przy użyciu tajnego klucza, co zapewnia integralność danych. Przykładem zastosowania JWT może być system logowania, gdzie po pomyślnym zalogowaniu użytkownik otrzymuje token, który jest następnie używany do autoryzacji kolejnych zapytań do serwera. Dzięki swojej strukturze, JWT nie tylko zwiększa bezpieczeństwo, ale także umożliwia łatwą wymianę informacji między różnymi systemami, co jest szczególnie ważne w architekturach mikroserwisowych.

Pytanie 15

Na ilustracji pokazany jest fragment diagramu blokowego pewnego algorytmu. Ile razy warunek n<7 będzie badany?

Ilustracja do pytania
A. 7
B. 8
C. 6
D. 5
Odpowiedź 4 jest prawidłowa ponieważ algorytm rozpoczyna od n równego 1 i zwiększa tę wartość o jeden w każdej iteracji aż do momentu gdy n stanie się równe 7 Wtedy warunek n mniejsze od 7 przestaje być spełniony co oznacza że warunek ten jest sprawdzany łącznie 6 razy tj dla n równych 1 2 3 4 5 i 6 Jest to typowa pętla kontrolna często spotykana w programowaniu gdzie warunek pętli decyduje o jej zakończeniu W praktyce takie podejście pozwala na efektywne zarządzanie liczbą iteracji i zapewnia klarowność kodu Co więcej użycie pętli z warunkiem końcowym jest zgodne z dobrymi praktykami projektowania algorytmów gdyż minimalizuje ryzyko błędów logicznych poprzez jawne określenie końca pętli Ponadto zrozumienie mechanizmu działania pętli i jej warunków jest kluczowe dla optymalizacji algorytmów i efektywnego zarządzania zasobami co ma bezpośrednie przełożenie na wydajność aplikacji szczególnie w środowiskach wymagających dużej mocy obliczeniowej

Pytanie 16

Który z wymienionych elementów interfejsu użytkownika jest charakterystyczny dla aplikacji działającej na komputerze?

A. Przycisk (Button)
B. API REST
C. Strona HTML
D. Routing
Przycisk, czyli ten mały element, co go klikamy w aplikacjach, to naprawdę ważna część interfejsu. Używamy go, żeby coś zainicjować, na przykład zapisać dane czy wywołać jakąś funkcję. Fajnie, że można go dowolnie ustawiać – zmieniać wygląd, rozmiar, a nawet to, jak się zachowuje. Dzięki temu pasuje do każdej aplikacji. W dzisiejszych programach, jak WPF, te przyciski mogą mieć różne kolorowe ikony albo nawet animacje, co sprawia, że aplikacja wygląda super. Generalnie, bez przycisków użytkownik by się w aplikacji nie połapał, bo to dzięki nim możemy nawigować, zatwierdzać formularze czy otwierać nowe okna dialogowe.

Pytanie 17

Wskaż kod, który jest funkcjonalnie równoważny zaprezentowanemu poniżej:

switch(nrTel) {
    case 999: opis = "Pogotowie"; break;
    case 998: opis = "Straż"; break;
    case 997: opis = "Policja"; break;
    default: opis = "Inny numer";
}
Kod 1.
with nrTel {
    if (999) opis = "Pogotowie";
    if (998) opis = "Straż";
    if (997) opis = "Policja";
    else opis = "Inny numer";
}
Kod 2.
if (nrTel == 999)
    opis = "Pogotowie";
else if (nrTel == 998)
    opis = "Straż";
else if (nrTel == 997)
    opis = "Policja";
else opis = "Inny numer";
Kod 3.
if (nrTel == 999)
    opis = "Pogotowie";
if (nrTel == 998)
    opis = "Straż";
if (nrTel == 997)
    opis = "Policja";
else
    opis = "Inny numer";
Kod 4.
Opis =
    if (nrTel == 999) => "Pogotowie";
    else if (nrTel == 998) => "Straż";
    else if (nrTel == 997) => "Policja";
    else => "Inny numer";
A. Kod 4.
B. Kod 3.
C. Kod 2.
D. Kod 1.
Zamiana instrukcji switch na inne konstrukcje warunkowe wymaga bardzo uważnego odwzorowania zasad działania, zwłaszcza tego, że switch działa wyłącznie na porównaniu wartości (nie warunków logicznych) i wykonuje tylko jeden z przypadków lub blok domyślny. Zauważyłem, że często błędne odpowiedzi biorą się z niepełnego zrozumienia, jak działają instrukcje if-else oraz kiedy wykonywana jest dana gałąź kodu. Przykładowo, Kod 1 i Kod 3 stosują osobne instrukcje if, przez co mogą prowadzić do przypisywania wartości "opis" wiele razy podczas jednego przebiegu – co zupełnie odbiega od pierwotnej logiki switcha. Dla przykładu: jeśli nrTel będzie równe 997, to w Kodzie 3 pierwsze dwa warunki będą fałszywe, ale trzeci będzie prawdziwy i wykona się, a jednocześnie else zostanie potraktowany jako związany tylko z ostatnim if, co jest nieintuicyjne i łatwo o błąd. Jeszcze większe zamieszanie wprowadza Kod 1, gdzie składnia nie odpowiada żadnemu znanemu językowi – takie rzeczy pojawiają się raczej w pseudokodzie i nie nadają się do prawdziwych projektów. Kod 4 natomiast prezentuje nietypową, niepoprawną składnię (np. "if (...) => 'cos';"), która nie jest zgodna z żadnym głównym językiem programowania – to bardziej skrót myślowy lub pseudokod. W praktyce, poprawną zamianą switch na instrukcje warunkowe jest dokładne odwzorowanie logiki wyłączności wyboru, czyli właśnie użycie połączonych bloków if – else if – else, jak w Kodzie 2. Moim zdaniem takie błędne podejścia często wynikają z chęci uproszczenia kodu bez zwrócenia uwagi na to, jak mechanizmy sterowania naprawdę działają. Warto zapamiętać, że właściwe odwzorowanie switcha to zawsze jedna ścieżka wykonania dla danej wartości, bez powtarzania czy nadpisywania wyniku w kolejnych warunkach – i tego właśnie brakuje w niepoprawnych kodach.

Pytanie 18

Które z poniższych narzędzi jest używane do statycznej analizy kodu JavaScript?

A. Webpack
B. Babel
C. ESLint
D. Jest
Webpack, Babel i Jest to narzędzia, które pełnią różne funkcje w procesie tworzenia aplikacji JavaScript, jednak żadna z tych opcji nie jest używana do statycznej analizy kodu. Webpack to narzędzie do pakowania modułów, które pozwala programistom łączyć różne zasoby, takie jak skrypty, style czy obrazy, w jeden plik wynikowy, co jest bardzo przydatne w kontekście optymalizacji aplikacji. Z kolei Babel to transpilator, który umożliwia pisanie kodu w nowoczesnym JavaScript, a następnie konwertuje go do wersji, która jest kompatybilna z szerszą gamą przeglądarek. Dzięki Babel możemy korzystać z najnowszych funkcji języka, co zdecydowanie ułatwia rozwój, jednak nie ma on możliwości analizy statycznej. Natomiast Jest to framework testowy, który skupia się na jednostkowym testowaniu kodu JavaScript. Choć Jest pozwala na pisanie testów i sprawdzanie poprawności działania kodu, to również nie pełni roli narzędzia do analizy statycznej. Wybierając te narzędzia, można wprowadzać różne aspekty optymalizacji i poprawy jakości kodu, ale nie zastąpią one dedykowanych narzędzi do analizy, jak ESLint. Warto zrozumieć, że każde z tych narzędzi ma swoją specyfikę i zastosowanie, co jest kluczowe w kontekście efektywnego używania ich w projektach programistycznych.

Pytanie 19

Przedstawione w filmie działania wykorzystują narzędzie

A. kompilatora dla interfejsu graficznego
B. generatora GUI przekształcającego kod do języka XAML
C. generatora kodu java
D. debuggera analizującego wykonujący kod
Wybrana odpowiedź jest trafna, bo faktycznie narzędzie pokazane w filmie to generator GUI, który potrafi przekształcać kod do języka XAML. XAML (czyli Extensible Application Markup Language) jest powszechnie używany do deklaratywnego opisywania interfejsów użytkownika, na przykład w aplikacjach WPF czy UWP na platformie .NET. Jak dla mnie, korzystanie z takich generatorów to ogromna wygoda, bo pozwala błyskawicznie przenosić projekt graficzny do formatu czytelnego dla platformy Microsoftu. Z mojego doświadczenia, wiele zespołów programistycznych stosuje takie rozwiązania, żeby oszczędzić czas na ręcznym pisaniu XAML-a (co potrafi być naprawdę żmudne przy dużych projektach). Co ciekawe, takie narzędzia bardzo dobrze współpracują z designerskimi edytorami UI i potrafią zautomatyzować konwersję nawet z innych formatów graficznych, np. Sketch czy Adobe XD do XAML-a. Branżowe standardy zalecają, by wykorzystywać generatorów GUI właśnie do tego celu, bo minimalizuje to liczbę błędów, przyspiesza wdrożenie zmian i ułatwia współpracę między programistami a projektantami. Warto pamiętać, że XAML jest bardzo elastyczny i umożliwia potem ręczną edycję wygenerowanego kodu – czasem powstają drobne poprawki, ale ogólnie to naprawdę przydatne narzędzie. Ogólnie – jeśli tylko projektujesz UI pod .NET, to automatyczna konwersja do XAML-a to jest coś, co warto znać i wykorzystywać w praktyce.

Pytanie 20

W jaki sposób można ograniczyć problemy społeczne wynikające z nadmiernego używania internetu?

A. Zwiększać czas spędzany przy ekranie
B. Unikać spotkań z ludźmi w realnym świecie
C. Całkowicie wycofać się z aktywności wirtualnych
D. Zachować równowagę pomiędzy relacjami w sieci a tymi w rzeczywistości
Utrzymywanie równowagi między relacjami online i offline to kluczowy element zapobiegania problemom społecznym wynikającym z nadmiernego korzystania z internetu. Przeplatanie kontaktów wirtualnych z interakcjami twarzą w twarz wzmacnia więzi społeczne i poprawia umiejętności komunikacyjne. Równowaga między życiem cyfrowym a rzeczywistym pozwala unikać izolacji społecznej i wspiera rozwój empatii oraz zdolności interpersonalnych. Jest to szczególnie ważne w kontekście młodzieży, która może być bardziej podatna na negatywne skutki nadmiernej ekspozycji na treści online.

Pytanie 21

Jakie składniki są kluczowe w dynamicznym formularzu logowania?

A. Plik graficzny
B. Nagłówek HTTP
C. Tabela w bazie danych
D. Pola tekstowe do wprowadzania danych użytkownika
Pola tekstowe do wprowadzania danych użytkownika są kluczowym elementem dynamicznego formularza logowania. Umożliwiają one użytkownikowi wprowadzenie informacji, takich jak nazwa użytkownika i hasło, co jest niezbędne do uwierzytelnienia w systemie. Formularze HTML wykorzystują tagi <input> do tworzenia pól tekstowych, a ich interakcja z użytkownikiem może być wspierana przez JavaScript lub inne technologie frontendowe, które walidują dane i zapewniają bezpieczeństwo procesu logowania. Pola tekstowe mogą być wzbogacone o atrybuty, takie jak 'required', 'pattern' czy 'type', które dodatkowo zabezpieczają formularz i ułatwiają użytkownikowi poprawne wypełnienie danych.

Pytanie 22

Jaki będzie wynik działania poniższego kodu w języku JavaScript?

function foo() {
  console.log(a);
  var a = 1;
  console.log(a);
}
foo();
A. undefined, undefined
B. 1, 1
C. ReferenceError, 1
D. undefined, 1
Wynik działania podanego kodu to 'undefined, 1', co jest zgodne z zasadami hoisting w JavaScript. Kiedy funkcja 'foo' jest wywoływana, zmienna 'a' jest zadeklarowana przy użyciu 'var'. Zgodnie z zasadą hoisting, deklaracja zmiennej jest przenoszona na początek funkcji, ale przypisanie wartości następuje w miejscu, gdzie znajduje się kod. Dlatego, podczas pierwszego wywołania 'console.log(a)', 'a' nie ma jeszcze przypisanej wartości, co skutkuje wyświetleniem 'undefined'. Następnie, po przypisaniu '1' do 'a', w drugim 'console.log(a)' zmienna ta już ma wartość, więc wyświetlane jest '1'. Zrozumienie hoisting jest kluczowe dla programistów, ponieważ może wpływać na logikę działania kodu i prowadzić do błędów, jeśli nie jest odpowiednio uwzględnione. W praktyce powinno się unikać korzystania z hoisting, preferując inicjalizację zmiennych na początku funkcji, co zwiększa czytelność i utrzymanie kodu.

Pytanie 23

Który z wymienionych poniżej wzorców projektowych można zakwalifikować jako wzorzec strukturalny?

A. Fasada (Facade)
B. Obserwator (Observer)
C. Metoda szablonowa (Template method)
D. Fabryka abstrakcyjna (Abstract Factory)
Fasada (Facade) to wzorzec projektowy, który jest przykładem wzorca strukturalnego. Umożliwia on tworzenie uproszczonego interfejsu dla bardziej złożonego systemu, integrując wiele podsystemów i dostarczając jednolity punkt dostępu. Strukturalne wzorce projektowe skupiają się na organizacji klas i obiektów, a Fasada doskonale wpisuje się w tę kategorię, redukując złożoność i zwiększając czytelność kodu. Wzorzec ten jest szeroko stosowany w architekturze aplikacji, gdzie występuje potrzeba uproszczenia dostępu do skomplikowanych bibliotek lub systemów wewnętrznych.

Pytanie 24

W metodach klasy GoldCustomer dostępne są tylko pola

public class Customer {
    public string Name;
    protected int Id;
    private int Age;
}
public class GoldCustomer: Customer {
    private GoldPoints: int;
}
A. GoldPoints, Name
B. GoldPoints, Name, Id, Age
C. GoldPoints, Name, Id
D. GoldPoints
Ta odpowiedź dobrze pokazuje, jak działa dziedziczenie i modyfikatory dostępu w C#. W klasie GoldCustomer masz dostęp do własnych pól, czyli GoldPoints, oraz do pól odziedziczonych po klasie bazowej Customer. Tutaj kluczowe jest rozumienie, które pola są faktycznie dostępne. Skoro Name jest publiczne, to bez żadnych kombinacji można się do niego dobrać z dowolnego miejsca – nawet spoza klasy. Id jest chronione (protected), więc według zasad OOP dostępne jest w klasie bazowej oraz wszystkich pochodnych – czyli właśnie w GoldCustomer. To bardzo praktyczne, bo często się zdarza, że potrzebujemy pracować na polach z klasy bazowej, ale nie chcemy, żeby były one widoczne na zewnątrz klasy (np. przez innych programistów korzystających z API). Age jest prywatne i tu już nie da się go bezpośrednio użyć w klasie pochodnej. Z mojego doświadczenia korzystanie z protected dla rzeczy, które mają być dostępne tylko w hierarchii dziedziczenia, to codzienność – pozwala zachować elastyczność, ale i bezpieczeństwo enkapsulacji. Praktycznie rzecz biorąc, jak piszesz klasy dziedziczące po innych, zawsze warto zerknąć na poziomy dostępu, bo od nich zależy, do czego masz dostęp i co możesz odziedziczyć. Wzorce projektowe, jak np. Template Method, mocno polegają na mechanizmach dziedziczenia i odpowiedniego ustawienia widoczności pól czy metod. Przemyślany dobór public, protected, private ułatwia utrzymanie kodu oraz chroni przed przypadkowym wykorzystaniem nieodpowiednich elementów klasy, co w większych projektach bywa naprawdę kluczowe.

Pytanie 25

Wskaż rodzaj testów, które przeprowadza się podczas fazy tworzenia kodu źródłowego

A. testy wydajnościowe
B. testy jednostkowe
C. testy wdrożeniowe
D. testy kompatybilności
Testy jednostkowe to, moim zdaniem, absolutny fundament solidnego programowania. Są to niewielkie, automatyczne testy, które programista pisze zwykle równolegle z kodem albo nawet przed nim, jeśli stosuje się TDD (Test-Driven Development). Chodzi o to, żeby każda najmniejsza część programu – funkcja, metoda czy klasa – była dokładnie sprawdzona, czy zachowuje się zgodnie z założeniami już na etapie pisania kodu. W praktyce wygląda to tak: piszesz sobie funkcję, która np. liczy VAT, i od razu piszesz kilka testów, które sprawdzają, czy dla różnych wartości zwraca ona poprawne wyniki. Gdy coś się zmieni w kodzie, testy jednostkowe pozwalają od razu wychwycić, że coś zepsułeś (albo, oby nie, ktoś inny). Standardy branżowe, jak np. ISTQB czy wytyczne IEEE 829, bardzo mocno podkreślają wagę testów jednostkowych – bez nich zarządzanie jakością oprogramowania jest po prostu niemożliwe na dłuższą metę. W praktyce nawet proste projekty szybko bez nich zamieniają się w chaos. Co ciekawe, dobrze napisane testy jednostkowe ułatwiają refaktoryzację, bo masz pewność, że po zmianach wszystko działa jak należy. W mojej opinii, jeśli ktoś naprawdę poważnie myśli o pracy w branży IT, powinien umieć pisać testy jednostkowe z marszu.

Pytanie 26

Które z podejść do tworzenia aplikacji najlepiej uwzględnia przyszłe zmiany w funkcjonalności?

A. Skupienie się tylko na estetce aplikacji
B. Pisanie kodu bez jakiejkolwiek dokumentacji
C. Tworzenie bez wcześniejszej specyfikacji technicznej
D. Zastosowanie modularnej architektury aplikacji
Użycie modularnej architektury aplikacji to najlepsze podejście do projektowania systemów, które muszą uwzględniać przyszłe modyfikacje funkcjonalności. Modularność pozwala na podział aplikacji na mniejsze, niezależne komponenty, które mogą być rozwijane, testowane i aktualizowane niezależnie od siebie. Takie podejście zwiększa elastyczność, ułatwia zarządzanie kodem i pozwala na szybkie wdrażanie nowych funkcji bez konieczności ingerencji w cały system. Architektura modularna jest szczególnie przydatna w dużych projektach, gdzie zmiany są częste, a wymagania dynamicznie się zmieniają.

Pytanie 27

Który z wymienionych przykładów ilustruje projektowanie interfejsu zgodnego z zasadami user experience (UX)?

A. Brak opcji cofnięcia już wykonanej akcji
B. Zastosowanie jedynie jednego koloru w całym interfejsie
C. Użycie czytelnych czcionek i intuicyjnego układu elementów
D. Przycisk umieszczony w przypadkowym miejscu aplikacji
Użycie czytelnych czcionek i intuicyjnego układu elementów to kluczowe zasady projektowania zgodne z user experience (UX). Przejrzystość i estetyka interfejsu zwiększają komfort użytkownika i ułatwiają korzystanie z aplikacji. Intuicyjny układ elementów pozwala na szybkie odnalezienie potrzebnych funkcji, co redukuje frustrację użytkownika i skraca czas potrzebny na realizację zadania. UX opiera się na badaniach dotyczących zachowań użytkowników i dostosowywaniu projektu do ich potrzeb.

Pytanie 28

Które z wymienionych praw autorskich nie wygasa po pewnym czasie?

A. Licencje wolnego oprogramowania
B. Autorskie prawa majątkowe
C. Prawa pokrewne
D. Autorskie prawa osobiste
Autorskie prawa osobiste to rodzaj praw autorskich, które nie wygasają po upływie określonego czasu i są bezterminowe. Obejmują one prawo do autorstwa, oznaczania dzieła swoim nazwiskiem oraz sprzeciwiania się wszelkim zmianom, które mogłyby naruszać reputację twórcy. Prawa osobiste są niezbywalne, co oznacza, że nie można ich przenieść na inną osobę ani sprzedać. Nawet po śmierci twórcy, prawo do ochrony integralności jego dzieła jest respektowane. W praktyce oznacza to, że choć prawa majątkowe mogą wygasnąć (np. po 70 latach od śmierci autora), prawo do bycia uznanym za twórcę trwa wiecznie.

Pytanie 29

Który z wymienionych parametrów określa prędkość procesora?

A. Liczba rdzeni
B. Wielkość pamięci podręcznej
C. Częstotliwość taktowania
D. Rodzaj złącza
Częstotliwość taktowania procesora, wyrażana najczęściej w gigahercach (GHz), jest kluczowym parametrem opisującym szybkość działania jednostki centralnej. Określa, ile cykli zegara procesor jest w stanie wykonać w ciągu jednej sekundy. Wyższa częstotliwość oznacza większą ilość operacji, które procesor może przetworzyć w danym czasie, co bezpośrednio wpływa na jego wydajność. Przykładowo, procesor o częstotliwości 3,0 GHz może wykonać 3 miliardy cykli na sekundę, co sprawia, że jest w stanie przeprowadzać bardziej skomplikowane obliczenia i efektywniej zarządzać zadaniami. W praktyce jednak sama częstotliwość nie jest jedynym wskaźnikiem wydajności; istotne są też inne czynniki, takie jak architektura procesora, liczba rdzeni czy szybkość pamięci RAM. Standardy, takie jak Intel Core i9 czy AMD Ryzen 5000, dostarczają informacji na temat maksymalnej częstotliwości taktowania, co pozwala konsumentom lepiej dobierać sprzęt do swoich potrzeb. Warto również zauważyć, że wielu nowoczesnych procesorów stosuje technologię Turbo Boost, która pozwala na chwilowe zwiększenie częstotliwości w celu uzyskania lepszej wydajności przy intensywnych obciążeniach.

Pytanie 30

Co to jest lazy loading w kontekście ładowania obrazów na stronie?

A. Metoda kompresji obrazów przed wysłaniem na serwer
B. Protokół transferu obrazów między serwerem a przeglądarką
C. Format przechowywania obrazów w pamięci podręcznej przeglądarki
D. Technika ładowania obrazów dopiero w momencie, gdy stają się widoczne dla użytkownika
Lazy loading to technika, która pozwala na ładowanie obrazów oraz innych zasobów dopiero w momencie, gdy stają się one widoczne dla użytkownika na ekranie. Dzięki temu oszczędzamy zasoby sieciowe i poprawiamy czas ładowania strony, co jest szczególnie istotne w kontekście optymalizacji SEO oraz doświadczenia użytkownika. Na przykład, w przypadku długiej strony internetowej z wieloma obrazami, lazy loading sprawia, że podczas przewijania strony obrazy nie są ładowane od razu, co zmniejsza obciążenie serwera i przyspiesza wczytywanie widocznych części strony. W praktyce można zastosować atrybuty takie jak "loading='lazy'" w znaczniku <img>, co jest zgodne z nowoczesnymi standardami HTML. Ponadto, wiele bibliotek i frameworków, jak np. Intersection Observer API, umożliwia zaawansowaną implementację lazy loadingu, co sprawia, że jest to obecnie powszechnie stosowana praktyka.

Pytanie 31

Jakie jest fundamentalne zagadnienie w projektowaniu aplikacji w architekturze klient-serwer?

A. Brak podziału na role klienta i serwera
B. Przeniesienie wszystkich obliczeń na stronę klienta
C. Funkcjonowanie aplikacji wyłącznie w trybie offline
D. Użycie serwera jako głównego miejsca przetwarzania danych
Użycie serwera jako centralnego miejsca przetwarzania danych jest kluczowym elementem architektury klient-serwer. Serwer pełni rolę centralnego punktu, który zarządza żądaniami klientów, przechowuje dane i zapewnia odpowiedzi na zapytania. Taki model zapewnia większe bezpieczeństwo danych, ułatwia zarządzanie zasobami i umożliwia skalowanie aplikacji w miarę wzrostu liczby użytkowników. Architektura klient-serwer jest szeroko stosowana w aplikacjach webowych, systemach bankowych oraz usługach chmurowych, gdzie konieczna jest centralizacja danych i ich ochrona.

Pytanie 32

Co to jest SPA (Single Page Application)?

A. Technika optymalizacji kodu w aplikacjach JavaScript
B. Metoda projektowania interfejsu użytkownika dla aplikacji mobilnych
C. Format pliku używany w aplikacjach do przetwarzania danych
D. Aplikacja webowa działająca na jednej stronie, dynamicznie aktualizująca treść bez przeładowywania całej strony
Single Page Application (SPA) to typ aplikacji internetowej, która działa na jednej stronie, umożliwiając dynamiczne ładowanie treści bez konieczności przeładowania całej witryny. W tradycyjnych aplikacjach webowych, każda interakcja użytkownika, która wymagała zmiany treści, wiązała się z odświeżeniem strony. W przypadku SPA, korzysta się z technologii takich jak AJAX, WebSockets czy API, co pozwala na asynchroniczne pobieranie danych z serwera. Przykłady SPA to popularne frameworki i biblioteki, takie jak React, Angular czy Vue.js. Dzięki tym technologiom, użytkownicy mogą doświadczyć płynniejszego i bardziej responsywnego interfejsu. Dobrą praktyką w projektowaniu SPA jest stosowanie wzorców projektowych, takich jak MVC (Model-View-Controller), co ułatwia zarządzanie kodem oraz jego modułowość. SPA są szczególnie przydatne w aplikacjach wymagających intensywnej interakcji, takich jak platformy e-commerce czy aplikacje społecznościowe, gdzie kluczowa jest szybkość i komfort użytkowania.

Pytanie 33

Które z wymienionych oznaczeń wskazuje na liniową złożoność algorytmu?

A. O(1)
B. O(log n)
C. O(n)
D. O(n²)
Złożoność O(n) oznacza liniową zależność czasu wykonania algorytmu od rozmiaru danych wejściowych. Oznacza to, że dla każdego dodatkowego elementu algorytm wykonuje jedną dodatkową operację. Algorytmy liniowe są jednymi z najczęściej stosowanych w praktyce, ponieważ oferują dobrą równowagę między szybkością a złożonością implementacji. Przykłady algorytmów o złożoności O(n) to przeszukiwanie liniowe (Linear Search), sumowanie elementów tablicy oraz niektóre algorytmy sortowania, takie jak Counting Sort dla określonych warunków. Liniowa złożoność czyni te algorytmy bardzo efektywnymi przy przetwarzaniu dużych zbiorów danych.

Pytanie 34

Które z poniższych nie jest typem testu w programowaniu?

A. Testy end-to-end
B. Testy integracyjne
C. Testy jednostkowe
D. Testy kompilacyjne
Testy jednostkowe, testy integracyjne oraz testy end-to-end są fundamentalnymi typami testów w programowaniu, które mają na celu weryfikację różnych aspektów aplikacji. W przeciwieństwie do testów kompilacyjnych, które skupiają się na tym, czy kod może być skompilowany, testy jednostkowe weryfikują poprawność poszczególnych komponentów programu w izolacji. Umożliwiają one programistom szybkie wykrywanie błędów na wczesnym etapie cyklu życia oprogramowania. Testy integracyjne badają współdziałanie różnych modułów, co jest kluczowe dla zapewnienia, że system jako całość działa zgodnie z założeniami projektowymi. Z kolei testy end-to-end są najbardziej kompleksowe, ponieważ symulują rzeczywiste scenariusze użytkowników, co pozwala na ocenę, czy wszystkie elementy systemu współpracują w sposób zamierzony. Podczas gdy testy kompilacyjne są niezbędne w kontekście wstępnej kontroli jakości kodu, nie powinny być mylone z testami, które analizują funkcjonalność aplikacji. Typowe błędy myślowe, które prowadzą do pomyłek, obejmują mylenie etapu kompilacji z faktycznym testowaniem funkcjonalności. Zrozumienie różnicy między tymi pojęciami jest kluczowe dla efektywnego procesu developmentu oraz zapewnienia, że oprogramowanie spełnia zarówno wymagania techniczne, jak i biznesowe.

Pytanie 35

Zapisany fragment w C# wskazuje na definicję klasy Car, która:

public class Car: Vehicle {     ...   }
A. dziedziczy po Vehicle
B. jest powiązana z klasą Vehicle
C. używa prywatnych pól klasy Vehicle
D. stanowi klasę bazową (nie dziedziczy po żadnej klasie)
W przedstawionym kodzie w języku C# mamy definicję klasy Car, która dziedziczy po klasie Vehicle. Dziedziczenie to fundamentalny mechanizm programowania obiektowego, pozwalający jednej klasie przejąć właściwości i metody innej klasy. W praktyce oznacza to, że klasa Car automatycznie zyskuje dostęp do metod i właściwości publicznych oraz chronionych klasy Vehicle, co umożliwia ponowne użycie kodu i zwiększa jego przejrzystość. Dziedziczenie jest kluczowe w projektowaniu skalowalnych systemów, gdzie umożliwia tworzenie bardziej specyficznych klas na podstawie klas ogólnych, co jest zgodne z zasadą DRY (Don't Repeat Yourself). Przykładowo, jeżeli klasa Vehicle zawiera metody takie jak Start() i Stop(), klasa Car może je wykorzystać bez konieczności ponownego definiowania. Dobre praktyki w programowaniu obiektowym zalecają wykorzystywanie dziedziczenia do tworzenia hierarchii klas, które logicznie odwzorowują relacje „jest-a” pomiędzy obiektami w systemie. Ważne jest też unikanie zbyt głębokiego dziedziczenia, co może prowadzić do skomplikowanego i trudnego w utrzymaniu kodu. Zrozumienie dziedziczenia jest kluczowe dla efektywnego wykorzystania wzorców projektowych, takich jak wzorzec projektowy Adapter czy Dekorator.

Pytanie 36

Jedną z zasad standardu WCAG 2.0 jest

A. unikanie przedstawiania informacji w formie uproszczonej
B. ograniczanie treści na stronie przez rezygnację z używania alternatywnych tekstów dla obrazów i filmów
C. używanie jednego, odpowiednio dużego rozmiaru czcionki
D. stosowanie różnych palet kolorystycznych, w tym o wysokim kontraście
Stosowanie różnych palet kolorystycznych, zwłaszcza takich z wysokim kontrastem, to naprawdę kluczowa sprawa w dostępności cyfrowej. Tak mówi standard WCAG 2.0, dokładniej zasada 1 – Postrzegalność. Chodzi tu głównie o kryterium sukcesu 1.4.3 (Kontrast – minimum), które wyraźnie określa, że tekst i treść graficzna muszą być czytelne dla osób z różnymi potrzebami, np. słabszym wzrokiem albo daltonizmem. Moim zdaniem warto sobie uświadomić, jak wielka to różnica. Przykładowo, jeśli tekst na stronie jest szary na białym tle, osoby starsze lub z wadami wzroku mogą po prostu nie być w stanie nic przeczytać. W praktyce, wysokokontrastowe kombinacje, np. biały tekst na czarnym tle lub na żółtym, bardzo poprawiają dostępność strony. Widać to choćby w trybach "high contrast" w systemach Windows – często osoby pracujące długo przy komputerze z tego korzystają, bo wzrok się mniej męczy. Branżowe dobre praktyki zalecają również nie polegać wyłącznie na kolorze podczas przekazywania informacji – przykładowo, jeśli błąd w formularzu jest oznaczony tylko na czerwono, osoba z daltonizmem tego nie zauważy. To wszystko pokazuje, że kolory i kontrast to nie tylko estetyka, ale klucz do równego dostępu. Z mojego doświadczenia, gdy projektuje się strony zgodnie z WCAG, dobrze jest testować różne ustawienia kontrastu albo korzystać z narzędzi jak Colour Contrast Analyser, żeby mieć pewność, że wszyscy użytkownicy skorzystają ze strony bez problemów.

Pytanie 37

Co to jest BEM w kontekście CSS?

A. Browser Extension Module - moduł rozszerzeń przeglądarki
B. Bootstrap Element Manager - narzędzie do zarządzania elementami Bootstrap
C. Metodologia nazewnictwa klas CSS: Block, Element, Modifier
D. Backend Encryption Method - metoda szyfrowania danych w backendzie
BEM, czyli Block, Element, Modifier, to metodologia służąca do organizacji i strukturyzacji kodu CSS, co znacząco ułatwia zarządzanie i rozwijanie projektów internetowych. W BEM każda klasa CSS jest zbudowana w sposób, który jasno definiuje jej rolę w kontekście całej aplikacji. Na przykład, blok to niezależny komponent, taki jak 'navbar' czy 'button', element to część bloku, która nie ma sensu sama w sobie, jak 'navbar__item', a modyfikator wskazuje na różne stany lub warianty bloku lub elementu, jak 'button--primary' lub 'button--disabled'. Zastosowanie BEM pozwala na lepszą czytelność kodu oraz unikanie konfliktów nazw, co jest kluczowe w dużych projektach. Praktyka ta jest szeroko stosowana w branży, a wiele frameworków CSS, takich jak Bootstrap, przyjmuje zasady BEM dla swoich komponentów, co wspiera stworzenie spójnego i łatwego w utrzymaniu stylu. Zrozumienie BEM jest fundamentem dla programistów front-end, ponieważ pozwala na efektywniejszą współpracę w zespole oraz lepszą organizację kodu.

Pytanie 38

Po uruchomieniu poniższego kodu w języku C++ w konsoli pojawi się ciąg liczb:

int a = 1;
while (a++ < 6) {
    cout << a << " ";
}
A. 1 2 3 4 5
B. 2 3 4 5 6
C. 2 3 4 5 6 7
D. 1 2 3 4 5 6
Z tego co widzę, najczęstsze nieporozumienia związane z tym pytaniem wynikają z mylenia sposobu działania operatora postinkrementacji z preinkrementacją, a także niezrozumienia kolejności wykonania instrukcji w pętli. W tym przykładzie zapis a++ < 6 sprawia, że najpierw do warunku trafia obecna wartość a (sprawdzana jest 1 < 6), dopiero potem następuje zwiększenie a do 2. Wewnątrz pętli wypisywana jest już ta nowa wartość. To może być mylące, bo ktoś mógłby założyć, że najpierw następuje inkrementacja, a potem sprawdzenie warunku – tak by było przy ++a < 6, ale nie przy a++ < 6. Kolejna rzecz: wybierając odpowiedzi typu 1 2 3 4 5 6 lub 2 3 4 5 6 7, można nieświadomie przyjąć, że pętla wypisuje także wartości początkową lub końcową poza zakresem warunku, co w tym kodzie nie ma miejsca. Częstym błędem jest też założenie, że warunek a++ < 6 przepuszcza do wypisania wartość 6 lub nawet 7, ale w rzeczywistości przy a równym 6 warunek staje się fałszywy i pętla się kończy. Takie subtelności są bardzo istotne w codziennym programowaniu, szczególnie kiedy pracuje się z pętlami sterującymi wykonywaniem algorytmów czy przetwarzaniem danych w tablicach. Praktyka pokazuje, że przeoczenie różnic między post- i pre-inkrementacją prowadzi do bugów, które często trudno namierzyć, a ich efekty mogą wychodzić dopiero po dłuższym czasie. Moim zdaniem najlepiej przyjąć zasadę, by czytać kod spokojnie linijka po linijce i zwracać uwagę na to, co dzieje się z każdą zmienną w każdej iteracji. Uczy to logicznego myślenia i pozwala lepiej rozumieć mechanizmy języka – a to podstawa do pisania solidnego, przewidywalnego kodu.

Pytanie 39

Jaki będzie wynik działania poniższego kodu w języku Java?

String a = "hello";
String b = "hello";
String c = new String("hello");
System.out.println(a == b);
System.out.println(a == c);
System.out.println(a.equals(c));
A. true, false, true
B. false, false, true
C. true, false, false
D. true, true, true
Wynik działania kodu to true, false, true. Pierwsza linia kodu, gdzie porównujemy zmienne 'a' i 'b' przy użyciu operatora '==', zwraca true, ponieważ obie zmienne wskazują na ten sam obiekt w pamięci, co jest efektem optymalizacji JVM dla literałów typu String. W przypadku drugiej linii, gdzie porównujemy 'a' i 'c', wynik to false, ponieważ 'c' to nowy obiekt utworzony przy pomocy operatora 'new', a więc ma inną referencję w pamięci. W trzeciej linii używamy metody 'equals()', która porównuje wartości obiektów, a nie ich referencje. W tym przypadku porównywane są wartości stringów i ponieważ wszystkie mają tę samą treść, wynik to true. Zrozumienie różnicy między operatorem '==' a metodą 'equals()' jest kluczowe w programowaniu w Javie. Przy pracy z obiektami, zawsze warto stosować 'equals()' do porównywania zawartości, aby uniknąć nieporozumień związanych z referencjami."

Pytanie 40

Celem zastosowania wzorca Obserwator w tworzeniu aplikacji WEB jest:

A. zarządzanie funkcjami synchronicznymi w kodzie aplikacji
B. informowanie obiektów o modyfikacji stanu innych obiektów
C. dostosowanie interfejsu użytkownika do różnych kategorii użytkowników
D. monitorowanie działań użytkownika oraz generowanie wyjątków
Wzorzec projektowy Obserwator (ang. Observer) to jeden z klasyków ze świata programowania obiektowego i frontendu. Główna jego rola polega na tym, by pozwalać obiektom (obserwatorom) reagować na zmiany stanu innych obiektów (podmiotów) bez sztywnego powiązania tych klas ze sobą. W praktyce, w aplikacjach webowych bardzo często wykorzystuje się ten wzorzec w architekturach typu MVC czy MVVM, gdzie widoki muszą się automatycznie aktualizować po zmianie modelu danych. Przykład: w Reactcie używasz hooka useState lub useEffect – i Twoje komponenty „obserwują” stan aplikacji. Gdy stan się zmienia, komponenty same się przebudowują, a Ty nie musisz ręcznie wywoływać każdej aktualizacji. Podobnie działa np. EventEmitter w Node.js, Redux z subskrypcjami store czy nawet WebSockety, gdzie klient „słucha” na zmiany po stronie serwera. Dzięki temu komunikacja pomiędzy różnymi częściami systemu staje się luźno powiązana, co ułatwia utrzymanie i rozbudowę kodu. Moim zdaniem bez zrozumienia tego wzorca trudno ogarnąć nowoczesny frontend, bo większość bibliotek UI gdzieś pod spodem go wykorzystuje. Przy okazji: Observer to wzorzec zalecany przez GOF (Gang of Four), więc to nie jest tylko „fajna technika”, ale sprawdzony standard branżowy. Warto wiedzieć, że podejście to minimalizuje ryzyko błędów w synchronizacji danych i pozwala naturalnie reagować na zmiany bez pisania stosów callbacków. To spora oszczędność czasu i kodu.