Wyniki egzaminu

Informacje o egzaminie:
  • Zawód: Technik programista
  • Kwalifikacja: INF.04 - Projektowanie, programowanie i testowanie aplikacji
  • Data rozpoczęcia: 8 kwietnia 2026 19:49
  • Data zakończenia: 8 kwietnia 2026 19:59

Egzamin zdany!

Wynik: 26/40 punktów (65,0%)

Wymagane minimum: 20 punktów (50%)

Pochwal się swoim wynikiem!
Szczegółowe wyniki:
Pytanie 1

Którą funkcję w C++ można zastosować do dynamicznego przydzielania pamięci dla tablicy?

A. sizeof()
B. delete[]
C. malloc()
D. free()
Funkcja 'malloc()' w języku C i C++ służy do dynamicznego alokowania pamięci dla tablic i innych struktur danych. Jest to kluczowa funkcja pozwalająca na przydzielenie określonej ilości bajtów w czasie wykonywania programu, co zwiększa elastyczność zarządzania pamięcią. Używając 'malloc()', programista może utworzyć tablicę o zmiennym rozmiarze, który nie musi być znany w czasie kompilacji. Dynamiczne alokowanie pamięci jest powszechnie stosowane w aplikacjach wymagających dużych ilości danych lub wtedy, gdy konieczne jest efektywne wykorzystanie zasobów systemowych.

Pytanie 2

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

A. Dialog wyboru pliku
B. Pasek narzędziowy
C. Pole tekstowe
D. Przycisk
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 3

Jakie obliczenia można wykonać za pomocą poniższego algorytmu, który operuje na dodatnich liczbach całkowitych?

Ilustracja do pytania
A. sumę cyfr wprowadzonej liczby
B. liczbę cyfr w wprowadzonej liczbie
C. sumę wprowadzonych liczb
D. największy wspólny dzielnik wprowadzonej liczby
Wybierając odpowiedź dotyczącą liczby cyfr w wprowadzonej liczbie, pokazujesz dobre zrozumienie tego, jak działa prezentowany algorytm. W praktyce bardzo często spotyka się podobne rozwiązania, gdy trzeba np. zliczyć, ile znaków ma PESEL, numer telefonu lub numer identyfikacyjny w bazie danych. Algorytm wykonuje bardzo prostą, ale jednocześnie sprytną operację – dzieli podaną liczbę przez 10 (zawsze całkowicie, bez reszty), aż ta liczba się wyzeruje. Za każdym obrotem pętli zwiększa licznik, więc po zakończeniu działania licznik wskazuje, ile razy można było podzielić liczbę przez 10, czyli ile było w niej cyfr. To dokładnie odpowiada liczbie cyfr w zapisie dziesiętnym. Podejście to jest bardzo efektywne, bo nie wymaga konwersji liczby na tekst ani używania dodatkowych struktur danych. W profesjonalnym kodzie często preferuje się takie rozwiązania – są szybkie i niezawodne. Moim zdaniem warto znać ten wzorzec, bo przydaje się zarówno w algorytmice, jak i analizie danych czy podczas implementacji walidacji pól liczbowych w bazach danych lub formularzach. Dodatkowo, zgodnie z dobrymi praktykami, algorytm nie ulega błędom związanym z nietypowymi danymi – działa dla każdej dodatniej liczby całkowitej. Warto zapamiętać takie sztuczki, bo potem życie programisty jest łatwiejsze.

Pytanie 4

Jaki rodzaj ataku hakerskiego polega na bombardowaniu serwera ogromną ilością żądań, co prowadzi do jego przeciążenia?

A. Man-in-the-Middle
B. Phishing
C. SQL Injection
D. DDoS
Atak DDoS (Distributed Denial of Service) polega na zasypywaniu serwera dużą ilością zapytań, co prowadzi do jego przeciążenia i unieruchomienia. W tym rodzaju ataku, hakerzy wykorzystują sieć skompromitowanych komputerów, znanych jako botnety, aby wysłać ogromne ilości nieautoryzowanych żądań do docelowego serwera w krótkim czasie. Celem DDoS jest spowodowanie, że serwer nie jest w stanie odpowiedzieć na prawidłowe zapytania od autentycznych użytkowników, co skutkuje awarią usługi. Przykłady ataków DDoS obejmują SYN Flood, UDP Flood oraz HTTP Flood, gdzie każdy z tych typów wykorzystuje różne protokoły i metody do zablokowania normalnego ruchu. Standardy takie jak RFC 793 definiują protokół TCP, który może być narażony na ataki SYN Flood. Ważne jest, aby organizacje stosowały odpowiednie środki zabezpieczające, takie jak systemy detekcji intruzów (IDS), firewalle, oraz usługi ochrony DDoS, aby minimalizować ryzyko i skutki tych ataków.

Pytanie 5

Który z poniższych metod najlepiej zabezpiecza dane karty płatniczej podczas zakupów online?

A. Używanie wirtualnych kart płatniczych lub jednorazowych kodów
B. Udostępnianie danych karty na platformach internetowych
C. Podawanie informacji o karcie w odpowiedzi na wiadomość e-mail od nieznajomego
D. Przechowywanie numeru karty w przeglądarce internetowej
Korzystanie z wirtualnych kart płatniczych lub jednorazowych kodów to skuteczny sposób na ochronę danych karty płatniczej podczas transakcji internetowych. Wirtualne karty mają ograniczony okres ważności i są powiązane z określoną kwotą, co minimalizuje ryzyko kradzieży całego konta bankowego. Jednorazowe kody płatności wygasają po jednorazowym użyciu, co uniemożliwia ich ponowne wykorzystanie przez osoby trzecie. Dzięki tym metodom użytkownicy znacznie redukują ryzyko oszustw i nieautoryzowanych transakcji.

Pytanie 6

Przykład wywołania funkcji zamien w języku C++ może wyglądać w następujący sposób:

