Wyniki egzaminu

Informacje o egzaminie:
  • Zawód: Technik programista
  • Kwalifikacja: INF.04 - Projektowanie, programowanie i testowanie aplikacji
  • Data rozpoczęcia: 8 czerwca 2026 12:29
  • Data zakończenia: 8 czerwca 2026 12:44

Egzamin zdany!

Wynik: 31/40 punktów (77,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

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 1.
B. Kod 4.
C. Kod 2.
D. Kod 3.
W tym przypadku Kod 2 jest dokładnym odpowiednikiem funkcjonalnym dla przedstawionej instrukcji switch. To, co tu widać, to klasyczna zamiana konstrukcji switch-case na strukturę if-else if-else, co jest bardzo częstą praktyką w programowaniu, szczególnie w językach, które nie zawsze posiadają rozbudowaną wersję switch. Kod 2 najpierw sprawdza, czy nrTel to 999, jeśli tak – przypisuje "Pogotowie" i nie sprawdza dalszych warunków. Jeśli nie, przechodzi do kolejnego warunku, czyli nrTel == 998, potem 997, w końcu domyślnie daje "Inny numer". Dokładnie tak samo to działało w switchu – tylko jeden warunek się wykonuje i reszta jest ignorowana, co ma znaczenie np. gdybyśmy później rozbudowywali logikę. Takie podejście jest czytelne, uniwersalne i zgodne z dobrymi praktykami kodowania – łatwo to refaktoryzować, debugować i utrzymywać. W wielu firmowych projektach spotkałem się z preferencją dla if-else zamiast switcha, jeśli liczba przypadków nie jest ogromna, bo łatwiej potem dołożyć dodatkowe warunki (np. złożone, nie tylko proste porównanie wartości). Fajnie też wiedzieć, że takie zamiany to podstawa przy migracji kodu między różnymi językami – nie każdy język ma identycznie działający switch. Moim zdaniem, umiejętność takiego przełożenia to dobra baza do nauki algorytmiki i lepszego rozumienia logiki sterowania przepływem kodu.

Pytanie 2

Co będzie wynikiem działania poniższego kodu SQL?

SELECT COUNT(*)
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
A. Średnia pensja wszystkich pracowników
B. Liczba pracowników z pensją powyżej średniej
C. Liczba pracowników z najwyższą pensją
D. Błąd składni SQL
Odpowiedź, że wynik działania zapytania SQL to liczba pracowników z pensją powyżej średniej, jest całkowicie poprawna. Zapytanie to korzysta z funkcji agregującej COUNT(*), która zlicza liczbę rekordów spełniających określony warunek. W tym przypadku warunkiem jest, że pensja pracownika jest większa od średniej pensji wszystkich pracowników, którą obliczamy za pomocą wewnętrznego zapytania (subquery). Tego rodzaju operacje są powszechnie stosowane w analizie danych w bazach danych, gdzie często musimy wykonać porównania względem wartości agregatów, takich jak średnia, mediana czy suma. Przykładowo, w analizie wynagrodzeń w danej firmie, można użyć podobnych zapytań do oceny, jaki odsetek pracowników jest wynagradzanych powyżej średniej, co może być istotne z punktu widzenia polityki płacowej oraz budżetowania. Pamiętaj, że dobre praktyki w pracy z bazami danych obejmują optymalizację zapytań oraz unikanie niepotrzebnych obliczeń, co może wpłynąć na wydajność systemu.

Pytanie 3

Pętla przedstawiona w zadaniu działa na zmiennej typu string o nazwie ciag. Jej celem jest:

int i = 0;
while (ciag[i] != 0)  {
    if (ciag[i] > 96 && ciag[i] < 123)  {
        ciag[i] = (ciag[i] - 32);
    }
    i++;
}
A. Od każdego znaku w ciągu odjąć kod 32.
B. Od każdego znaku w ciągu, który nie jest równy 0, odjąć kod 32.
C. Zamienić w ciągu wielkie litery na małe.
D. Zamienić w ciągu małe litery na wielkie.
Pętla, która zamienia małe litery na wielkie, to naprawdę fajny przykład tego, jak można operować na tekstach. W zasadzie każdy znak w napisie jest przeszukiwany, a jeśli to litera, to modyfikujemy jej kod ASCII. W praktyce dodajemy lub odejmujemy 32, żeby uzyskać odpowiednią wielką literę. Tego typu operacje wykorzystuje się w wielu miejscach, jak na przykład przy filtrowaniu danych czy normalizacji tekstu. No i oczywiście w systemach wyszukujących, gdzie wielkość liter ma znaczenie. Warto umieć zaimplementować taką pętlę, bo przydaje się w różnych aplikacjach, szczególnie tam, gdzie tekst jest kluczowy.

Pytanie 4

Która metoda tablicy w JavaScript dodaje nowy element na końcu tablicy?

A. unshift()
B. pop()
C. push()
D. shift()
Metoda push() w JavaScript jest kluczowym narzędziem do dodawania nowych elementów na końcu tablicy. Jest to technika powszechnie stosowana w programowaniu, która pozwala na dynamiczne zarządzanie danymi w aplikacjach. Stosując push(), zyskujemy możliwość zwiększania rozmiaru tablicy w locie, co jest szczególnie przydatne w przypadku pracy z danymi, które mogą się zmieniać lub być nieprzewidywalne. Na przykład, jeśli mamy tablicę przechowującą listę zakupów, możemy dodać nowy przedmiot za pomocą metody push: `zakupy.push('jogurt');`. Warto również zauważyć, że metoda ta zwraca nową długość tablicy po dodaniu elementu, co może być użyteczne w kontekście dalszego przetwarzania lub sprawdzania zawartości tablicy. Zastosowanie tej metody jest zgodne z zasadami dobrego programowania w JavaScript, które zaleca efektywne gospodarowanie pamięcią i elastyczne zarządzanie strukturami danych.

Pytanie 5

Co oznacza skrót CDN w kontekście aplikacji webowych?

A. Content Definition Notation - notacja do definiowania treści w aplikacjach
B. Cross Domain Navigation - metoda nawigacji między domenami w aplikacjach webowych
C. Compressed Data Node - węzeł kompresji danych w architekturze mikrousług
D. Content Delivery Network - sieć rozproszona geograficznie, służąca do dostarczania treści
W kontekście aplikacji webowych błędne skróty i pojęcia często prowadzą do nieporozumień dotyczących architektury i technologii. Cross Domain Navigation, chociaż istotne w kontekście bezpieczeństwa i wymiany danych między różnymi domenami, nie jest związane z dostarczaniem treści. Metoda ta dotyczy głównie sposobów nawigacji w aplikacjach, które mogą wymagać zarządzania różnymi politykami CORS (Cross-Origin Resource Sharing), ale nie definiuje sposobów optymalizacji dostarczania treści. Compressed Data Node to termin, który sugeruje węzeł odpowiedzialny za kompresję danych w architekturze mikrousług, ale nie wiąże się z geograficznie rozproszonym dostarczaniem treści, co jest kluczowym aspektem działania CDN. Content Definition Notation to z kolei nieznany termin w literaturze dotyczącej technologii webowej, nie mający powszechnie uznawanej definicji w branży. Błędem myślowym byłoby utożsamianie tych terminów z sieciami dostarczania treści, ponieważ każde z nich ma swoją specyfikę i zastosowanie. W kontekście aplikacji internetowych kluczowe jest zrozumienie, że CDN ma na celu poprawę szybkości i efektywności dostarczania treści, co jest niezrównanie bardziej złożonym i istotnym zagadnieniem niż tylko nawigacja czy kompresja danych. Praktyki związane z sieciami CDN są dobrze udokumentowane i należy je stosować zgodnie z najlepszymi standardami branżowymi, aby zapewnić wysoką jakość usług dla użytkowników.

Pytanie 6

Co zostanie wyświetlone w konsoli po wykonaniu poniższego kodu?

console.log(0.1 + 0.2 === 0.3);
console.log(0.1 + 0.2);
A. true, 0.30000000000000004
B. true, 0.3
C. false, 0.3
D. false, 0.30000000000000004
Niepoprawne odpowiedzi wynikają z nieporozumienia dotyczącego reprezentacji liczb zmiennoprzecinkowych w JavaScript. Wiele osób ma tendencję do sądzenia, że operacje matematyczne z użyciem liczb dziesiętnych będą prowadziły do oczekiwanych rezultatów. Przykład `0.1 + 0.2`, który wydaje się prosty, w rzeczywistości ujawnia istotne różnice w precyzji. W przeciwieństwie do liczb całkowitych, które są reprezentowane jednoznacznie, liczby zmiennoprzecinkowe mogą wprowadzać błędy zaokrągleń. Gdyby nasze porównanie zwracało `true`, wskazywałoby to na to, że na poziomie binarnym liczby te są identyczne, co jest w przypadku JavaScript nieprawdziwe. Z kolei podanie `0.3` jako wyniku sumy w niektórych odpowiedziach nie uwzględnia tej samej zasady, co sugeruje, że porównanie tych wartości jest właściwe, mimo że nie jest. Warto zrozumieć, że takie błędne wnioski mogą prowadzić do poważnych problemów w bardziej złożonych obliczeniach, zwłaszcza w aplikacjach finansowych, gdzie precyzja jest niezbędna. Dobrym zwyczajem jest korzystanie z odpowiednich metod, które pozwalają na bezpieczne porównywanie wartości zmiennoprzecinkowych, minimalizując ryzyko błędów. Stosując podejście oparte na tolerancji błędu, można uniknąć pułapek związanych z reprezentacją liczb i poprawić dokładność obliczeń.

Pytanie 7

Jakie są typowe frameworki/biblioteki używane w aplikacjach webowych?

A. ASP.NET Core, Django, Angular, React.js, Node.js
B. ASP.NET Core, jQuery, Joomla!, Wordpress, Angular
C. jquery, Joomla!, Wordpress, android Studio, Xamarin
D. Visual Studio, Eclipse, angular, React.js, Node.js
Wybrana grupa frameworków i bibliotek — ASP.NET Core, Django, Angular, React.js, Node.js — to w praktyce jedne z najbardziej rozpoznawalnych i szeroko wykorzystywanych rozwiązań w branży tworzenia aplikacji webowych. Każdy z nich pełni trochę inną rolę, co powoduje, że są stosowane na różnych warstwach aplikacji. Na przykład ASP.NET Core oraz Django to frameworki po stronie serwera, obsługujące backend, logikę biznesową i komunikację z bazą danych. Są bardzo popularne zwłaszcza tam, gdzie liczy się szybkość wdrożenia i bezpieczeństwo. Node.js również zalicza się do backendowych technologii, z tym że pozwala pisać po stronie serwera w JavaScript, co bywa ogromnym plusem, gdy zespół jest mocno frontendowy. Angular i React.js to natomiast narzędzia, które pomagają budować rozbudowane, interaktywne interfejsy użytkownika po stronie klienta. Takie podejście, gdzie backend i frontend są rozdzielone, to obecnie standard — tzw. architektura SPA (Single Page Application) albo nawet JAMstack. Warto pamiętać, że dobrym zwyczajem jest korzystać właśnie z takich nowoczesnych frameworków, bo zapewniają solidne wsparcie społeczności, regularne aktualizacje i kompatybilność z nowymi standardami webowymi. Moim zdaniem, jeżeli myśli się poważnie o pracy jako developer webowy, to znajomość przynajmniej dwóch z wymienionych narzędzi to absolutny must-have. Przy okazji — wiele firm prowadzi projekty wieloplatformowe, więc umiejętność korzystania z tych frameworków można łatwo przenieść również do świata mobilnego czy nawet IoT.

Pytanie 8

Co oznacza termin 'immutability' w programowaniu funkcyjnym?

A. Stan obiektu nie może być modyfikowany po jego utworzeniu
B. Funkcje mogą być przypisywane do zmiennych
C. Kod może być wykonywany równolegle
D. Obiekty są automatycznie usuwane z pamięci
Termin 'immutability' w programowaniu funkcyjnym odnosi się do właściwości obiektów, które po utworzeniu nie mogą być modyfikowane. W kontekście programowania funkcyjnego, gdzie funkcje są kluczowym składnikiem, immutability jest fundamentalnym założeniem, które pozwala na tworzenie bardziej przewidywalnych i bezpiecznych aplikacji. Kiedy obiekty są niemodyfikowalne, każde ich 'zmiana' generuje nowy obiekt, zamiast aktualizować istniejący, co eliminuję problemy związane z nieprzewidywalnym stanem aplikacji. Przykładem może być język programowania Scala, gdzie kolekcje, takie jak List, są niemodyfikowalne z założenia. Z perspektywy dobrych praktyk, immutability przyczynia się do łatwiejszej analizy kodu, testowania jednostkowego oraz równoległego przetwarzania danych. Ponadto, programowanie funkcyjne, bazujące na tej koncepcji, sprzyja tworzeniu czystych, modularnych i łatwych do przetestowania aplikacji.

Pytanie 9

Cytat przedstawia charakterystykę metodyki RAD. Pełne znaczenie tego skrótu można przetłumaczyć na język polski jako:

...(RAD)..., is both a general term for adaptive software development approaches, and the name for James Martin's method of rapid development.

In general, RAD approaches to software development put less emphasis on planning and more emphasis on an adaptive process. Prototypes are often used in addition to or sometimes even instead of design specifications.

Źródło: https://en.wikipedia.org/

A. środowisko refaktoryzacji aplikacji
B. środowisko szybkiego rozwoju aplikacji
C. prototypowanie wsparte testami jednostkowymi
D. zintegrowane środowisko programistyczne
RAD, czyli Rapid Application Development, tłumaczy się na polski najczęściej jako „środowisko szybkiego rozwoju aplikacji” albo „metodyka szybkiego wytwarzania oprogramowania”. To podejście stawia na błyskawiczne prototypowanie i szybkie iteracje zamiast długiego, formalnego planowania. Bardziej niż na dokumentacji, skupia się na tworzeniu działających wersji aplikacji, które można testować i na bieżąco modyfikować zgodnie z tym, czego oczekuje klient lub zespół użytkowników. W praktyce, przykładowy projekt w RAD to np. budowa aplikacji, gdzie klient dostaje wstępny prototyp po tygodniu, a nie po miesiącu – i od razu może zgłaszać uwagi. Bardzo często stosuje się narzędzia typu CASE (Computer-Aided Software Engineering), które pozwalają szybko generować kod i prototypy GUI bez żmudnego pisania wszystkiego od zera. W świecie profesjonalnych firm IT, RAD jest chętnie wykorzystywany, kiedy czas wdrożenia jest kluczowy, na przykład w startupach, które muszą szybko przetestować swój pomysł rynkowy. Moim zdaniem, nawet jeśli nie wszystkie projekty się do tego nadają, to znajomość RAD jest bardzo przydatna dla każdego programisty – pozwala lepiej zrozumieć, jak można pracować zwinnie i elastycznie, bez zbędnego formalizmu. RAD to nie tylko metodyka, ale też praktyczny styl myślenia o aplikacjach – szybciej, więcej, elastyczniej. Warto się tym zainteresować, szczególnie jeśli komuś zależy na czasie i wczesnych efektach pracy.

Pytanie 10

W jaki sposób definiuje się konstruktor kopiujący w ramach klasy?

A. Generuje nowy obiekt klasy bez przypisywania wartości
B. Generuje nowy obiekt i usuwa wcześniejszy
C. Inicjuje obiekt klasy na podstawie klasy dziedziczącej
D. Tworzy nowy obiekt jako wierną kopię innego obiektu
Konstruktor kopiujący to specjalny typ konstruktora, który tworzy nowy obiekt będący dokładną kopią innego obiektu tej samej klasy. Jest to niezwykle przydatne, gdy chcemy zduplikować istniejący obiekt, zachowując jego stan i wartości wszystkich składowych. Konstruktor kopiujący przyjmuje jako argument referencję do obiektu tej samej klasy, co pozwala na kopiowanie zarówno podstawowych typów danych, jak i dynamicznie alokowanych zasobów. Jego zastosowanie jest kluczowe w sytuacjach, gdy musimy pracować z obiektami dynamicznymi lub kopiować obiekty zarządzające wskaźnikami, aby uniknąć problemów związanych z wielokrotnym zwalnianiem tej samej pamięci.

Pytanie 11

Na podstawie zamieszczonego fragmentu kodu można stwierdzić, że element o nazwie rysunek jest

MojaKlasa obj1 = new MojaKlasa();
obj1.rysunek();
A. konstruktorem
B. obiektem
C. metodą w klasie
D. polem w klasie
W tym fragmencie kodu wywołujesz funkcję rysunek na obiekcie obj1, który jest instancją klasy MojaKlasa. To znaczy, że rysunek jest metodą tej klasy. Tak naprawdę, w programowaniu obiektowym korzystanie z metod to chleb powszedni – to one definiują zachowanie obiektu. W praktyce, metody są tym, co pozwala obiektom „robić” coś konkretnego, czyli realizować logikę biznesową albo odpowiadać na zdarzenia. Moim zdaniem warto pamiętać, że w standardach takich jak Java czy C#, notacja obj1.rysunek() jednoznacznie wskazuje na wywołanie metody (nawiasy są tu sygnałem, że chodzi o funkcję, a nie o dostęp do pola). To zresztą jest bardzo czytelna konwencja, spotykana praktycznie w każdym języku zorientowanym obiektowo. Dla przykładu, jeśli chciałbyś uzyskać dostęp do pola w obiekcie, nie używałbyś nawiasów, tylko napisałbyś obj1.nazwapola. W pracy nad większymi projektami warto też pamiętać o tzw. enkapsulacji – metody pozwalają „schować” szczegóły implementacji i udostępnić tylko to, co faktycznie powinno być dostępne z zewnątrz. W sumie, wywołanie obj1.rysunek(); dokładnie pokazuje, jak od strony praktycznej wyglądają interakcje z metodą klasy.

Pytanie 12

Tworząc aplikację opartą na obiektach, należy założyć, że program będzie zarządzany przez

A. pętlę dyspozytora, która w zależności od zdarzenia wywoła właściwą funkcję
B. moduły zawierające funkcje oraz zmienne globalne
C. definicję warunków końcowego rozwiązania
D. zbiór instancji klas współpracujących ze sobą
W programowaniu obiektowym najważniejsze jest właśnie to, że wszystko opiera się na współpracujących ze sobą instancjach klas, czyli obiektach. To one przechowują dane (atrybuty) i zachowania (metody), a cała logika programu kręci się wokół ich interakcji. W praktyce oznacza to, że projektując aplikację, skupiasz się na tym, jakie obiekty będą potrzebne (np. Użytkownik, Zamówienie, Produkt), jakie mają cechy i jak ze sobą współpracują. Takie podejście pozwala na łatwiejsze zarządzanie złożonymi programami – moim zdaniem dużo prościej utrzymać i rozwijać kod, gdy jest podzielony na logiczne byty. To też zgodne ze standardami jak SOLID czy wzorce projektowe typu MVC, gdzie każda część aplikacji odpowiada za coś konkretnego, a komunikacja odbywa się przez wywołania metod. Przykład? W sklepie internetowym klasy takie jak Koszyk i Produkt "rozmawiają" ze sobą: koszyk dodaje produkt, sprawdza jego stan itd. Co ciekawe, takie ułożenie bardzo ułatwia testowanie jednostkowe – testujesz zachowanie pojedynczych obiektów, zamiast całych skomplikowanych funkcji rozsianych po programie. Z własnego doświadczenia mogę powiedzieć, że praca z kodem opartym o obiekty jest po prostu przyjemniejsza, mniej chaotyczna i zdecydowanie bardziej odporna na błędy przy rozwoju projektu.

Pytanie 13

Jaki jest podstawowy okres ochrony autorskich praw majątkowych w krajach Unii Europejskiej?

A. 50 lat od chwili pierwszej publikacji utworu
B. 75 lat od daty powstania utworu
C. 70 lat od zgonu autora
D. Bezterminowo
Podstawowy czas trwania autorskich praw majątkowych w Unii Europejskiej wynosi 70 lat od śmierci autora. Oznacza to, że przez ten okres twórca lub jego spadkobiercy mają wyłączne prawo do korzystania z utworu i czerpania z niego korzyści finansowych. Po upływie tego czasu dzieło przechodzi do domeny publicznej i może być swobodnie wykorzystywane przez każdego, bez konieczności uzyskania zgody. Długość ochrony praw autorskich została ujednolicona w ramach przepisów UE, aby zagwarantować spójność w całej wspólnocie i wspierać ochronę kultury oraz dziedzictwa narodowego.

Pytanie 14

Co następuje, gdy błąd nie zostanie uchwycony przez blok catch?

A. Błąd zostanie zignorowany przez kompilator
B. Program kontynuuje działanie, pomijając błąd
C. Program zakończy działanie z błędem
D. Instrukcja throw zostanie automatycznie wykreślona
Jeśli wyjątek nie zostanie przechwycony przez blok 'catch', program zakończy działanie z błędem i wygeneruje komunikat o nieobsłużonym wyjątku. Jest to domyślne zachowanie w C++ i innych językach obsługujących wyjątki, co ma na celu zapobieganie dalszemu wykonywaniu kodu, który mógłby prowadzić do nieprzewidywalnych rezultatów. Obsługa wyjątków jest kluczowym elementem zapewniania stabilności i bezpieczeństwa aplikacji – brak jej implementacji może prowadzić do awarii programu. Dlatego zaleca się, aby zawsze stosować odpowiednie bloki 'try-catch' wokół kodu, który może generować wyjątki.

Pytanie 15

Zaprezentowane oznaczenie praw Creative Commons umożliwia bezpłatne wykorzystywanie utworu

Ilustracja do pytania
A. w celach komercyjnych
B. pod warunkiem zachowania go w pierwotnej formie
C. pod warunkiem udostępnienia go na takiej samej licencji
D. w celu dokonywania zmian lub remiksowania
Odpowiedź dotycząca możliwości zmiany lub remiksowania utworu jest prawidłowa w kontekście oznaczeń Creative Commons takich jak CC BY lub CC BY-NC. Licencje te umożliwiają korzystanie z utworu w sposób zmieniony czy remiksowany pod warunkiem spełnienia określonych wymogów. CC BY wymaga jedynie przypisania autorstwa, co daje twórcom dużą elastyczność w adaptacji i modyfikacji dzieła, co znajduje zastosowanie w projektach edukacyjnych, artystycznych czy badawczych. Działania takie mogą obejmować tworzenie adaptacji, tłumaczeń, mashupów czy nowych kreatywnych form bazujących na oryginale. CC BY-NC natomiast ogranicza użycie komercyjne, ale nadal zezwala na modyfikacje w niekomercyjnych kontekstach. Remiksowanie muzyki, tworzenie nowych wersji wideo czy projektów graficznych są popularnymi praktykami w społeczności twórców, co promuje innowacje i rozwój kultury open source. Ważne jest, aby użytkownicy byli świadomi warunków licencji i poprawnie przypisywali autorstwo, co nie tylko spełnia wymogi prawne, ale również wspiera etos współpracy i uczciwości w społeczności twórczej. Zaangażowanie w twórczość w oparciu o licencje Creative Commons przyczynia się do propagowania wiedzy i kultury oraz wspiera zrównoważony rozwój społeczności twórczych.

Pytanie 16

Które z wymienionych opcji wspiera osoby niewidome w korzystaniu z witryn internetowych?

A. Umożliwienie modyfikacji czcionki
B. Zmiana rozdzielczości ekranu
C. Ograniczenie liczby grafik na stronie
D. Implementacja czytnika ekranu (screen reader)
Dodanie czytnika ekranu (screen reader) jest kluczowym rozwiązaniem, które znacząco ułatwia osobom niewidomym i słabowidzącym korzystanie z serwisów internetowych. Czytniki ekranu to oprogramowanie przekształcające tekst na stronie internetowej na mowę, co pozwala użytkownikom na interakcję z treścią dostępną w internecie. Technologia ta opiera się na standardach dostępności, takich jak WCAG (Web Content Accessibility Guidelines), które zalecają projektowanie stron przyjaznych dla osób z różnymi niepełnosprawnościami. Przykładem działania czytnika ekranu może być program JAWS, który umożliwia użytkownikom nawigację po stronach internetowych poprzez komendy klawiaturowe oraz odczytywanie treści na głos. Dzięki czytnikom ekranu, osoby niewidome mają możliwość dostępu do informacji, komunikacji oraz interakcji w sieci, co wpisuje się w ideę cyfrowej inkluzji i równości szans. Wprowadzenie czytnika ekranu na stronie internetowej to nie tylko techniczne wsparcie, ale również wyraz odpowiedzialności społecznej, mający na celu zapewnienie, że wszyscy użytkownicy mają równe prawo do korzystania z zasobów w sieci.

Pytanie 17

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

A. Użycie czytelnych czcionek i intuicyjnego układu elementów
B. Zastosowanie jedynie jednego koloru w całym interfejsie
C. Przycisk umieszczony w przypadkowym miejscu aplikacji
D. Brak opcji cofnięcia już wykonanej akcji
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 18

Który komponent systemu komputerowego zajmuje się transferem danych pomiędzy procesorem a pamięcią RAM?

A. Zasilacz
B. Mostek północny (Northbridge)
C. Kontroler DMA
D. Karta graficzna
Mostek północny, znany również jako Northbridge, jest kluczowym elementem architektury komputerowej, który odpowiada za komunikację pomiędzy procesorem a pamięcią RAM. Jego głównym zadaniem jest koordynowanie przepływu danych w systemie oraz zapewnienie szybkiego dostępu do pamięci, co jest niezbędne dla wydajności całego systemu. Mostek północny jest odpowiedzialny za zarządzanie magistralami danych, a także interfejsami, takimi jak PCI Express, które łączą różne komponenty. Dzięki zastosowaniu standardów, takich jak DDR (Double Data Rate), mostek północny umożliwia efektywne przesyłanie danych w wysokiej prędkości. Praktycznym przykładem działania mostka północnego jest sytuacja, kiedy procesor potrzebuje załadować dane z pamięci RAM do rejestrów – mostek północny zarządza tym procesem, minimalizując opóźnienia i maksymalizując wydajność. W nowoczesnych systemach komputerowych mostek północny jest często zintegrowany z procesorem, co dodatkowo zwiększa efektywność komunikacji oraz zmniejsza czas dostępu do danych.

Pytanie 19

Jakie jest podstawowe użycie metod wirtualnych?

A. Umożliwienie korzystania z metod bezpośrednio z klasy bazowej
B. Umożliwienie wielokrotnego dziedziczenia
C. Zapewnienie, że metoda działa wyłącznie na danych statycznych
D. Umożliwienie dynamicznego wiązania metod w czasie wykonania
Umożliwienie korzystania z metod bezpośrednio z klasy bazowej nie jest funkcją metod wirtualnych – to raczej standardowa cecha metod publicznych. Metody działające wyłącznie na danych statycznych nie mogą być wirtualne, ponieważ ich działanie nie jest zależne od instancji klasy. Umożliwienie wielokrotnego dziedziczenia jest funkcją konstrukcji dziedziczenia w językach takich jak C++, ale samo w sobie nie wymaga metod wirtualnych, chociaż mogą one być używane w kontekście wielokrotnego dziedziczenia.

Pytanie 20

Jaką wartość jest w stanie przechować tablica jednowymiarowa?

A. Jedną wartość
B. Wartość logiczną true lub false
C. Wiele wartości pod różnymi indeksami
D. Wiele wartości pod tym samym indeksem
Tablica jednowymiarowa przechowuje wiele wartości pod różnymi indeksami. Każdy element tablicy jest dostępny za pomocą indeksu, co pozwala na szybkie i efektywne przechowywanie oraz przetwarzanie danych. W programowaniu tablice jednowymiarowe są podstawą do implementacji algorytmów sortowania, wyszukiwania oraz przechowywania sekwencji danych. Tego rodzaju tablice są niezwykle użyteczne w organizowaniu danych o powtarzalnej strukturze, takich jak listy imion, wyniki testów czy współrzędne.

Pytanie 21

1 terabajt (TB) to ile gigabajtów (GB)?

A. 2048
B. 1024
C. 1000
D. 512
No to fajnie, że trafiłeś w temat! 1 terabajt (TB) to 1024 gigabajty (GB), co wynika z systemu binarnego, który w IT jest najczęściej używany. Trochę technicznie mówiąc, 1 TB to tak naprawdę 2^40 bajtów, co daje nam ogromną liczbę – dokładnie 1 099 511 627 776 bajtów. Jak podzielisz to przez 1 073 741 824 bajtów, które to są 1 GB, to wyjdzie 1024 GB. Warto wiedzieć, że w świecie komputerów i systemów operacyjnych operujemy głównie na tym systemie binarnym. Ale uwaga, bo producenci dysków często podają pojemności w systemie dziesiętnym, i wtedy 1 TB to jakby 1 000 GB. To może wprowadzać zamieszanie, więc dobrze jest sprawdzać specyfikacje i mieć to na uwadze, żeby nie było nieporozumień. Większość systemów, jak Windows czy Linux, działa w tym binarnym, więc warto to znać, gdyż to ułatwia pracę zarówno użytkownikom, jak i fachowcom z branży IT.

Pytanie 22

Co to jest CI/CD w kontekście rozwoju oprogramowania?

A. Code Implementation/Code Delivery - metodyka implementacji i dostarczania kodu
B. Ciągła integracja i ciągłe dostarczanie - praktyki automatyzujące proces wdrażania kodu
C. Customer Interface/Customer Design - projektowanie interfejsów zorientowane na klienta
D. Component Isolation/Component Deployment - izolacja i wdrażanie komponentów aplikacji
W kontekście rozwoju oprogramowania, pojęcia takie jak Customer Interface/Customer Design, Code Implementation/Code Delivery oraz Component Isolation/Component Deployment, które zostały zaproponowane jako alternatywy dla CI/CD, posiadają fundamentalne różnice, które sprawiają, że nie są one odpowiednie w tej konkretnej sytuacji. Customer Interface/Customer Design koncentruje się na projektowaniu interfejsów użytkownika, co jest istotne, ale nie dotyczy bezpośrednio procesów automatyzacji związanych z integracją i dostarczaniem kodu. Z kolei Code Implementation/Code Delivery odnosi się do ogólnych metod implementacji kodu, co również nie wyczerpuje tematu CI/CD, gdyż nie uwzględnia aspektu automatyzacji i ciągłości procesów. Na koniec, Component Isolation/Component Deployment może sugerować izolację komponentów aplikacji, lecz nie uwzględnia znaczenia ciągłej integracji w kontekście synchronizacji i wczesnego wykrywania błędów. W praktyce, wiele organizacji staje przed wyzwaniami związanymi z integracją różnych komponentów oraz automatyzacji procesów, co może prowadzić do opóźnień w dostarczaniu oprogramowania. Dlatego kluczowe jest zrozumienie, że CI/CD to nie tylko termin techniczny, ale zbiór praktyk, który przynosi realne korzyści w postaci wyższej jakości kodu i szybszego dostarczania rozwiązań do użytkowników.

Pytanie 23

Wskaż uproszczoną wersję kodu XAML dla elementów w pokazanym oknie dialogowym?

Ilustracja do pytania
A. Kod 2
B. Kod 1
C. Kod 4
D. Kod 3
Dobrze jest znać podstawowe różnice pomiędzy ListBox, ComboBox, CheckBox, RadioButton oraz Label w XAML. W tym oknie dialogowym widać wyraźnie, że po lewej stronie użytkownik ma możliwość wyboru gatunku zwierzęcia spośród kilku opcji wyświetlonych jednocześnie. Takie zadanie najlepiej spełnia ListBox, bo umożliwia wygodną selekcję z widocznej listy. U góry po prawej jest pole tekstowe do wpisania imienia zwierzaka, więc TextBox jak najbardziej pasuje. Poniżej mamy dwa pola wyboru – „Zaszczepiony?” i „Na diecie?” – to są typowe przypadki na CheckBoxy: można zaznaczyć dowolne lub oba naraz. Kluczowe jest to, że CheckBox pozwala użytkownikowi wybrać dowolną kombinację, a nie tylko jedną opcję jak RadioButton. Z mojego doświadczenia często początkujący mylą ComboBox z ListBoxem, ale tu akurat lista jest zawsze widoczna, co jest typowe dla ListBoxa. Stosowanie CheckBoxów dla takich dwustanowych opcji też jest zgodne z dobrymi praktykami UX i standardami opisu formularzy w XAML. W pracy zawodowej często się to wykorzystuje, bo kod jest czytelny i łatwo go rozszerzać. Właśnie taki zestaw – ListBox, TextBox, CheckBox – jest najbardziej przejrzysty i zgodny z zamysłem projektanta interfejsów. Fajnie jest to zapamiętać, bo ta kombinacja pojawia się w wielu firmowych projektach.

Pytanie 24

Liczba A4 w zapisie heksadecymalnym ma odpowiadający jej zapis binarny

A. 1010100
B. 10100010
C. 10100100
D. 1011100
Zapisanie liczby A4 z systemu szesnastkowego (heksadecymalnego) do systemu binarnego to podstawowa umiejętność przy pracy z systemami cyfrowymi. W praktyce każda cyfra heksadecymalna odpowiada dokładnie czterem cyfrom binarnym, co wynika bezpośrednio z faktu, że 16=2^4. Gdy rozbijamy A4 na dwie części, mamy literę A (co oznacza 10 w dziesiętnym) oraz cyfrę 4. Zamieniamy więc A na binarny: 1010, a 4 – 0100. Sklejamy razem i dostajemy 10100100 – to jest właśnie prawidłowa odpowiedź. W rzeczywistych projektach, np. podczas programowania mikrokontrolerów, przy analizie adresów pamięci czy pracy z danymi w protokołach sieciowych, umiejętność szybkiej zamiany szesnastkowych wartości na binarne (i odwrotnie) jest totalnie niezbędna. Moim zdaniem zapamiętanie tych konwersji bardzo przyspiesza debugowanie kodu czy analizę rejestrów sprzętowych. To też podstawa przy pracy z narzędziami typu oscyloskop cyfrowy lub analizator stanów logicznych, gdzie często wartości wyświetlane są w jednym systemie, a dokumentacja posługuje się innym. Branża IT i elektronika wręcz żyją tymi zamianami – nie ma co się oszukiwać, im szybciej to opanujesz, tym mniej błędów popełnisz przy konfiguracji sprzętu czy pisaniu sterowników.

Pytanie 25

W jakim modelu Cyklu Życia Projektu Informatycznego znajduje się etap analizy ryzyka?

A. W modelu z prototypem
B. W modelu Fry’ego
C. W spiralnym
D. W kaskadowym
Często spotyka się przekonanie, że analiza ryzyka jest obecna w każdym modelu cyklu życia projektu informatycznego, ale to nie do końca tak działa. W modelu kaskadowym, czyli tzw. waterfall, wszystko odbywa się etapami – analiza, projektowanie, implementacja i tak dalej, w sztywno określonej kolejności. Tu niestety nie ma miejsca na systematyczną analizę ryzyka na każdym etapie, bo cała koncepcja tego modelu polega na tym, że raz wykonane czynności trudno potem cofnąć lub poprawić, szczególnie gdy coś pójdzie nie tak. To, moim zdaniem, jest jeden z powodów, dla których model kaskadowy bywa krytykowany – brak elastyczności i mała odporność na niespodziewane problemy. Podobnie jest w modelu z prototypem – tam niby tworzy się szybkie makiety czy prototypy, ale głównym celem jest poznanie potrzeb użytkownika i szybkie zebranie informacji zwrotnej, a nie formalna analiza ryzyka. Ryzyko oczywiście można zidentyfikować przy okazji, ale nie jest to centralny punkt tego podejścia. Model Fry’ego to już zupełnie inna bajka – jest bardzo liniowy, nacisk kładzie raczej na dokumentację i ścisłe trzymanie się etapów, a nie na adaptacyjność czy zarządzanie niepewnością. Z mojego punktu widzenia, błędne wybranie któregoś z tych modeli jako tego, gdzie analizuje się ryzyko, wynika z przekonania, że wszędzie jest miejsce na refleksję nad zagrożeniami – niestety, tylko model spiralny wprost i metodycznie wpisuje analizę ryzyka w swój rdzeń. W innych przypadkach analiza ryzyka jeśli się pojawia, to głównie z inicjatywy zespołu, a nie jako zaplanowany, powtarzający się etap procesu. Warto o tym pamiętać przy wyborze metodyki do danego projektu – nie każda zapewni takie same mechanizmy zabezpieczające przed błędami i nieprzewidzianymi zdarzeniami.

Pytanie 26

Jakie jest przeznaczenie dokumentacji wdrożeniowej?

A. Do testowania wydajności aplikacji
B. Do zarządzania bazą danych aplikacji
C. Do opisania procesu instalacji i konfiguracji aplikacji w środowisku produkcyjnym
D. Do tworzenia zadań w systemie kontroli wersji
Dokumentacja wdrożeniowa opisuje proces instalacji i konfiguracji aplikacji w środowisku produkcyjnym. Obejmuje ona szczegółowe instrukcje dotyczące wymaganych komponentów systemowych, zależności oraz kroków niezbędnych do prawidłowego wdrożenia aplikacji. Dzięki dokumentacji wdrożeniowej administratorzy IT oraz zespoły DevOps mogą skutecznie zarządzać procesem implementacji, minimalizując ryzyko błędów i przestojów. Dokument ten zawiera również informacje o kopiach zapasowych, procedurach przywracania systemu oraz testach przeprowadzanych po wdrożeniu, co zapewnia stabilność i bezpieczeństwo aplikacji po przeniesieniu jej na serwery produkcyjne. Kompleksowa dokumentacja wdrożeniowa to kluczowy element zarządzania cyklem życia oprogramowania (SDLC).

Pytanie 27

Który z poniższych problemów jest najczęściej rozwiązywany z zastosowaniem algorytmu rekurencyjnego?

A. Sortowanie za pomocą metody QuickSort
B. Wyszukiwanie binarne w uporządkowanej tablicy
C. Generowanie ciągu Fibonacciego
D. Obliczanie sumy elementów w tablicy
Generowanie ciągu Fibonacciego to klasyczny przykład problemu, który najczęściej rozwiązuje się za pomocą algorytmu rekurencyjnego. Algorytm rekurencyjny wywołuje sam siebie, dzieląc problem na mniejsze podproblemy, aż do osiągnięcia przypadku bazowego. W przypadku Fibonacciego każda liczba jest sumą dwóch poprzednich, a algorytm rekurencyjny odwzorowuje to wprost poprzez wywołania fib(n-1) + fib(n-2). Rekurencja jest intuicyjna i często stosowana w zadaniach matematycznych, takich jak obliczanie silni czy rozwiązywanie problemów związanych z przeszukiwaniem drzew. Choć rekurencja jest elegancka, dla dużych n może prowadzić do nadmiarowych obliczeń, dlatego często optymalizuje się ją za pomocą pamięci podręcznej (memoizacji) lub iteracyjnych wersji algorytmu.

Pytanie 28

Który operator w JavaScript sprawdza zarówno równość wartości jak i typu danych?

A. =
B. ==
C. ===
D. !=
Operator === w JavaScript jest powszechnie określany jako operator ścisłej równości. Jego główną zaletą jest to, że porównuje zarówno wartość, jak i typ danych dwóch operandów. Oznacza to, że jeśli porównujesz dwie zmienne, a jedna z nich jest liczbą, a druga łańcuchem znaków, operator ten zwróci false, ponieważ typy są różne. Dla przykładu, porównując 5 === '5', wynik będzie false, podczas gdy w przypadku operatora == wynik byłby true, co może prowadzić do niezamierzonych błędów w logice programu. Użycie operatora === jest zgodne z najlepszymi praktykami programistycznymi, ponieważ unika potencjalnych problemów związanych z automatycznym rzutowaniem typów. W praktyce, zawsze warto stosować operator ścisłej równości, aby zapewnić większą przewidywalność kodu oraz uniknąć trudnych do zdiagnozowania błędów. Dlatego operator === jest preferowany w nowoczesnym programowaniu w JavaScript.

Pytanie 29

W przedstawionym filmie ukazano kreator interfejsu użytkownika, dla którego automatycznie powstaje

A. obsługa wciśniętego przycisku
B. obsługa przycisku ekranu dotykowego
C. kod Java
D. kod XML
Kod XML jest obecnie najczęściej stosowanym formatem do definiowania wyglądu interfejsów użytkownika w takich narzędziach jak Android Studio czy różnego rodzaju designery graficzne. Kiedy projektujesz layout aplikacji mobilnej albo desktopowej, duża część nowoczesnych narzędzi tworzy właśnie pliki XML, które następnie są interpretowane przez system w czasie uruchamiania aplikacji. Ułatwia to rozdzielenie logiki aplikacji od jej prezentacji, co wydaje się fundamentalne przy większych projektach. Moim zdaniem takie podejście daje ogromne korzyści – można łatwo modyfikować wygląd bez dotykania kodu źródłowego. W praktyce, jeśli używasz np. Android Studio, zbudujesz interfejs przeciągając przyciski czy pola tekstowe, a pod spodem dostaniesz czytelny plik XML. To przyspiesza pracę, zwiększa czytelność projektu i pozwala na późniejsze automatyczne generowanie dokumentacji albo testów interfejsu. Takie standardy są rekomendowane nie tylko przez Google, ale też szeroko stosowane w innych środowiskach, jak chociażby XAML w Microsoft czy FXML w JavaFX. Przezroczystość działania tych narzędzi sprawia, że łatwiej jest pracować zespołowo, bo każdy może szybko zorientować się w strukturze UI patrząc na XML-a. Samo generowanie kodu XML przez narzędzia graficzne to duży krok w kierunku lepszej organizacji pracy i zgodności ze współczesnymi praktykami branżowymi.

Pytanie 30

Do zadań widoku w architekturze MVVM (Model-View-ViewModel) należy

A. obsługa interakcji użytkownika, stworzenie UI
B. przechowywanie ściągniętych i przetworzonych informacji
C. przekazywanie danych do widoku oraz wymiana informacji z modelem
D. zarządzanie logiką aplikacji - obejmuje wdrażanie algorytmów
Wiele osób myli zadania widoku w architekturze MVVM z innymi warstwami, przez co później pojawiają się spore problemy przy rozwijaniu i utrzymywaniu większych aplikacji. Przede wszystkim, widok nigdy nie powinien zarządzać logiką aplikacji ani implementować algorytmów – to zadanie Modelu lub ewentualnie ViewModelu. Przenoszenie takich odpowiedzialności do UI prowadzi do tzw. „smrodu kodu” i utrudnia refaktoryzację czy testowanie. Spotkałem się w praktyce z projektami, gdzie próbowano do widoku wrzucić obsługę serwisów, walidację czy sterowanie workflow – efektem był totalny chaos. Równie często pojawia się błędne przekonanie, że widok powinien przekazywać dane do widoku i wymieniać informacje z modelem – tymczasem w MVVM przepływ danych realizuje głównie ViewModel dzięki data bindingowi, a widok jest raczej pasywny i nie zarządza wymianą informacji bezpośrednio z modelem. To ViewModel łączy model z warstwą prezentacji, pozwalając na luźne powiązanie i wysoką elastyczność. Kolejna mylna koncepcja dotyczy przechowywania pobranych i przetworzonych informacji – tym zajmuje się Model, ewentualnie ViewModel, a nie widok. Wrzucając takie rzeczy do UI, łamiemy zasadę separacji odpowiedzialności. Moim zdaniem, warto zapamiętać, że długofalowy rozwój systemu, możliwość testowania oraz opcja łatwego podmieniania warstw bez ruszania całej reszty zależą właśnie od tego, jak precyzyjnie trzymamy się podziału ról. MVVM został zaprojektowany po to, żeby każda warstwa miała jasno określone zadania – i tylko wtedy architektura ma sens, jeśli się tego trzymamy. Odpowiedzialności widoku ograniczają się do prezentacji i obsługi interakcji użytkownika; wszystko, co wykracza poza to, powinno być delegowane do innych warstw. To pozwala na czysty kod i zgodność z najlepszymi praktykami programistycznymi.

Pytanie 31

Jakie sformułowanie najlepiej oddaje złożoność obliczeniową algorytmu quicksort?

A. jest różna w zależności od wyboru elementu dzielącego
B. jest zawsze mniejsza niż złożoność jakiegokolwiek innego algorytmu sortowania
C. jest większa niż złożoność sortowania bąbelkowego
D. jest większa niż O(n2)
Quicksort to jeden z najszybszych i najczęściej stosowanych algorytmów sortowania, ale jego złożoność obliczeniowa nie jest stała i zależy od wyboru elementu rozdzielającego (pivot). W najgorszym przypadku, gdy pivot wybierany jest niefortunnie (np. największy lub najmniejszy element), złożoność quicksort wynosi O(n²). W przypadku optymalnym (pivot dzieli zbiór na dwie równe części), złożoność to O(n log n). Algorytm ten działa w sposób rekurencyjny, dzieląc tablicę na mniejsze podzbiory, co czyni go bardzo efektywnym dla dużych zbiorów danych. W praktyce quicksort jest często szybszy niż sortowanie przez scalanie (merge sort) ze względu na mniejszą liczbę operacji przesuwania danych, mimo że oba algorytmy mają podobną średnią złożoność obliczeniową.

Pytanie 32

Algorytm przedstawiony powyżej może zostać zaimplementowany w języku Java z wykorzystaniem instrukcji:

Ilustracja do pytania
A. while
B. try
C. switch
D. if
Instrukcja 'while' w Javie działa tak, że powtarza blok kodu, aż warunek, który podasz, będzie prawdziwy. To jedna z podstawowych rzeczy w programowaniu i super przydaje się, kiedy nie wiesz z góry, ile razy coś ma się powtórzyć. Na przykład, możesz to wykorzystać, gdy szukasz czegoś w danych albo gdy chcesz, żeby coś wydarzyło się wielokrotnie, jak obsługa kliknięć na stronie.

Pytanie 33

Z analizy złożoności obliczeniowej algorytmów sortowania dla dużych zbiorów danych (powyżej 100 elementów) wynika, że najefektywniejszą metodą jest algorytm sortowania:

sortowanie bąbelkoweO(n²)
sortowanie przez wstawianieO(n²)
sortowanie przez scalanieO(n log n)
sortowanie przez zliczanieO(n)
sortowanie kubełkoweO(n²)
A. kubełkowego
B. przez scalanie
C. bąbelkowego
D. przez zliczanie
Sortowanie bąbelkowe jest jednym z najwolniejszych algorytmów i rzadko jest używane w praktyce ze względu na złożoność O(n^2). Sortowanie kubełkowe może być szybkie, ale jego efektywność zależy od równomiernego rozkładu danych. Sortowanie przez scalanie jest bardziej uniwersalne, ale ma większą złożoność obliczeniową niż Counting Sort i może być mniej efektywne dla dużych zbiorów danych o ograniczonym zakresie.

Pytanie 34

Zaprezentowany diagram ilustruje wyniki przeprowadzonych testów:

Informacje o stronie
Wyświetlenie po1.431 si
Pobieranie2.815 si
Całkowity czas wczytania4.395 si
Czas powtórnego wczytania1.609 si
Ilość przekierowań (wpisanego adresu)1i
Ilość żądań145i
Łącznie przesłane6.71 MBi
Pomijane przy powtórnym ładowaniu6.47 MB (96%)i
Rozmiar rzeczywisty8.29 MBi
A. ochrony
B. wydajnościowych
C. użyteczności
D. funkcjonalności
To właśnie są testy wydajnościowe – dokładnie takie parametry jak czasy ładowania, liczba żądań HTTP, rozmiar przesyłanych danych czy ilość przekierowań analizuje się w praktyce podczas oceny wydajności stron internetowych. Moim zdaniem ten typ testów jest absolutnie kluczowy w projektowaniu nowoczesnych aplikacji webowych, bo użytkownicy szybko rezygnują, jeśli strona się długo ładuje albo jest zbyt zasobożerna. W branży zwraca się obecnie ogromną uwagę na to, by strony były 'lekkie', szybkie i zoptymalizowane pod kątem przesyłu danych. Nawet Google premiuje szybkie serwisy w wynikach wyszukiwania, co niejeden programista już odczuł na własnej skórze. Testy wydajnościowe sprawdzają, jak aplikacja zachowuje się pod dużym obciążeniem i ile danych realnie pobierają użytkownicy. W praktyce polecam korzystać z narzędzi takich jak Google Lighthouse, WebPageTest czy nawet prosty DevTools w przeglądarce – pozwalają szybko wyłapać największe problemy z czasem ładowania. Warto też pamiętać, że optymalizacja wydajności to nie tylko lepsze wrażenia użytkownika, ale bardzo wymierne oszczędności na transferze i infrastrukturze. Dobry zwyczaj to cyklicznie monitorować te wskaźniki, nawet gdy wydaje się, że wszystko działa OK – bo sytuacja może się szybko zmienić po wdrożeniu nowych funkcjonalności lub zmianach w kodzie.

Pytanie 35

W programowaniu obiektowym odpowiednikami zmiennych oraz funkcji w programowaniu strukturalnym są

A. metody statyczne i abstrakcyjne
B. pola i kwalifikatory dostępu
C. pola i metody
D. hermetyzacja oraz dziedziczenie
Pola i metody to absolutna podstawa, jeśli chodzi o programowanie obiektowe. Właśnie one są najbliższym odpowiednikiem zmiennych i funkcji z podejścia strukturalnego. Moim zdaniem, gdy uczysz się OOP, warto od razu wyłapać tę analogię – pola (czyli inaczej: atrybuty, właściwości, fields) przechowują stan obiektu, a metody (czyli funkcje w klasie) definiują, co obiekt potrafi zrobić. Przykład z życia: klasa Samochód ma pole kolor, które opisuje jego cechę oraz metodę jedź(), która realizuje jakąś akcję. W praktyce programiści bardzo często modelują swoje klasy tak, aby pola były prywatne (zgodnie z zasadą hermetyzacji), a dostęp do nich zapewniały metody publiczne – tzw. gettery i settery. Standardy branżowe, np. JavaBeans w Javie czy konwencje C#, też polegają na tym, że pola odzwierciedlają dane, a metody operacje na tych danych. Z mojego doświadczenia wynika, że rozumienie tej relacji ułatwia zarówno pisanie czytelnego kodu, jak i jego dalsze rozwijanie. To właśnie dzięki rozdzieleniu na pola i metody klasy mogą odwzorowywać obiekty z realnego świata i ich zachowania, co jest głównym celem programowania obiektowego.

Pytanie 36

Które z poniższych nie jest narzędziem do zarządzania stanem w aplikacjach React?

A. Context API
B. Webpack
C. Redux
D. MobX
Wybierając odpowiedzi związane z zarządzaniem stanem, warto zaznaczyć, że Redux, MobX oraz Context API to popularne narzędzia wykorzystywane do efektywnego zarządzania stanem w aplikacjach zbudowanych w React. Redux jest biblioteką, która wprowadza wzorzec architektoniczny Flux, umożliwiając centralizację stanu aplikacji. Pozwala to na łatwiejsze śledzenie zmian stanu oraz ich przewidywalność. MobX, z drugiej strony, oferuje bardziej reaktywny i obiektowy model zarządzania stanem, gdzie zmiany stanu są automatycznie śledzone, co upraszcza kod i redukuje złożoność. Context API to natywne rozwiązanie w React, które umożliwia dzielenie się stanem między komponentami bez potrzeby przekazywania propsów przez wszystkie poziomy drzewa komponentów. Często nowi programiści mylą Webpack z narzędziami do zarządzania stanem, co wynika z jego kluczowej roli w ekosystemie React. W rzeczywistości, narzędzia do budowania, takie jak Webpack, koncentrują się głównie na kompilacji i optymalizacji zasobów, a nie na logice i zarządzaniu stanem aplikacji. Zrozumienie różnic między tymi narzędziami jest kluczowe dla prawidłowego projektowania aplikacji i efektywnego wykorzystania dostępnych technologii.

Pytanie 37

Zapis w języku C# przedstawia definicję klasy Car, która:

public class Car: Vehicle { ... }
A. jest klasą podstawową (nie dziedziczy po innej klasie)
B. używa pól prywatnych klasy Vehicle
C. jest zaprzyjaźniona z klasą Vehicle
D. odziedzicza po Vehicle
Słusznie, zapis public class Car : Vehicle { ... } w języku C# oznacza, że klasa Car dziedziczy po klasie Vehicle. To jest tak zwane dziedziczenie, jeden z fundamentalnych mechanizmów programowania obiektowego. Dzięki temu Car odzyskuje wszystkie publiczne i chronione (protected) człony klasy Vehicle, a dodatkowo może wprowadzać własne składowe albo nadpisywać metody bazowe. Przykładowo, jeśli Vehicle ma metodę Start(), to Car również ją posiada, chyba że ją nadpisze słówkiem override. Moim zdaniem, znajomość dziedziczenia ułatwia projektowanie czytelnych oraz rozszerzalnych systemów, zwłaszcza w większych projektach. W praktyce — jeśli tworzysz aplikację zarządzającą różnymi pojazdami, to możesz mieć np. klasę Vehicle z uniwersalnymi funkcjami i kilka pochodnych (takich jak Car, Truck, Motorcycle), co pozwala trzymać wspólną logikę w jednym miejscu. Warto pamiętać, że w C# jest tylko dziedziczenie pojedyncze jeśli chodzi o klasy (w przeciwieństwie do niektórych innych języków). To też zgodne z SOLID, gdzie jedna klasa powinna mieć jasno określoną odpowiedzialność. Ja często spotykam się z tym podejściem w kodzie produkcyjnym – porządek w strukturze to podstawa, a dziedziczenie bardzo w tym pomaga.

Pytanie 38

Który algorytm sortowania opiera się na metodzie "dziel i zwyciężaj"?

A. Sortowanie przez wstawianie
B. Sortowanie bąbelkowe
C. Sortowanie szybkie (QuickSort)
D. Sortowanie przez wybór
Sortowanie przez wybór polega na wyszukiwaniu najmniejszego elementu w każdej iteracji i umieszczaniu go na początku tablicy, co prowadzi do złożoności O(n²). Sortowanie bąbelkowe również działa w czasie O(n²) i nie wykorzystuje strategii dziel i zwyciężaj. Sortowanie przez wstawianie polega na stopniowym umieszczaniu elementów w odpowiedniej pozycji, ale nie dzieli tablicy na mniejsze części jak QuickSort, co sprawia, że jest mniej wydajne dla dużych zbiorów danych.

Pytanie 39

Co to jest PWA (Progressive Web App)?

A. Biblioteka graficzna do tworzenia animacji
B. System zarządzania treścią dla stron internetowych
C. Aplikacja webowa działająca jak natywna aplikacja mobilna
D. Framework do tworzenia aplikacji mobilnych
Progressive Web App (PWA) to aplikacja webowa, która łączy cechy stron internetowych i natywnych aplikacji mobilnych, oferując użytkownikom lepsze doświadczenia dzięki technologii webowej. PWA wykorzystują zaawansowane funkcje przeglądarek, takie jak Service Workers, aby zapewnić offline'ową funkcjonalność, powiadomienia push i lepsze zarządzanie pamięcią podręczną. Dzięki temu użytkownicy mogą korzystać z aplikacji niezależnie od jakości połączenia internetowego. Przykłady PWA obejmują aplikacje takie jak Twitter Lite, które umożliwiają użytkownikom przeglądanie treści nawet przy słabym sygnale sieciowym, a także Facebook Lite, który jest zoptymalizowany pod kątem urządzeń o ograniczonych zasobach. Warto również wspomnieć o zastosowaniach PWA w e-commerce, gdzie użytkownicy mogą szybko dodawać produkty do koszyka i dokonywać zakupów bez konieczności ładowania pełnej aplikacji mobilnej. Te właściwości sprawiają, że PWA są zgodne z najlepszymi praktykami branżowymi, zapewniając użytkownikom dostęp do funkcji, które wcześniej były zarezerwowane tylko dla natywnych aplikacji.

Pytanie 40

Jakie elementy powinny być uwzględnione w scenariuszu testów aplikacji?

A. Dokumentacja techniczna oprogramowania
B. Zestaw kroków do testowania, oczekiwanych rezultatów oraz warunków początkowych
C. Strategia wdrożenia aplikacji w środowisku produkcyjnym
D. Dokładne wytyczne dotyczące realizacji kodu
Scenariusz testowy aplikacji powinien zawierać szczegółowy opis kroków testowych, oczekiwane wyniki oraz warunki wstępne, które muszą być spełnione przed rozpoczęciem testu. Scenariusz testowy to kluczowy dokument w procesie testowania oprogramowania, który pozwala na systematyczne i dokładne sprawdzenie, czy aplikacja działa zgodnie z oczekiwaniami. Uwzględnienie kroków testowych pozwala na replikację testów, a opis warunków wstępnych zapewnia, że test jest przeprowadzany w odpowiednim środowisku.