void zamien(int *a, int *b) {
    int tmp;
    tmp = *a;
    *a = *b;
    *b = tmp;
}
A. zamien(12, 34)
B. zamien(&a, &b); // a, b - zmienne całkowite
C. zamien(*a, *b); // a, b - zmienne całkowite
D. zamien(m, n); // m, n - zmienne całkowite
Patrząc na inne podane propozycje, łatwo zauważyć, że każda z nich zawiera typowy błąd związany z mechaniką przekazywania danych do funkcji w C++. Dużo osób na początku myśli, że można po prostu przekazać liczby bezpośrednio, jak w zamien(12, 34), ale to mija się z celem, bo funkcja oczekuje wskaźników, czyli adresów zmiennych, które mają być zamienione. Przekazanie samych wartości (czy to literałów, czy konkretnych zmiennych) skutkuje tym, że funkcja pracuje na kopiach tych wartości, a nie na oryginalnych danych. Taki kod się nawet nie skompiluje, bo kompilator jasno wymaga wskaźników jako argumentów. Z kolei zamien(*a, *b) też jest mylące, bo tu przekazujemy już nie wskaźniki, ale wartości, na które one wskazują. To znowu powoduje, że funkcja dostaje kopie, a nie adresy, więc nie może zmienić oryginałów. Bardzo łatwo tu pomylić dereferencję z przekazaniem wskaźnika – moim zdaniem to jeden z najczęstszych błędów początkujących, bo na pierwszy rzut oka wydaje się logiczne, że skoro funkcja operuje na wskaźnikach, to wystarczy podać gwiazdkę. No ale niestety, to jest właśnie ta typowa pułapka. Podobnie zamien(m, n) wygląda jak klasyczne wywołanie funkcji, ale znowu – przekazujemy wartości, nie adresy, więc zamiana zachodzi tylko na kopiach i nie widać efektu poza funkcją. W praktyce taki kod nie spełnia celu, dla którego ktoś napisał funkcję operującą na wskaźnikach. Takie nieporozumienia wynikają często z nieznajomości podstaw przekazywania parametrów w C++. Programowanie niskopoziomowe jest pod tym względem wymagające, bo trzeba zawsze wiedzieć, czy manipuluje się oryginałem czy tylko tymczasową kopią, a to różnica zasadnicza. Z mojego doświadczenia wynika, że najlepiej uczyć się przez praktykę: napisać prostą funkcję, przekazać różne typy argumentów i samemu zobaczyć, co się dzieje z ich wartościami po powrocie z funkcji. To bardzo szybko wyjaśnia, dlaczego przekazywanie wskaźników lub referencji jest tak ważne w sytuacjach, gdy chcemy faktycznie wpłynąć na dane przekazane do funkcji. Warto też podkreślić, że kompilator nie pozwoli na wywołanie funkcji z niezgodnym typem argumentu – i to jest jedna z tych rzeczy, które ratują przed większą katastrofą w działającym programie.

Pytanie 7

Wykorzystanie typu DECIMAL w MySQL wymaga wcześniejszego określenia długości (liczby cyfr) przed oraz po przecinku. Jak należy to zapisać?

A. łańcuchowy
B. stałoprzecinkowy
C. zmiennoprzecinkowy
D. logiczny
Typ łańcuchowy w MySQL odnosi się do przechowywania danych tekstowych, takich jak VARCHAR czy CHAR, które są używane do przechowywania łańcuchów znaków. W przeciwieństwie do typu DECIMAL, nie ma on zastosowania do reprezentacji wartości numerycznych, co sprawia, że nie nadaje się do obliczeń matematycznych wymagających precyzji. Typ zmiennoprzecinkowy (FLOAT, DOUBLE) z kolei jest używany do przechowywania liczb, które mogą obejmować wartości z przecinkiem dziesiętnym, ale mogą cierpieć na problemy z precyzją, ponieważ są reprezentowane w formie binarnej. Ze względu na sposób przechowywania, liczby zmiennoprzecinkowe mogą prowadzić do niezamierzonych błędów zaokrągleń, co czyni je mniej odpowiednimi w kontekście finansowym. Typ logiczny (BOOLEAN) ma na celu przechowywanie wartości prawda/fałsz i nie jest dostosowany do przechowywania wartości liczbowych. Podsumowując, wszystkie trzy wymienione typy są nieodpowiednie do przechowywania liczb dziesiętnych z określoną precyzją, co stanowi kluczową cechę typu DECIMAL, który oferuje większą kontrolę nad dokładnością obliczeń.

Pytanie 8

Wskaż typy numeryczne o stałej precyzji

A. long long, long double
B. int, short, long
C. bool char, string
D. float, double
Typy numeryczne o stałej precyzji (czyli tzw. typy całkowite) to na przykład int, short, long – dokładnie te, które wskazałeś. Działają one trochę jak liczniki – przechowują liczby całkowite w określonym zakresie, bez przecinka. Moim zdaniem to podstawa, jeśli chodzi o reprezentowanie wartości typu liczba sztuk, indeks, identyfikator – wszędzie tam, gdzie nie potrzebujemy części ułamkowej. Ich precyzja wynika z tego, że są zdefiniowane w standardzie (np. w C++ czy Javie) jako liczby całkowite reprezentowane przez określoną liczbę bitów. Dla przykładu, 32-bitowy int zawsze pomieści wartości od -2 147 483 648 do 2 147 483 647 i każdy bit jest tu ważny. W praktyce, programując mikrokontrolery albo systemy wbudowane, właściwy wybór typu o stałej precyzji potrafi decydować o stabilności i wydajności całego programu. Warto też wiedzieć, że typy te – int, short, long – nie mają błędu zaokrągleń, co często zdarza się przy operacjach na liczbach zmiennoprzecinkowych. No i jeszcze takie małe spostrzeżenie: dobrym zwyczajem jest wybieranie najmniejszego typu całkowitego, który pokryje wymagany zakres, żeby zoptymalizować zużycie pamięci. Takie podejście mocno się przydaje, zwłaszcza jak się pracuje nad większym projektem, gdzie każda optymalizacja jest na wagę złota.

Pytanie 9

Która z poniższych technik NIE jest związana z optymalizacją wydajności strony internetowej?

A. Użycie CDN
B. Minifikacja kodu
C. Lazy loading
D. Deep linking
Deep linking to technika, która polega na linkowaniu bezpośrednio do określonego miejsca w treści danej strony internetowej, omijając jej stronę główną czy inne interfejsy nawigacyjne. Nie wpływa jednak na optymalizację wydajności strony, ponieważ koncentruje się na poprawie nawigacji i doświadczenia użytkownika, a nie na szybkości ładowania strony czy efektywnym zarządzaniu zasobami. Przykładem zastosowania deep linking może być sytuacja, w której użytkownik klika w link do konkretnego produktu w sklepie internetowym, co pozwala mu od razu zobaczyć interesującą go ofertę bez zbędnych kroków dodatkowych. W praktyce, techniki optymalizacji wydajności, takie jak minifikacja kodu, lazy loading i użycie CDN, koncentrują się na zmniejszeniu rozmiaru plików, opóźnianiu ładowania nieistotnych zasobów oraz dystrybucji treści z najbliższych lokalizacji serwerów, co przyczynia się do szybszego dostarczania zawartości do użytkownika. Dlatego właśnie deep linking jest odpowiedzią, która nie jest związana z wydajnością strony.

Pytanie 10

Zaproponowany fragment kodu w Android Studio realizuje metodę nasłuchującą do obsługi wydarzenia:

przycisk = (Button) findViewById(R.id.yes_button);
przycisk.setOnClickListener(new View.OnClickListener() { ... });
A. zmiany w polu tekstowym
B. naciśnięcia przycisku
C. wybór daty
D. zmiany stanu kontrolki Switch
Metoda OnClickListener, to coś, co na pewno warto znać, gdy pracujesz z aplikacjami na Androida. Gdy użytkownik klika przycisk, wywoływana jest metoda onClick. I tu możesz zrobić różne rzeczy, jak na przykład przejść do innego ekranu, zapisać dane albo uruchomić jakąś akcję w tle. To jest dobry przykład wzorca projektowego zwanego Delegacja, który pomaga oddzielić to, co widzisz w interfejsie, od tego, co dzieje się w aplikacji. Dzięki temu łatwiej zarządzać kodem i wprowadzać zmiany. Fajnie jest, gdy logikę umieszczasz w osobnych metodach, bo wtedy testowanie całej aplikacji staje się prostsze. Przykłady? Możesz na przykład użyć OnClickListenera, żeby zrobić logowanie po kliknięciu przycisku lub wysłać formularz. Pamiętaj też, żeby unikać ciężkich operacji w metodzie onClick, żeby aplikacja działała płynnie.

Pytanie 11

Jaką funkcję spełniają atrybuty klasy w programowaniu obiektowym?

A. Zapisują wartości lokalne w funkcjach
B. Określają globalne stałe programu
C. Umożliwiają przeprowadzanie operacji na obiektach
D. Zawierają informacje opisujące stan obiektu
Zmienne lokalne w metodach przechowują wartości tymczasowe i są usuwane po zakończeniu wykonywania metody, co odróżnia je od pól klasy, które istnieją tak długo, jak istnieje obiekt. Stałe globalne programu są dostępne z każdego miejsca w kodzie, ale nie są związane z konkretną instancją obiektu – ich wartość nie zmienia się dla różnych obiektów. Operacje wykonywane na obiektach są definiowane przez metody klasy, a nie przez pola – pola jedynie przechowują dane, natomiast metody określają zachowanie obiektów i umożliwiają interakcję z nimi.

Pytanie 12

Który z poniższych elementów nie jest związany z architekturą mikroserwisów?

A. Monolityczny kod źródłowy
B. Skalowalność poszczególnych usług
C. Komunikacja przez API
D. Niezależne wdrażanie usług
Każda z pozostałych odpowiedzi na pytanie odnosi się do kluczowych aspektów architektury mikroserwisów. Niezależne wdrażanie usług jest jednym z głównych założeń mikroserwisów, ponieważ umożliwia autonomiczne aktualizacje i rozwój poszczególnych komponentów systemu bez konieczności przerywania działania całej aplikacji. Komunikacja przez API jest niezbędna dla współpracy między mikroserwisami, ponieważ pozwala na wymianę danych i poleceń w sposób zorganizowany i niezależny. Wreszcie, skalowalność poszczególnych usług oznacza, że można dostosować zasoby do zmieniających się potrzeb i obciążenia systemu, co jest kluczowe w dzisiejszych dynamicznych środowiskach IT. Typowym błędem jest zrozumienie architektury mikroserwisów jako jedynie rozdzielenia kodu. W rzeczywistości wymaga to zmiany podejścia do projektowania, wdrażania i zarządzania systemami. Nieprawidłowa interpretacja tych pojęć może prowadzić do stworzenia systemu, który nie wykorzystuje pełnych korzyści płynących z mikroserwisów, takich jak elastyczność, łatwość w skalowaniu i efektywne zarządzanie zespołami. Zamiast tego można wprowadzić architekturę, która jest jedynie zbiorem monolitów, co nie spełnia oczekiwań nowoczesnych aplikacji internetowych i mobilnych.

Pytanie 13

Co to jest klasa abstrakcyjna?

A. Klasa, która może być dziedziczona, ale nie można jej instancjonować
B. Klasa, która nie może posiadać żadnych metod
C. Klasa, która zawsze dziedziczy z klasy bazowej
D. Klasa, która może zawierać zarówno metody zdefiniowane, jak i niezdefiniowane (czysto wirtualne)
Odpowiedź „Klasa, która może być dziedziczona, ale nie można jej instancjonować” jest poprawna, ponieważ najtrafniej oddaje istotę klasy abstrakcyjnej w programowaniu obiektowym. Klasa abstrakcyjna służy jako wzorzec lub szablon dla klas pochodnych, określając wspólne cechy i zachowania, które powinny zostać zaimplementowane w klasach dziedziczących. Nie tworzy się z niej bezpośrednio obiektów, ponieważ sama w sobie nie reprezentuje kompletnego bytu, lecz raczej koncepcję lub ogólny typ. Dzięki temu mechanizmowi programista może narzucić strukturę kodu, zwiększyć jego czytelność oraz ułatwić dalsze rozszerzanie aplikacji. Takie podejście sprzyja stosowaniu zasad programowania obiektowego, takich jak dziedziczenie i polimorfizm, a także pomaga w tworzeniu bardziej uporządkowanych i łatwiejszych w utrzymaniu projektów.

Pytanie 14

Na podstawie definicji zamieszczonej w ramce, wskaż, który z rysunków ilustruje komponent Chip zdefiniowany w bibliotece Angular Material?

Ilustracja do pytania
A. Rysunek 4
B. Rysunek 1
C. Rysunek 3
D. Rysunek 2
Komponent Chip w bibliotece Angular Material to interaktywny element, który reprezentuje fragment informacji, tag lub wybór. Może zawierać tekst, ikonę lub być klikalny, co czyni go niezwykle użytecznym w projektowaniu nowoczesnych interfejsów użytkownika. Komponenty tego typu często wykorzystywane są w formularzach lub systemach tagowania, umożliwiając użytkownikowi intuicyjne dodawanie lub usuwanie elementów. Wyróżnia się swoją minimalistyczną formą i możliwością dostosowania do różnych potrzeb projektowych.

Pytanie 15

Jakie narzędzie umożliwia testowanie API w aplikacjach internetowych?

A. Node.js
B. Blender
C. Microsoft Excel
D. Postman
Postman to jedno z najczęściej wykorzystywanych narzędzi do testowania API aplikacji webowych. Umożliwia wysyłanie żądań HTTP, testowanie endpointów oraz monitorowanie odpowiedzi serwera. Dzięki Postmanowi programiści mogą w łatwy sposób analizować dane przesyłane między frontendem a backendem, co jest kluczowe w trakcie budowania nowoczesnych aplikacji opartych na architekturze REST lub GraphQL. Narzędzie oferuje możliwość automatyzacji testów, co przyspiesza proces wykrywania błędów i zwiększa jakość dostarczanych aplikacji. Postman pozwala także na tworzenie skryptów pre-request i testowych, umożliwiając weryfikację poprawności danych oraz sprawdzanie integralności aplikacji na różnych etapach jej rozwoju.

Pytanie 16

Zalecenia standardu WCAG 2.0 dotyczące percepcji koncentrują się na

A. zapewnieniu odpowiedniej ilości czasu na przeczytanie i zrozumienie treści
B. zrozumieniu i wiarygodności prezentowanych treści na stronie
C. prezentacji elementów interfejsu użytkownika
D. umożliwieniu interakcji między komponentami użytkownika za pomocą klawiatury
Rekomendacje standardu WCAG 2.0 dotyczące percepcji koncentrują się na tym, jak użytkownicy postrzegają i interpretują treści na stronach internetowych, co obejmuje również komponenty interfejsu użytkownika. Standardy te nakładają obowiązek projektowania elementów interaktywnych w sposób, który umożliwia ich łatwe identyfikowanie i zrozumienie przez wszystkich użytkowników, w tym osoby z niepełnosprawnościami. Przykłady obejmują odpowiednie etykietowanie przycisków, stosowanie kontrastujących kolorów oraz zapewnienie wyraźnych granic dla interaktywnych elementów. Komponenty takie jak formularze, menu nawigacyjne czy przyciski akcji muszą być intuicyjnie zrozumiałe i łatwe w obsłudze. Odniesienia do standardów WCAG 2.0, szczególnie do wytycznych związanych z percepcją, podkreślają znaczenie dostosowania treści do różnych percepcyjnych sposobów odbioru, co jest kluczowe dla zapewnienia dostępności. Właściwe zastosowanie tych zasad sprzyja lepszej użyteczności, co przekłada się na pozytywne doświadczenia użytkowników.

Pytanie 17

Która z poniższych nie jest cechą architektury mikroserwisów?

A. Wspólna baza danych dla wszystkich usług
B. Niezależne wdrażanie poszczególnych usług
C. Autonomia zespołów rozwijających poszczególne usługi
D. Odporność na awarie pojedynczych komponentów
Architektura mikroserwisów opiera się na praktykach, które umożliwiają wzrost skalowalności, elastyczności oraz odporności systemu. Wspólna baza danych dla wszystkich usług, będąca jedną z zaproponowanych odpowiedzi, jest sprzeczna z tymi fundamentalnymi zasadami. Utrzymywanie centralnej bazy danych prowadzi do sytuacji, gdzie zmiany w jednym mikroserwisie mogą mieć niepożądane konsekwencje dla innych, co z kolei zmniejsza niezależność każdej usługi. W mikroserwisach kluczowe jest, aby każda usługa miała swoje własne źródło danych, co pozwala na decoupling, czyli luźne powiązanie między komponentami. Ponadto, w architekturze mikroserwisów, każda usługa powinna być w stanie działać i być wdrażana niezależnie, co jest niemożliwe w przypadku korzystania z jednej bazy danych, ponieważ wszelkie zmiany wymagałyby zsynchronizowanego podejścia. Kolejnym aspektem jest odporność na awarie, która również ulega osłabieniu w przypadku wspólnej bazy danych. Jeśli baza danych ulegnie awarii, wszystkie usługi korzystające z niej są jednocześnie dotknięte problemem, co jest sprzeczne z koncepcją mikroserwisów, gdzie pojedyncze komponenty powinny być zdolne do działania niezależnie. Wreszcie, autonomia zespołów jest również podważana przez wspólną bazę danych, ponieważ zespoły nie mogą pracować równolegle nad swoimi usługami, a zmiany są wymuszone przez współzależności. Dlatego stosowanie wspólnej bazy danych jest jednym z najczęstszych błędów, który może prowadzić do problemów w projektowaniu i zarządzaniu architekturą mikroserwisów.

Pytanie 18

Jaką nazwę nosi framework CSS, który służy do definiowania wyglądu stron internetowych i którego klasy zostały użyte w przedstawionym przykładzie?

<div class="col-sm-3 col-md-6 col-lg-4">
  <button class="btn btn-primary dropdown-toggle" type="button">
</button>
</div>
A. Yaml
B. Angular
C. Symfony
D. Bootstrap
Yaml jest formatem serializacji danych, który jest używany głównie do przechowywania konfiguracji w sposób czytelny dla człowieka. W przeciwieństwie do CSS, nie jest używany do stylizacji aplikacji internetowych. Angular to framework JavaScript do budowy aplikacji front-endowych, a nie narzędzie do stylizacji. Choć Angular może być używany razem z różnymi bibliotekami CSS do tworzenia stylowych aplikacji, sam w sobie nie dostarcza gotowych rozwiązań CSS, takich jak Bootstrap. Użycie Angulara wymaga skupienia się na logice aplikacji i strukturze komponentów, podczas gdy stylizacja wymaga dodatkowych narzędzi lub bibliotek CSS. Symfony to framework PHP, który jest przeznaczony do budowy aplikacji back-endowych i nie oferuje żadnych funkcji związanych z bezpośrednią stylizacją front-endu. Jest to narzędzie do zarządzania logiką biznesową, a nie wyglądem aplikacji. Wybierając odpowiednie narzędzia do stylizacji front-endu, należy skupić się na rozwiązaniach, które dostarczają gotowe komponenty CSS, jak Bootstrap, który oferuje bogaty zestaw klas i komponentów do szybkiego tworzenia atrakcyjnych interfejsów użytkownika. Typowe błędne myślenie to mylenie ról poszczególnych narzędzi i frameworków ze względu na ich popularność, dlatego ważne jest rozumienie ich specyficznych zastosowań i ograniczeń w zakresie stylizacji i budowy aplikacji internetowych. Aby rozwijać efektywne i wydajne aplikacje webowe, konieczne jest świadome łączenie odpowiednich technologii, które najlepiej odpowiadają na potrzeby konkretnego projektu.

Pytanie 19

Która z wymienionych właściwości najlepiej charakteryzuje biblioteki dynamiczne?

A. Są ładowane podczas kompilacji
B. Są ładowane w trakcie działania aplikacji
C. Zawierają kod źródłowy aplikacji
D. Są statycznie dołączane do pliku wykonywalnego
Jak mówimy o ładowaniu bibliotek w czasie kompilacji, to mamy na myśli biblioteki statyczne. One są wplecione w plik wykonywalny. Z kolei biblioteki dynamiczne, to jakby zewnętrzne funkcje, które nie są częścią źródłowego kodu programu. Przy statycznym dołączaniu wszelkie potrzebne zasoby są w jednym pliku, a to odróżnia je od tych dynamicznych, które wchodzą w grę dopiero, gdy program działa.

Pytanie 20

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

A. obsługa wciśniętego przycisku
B. kod Java
C. kod XML
D. obsługa przycisku ekranu dotykowego
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 21

Który z frameworków bazuje na budowaniu komponentów przy użyciu języka JavaScript?

A. ASP.NET Core
B. React.js
C. Django
D. Node.js
React.js to popularna biblioteka JavaScript, która opiera się na komponencie jako podstawowym elemencie budowy interfejsu użytkownika. Framework ten umożliwia tworzenie dynamicznych i interaktywnych aplikacji webowych, które cechują się wysoką wydajnością. Dzięki wykorzystaniu komponentów, programiści mogą wielokrotnie wykorzystywać te same elementy interfejsu, co znacznie upraszcza zarządzanie kodem i poprawia jego czytelność. React jest szeroko stosowany w budowie Single Page Applications (SPA) i wspiera technologię Virtual DOM, co minimalizuje liczbę operacji na rzeczywistym DOM i zwiększa szybkość renderowania stron. React jest szczególnie polecany do tworzenia nowoczesnych aplikacji webowych o dynamicznych interfejsach, co czyni go jednym z liderów na rynku frontendowym.

Pytanie 22

Na jakim etapie cyklu życia projektu tworzony jest szczegółowy opis wymagań funkcjonalnych oraz niefunkcjonalnych?

A. Analiza
B. Weryfikacja
C. Wdrożenie
D. Planowanie
Często spotykam się z przekonaniem, że szczegółowy opis wymagań powstaje dopiero na etapie wdrożenia, weryfikacji czy planowania. Takie podejście prowadzi jednak do poważnych problemów w projektach IT. Jeśli wychodzimy z założenia, że podczas wdrożenia będziemy zbierać wymagania, to praktycznie ryzykujemy totalnym chaosem – na tym etapie powinno się już tylko realizować to, co wcześniej uzgodniono, a nie ustalać, co właściwie ma powstać. Weryfikacja natomiast dotyczy testowania i sprawdzania, czy efekt końcowy spełnia wymagania, ale testować można tylko to, co zostało jasno zdefiniowane wcześniej. Często popełnianym błędem jest też mylenie planowania z analizą – owszem, w planowaniu określa się harmonogram, kosztorys i podział zadań, ale bez rzetelnej analizy nie wiadomo, co de facto planować. Niestety, wielu początkujących myśli, że szczegóły funkcjonalne i niefunkcjonalne wymyśla się na bieżąco, co jest prostą drogą do konfliktów z klientem i niekończących się poprawek. Standardy branżowe, takie jak PMBOK czy Agile, jasno opisują, że analiza wymagań to fundament każdego projektu. Przełożenie tego na praktykę jest proste: najpierw dokładnie rozkładamy temat na czynniki pierwsze, a dopiero potem przechodzimy do planowania, implementacji i testów. Takie podejście naprawdę ratuje skórę w poważniejszych przedsięwzięciach.

Pytanie 23

Która z poniższych technologii służy do tworzenia interfejsu użytkownika zarówno dla aplikacji webowych jak i mobilnych?

A. Vue.js
B. React Native
C. jQuery
D. Angular
React Native to framework stworzony przez Facebook, który pozwala na tworzenie natywnych aplikacji mobilnych przy użyciu JavaScriptu oraz React. Jego największą zaletą jest możliwość współdzielenia kodu pomiędzy aplikacjami mobilnymi a webowymi, co znacząco przyspiesza proces developmentu i redukuje koszty. React Native umożliwia wykorzystanie jednego kodu źródłowego do budowy aplikacji zarówno na systemy iOS, jak i Android, co jest idealnym rozwiązaniem w kontekście rosnącego zapotrzebowania na aplikacje wieloplatformowe. Framework ten korzysta z natywnych komponentów UI, co przekłada się na wysoką wydajność oraz natywne wrażenia użytkownika. Przykłady zastosowania React Native można znaleźć w popularnych aplikacjach, takich jak Instagram czy Airbnb, które z powodzeniem wykorzystują ten framework do tworzenia dynamicznych i responsywnych interfejsów. Dobre praktyki przy używaniu React Native obejmują optymalizację komponentów, stosowanie odpowiednich bibliotek do nawigacji oraz zarządzania stanem aplikacji.

Pytanie 24

Jaką wartość dziesiętną reprezentuje liczba binarna 1010?

A. 8
B. 10
C. 12
D. 14
Liczba binarna 1010 to wartość dziesiętna, która wynosi 10. Aby dokonać konwersji liczby binarnej na system dziesiętny, należy zrozumieć, że każda cyfra w systemie binarnym reprezentuje potęgę liczby 2, zaczynając od prawej strony, gdzie najniższa pozycja ma wartość 2^0. W przypadku 1010, mamy następujące pozycje: 1 * 2^3 (co daje 8), 0 * 2^2 (co daje 0), 1 * 2^1 (co daje 2) oraz 0 * 2^0 (co daje 0). Sumując te wartości: 8 + 0 + 2 + 0, otrzymujemy 10. W praktyce konwersja z systemu binarnego na dziesiętny jest niezwykle przydatna w programowaniu i elektronice, gdzie liczby binarne są powszechnie stosowane. Przykładowo, w obliczeniach komputerowych oraz w projektowaniu układów cyfrowych, znajomość tych konwersji jest kluczowa. Odnosi się to również do standardów, takich jak IEEE 754, które definiują reprezentację liczb zmiennoprzecinkowych w formatach binarnych.

Pytanie 25

Które narzędzie najlepiej nadaje się do analizy wydajności aplikacji JavaScript?

A. Chrome DevTools Performance
B. npm
C. Webpack
D. Babel
Chrome DevTools Performance to potężne narzędzie, które jest integralną częścią przeglądarki Google Chrome i służy do analizy wydajności aplikacji JavaScript. Dzięki niemu możemy monitorować czas ładowania, identyfikować wąskie gardła w kodzie oraz analizować, jak różne elementy strony wpływają na ogólną wydajność. Narzędzie to umożliwia nagrywanie sesji wydajności, co pozwala na szczegółowe zbadanie, jak różne operacje wpływają na czas odpowiedzi aplikacji. Przykładowo, możemy użyć DevTools do analizy, które skrypty zajmują najwięcej czasu lub które zadania blokują wątek główny, co jest kluczowe dla zapewnienia płynności interfejsu użytkownika. Dodatkowo, narzędzie to oferuje różne metryki, takie jak FPS (frames per second), co jest niezbędne do oceny płynności animacji. Warto również podkreślić, że DevTools jest zgodne z najlepszymi praktykami branżowymi, a jego umiejętne wykorzystanie może znacząco poprawić jakość aplikacji.

Pytanie 26

Z podanej definicji pola licznik można wywnioskować, iż

class MojaKlasa
{
    private static int licznik;
    ...
A. pole nie może być zmieniane w kodzie klasy
B. bieżąca wartość pola jest wspólna dla wszystkich instancji klasy
C. pole jest związane z określoną instancją klasy i jego wartość jest unikalna tylko dla tej instancji
D. bieżąca wartość pola jest wspólna dla wszystkich instancji klasy i nie może być zmieniana
Warto się chwilę zatrzymać i przeanalizować, skąd biorą się błędne przekonania dotyczące pól statycznych. Bardzo częstym nieporozumieniem jest utożsamianie słowa static z czymś „niezmiennym” albo uniemożliwiającym modyfikacje. Tymczasem static oznacza tyle, że pole nie jest związane z pojedynczym obiektem, tylko z całą klasą – czyli wszystkie obiekty tej klasy dzielą jedną, wspólną wartość licznik. To nie jest tak, że static czyni pole stałym – żeby pole było niezmienne, potrzeba słowa kluczowego final (w Javie), a tutaj go ewidentnie nie ma. Często osoby początkujące mylą static z final i stąd pojawia się przekonanie, że pole nie może być modyfikowane – co nie jest prawdą. Równie błędne jest zakładanie, że każde pole, które nie jest static, jest automatycznie unikalne per instancja. Gdybyśmy usunęli static z definicji licznik, wtedy rzeczywiście każda instancja MojaKlasa miałaby swoją własną wersję tej zmiennej, ale w tym przypadku wszystkie obiekty współdzielą tę samą wartość. Jeszcze inny błąd to przekonanie, że pole prywatne (private) nie może być zmieniane w kodzie klasy – w rzeczywistości private ogranicza dostęp do pola tylko do wnętrza klasy, ale metody tej klasy mają pełne prawo je modyfikować. Tak więc, patrząc z perspektywy dobrych praktyk programistycznych i samej składni, static to po prostu cecha, która decyduje o zakresie współdzielenia pola pomiędzy instancjami, a nie o jego niezmienności czy widoczności na zewnątrz. Moim zdaniem kluczowe jest wyciągnięcie z tego wniosku, że static to współdzielenie, a nie blokada zmian – i na tym polega istota poprawnej odpowiedzi w tym pytaniu.

Pytanie 27

Z jakiej kolekcji powinno się korzystać, aby przechowywać informacje związane z elementem interfejsu użytkownika w taki sposób, aby ten element był informowany przez kolekcję o dodaniu, usunięciu lub zmianie jej zawartości?

A. ObservableCollection
B. KeyedCollection
C. Collection
D. ReadOnlyCollection
ObservableCollection to zdecydowanie najlepszy wybór w sytuacji, gdy zachodzi potrzeba powiadamiania elementów interfejsu użytkownika o zmianach w kolekcji. W praktyce, kiedy pracujesz np. z WPF, UWP albo MAUI, to ObservableCollection automatycznie informuje UI o dodaniu, usunięciu czy modyfikacji elementów. Wszystko dzięki temu, że implementuje interfejs INotifyCollectionChanged. Moim zdaniem praktyczne zastosowanie jest mega – gdy masz np. listę produktów, która wyświetla się użytkownikowi, to po prostu dokładasz lub usuwasz elementy z ObservableCollection i nie musisz ręcznie odświeżać widoku. Framework sam ogarnia powiązanie danych, bo kolekcja emituje zdarzenia CollectionChanged. Takie podejście jest spójne z zasadami MVVM i ogólnie promowane przez Microsoft w oficjalnych dokumentacjach. Często spotkać można rozwiązania, gdzie ktoś używa zwykłej List lub Collection, ale wtedy tracisz te automatyczne powiadomienia i pojawia się masa kodu-boilerplate. Szczerze mówiąc, nie widzę sensu kombinować z innymi kolekcjami, jeśli zależy Ci na dynamicznym, responsywnym UI. ObservableCollection to po prostu standard branżowy w .NET, jak dla mnie nie ma lepszej opcji na takie zastosowania.

Pytanie 28

Który z wymienionych wzorców projektowych jest najbardziej odpowiedni do uproszczenia interfejsu złożonego systemu?

A. Kompozyt (Composite)
B. Singleton (Singleton)
C. Metoda szablonowa (Template method)
D. Fasada (Facade)
Wzorzec Kompozyt (Composite) umożliwia traktowanie pojedynczych obiektów i ich grup w jednakowy sposób, co ułatwia zarządzanie hierarchicznymi strukturami. Metoda szablonowa (Template Method) definiuje szkielet algorytmu w klasie bazowej, pozwalając podklasom na dostosowanie poszczególnych kroków. Singleton to wzorzec zapewniający istnienie tylko jednej instancji klasy, co jest użyteczne w zarządzaniu zasobami systemowymi, ale nie służy do upraszczania interfejsu do złożonego systemu.

Pytanie 29

Jakie działanie powinno się wykonać w pierwszym kroku, oceniając stan osoby poszkodowanej?

A. Zadbać o własne bezpieczeństwo
B. Rozpocząć resuscytację krążeniowo-oddechową
C. Sprawdzić, czy występuje krwawienie
D. Wezwać ambulans
Właśnie o to chodzi — zadbanie o własne bezpieczeństwo jako pierwszy krok to fundament całej pierwszej pomocy i temat, który się często przecenia, a moim zdaniem jest kluczowy. Chodzi o to, że nawet najlepsze chęci nie mają sensu, jeśli ratujący sam staje się kolejną ofiarą. W praktyce oznacza to, że zanim podejdziesz do poszkodowanego, musisz się zastanowić, czy miejsce wypadku jest bezpieczne. Przykładowo na drodze – trzeba rozejrzeć się, czy nie nadjeżdżają inne samochody, zabezpieczyć teren (trójkąt ostrzegawczy, kamizelka odblaskowa). W przypadku porażenia prądem – odłączyć źródło napięcia. To wcale nie są banały; tego uczą na wszystkich kursach BLS (Basic Life Support) i w zasadzie każda książka ratownicza stawia to na pierwszym miejscu. Często się o tym zapomina, bo emocje biorą górę. Prawda jest taka, że każda akcja ratunkowa zaczyna się od sekundy refleksji: czy ja tu jestem bezpieczny? Dopiero później można oceniać stan poszkodowanego i dalej działać. W sumie jak się o tym pomyśli, to takie myślenie ratuje zdrowie nie tylko nam, ale i tym, którym chcemy pomóc — bo nie zwiększamy liczby poszkodowanych. Niektórym wydaje się, że od razu trzeba robić masaż serca czy wołać karetkę, ale bez oceny zagrożenia można narobić sobie i innym więcej problemów. Takie są realia pracy w terenie, nie tylko w teorii.

Pytanie 30

Która z wymienionych metod najlepiej chroni komputer przed złośliwym oprogramowaniem?

A. Cykliczne wykonywanie kopii zapasowych
B. Właściwie zaktualizowany program antywirusowy
C. Stosowanie mocnych haseł
D. Unikanie używania publicznych sieci Wi-Fi
Program antywirusowy to naprawdę istotna rzecz, jeśli chodzi o ochronę komputerów przed złośliwym oprogramowaniem. On w zasadzie non stop monitoruje nasz system i ma za zadanie wyłapywać różne wirusy, trojany, a nawet ransomware, co jest bardzo ważne. Pamiętaj, żeby regularnie aktualizować bazy wirusów, bo dzięki temu będziesz miał zabezpieczenie przed najnowszymi zagrożeniami. Warto też zauważyć, że wiele programów antywirusowych ma dodatkowe opcje, jak na przykład monitorowanie stron www, czy skanowanie e-maili i plików, które pobierasz. To wszystko razem daje lepszą ochronę.

Pytanie 31

Jakie są kluczowe zasady WCAG 2.0?

A. Elastyczna, prosta, przejrzysta, trwała
B. Ewolucyjna, interaktywna, efektywna
C. Dostosowana, błyskawiczna, mobilna, dostępna
D. Percepcyjna, operacyjna, zrozumiała, solidna
Niepoprawne odpowiedzi nie odzwierciedlają kluczowych zasad WCAG 2.0. Pierwsza z nich, określająca elementy jako postępowe, responsywne, efektywne, nie ujęła fundamentalnych wymogów dotyczących dostępności. Postępowe i responsywne odnoszą się bardziej do designu i wydajności strony, a nie do jej dostępności dla osób z różnymi niepełnosprawnościami. Wymagania dotyczące percepcji i interakcji z treścią są kluczowe dla WCAG 2.0, ale nie są poruszane w tej opcji. Kolejna odpowiedź wskazuje na cechy: dostosowana, szybka, mobilna, dostępna, co również nie odpowiada zasadom WCAG. Użyte terminy nie koncentrują się na dostępności treści, a bardziej na wydajności i dostosowywaniu do urządzeń mobilnych, pomijając kluczowe aspekty związane z percepcją i interaktywnością. Ostatnia niepoprawna odpowiedź, która zawiera elastyczność, prostotę, przejrzystość i trwałość, również nie odpowiada rzeczywistym zasadom WCAG. Choć te cechy są pożądane w projektowaniu stron internetowych, nie są częścią formalnych zasad WCAG, które koncentrują się na konkretnej dostępności treści dla osób z ograniczeniami. W rezultacie, te odpowiedzi nie spełniają wymaganych kryteriów dostępności.

Pytanie 32

Jakie jest główne zadanie debuggera w środowisku programowania?

A. Analiza i usuwanie błędów w kodzie
B. Tworzenie kodu źródłowego
C. Kompilowanie kodu źródłowego
D. Generowanie plików wykonywalnych
Debugger to narzędzie programistyczne służące do analizy i usuwania błędów w kodzie źródłowym. Pozwala na krokowe wykonywanie programu, śledzenie wartości zmiennych i identyfikowanie miejsc, w których występują błędy logiczne lub składniowe. Debugger umożliwia zatrzymanie wykonania programu w dowolnym miejscu, ustawienie tzw. breakpointów (punktów przerwania) i monitorowanie przepływu sterowania. Dzięki temu programista może dokładnie przeanalizować, dlaczego program nie działa zgodnie z oczekiwaniami i szybko znaleźć przyczynę problemu. Debuggery są dostępne w większości zintegrowanych środowisk programistycznych (IDE), takich jak Visual Studio, PyCharm czy IntelliJ IDEA.

Pytanie 33

Które z poniższych twierdzeń najlepiej charakteryzuje metodę wirtualną?

A. Metoda, która może być przesłonięta w klasie dziedziczącej
B. Metoda, która może być wywoływana tylko przez klasę nadrzędną
C. Metoda, która jest zawsze stosowana w konstruktorach danej klasy
D. Metoda, która działa wyłącznie dla statycznych pól danej klasy
Metoda, która może być wywoływana tylko przez klasę bazową to raczej metoda prywatna lub chroniona, a nie wirtualna. Metody statyczne są związane z klasą, a nie z konkretnymi obiektami, więc nie można ich tak po prostu nadpisać w klasie pochodnej. A tak w ogóle, metody w konstruktorach zazwyczaj nie są wirtualne, bo wywołanie metod wirtualnych w konstruktorze może prowadzić do dziwnych rzeczy – w konstruktorze klasy bazowej składowe klasy pochodnej jeszcze nie są gotowe.

Pytanie 34

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

A. 70 lat od zgonu autora
B. Bezterminowo
C. 50 lat od chwili pierwszej publikacji utworu
D. 75 lat od daty powstania utworu
Okres 50 lat od pierwszej publikacji utworu odnosi się zazwyczaj do praw pokrewnych, takich jak ochrona nagrań dźwiękowych lub filmowych. Ochrona przez 75 lat od powstania utworu nie jest standardem w UE, choć niektóre kraje mogą mieć takie przepisy w odniesieniu do specyficznych typów dzieł. Bezterminowa ochrona dotyczy wyłącznie autorskich praw osobistych, a nie majątkowych, które zawsze wygasają po określonym czasie.

Pytanie 35

Wynikiem wykonania poniższego fragmentu kodu jest wyświetlenie liczb z zakresu od 2 do 20, które są

for (let number = 2; number <= 20; number++) {
    let check = true;
    for (let test = 2; test < number; test++) {
        if (number % test === 0) {
            check = false;
            break;
        }
    }
    if (check) console.log(number);
}
A. podzielne przez wartość zmiennej check.
B. parzyste.
C. podzielne przez wartość zmiennej test.
D. pierwsze.
Kod wypisuje liczby pierwsze, czyli takie, które mają dokładnie dwa dzielniki: 1 i samą siebie. Liczby pierwsze są podstawą w wielu dziedzinach matematyki i informatyki, szczególnie w kryptografii i algorytmach. Wyszukiwanie liczb pierwszych w danym przedziale to popularne zadanie, które pozwala na lepsze zrozumienie iteracji, pętli i warunków logicznych w programowaniu. Algorytm ten jest również wykorzystywany w optymalizacji algorytmów szyfrowania i generowania kluczy.

Pytanie 36

Które z wymienionych pól klasy można zainicjalizować przed stworzeniem obiektu?

A. Chronione pole
B. Publiczne pole
C. Static pole
D. Prywatne pole
Pole statyczne można zainicjować przed utworzeniem obiektu klasy, ponieważ należy ono do samej klasy, a nie do jej instancji. Statyczne pola są inicjalizowane tylko raz, w momencie pierwszego użycia klasy lub jej statycznych metod. Dzięki temu można przechowywać dane wspólne dla wszystkich obiektów danej klasy, co jest kluczowe w optymalizacji pamięci i kodu. Przykładem może być licznik instancji klasy, który zwiększa swoją wartość za każdym razem, gdy tworzony jest nowy obiekt.

Pytanie 37

Jaką wartość ma zmienna b po wykonaniu poniższego kodu?

int a = 1, b = 20, c = 3;
while (a <= 10) {
    b = b - c;
    a += 2;
}
A. 2
B. 11
C. 5
D. 20
Powszechnym błędem w rozwiązywaniu tego typu zadań jest nieuwzględnienie wszystkich kroków pętli oraz niepoprawne obliczenie liczby iteracji. Można łatwo przeoczyć fakt jak często pętla się wykonuje i w jaki sposób zmieniają się wartości zmiennych. W przypadku przedstawionego kodu zmienna a początkowo wynosi 1 i zwiększa się o 2 w każdej iteracji aż do przekroczenia wartości 10. To oznacza że pętla wykona się pięć razy. Każdy przebieg pętli zmniejsza wartość b o 3 z powodu operacji b = b - c gdzie c jest równe 3. Jeśli nie uwzględni się wszystkich pięciu iteracji można błędnie wywnioskować inną wartość końcową b. Poprawne zrozumienie działania pętli while i operacji arytmetycznych w niej zawartych jest kluczowe w programowaniu. Takie pomyłki pokazują znaczenie czytelności i precyzji w analizie kodu oraz przypominają o konieczności dokładnego śledzenia zmian w zmiennych w czasie trwania pętli aby poprawnie przewidzieć wynik końcowy. Kluczowym standardem w branży jest testowanie kodu i ręczne śledzenie jego działania zwłaszcza w kontekście algorytmów iteracyjnych co pozwala na uniknięcie błędnych założeń i wyników.

Pytanie 38

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. false, false, true
B. true, false, false
C. true, true, true
D. true, false, 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 39

Które z poniższych jest podstawowym rodzajem testów używanych w testowaniu jednostkowym?

A. Testy jednostkowe
B. Testy akceptacyjne
C. Testy integracyjne
D. Testy systemowe
Testy jednostkowe są kluczowym elementem procesu testowania oprogramowania, szczególnie w kontekście metodologii programowania zwinnego. Polegają one na testowaniu pojedynczych najmniejszych części programu, takich jak funkcje czy metody, w izolacji od reszty systemu. Dzięki temu możemy szybko wykryć błędy i upewnić się, że dany fragment kodu działa zgodnie z oczekiwaniami. W praktyce, testy jednostkowe są często automatyzowane i stanowią podstawę dla procesu ciągłej integracji (CI). Przykładem zastosowania testów jednostkowych może być sprawdzenie, czy funkcja dodająca dwie liczby zwraca poprawny wynik dla różnych zestawów danych wejściowych. Dzięki testom jednostkowym programiści mogą z większą pewnością modyfikować i rozwijać kod, mając pewność, że nie wprowadzają nowych błędów. To właśnie testy jednostkowe pozwalają na szybkie wykrywanie regresji i są fundamentem dla bardziej zaawansowanych form testowania, takich jak testy integracyjne czy systemowe. Dbanie o dobrze zdefiniowany zestaw testów jednostkowych jest uznawane za dobrą praktykę w branży IT i podnosi jakość oprogramowania.

Pytanie 40

Jednym z kroków publikacji aplikacji mobilnej w Google Play są testy Beta, które charakteryzują się tym, że są:

A. prowadzone w oparciu o dokument zawierający przypadki testowe
B. przeprowadzane przez grupę docelowych użytkowników aplikacji
C. podzielone na testy dotyczące funkcjonalności, wydajności i skalowalności
D. realizowane przez zespół zatrudnionych testerów z Google
Testy Beta w kontekście publikacji aplikacji na Google Play to bardzo istotny element całego procesu wydawniczego. Tak naprawdę chodzi tutaj o to, by oddać aplikację w ręce prawdziwych użytkowników, którzy potencjalnie będą z niej korzystać po premierze. To nie są testy laboratoryjne, gdzie wszystko jest przewidywalne i kontrolowane, tylko taki trochę poligon doświadczalny w rzeczywistym środowisku. Dzięki temu deweloperzy mogą wyłapać błędy, których nie dało się zauważyć podczas testów wewnętrznych czy automatycznych. Google umożliwia zaproszenie do testów Beta konkretnej grupy osób – czasem są to osoby z mailing listy, czasem aktywna społeczność, a czasem po prostu przypadkowi użytkownicy spełniający określone kryteria. Takie podejście jest zgodne z najlepszymi praktykami branżowymi, bo zapewnia bardziej realistyczny feedback. Moim zdaniem właśnie testy Beta ratują najwięcej aplikacji przed poważnymi wpadkami po oficjalnym wydaniu – użytkownicy zgłaszają nie tylko błędy, ale też własne pomysły i uwagi, które mogą zupełnie zmienić kierunek rozwoju produktu. To jest w sumie taka wersja MVP na etapie gotowego produktu, tylko że z dużo szerszą i bardziej zaangażowaną bazą testującą. Testy Beta są nieocenione, bo pozwalają zobaczyć aplikację oczami jej przyszłych użytkowników i szybko reagować na ich potrzeby, zanim pójdzie do szerokiej dystrybucji. Praktyka pokazuje, że pomijanie tego kroku to trochę proszenie się o złe oceny i negatywne recenzje już po premierze.