Wyniki egzaminu

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

Egzamin niezdany

Wynik: 11/40 punktów (27,5%)

Wymagane minimum: 20 punktów (50%)

Nowe
Analiza przebiegu egzaminu— sprawdź jak rozwiązywałeś pytania
Udostępnij swój wynik
Szczegółowe wyniki:
Pytanie 1

Co to jest zasięg (scope) zmiennej w programowaniu?

A. Czas życia zmiennej podczas wykonywania programu
B. Obszar kodu, w którym zmienna jest dostępna
C. Ilość pamięci, jaką zmienna zajmuje podczas wykonywania programu
D. Maksymalny zakres wartości, jakie może przyjąć zmienna danego typu
Wybór odpowiedzi dotyczącej ilości pamięci, jaką zmienna zajmuje podczas wykonywania programu, jest mylący, ponieważ pojęcie zasięgu zmiennej dotyczy nie przestrzeni pamięci, lecz obszaru kodu, w którym zmienna jest dostępna. Ilość pamięci, jaką zmienna zajmuje, jest kwestią zarządzania pamięcią, która jest niezależna od samego zasięgu. Zmienna może zająć różną ilość pamięci w zależności od typu danych, które reprezentuje, ale to nie definiuje, gdzie ta zmienna może być używana. Na przykład w językach takich jak C++ czy Java, zasięg zmiennej wpływa na jej widoczność, a nie na ilość zajmowanej pamięci. Kolejna niewłaściwa koncepcja dotyczy maksymalnego zakresu wartości, jakie może przyjąć zmienna danego typu. To zagadnienie odnosi się do ograniczeń typów danych, a nie do ich zasięgu w kodzie. Typy danych definiują, jakie wartości mogą być przechowywane, ale nie mają wpływu na to, w jakich częściach programu te zmienne są dostępne. Czas życia zmiennej jest również inną kwestią, która nie odnosi się do zasięgu, a do momentu, w którym zmienna jest aktywna w programie. Zrozumienie tych różnic jest kluczowe dla skutecznego programowania, ponieważ nieprawidłowe zrozumienie pojęcia zasięgu może prowadzić do trudnych do zdiagnozowania błędów w kodzie, takich jak błędy związane z dostępem do zmiennych, które nie są już dostępne w danym kontekście.

Pytanie 2

Jaką kategorię reprezentuje typ danych "array"?

A. Typ danych prosty
B. Typ danych złożony
C. Typ wskaźników
D. Typ logiczny
Prosty typ danych odnosi się do typów takich jak 'int', 'char' czy 'bool', które przechowują pojedyncze wartości, a nie zestawy danych. Typ wskaźnikowy przechowuje adresy pamięci, a nie kolekcje wartości, jak to ma miejsce w przypadku tablic. Typ logiczny (boolean) przechowuje wartości 'true' lub 'false', ale nie jest przeznaczony do przechowywania wielu elementów. Tablice różnią się od typów prostych tym, że pozwalają na jednoczesne przechowywanie wielu elementów i dostęp do nich za pomocą indeksów.

Pytanie 3

Który z poniższych elementów jest częścią architektury PWA (Progressive Web App)?

A. DOM Renderer
B. Virtual Machine
C. Service Worker
D. Media Encoder
Wybór innych odpowiedzi może wynikać z nieporozumienia dotyczącego terminologii i funkcji różnych komponentów w architekturze aplikacji webowych. DOM Renderer, który jest odpowiedzialny za renderowanie struktury dokumentu HTML w przeglądarkach, nie ma bezpośredniego związku z architekturą PWA. Jego zadaniem jest prezentacja treści, ale nie wpływa na funkcjonalności offline czy zarządzanie zasobami. W kontekście PWA, kluczowe są aspekty zapewniające dostępność i wydajność aplikacji, a DOM Renderer nie odnosi się do tych wymagań. Virtual Machine, często kojarzona z technologiami takimi jak Java czy JavaScript (np. V8 w Google Chrome), jest odpowiedzialna za wykonywanie kodu, ale nie pełni roli w architekturze PWA, ponieważ nie zarządza ani nie optymalizuje interakcji sieciowych. Ostatni element, Media Encoder, to narzędzie do kodowania multimediów, które również nie ma zastosowania w kontekście PWA. Typowe błędy polegają na myleniu komponentów odpowiedzialnych za renderowanie i wykonywanie kodu z tymi, które mają na celu poprawę doświadczenia użytkownika w aplikacjach webowych. Zrozumienie roli Service Workera jest kluczowe dla efektywnego projektowania aplikacji, które zapewniają użytkownikom lepsze doświadczenie, szczególnie w warunkach ograniczonej dostępności sieci.

Pytanie 4

Jakie znaczenie ma poziom dostępności AAA w WCAG 2.0?

A. Najwyższy poziom dostępności
B. Dostosowanie tylko do użytkowników mobilnych
C. Średni standard dostępności
D. Najnizszy poziom dostępności
Niepoprawne odpowiedzi dotyczące poziomu dostępności w WCAG 2.0 wprowadzają w błąd i nie odzwierciedlają rzeczywistego znaczenia poziomów dostępności. Po pierwsze, stwierdzenie o minimalnym poziomie dostępności jest mylące, ponieważ poziom A nie jest jedynie minimalnym standardem, ale również zawiera kluczowe wytyczne. Uznanie poziomu AAA za minimalny standard mogłoby prowadzić do sytuacji, w której użytkownicy niepełnosprawni nie otrzymaliby odpowiedniej pomocy. Kolejnym błędnym podejściem jest określenie poziomu AAA jako średniego poziomu dostępności, co jasno sugeruje błędne zrozumienie hierarchii poziomów w WCAG. W rzeczywistości poziom AAA jest znacznie bardziej wymagający i zawiera dodatkowe kryteria, które są kluczowe dla pełnej dostępności. Ostatnia niepoprawna odpowiedź sugeruje, że poziom AAA dotyczy jedynie użytkowników mobilnych, co jest całkowicie mylne. WCAG 2.0 jest zaprojektowane tak, aby dotyczyło wszystkich platform i urządzeń, nie ograniczając się tylko do mobilnych. Koncentruje się na zapewnieniu dostępności treści dla wszystkich, niezależnie od używanego urządzenia.

Pytanie 5

Jakie znaczenie ma polimorfizm w programowaniu obiektowym?

A. Dzieli program na klasy oraz obiekty
B. Umożliwia jednej metodzie działać w różnorodny sposób w zależności od klasy, do której należy
C. Pozwala na tworzenie obiektów z wielu różnych klas równocześnie
D. Ogranicza dostęp do atrybutów klasy
Tworzenie obiektów z wielu klas jednocześnie nie jest związane z polimorfizmem – jest to raczej przykład wielokrotnego dziedziczenia, gdzie jedna klasa może dziedziczyć po wielu klasach bazowych. Dzielenie programu na klasy i obiekty to podstawowa cecha programowania obiektowego, ale nie jest to definicja polimorfizmu. Ograniczenie dostępu do pól klasy to hermetyzacja, a nie polimorfizm – celem polimorfizmu jest umożliwienie różnym klasom realizacji wspólnego interfejsu, a nie ukrywanie danych wewnętrznych obiektu.

Pytanie 6

Które z wymienionych poniżej błędów podczas wykonywania programu można obsłużyć poprzez zastosowanie wyjątków?

A. Błąd w składni
B. Błąd kompilacyjny
C. Błąd dzielenia przez zero
D. Niekompatybilność typów danych w kodzie
Błędy składniowe są wykrywane na etapie kompilacji i nie mogą być obsługiwane za pomocą wyjątków – kompilator generuje komunikat o błędzie, zanim program zostanie uruchomiony. Błędy kompilacji, takie jak niezgodność typów danych, również są wychwytywane na etapie kompilacji i wymagają poprawienia kodu źródłowego. Wyjątki są przeznaczone do obsługi błędów, które występują w czasie wykonywania programu, a nie błędów wykrywanych przez kompilator. Dlatego obsługa błędów składniowych i kompilacyjnych wymaga innego podejścia niż mechanizm wyjątków.

Pytanie 7

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

A. Pola tekstowe do wprowadzania danych użytkownika
B. Plik graficzny
C. Nagłówek HTTP
D. Tabela w bazie danych
Nagłówek HTTP nie jest elementem interaktywnym dla użytkownika i służy do przesyłania danych między klientem a serwerem. Pliki graficzne mogą być elementem wizualnym formularza, ale same w sobie nie umożliwiają wprowadzania danych. Tabele w bazie danych przechowują dane po stronie serwera i nie są bezpośrednim elementem formularza logowania – odgrywają one rolę na poziomie backendu, a nie interfejsu użytkownika.

Pytanie 8

Zapisany fragment w Pythonie ilustruje:

pierwiastki = {"N":"Azot","O":"Tlen","P":"Fosfor","Si":"Siarka"}
A. kolejkę (LIFO)
B. stos
C. strukturę danych
D. tablicę asocjacyjną (słownik)
Fragment kodu, który tutaj analizujemy, nie jest zwykłą strukturą danych w sensie ogólnym, bo to za mało precyzyjne określenie – praktycznie wszystko w programowaniu to jakaś struktura danych, od prostych zmiennych przez listy, aż po bardziej złożone zbiory czy słowniki. W przykładzie nie mamy też do czynienia ani ze stosem, ani z kolejką LIFO. Stos (ang. stack) to struktura, gdzie elementy dodaje się i usuwa na zasadzie ostatni wszedł, pierwszy wyszedł (Last-In-First-Out). Kolejki działają zwykle na zasadzie FIFO, ale tu pojawiła się kolejka LIFO, która w praktyce jest po prostu nazwą stosu, więc to takie trochę mieszanie pojęć. W Pythonie typ dictionary (dict) jest fundamentalnym narzędziem do przechowywania danych powiązanych przez klucz – hasła, ustawienia aplikacji, tłumaczenia na różne języki, wszystko to korzysta z tej zasady. Często błędnie utożsamia się tablice asocjacyjne z listami – tymczasem listy przechowują dane pod indeksem liczbowym, a słowniki pod dowolnym kluczem niezmienniczym. To jest właśnie esencja tablicy asocjacyjnej, bo nie trzeba znać kolejności ani pozycji, wystarczy klucz. W pytaniu łatwo się pomylić, bo teoretycznie wszystkie wymienione typy są strukturami danych, ale tylko słownik oddaje sens kodu. Na marginesie, spotkałem się nieraz z próbą użycia stosu czy kolejki tam, gdzie trzeba mapować jedne wartości na drugie – to zawsze kończy się niepotrzebnym komplikowaniem projektu i traceniem czasu na obsługę błędów, które słownik rozwiązuje w locie. Takie zrozumienie podstawowych różnic jest kluczowe dla efektywnej pracy z kodem, bo wybór nieodpowiedniej struktury danych to proszenie się o kłopoty w większych projektach.

Pytanie 9

Jak nazywa się wzorzec projektowy, do którego odnosi się ta definicja?

Wzorzec projektowy należący do grupy wzorców strukturalnych. Służy do ujednolicenia dostępu do złożonego systemu poprzez wystawienie uproszczonego, uporządkowanego interfejsu programistycznego, który ułatwia jego użycie.
Źródło Wikipedia. Wolna encyklopedia
A. Kompozyt
B. Dekorator
C. Fasada
D. Prototyp
Prototyp to wzorzec kreacyjny, który koncentruje się na tworzeniu nowych obiektów poprzez klonowanie istniejących. Różni się od fasady, ponieważ nie zajmuje się uproszczeniem interfejsów, lecz optymalizacją procesu tworzenia obiektów. Jest używany, gdy klasy instancji mają podobne stany i konieczne jest szybkie ich generowanie z zachowaniem pewnych właściwości. Dekorator natomiast to wzorzec strukturalny umożliwiający dynamiczne dodawanie nowych funkcjonalności do obiektów, bez modyfikacji ich struktury bazowej. Podstawowym celem dekoratora jest rozszerzenie możliwości obiektów, co odróżnia go od fasady, która skupia się na upraszczaniu dostępu do złożonych systemów. Dekorator działa na poziomie pojedynczych komponentów, gdzie fasada dotyczy całego systemu. Kompozyt umożliwia tworzenie hierarchicznych struktur obiektowych, pozwalając na jednolite traktowanie indywidualnych obiektów i ich złożonych struktur. Umożliwia pracę z drzewiastymi strukturami danych, co czyni go bardziej odpowiednim do zastosowań, gdzie istotna jest praca z kolekcjami obiektów jako całością. Wszystkie te wzorce mają odmienne założenia i zastosowania, a błąd w ich rozpoznaniu może wynikać z braku zrozumienia ich specyficznych ról i miejsc w architekturze oprogramowania. Wybór odpowiedniego wzorca wymaga zrozumienia zarówno wymagań systemowych, jak i ich długoterminowych implikacji na projekt i utrzymanie oprogramowania. Każdy z tych wzorców wnosi unikalne wartości, ale ich zastosowanie powinno być zgodne z konkretnymi potrzebami projektowymi i architektonicznymi systemu, nad którym się pracuje.

Pytanie 10

Jakie jest przeznaczenie polecenia "git merge"?

A. Do pobierania aktualizacji zdalnego repozytorium
B. Do zakładania nowego repozytorium
C. Do usuwania zmian w repozytorium
D. Do łączenia zmian z różnych gałęzi
Polecenie "git merge" służy w Git do łączenia zmian z różnych gałęzi. Kiedy pracujemy w zespole i każdy programista rozwija swój fragment kodu na osobnej gałęzi, w pewnym momencie trzeba te zmiany zebrać do kupy, żeby powstała jedna, wspólna wersja projektu. Tu właśnie pojawia się "merge" – pozwala w prosty sposób dołączyć zmiany z jednej gałęzi do drugiej, najczęściej z feature branch do develop albo main. Praktycznie rzecz biorąc, to polecenie sprawdza się zawsze wtedy, gdy chcemy zintegrować efekty pracy kilku osób lub wersje rozwojowe z główną linią kodu. Moim zdaniem, korzystanie z "git merge" to w zasadzie codzienność w projektach zespołowych, bo prawie nikt już nie pracuje tylko na jednej gałęzi. Warto też pamiętać, że merge może czasem prowadzić do konfliktów, jeśli te same fragmenty plików były zmieniane równolegle – wtedy trzeba ręcznie rozwiązać te rozbieżności. W praktyce, dobrą praktyką jest regularne mergowanie, żeby uniknąć lawiny konfliktów na koniec sprintu. Dla mnie "merge" to narzędzie absolutnie kluczowe, bez którego ciężko sobie wyobrazić sensowną pracę z Gitem. No i jeszcze – to nie to samo co "rebase", chociaż oba służą do integracji zmian, ale w różny sposób. Merge zostawia historię połączeń, co ułatwia śledzenie zmian w większych projektach.

Pytanie 11

Co to jest kontener Docker?

A. Lekka, samodzielna jednostka oprogramowania, która zawiera wszystko, co aplikacja potrzebuje do uruchomienia
B. Graficzny interfejs do zarządzania kodem aplikacji webowych
C. System zarządzania bazami danych NoSQL
D. Narzędzie do automatycznego testowania interfejsów użytkownika
Niektóre odpowiedzi mogą wprowadzać w błąd, myląc pojęcie kontenerów Docker z innymi technologiami. Graficzny interfejs do zarządzania kodem aplikacji webowych odnosi się do narzędzi, takich jak edytory kodu czy IDE, które ułatwiają programistom tworzenie i edytowanie aplikacji, jednak nie zapewniają one izolacji ani pakowania wszystkich niezbędnych komponentów w jedną jednostkę. Podobnie, system zarządzania bazami danych NoSQL to zupełnie inny obszar technologii, skoncentrowany na przechowywaniu i przetwarzaniu danych w sposób nienormowany, a nie na wirtualizacji aplikacji. Narzędzia do automatycznego testowania interfejsów użytkownika także nie mają związku z kontenerami, ponieważ koncentrują się na zapewnieniu jakości oprogramowania poprzez testowanie jego interakcji z użytkownikami. Wspólnym błędem w tych myśleniach jest niezrozumienie, że kontenery Docker działają na zasadzie izolacji aplikacji, co pozwala na ich niezależne uruchamianie i skalowanie, w przeciwieństwie do technologii, które funkcjonują w innych obszarach rozwoju oprogramowania. Zrozumienie różnic pomiędzy tymi technologiami jest kluczowe dla efektywnego wykorzystania narzędzi w procesie tworzenia i zarządzania aplikacjami.

Pytanie 12

Jaki jest główny cel normalizacji baz danych?

A. Zmniejszenie rozmiaru bazy danych kosztem integralności
B. Zwiększenie liczby tabel w celu lepszej organizacji danych
C. Eliminacja redundancji danych i zapewnienie integralności danych
D. Przyśpieszenie zapytań kosztem zwiększenia redundancji
Wybór odpowiedzi, która sugeruje zmniejszenie rozmiaru bazy danych kosztem integralności, jest mylny, ponieważ integralność danych jest kluczowym elementem, na którym buduje się każdą strukturę baz danych. Zredukowanie rozmiaru bazy danych poprzez eliminację danych niezgodnych lub niepotrzebnych może prowadzić do utraty ważnych informacji i zagrażać wiarygodności danych. Ponadto, podejście polegające na przyspieszaniu zapytań kosztem zwiększenia redundancji jest nieefektywne w dłuższej perspektywie, ponieważ nadmiar danych może prowadzić do spowolnienia operacji, a także do zwiększenia ryzyka błędów i niezgodności. Redundancja, choć może początkowo przyspieszać dostęp do danych, w rzeczywistości komplikuje ich zarządzanie i aktualizację. Zwiększona liczba tabel w celu lepszej organizacji danych nie jest odpowiedzią na fundamentalne pytanie o cel normalizacji. Tabele powinny być tworzone w sposób przemyślany, a nie tylko w celu zwiększenia ich liczby. Niezrozumienie zasad normalizacji i ich wpływu na integralność i spójność bazy danych może prowadzić do poważnych problemów w analizie danych, a także utrudniać rozwój aplikacji bazodanowych. Dlatego ważne jest, aby dobrze zrozumieć, że normalizacja nie polega na redukcji rozmiaru bazy danych, ale na dokładnym i efektywnym zarządzaniu danymi, co jest kluczowe dla sukcesu każdego systemu bazodanowego.

Pytanie 13

Który z wymienionych typów testów najlepiej ocenia odporność aplikacji na intensywne obciążenie?

A. Testy funkcjonalne
B. Testy zgodności
C. Testy bezpieczeństwa
D. Testy obciążeniowe
Testy funkcjonalne koncentrują się na sprawdzeniu, czy aplikacja działa zgodnie ze specyfikacją, ale nie analizują jej wydajności pod obciążeniem. Testy zgodności badają, czy aplikacja spełnia wymagania regulacyjne i standardy branżowe, co nie ma bezpośredniego związku z obciążeniem. Testy bezpieczeństwa analizują podatności aplikacji na ataki zewnętrzne i wewnętrzne, ale ich celem nie jest ocena wydajności pod dużym ruchem użytkowników.

Pytanie 14

Co to jest choroba związana z wykonywaniem zawodu?

A. Każda choroba, która występuje w czasie pracy
B. Choroba wynikająca z warunków pracy lub związanych z nimi czynników
C. Choroba występująca tylko w sektorze przemysłowym
D. Stan zdrowia, który uniemożliwia pracę przez okres krótszy niż tydzień
Choroba, która pojawia się w trakcie zatrudnienia, ale nie jest związana z warunkami pracy, nie jest klasyfikowana jako choroba zawodowa. Może to być zwykłe przeziębienie lub inna przypadłość niezwiązana z charakterem wykonywanej pracy. Stan zdrowia, który uniemożliwia pracę przez krótki czas (np. tydzień), może być traktowany jako tymczasowa niezdolność do pracy, ale nie spełnia definicji choroby zawodowej. Choroby zawodowe występują nie tylko w sektorze przemysłowym – mogą pojawiać się również w pracy biurowej (np. problemy z kręgosłupem lub wzrokiem).

Pytanie 15

Jednym z elementów, które mają zostać zaimplementowane w aplikacji, jest możliwość cofnięcia ostatnich działań do 20 operacji wstecz (undo). Struktura danych, która jest odpowiednia do tego celu i pozwala na dostęp tylko do ostatnio dodanego elementu, to:

A. stos
B. drzewo
C. tablica
D. kolejka
Kolejka to struktura danych działająca na zasadzie FIFO (First In, First Out), co oznacza, że pierwszy dodany element jest pierwszym, który zostaje usunięty. Tego rodzaju organizacja danych nie nadaje się do implementacji funkcji cofania, ponieważ nie umożliwia łatwego dostępu do ostatnich operacji. W kontekście aplikacji umożliwiającej cofnięcie działań, kolejka nie zaspokaja potrzeb użytkownika, gdyż nie pozwala na usunięcie najnowszej operacji. Drzewo, jako bardziej złożona struktura, jest używane głównie do organizacji danych w hierarchicznej formie. Chociaż drzewa mogą być skuteczne w wyszukiwaniu i porządkowaniu danych, nie są odpowiednie do realizacji funkcji cofania ostatnich operacji, ponieważ nie oferują prostego dostępu do ostatnio dodanych elementów. Wreszcie, tablica jest statyczną strukturą danych, która przechowuje elementy w sekwencyjnej kolejności. Mimo że można by używać tablicy do przechowywania operacji, ich ograniczenia dotyczące rozmiaru i elastyczności sprawiają, że są mniej efektywne w porównaniu do stosu w kontekście cofania operacji. W związku z tym, ani kolejka, ani drzewo, ani tablica nie są odpowiednimi wyborami dla funkcjonalności cofania w aplikacji, co czyni stos jedynym logicznym rozwiązaniem.

Pytanie 16

Jaką rolę odgrywa program Jira?

A. Planowanie, śledzenie oraz raportowanie zadań projektowych
B. Produkcja grafik 3D
C. Zarządzanie edycjami systemu operacyjnego
D. Modyfikowanie arkuszy kalkulacyjnych
Jira to jedno z najpopularniejszych narzędzi do zarządzania projektami, wykorzystywane głównie w metodykach Agile i Scrum. Umożliwia planowanie, monitorowanie i raportowanie zadań projektowych na różnych etapach ich realizacji. Dzięki elastycznym tablicom kanban i sprintom, Jira pozwala zespołom programistycznym śledzić postępy, zarządzać backlogiem oraz efektywnie przydzielać zasoby. Funkcjonalności takie jak automatyzacja procesów, śledzenie błędów (bug tracking) i integracja z innymi narzędziami (np. GitHub, Bitbucket) sprawiają, że Jira jest wszechstronnym rozwiązaniem do zarządzania nawet najbardziej złożonymi projektami. Dzięki generowanym raportom i wykresom burndown, menedżerowie mogą dokładnie analizować tempo pracy i podejmować decyzje w oparciu o dane.

Pytanie 17

Który z wymienionych składników jest charakterystyczny dla środowiska IDE przeznaczonego do tworzenia aplikacji mobilnych?

A. Edytor graficzny, narzędzia analityczne, klient FTP
B. Edytor tekstowy, przeglądarka internetowa, system kontroli wersji
C. Narzędzia do analizy danych, serwer webowy, przeglądarka internetowa
D. Kompilator, debugger, emulator urządzenia mobilnego
Edytor tekstowy, przeglądarka internetowa i system kontroli wersji to narzędzia używane w różnych aspektach programowania, ale nie są one wystarczające do pełnego cyklu tworzenia aplikacji mobilnych. Narzędzia do analizy danych, serwery webowe i przeglądarki są istotne dla programowania webowego i backendowego, ale nie mają kluczowej roli w tworzeniu natywnych aplikacji mobilnych. Edytor graficzny, narzędzia analityczne i klient FTP mogą wspierać rozwój aplikacji, ale nie zastąpią kompilatora, debuggera czy emulatora, które są niezbędne do budowy i testowania oprogramowania mobilnego.

Pytanie 18

Jaką właściwość ma sieć synchroniczna?

A. Transmisja danych odbywa się w wyznaczonych interwałach czasowych
B. Nie jest konieczna synchronizacja zegarów
C. Przekazywanie danych zachodzi w sposób niesystematyczny
D. Gwarantuje większą elastyczność w przesyłaniu danych
Przesyłanie danych w sieciach synchronicznych nigdy nie odbywa się w sposób nieciągły, ponieważ kluczowym elementem ich działania jest stała synchronizacja. W sieciach synchronicznych każda jednostka czasowa ma przypisaną konkretną rolę i czas na przesyłanie danych, co wyklucza możliwość nieciągłości w transmisji. Ponadto, sieci synchroniczne wymagają synchronizacji zegarów, co jest przeciwieństwem twierdzenia, że nie jest to konieczne. Synchronizacja zegarów jest niezbędna, aby wszystkie urządzenia działały w harmonii, co pozwala na uniknięcie kolizji danych i zapewnia ich integralność. Ostatnim błędnym założeniem jest stwierdzenie, że sieć synchroniczna zapewnia większą elastyczność w przesyłaniu danych. W rzeczywistości, sztywność harmonogramu transmisji w sieciach synchronicznych ogranicza elastyczność, ponieważ każde urządzenie ma przypisany określony czas na przesyłanie danych, co może być niewystarczające w przypadku nagłych wzrostów zapotrzebowania na przepustowość. W tym kontekście sieci asynchroniczne są znacznie bardziej elastyczne, ponieważ umożliwiają przesyłanie danych w dowolnym czasie, w zależności od aktualnych potrzeb.

Pytanie 19

Która z poniższych technologii służy do tworzenia aplikacji mobilnych za pomocą języków webowych?

A. Spring Boot
B. ASP.NET Core
C. React Native
D. Django
Spring Boot, ASP.NET Core oraz Django to technologie związane z tworzeniem aplikacji webowych, ale każda z nich ma swoje unikalne zastosowania i nie służy do tworzenia aplikacji mobilnych z użyciem języków webowych. Spring Boot jest frameworkiem opartym na Javie, który upraszcza rozwój aplikacji opartych na architekturze mikroserwisów oraz aplikacji webowych. Jego głównym celem jest uproszczenie procesu konfiguracji i uruchamiania aplikacji backendowych, a nie tworzenie interfejsów użytkownika w środowisku mobilnym. ASP.NET Core to framework od Microsoftu, który umożliwia tworzenie aplikacji internetowych i API w języku C#. Choć jest bardzo elastyczny i może być używany do tworzenia różnych typów aplikacji, nie jest zaprojektowany z myślą o mobilnych interfejsach użytkownika. Z kolei Django to framework oparty na języku Python, który skupia się na szybkim rozwoju aplikacji webowych z wykorzystaniem architektury Model-View-Template. Każda z tych technologii ma swoje miejsce w ekosystemie tworzenia oprogramowania, ale ich zastosowanie w kontekście aplikacji mobilnych jest ograniczone. Typowym błędem myślowym jest mylenie frameworków działających w środowisku serwerowym z technologiami dedykowanymi do rozwoju aplikacji mobilnych. W praktyce, do rozwoju aplikacji mobilnych należy wykorzystywać technologie, które są specjalnie dostosowane do tego celu, takie jak React Native, Flutter czy Xamarin, które oferują nativne rozwiązania i lepszą integrację z platformami mobilnymi.

Pytanie 20

Która z poniższych technologii jest używana do tworzenia animacji na stronach internetowych?

A. MySQL
B. HTTP Headers
C. XML
D. CSS Animations
MySQL, XML oraz HTTP Headers to technologie, które są stosowane w zupełnie innych kontekstach niż tworzenie animacji na stronach internetowych. MySQL to system zarządzania bazami danych, który służy do przechowywania i zarządzania danymi. Używa się go w kontekście backendu aplikacji webowych, gdzie umożliwia przechowywanie informacji o użytkownikach, produktach czy innych danych, ale nie ma bezpośredniego wpływu na animacje czy wygląd strony. XML to format służący do wymiany danych, który również nie ma zastosowania w animacjach. Może być wykorzystany do transportowania danych pomiędzy systemami, ale nie do tworzenia efektów wizualnych na stronach. HTTP Headers z kolei to informacje przesyłane pomiędzy klientem a serwerem, które dotyczą komunikacji sieciowej, a nie animacji. Często zdarza się, że osoby uczące się technologii internetowych mylą te różne warstwy i ich zastosowania, co prowadzi do nieporozumień. Kluczowe jest zrozumienie, że CSS Animations są dedykowane do stylizacji i animacji w kontekście front-endu, podczas gdy pozostałe technologie pełnią inne, specyficzne role w ekosystemie webowym. Właściwe podejście do nauki i zrozumienia tych zależności jest fundamentem skutecznego programowania i tworzenia aplikacji internetowych.

Pytanie 21

Co to jest algorytm QuickSort?

A. Algorytm wyszukiwania binarnego w posortowanej tablicy
B. Wydajny algorytm sortowania oparty na strategii 'dziel i zwyciężaj'
C. Technika przeszukiwania grafu wszerz
D. Metoda kompresji danych bez strat
Algorytm QuickSort to jeden z najbardziej popularnych i efektywnych algorytmów sortowania, który opiera się na strategii 'dziel i zwyciężaj'. W praktyce działa w ten sposób, że wybiera element zwany pivotem (osią) i dzieli zbiór na dwie części: jeden z elementami mniejszymi od pivota, a drugi z elementami większymi. Następnie rekurencyjnie sortuje te podzbiory. QuickSort jest niezwykle szybki i wydajny, zwłaszcza dla dużych zbiorów danych, a jego średnia złożoność czasowa wynosi O(n log n). Używa się go w wielu aplikacjach, gdzie istotne jest szybkie przetwarzanie danych, takich jak sortowanie list w aplikacjach webowych czy organizacja danych w bazach. Warto jednak pamiętać, że w najgorszym przypadku, gdy pivot jest źle wybierany, złożoność może wynosić O(n^2), co występuje na przykład w przypadku już posortowanej tablicy. W kontekście praktycznym, dobre praktyki obejmują dobór odpowiedniej metody wyboru pivota, co może znacznie poprawić wydajność algorytmu.

Pytanie 22

Która z metod zarządzania projektem jest oparta na przyrostach realizowanych w sposób iteracyjny?

A. Model spiralny
B. Metodyki zwinne (Agile)
C. Model prototypowy
D. Model wodospadowy (waterfall)
Metodyki zwinne, czyli Agile, są naprawdę ciekawe, bo stawiają na iteracyjne podejście. To znaczy, że po trochu, krok po kroku realizujemy projekt, a każda iteracja dostarcza nam kawałek działającego produktu. Dzięki temu możemy łatwo dostosować się do zmieniających się wymagań klienta. W moim doświadczeniu, to świetny sposób na rozwijanie aplikacji, bo pozwala nam regularnie testować i wprowadzać zmiany. W Agile najważniejsza jest współpraca z klientem i szybkie dostarczanie wartości, co czyni ten model bardzo efektywnym, zwłaszcza w szybko zmieniających się warunkach.

Pytanie 23

Który fragment kodu ilustruje zastosowanie rekurencji?

Blok 1:
int fn(int a) {
  if(a==1) return 1;
  return fn(a-1)+2;
}
Blok 2:
int fn(int a) {
  if(a==1) return 1;
  return (a-1)+2;
}
Blok 3:
int fn(int a) {
  if(a==1) return 1;
  return fun(a-1)+2;
}
Blok 4:
int fn(int a) {
  if(a==1) return 1;
  return 2;
}
A. Blok 3
B. Blok 2
C. Blok 4
D. Blok 1
Wiele osób myli pojęcie rekurencji z prostym przetwarzaniem argumentów funkcji albo próbą wywołania innej funkcji. W przypadku Bloku 2 mamy tylko zwykłe odejmowanie i dodawanie – funkcja fn nie wywołuje samej siebie, więc nie występuje tu rekurencja. To jest bardzo częsty błąd, gdzie ktoś widzi podobieństwo w nazwach i strukturze, ale nie dostrzega istoty rekurencji, czyli tego samowywołania z innym argumentem. Blok 3 z kolei próbuje wywołać inną funkcję (fun zamiast fn), więc to również nie jest rekurencja, tylko – w najlepszym wypadku – jakaś forma współdziałania funkcji, ale nie spełnia definicji rekurencji. Częsty błąd to mylenie rekurencji z przekazywaniem sterowania do innych funkcji. Natomiast Blok 4 jest już najprostszym przypadkiem – nie wywołuje żadnej funkcji w środku, po prostu zawsze zwraca 2, poza przypadkiem bazowym. Brak tu jakiejkolwiek logiki rekurencyjnej. W praktyce programistycznej rekurencja to bardzo specyficzny wzorzec, gdzie kluczowe jest istnienie sprawdzalnego warunku zakończenia (tzw. przypadek bazowy) oraz wywołanie tej samej funkcji, ale z „mniejszym” lub „prostszym” przypadkiem. Bez tych elementów nie można mówić o poprawnej implementacji rekurencji. Osobiście zauważyłem, że wielu uczniów próbuje używać rekurencji do wszystkiego, nie rozumiejąc, że bez samowywołania i przypadku bazowego to po prostu nie działa tak, jak powinno. Branżowe standardy jasno wskazują, że rekurencja jest narzędziem do rozwiązywania problemów, które mają naturalną strukturę rekurencyjną – na przykład przetwarzanie struktur drzewiastych, rozwiązywanie łamigłówek typu wieże Hanoi, czy sortowanie szybkie (quick sort). Jeśli jednak funkcja nie wywołuje samej siebie, nie spełnia warunków rekurencji, nawet jeśli operuje na podobnych argumentach lub odwołuje się do innych funkcji.

Pytanie 24

Co to jest BEM w kontekście CSS?

A. Bootstrap Element Manager - narzędzie do zarządzania elementami Bootstrap
B. Backend Encryption Method - metoda szyfrowania danych w backendzie
C. Browser Extension Module - moduł rozszerzeń przeglądarki
D. Metodologia nazewnictwa klas CSS: Block, Element, Modifier
Wybór innych odpowiedzi wskazuje na nieporozumienie dotyczące koncepcji BEM oraz jego zastosowania w CSS. Browser Extension Module, czyli moduł rozszerzeń przeglądarki, jest całkowicie niepowiązany z tematyką stylizacji stron internetowych. Takie podejście do ładowania lub tworzenia stylów w przeglądarkach nie dotyczy metodologii organizacji kodu CSS, jaką jest BEM. Backend Encryption Method natomiast odnosi się do bezpieczeństwa i szyfrowania danych w systemach serwerowych, co także nie ma związku z front-endowym podejściem do stylizacji. Pojęcie Bootstrap Element Manager mogłoby sugerować narzędzie do zarządzania komponentami w frameworku Bootstrap, jednak nie odnosi się do BEM, który jest niezależny od konkretnego frameworka i koncentruje się na organizacji kodu CSS. Typowym błędem myślowym przy wyborze tych odpowiedzi jest skupienie się na technologiach związanych z przeglądarką lub backendem, zamiast na metodologii stylistycznej, która ma na celu ułatwienie pracy z CSS. Kluczowe jest zrozumienie, że BEM jest narzędziem używanym do poprawy struktury i czytelności kodu CSS, co jest niezbędne w procesie tworzenia nowoczesnych, skalowalnych aplikacji webowych. Zwracanie uwagi na te różnice jest istotne dla każdej osoby zajmującej się front-endem, aby uniknąć zamieszania w terminologii i użyciu odpowiednich narzędzi do właściwych zadań.

Pytanie 25

Co oznacza walidacja kodu programu?

A. Czynnością dotyczącą publikacji aplikacji w sklepie
B. Czynnością polegającą na kompilowaniu kodu
C. Czynnością związaną z tworzeniem dokumentacji kodu
D. Czynnością weryfikującą poprawność i zgodność kodu z założeniami
Tworzenie dokumentacji kodu polega na opisywaniu funkcji, klas i modułów aplikacji, co ułatwia zrozumienie projektu, ale nie jest tożsame z walidacją kodu. Kompilowanie kodu to proces tłumaczenia go na język maszynowy, co umożliwia jego uruchomienie, ale nie wykrywa wszystkich błędów logicznych. Publikowanie aplikacji w sklepie to końcowy etap wdrażania produktu, który nie obejmuje walidacji kodu – ten proces powinien zostać przeprowadzony wcześniej, w trakcie rozwoju aplikacji.

Pytanie 26

W pokazanych fragmentach kodu zdefiniowano funkcję o nazwie fun1. W tej funkcji należy zaimplementować obsługę. Fragment kodu interfejsu użytkownika (XAML):

<RadioButton Content="opcja1" />
<RadioButton Content="opcja2" />
<Button Content="OK" Width=75 Click="fun1"/>
Fragment kodu logiki programu (C#):
private void fun1(object sender, RoutedEventArgs e) { ... }
A. aplikacji po wystąpieniu zdarzenia utraty fokusu przez pole opcji
B. inicjacji elementów interfejsu użytkownika
C. usunięcia kontrolek z pamięci RAM
D. naciśnięcia przycisku zatwierdzającego dialog
Obsługa zdarzeń utraty focusa dotyczy pól tekstowych i formularzy, a nie przycisków zatwierdzających dialog. Inicjalizacja elementów interfejsu użytkownika jest wykonywana na etapie ładowania aplikacji, a nie w odpowiedzi na interakcję z przyciskiem. Usuwanie kontrolek z pamięci jest ważnym elementem zarządzania zasobami, ale nie ma związku z obsługą zdarzeń przycisków dialogowych. Każda z tych operacji dotyczy innego etapu cyklu życia aplikacji i nie odnosi się bezpośrednio do zatwierdzania danych przez użytkownika.

Pytanie 27

Jakie są korzyści z wykorzystania struktur danych typu mapa (np. HashMap w Javie) w kontekście tworzenia zbiorów danych?

A. Ponieważ struktury danych typu mapa zajmują mniej pamięci niż tablice
B. Z powodu szybkiego uzyskiwania dostępu do elementów przy użyciu klucza
C. Bo pozwalają na sortowanie danych bez dodatkowych działań
D. Gdyż nie potrzebują znajomości wielkości danych przed kompilacją
Mapa, na przykład HashMap w Javie, to taka fajna struktura, która trzyma pary klucz-wartość. Dzięki temu szybko możemy znaleźć dane, korzystając z unikalnego klucza. HashMap jest super, bo pozwala nam na błyskawiczne dodawanie, usuwanie i wyszukiwanie elementów w czasie O(1). To naprawdę przydaje się, gdy pracujemy z dużymi zbiorami danych. Używamy jej często w aplikacjach wymagających szybkiego dostępu do informacji, jak różne bazy danych czy strony internetowe. No i jeszcze jej elastyczność – można ją łatwo dostosować do zmieniających się zestawów danych, co jest dużym plusem.

Pytanie 28

Jaki będzie rezultat operacji logicznej AND dla wartości binarnych 1010 oraz 1100?

A. 1000
B. 1110
C. 1010
D. 1100
Wynik logicznej operacji AND dla liczb binarnych 1010 i 1100 uzyskuje się poprzez porównywanie odpowiadających sobie bitów obu liczb. W systemie binarnym, operacja AND zwraca 1 tylko wtedy, gdy oba bity są równe 1. W przypadku liczb 1010 (co w systemie dziesiętnym odpowiada 10) oraz 1100 (co w systemie dziesiętnym odpowiada 12), analizujemy każdy bit od prawej do lewej. Pierwszy bit: 0 AND 0 = 0, drugi bit: 1 AND 0 = 0, trzeci bit: 0 AND 1 = 0, czwarty bit: 1 AND 1 = 1. Zatem wynik operacji AND to 1000 (co w systemie dziesiętnym odpowiada 8). Takie operacje logiczne są podstawą działania systemów cyfrowych i stosowane są w programowaniu oraz w projektowaniu układów cyfrowych, gdzie logika binarna jest niezbędna. Operacje AND są również używane w bazach danych oraz w językach programowania, gdzie umożliwiają filtrowanie danych na podstawie logicznych warunków. W kontekście standardów, operacje logiczne są definiowane przez różne normy, takie jak IEEE 754 dla arytmetyki zmiennoprzecinkowej, co podkreśla ich fundamentalne znaczenie w informatyce.

Pytanie 29

Które z wymienionych stwierdzeń najtrafniej charakteryzuje klasę bazową?

A. Klasa, która zawsze zawiera metody wirtualne
B. Klasa, która zapewnia wspólne atrybuty i metody dla klas pochodnych
C. Klasa, która dziedziczy z klasy pochodnej
D. Klasa, która nie może być dziedziczona
Klasa bazowa to klasa, która dostarcza wspólne pola i metody dla klas pochodnych. Definiuje ogólną funkcjonalność, która może być rozszerzana lub modyfikowana przez klasy dziedziczące. Dzięki temu programowanie obiektowe umożliwia wielokrotne wykorzystanie kodu, co prowadzi do jego większej modularności i czytelności. Klasa bazowa często zawiera metody wirtualne, które mogą być nadpisywane przez klasy pochodne, co pozwala na dostosowanie funkcjonalności do konkretnych potrzeb. Przykładem jest klasa 'Pojazd', która posiada metody takie jak 'Jedz()' czy 'Zatrzymaj()', a klasy pochodne, np. 'Samochód' lub 'Rower', rozszerzają tę funkcjonalność.

Pytanie 30

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

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

Pytanie 31

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

A. =
B. !=
C. ===
D. ==
Nieprawidłowe odpowiedzi związane z operatorem == bazują na koncepcji luźnej równości, która w JavaScript działa na zasadzie automatycznego rzutowania typów. Gdy używasz ==, JavaScript konwertuje operandy na ten sam typ, zanim dokona porównania. To może prowadzić do zaskakujących rezultatów. Na przykład, porównując 0 == '0', wynik będzie true, ponieważ łańcuch '0' jest konwertowany na liczbę. Stosowanie tego operatora jest często przyczyną nieprzewidywalnych zachowań, które mogą być trudne do debugowania. Operator = z kolei nie jest operatorem porównania, lecz operatorem przypisania. Używa się go do przypisania wartości do zmiennej, co jest zupełnie inną operacją niż porównanie. Z kolei operator != działa na zasadzie luźnej nierówności i również podlega automatycznemu rzutowaniu typów, co czyni go mniej przewidywalnym. W praktyce, unikanie operatorów == oraz != na rzecz === oraz !== jest zdecydowanie zalecane, aby zredukować ryzyko błędów związanych z typami danych i niejednoznaczną logiką. Wielu doświadczonych programistów zaleca stosowanie operatora === za każdym razem, aby zapewnić najwyższy poziom precyzji i bezpieczeństwa w kodzie. Dobrą praktyką jest również przemyślane podejście do typów danych i ich konwersji, co pozwala na bardziej klarowne i zrozumiałe programowanie.

Pytanie 32

Przedstawione w filmie działania wykorzystują narzędzie

A. kompilatora dla interfejsu graficznego
B. generatora kodu java
C. debuggera analizującego wykonujący kod
D. generatora GUI przekształcającego kod do języka XAML
Patrząc na wszystkie dostępne opcje, łatwo się pomylić, bo terminologia może być trochę podchwytliwa. Debugger analizujący wykonujący kod rzeczywiście jest kluczowym narzędziem w pracy programisty, ale jego zadaniem jest szukanie błędów i obserwowanie działania programu w czasie rzeczywistym, a nie generowanie kodu czy interfejsów. Myślę, że sporo osób utożsamia narzędzia developerskie z debuggerem, bo to jedno z najczęściej używanych rozwiązań – jednak tutaj akurat nie ma on nic wspólnego z przekształcaniem kodu do XAML-a. Generator kodu Java brzmi sensownie, jeśli ktoś pracuje więcej w środowiskach Javy, ale w tym przypadku mówimy o ekosystemie .NET i XAML-u, a Java ma zupełnie inne formaty i narzędzia (np. FXML dla JavaFX, ale to zupełnie inna bajka). Generator GUI przekształcający kod do języka XAML to narzędzie dedykowane platformie Microsoftu, bo XAML funkcjonuje właśnie w tych technologiach. Ostatnia odpowiedź, czyli kompilator dla interfejsu graficznego, to trochę pomieszanie pojęć – kompilator rzeczywiście tłumaczy kod na wykonywalny plik (np. EXE), ale nie jest narzędziem służącym do generowania czy przekształcania opisów interfejsów graficznych. Sporo osób może mieć tendencję do mylenia generatorów z kompilatorami, bo oba „tworzą coś automatycznie”, ale ich przeznaczenie jest zupełnie inne. Moim zdaniem najważniejsze to rozumieć, że generatory GUI ułatwiają życie, pozwalając szybko przenieść projekt interfejsu do kodu XAML, a reszta narzędzi ma zupełnie inne zadania. To rozróżnienie jest naprawdę kluczowe w branży.

Pytanie 33

Jakie narzędzie służy do zarządzania wersjami?

A. Trello
B. Jira
C. Bugzilla
D. Git
Dokładnie tak – Git to obecnie najpopularniejsze narzędzie do zarządzania wersjami kodu źródłowego. Wykorzystuje się go praktycznie w każdej większej firmie IT, a nawet w małych zespołach projektowych. Git pozwala śledzić wszelkie zmiany w projekcie, przywracać starsze wersje plików czy nawet łączyć pracę wielu osób nad tym samym kodem bez ryzyka konfliktów. Największą przewagą Gita nad starszymi systemami jak SVN jest rozproszony charakter – każdy programista ma lokalną kopię całej historii projektu i może pracować offline, a dopiero potem synchronizować zmiany. Z mojego doświadczenia przechodzenie na Gita wymaga chwili nauki, ale to narzędzie daje ogromną kontrolę nad kodem i bezpieczeństwo – nie ma się co bać eksperymentowania, bo zawsze można wrócić do wcześniejszej wersji. W praktyce, na przykład na Githubie czy GitLabie, Git jest podstawą do pracy zespołowej, code review i automatycznych testów. Warto też wspomnieć, że znajomość Gita jest już niemal wymaganiem na rynku pracy, nie tylko wśród programistów, ale też administratorów, testerów czy nawet projektantów dokumentacji. Generalnie, jeśli chodzi o zarządzanie wersjami – Git to złoty standard.

Pytanie 34

Która z metod zarządzania projektami stawia na przejrzystość oraz wizualizację bieżących zadań?

A. Scrum
B. Kanban
C. Agile
D. Waterfall
Scrum to metoda iteracyjna, która koncentruje się na sprintach i dostarczaniu działającego produktu w krótkich cyklach, ale nie skupia się na wizualizacji pracy na poziomie takim jak Kanban. Agile to ogólna filozofia zarządzania projektami, która obejmuje różne metodyki (w tym Scrum i Kanban), ale nie koncentruje się wyłącznie na wizualizacji. Waterfall to model sekwencyjny, gdzie prace realizowane są etapami, a transparentność nie jest kluczowym elementem tego podejścia, ponieważ każda faza musi zostać zakończona przed rozpoczęciem kolejnej.

Pytanie 35

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. Collection
B. ObservableCollection
C. ReadOnlyCollection
D. KeyedCollection
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 36

Jaki tekst zostanie wyświetlony po uruchomieniu jednego z poniższych fragmentów kodu?
Kod w React:

<h2>{2+2}</h2>
Kod w Angular:
<h2>{{2+2}}</h2>
A. {4}
B. {2+2}
C. 4
D. {{2+2}}
Wiele osób trafia na problem, bo te klamry i podwójne klamry wyglądają trochę tajemniczo, zwłaszcza przy pierwszym kontakcie z Reactem albo Angularem. Często pojawia się myślenie, że skoro w szablonie wpisano {2+2} albo {{2+2}}, to właśnie taki tekst zostanie wyświetlony na stronie, dosłownie z klamrami. W praktyce jednak i React (JSX), i Angular traktują klamry jako specjalną składnię do osadzania dynamicznych wartości z JavaScript — to nie jest zwykła dekoracja, tylko wyraźny sygnał dla silnika, że w tym miejscu należy wykonać kod i podstawić wynik. To powoduje, że nie wyświetli się ani „{2+2}”, ani „{{2+2}}”, tylko właśnie wynik tego wyrażenia. Co ciekawe, odpowiedź „{4}” też jest błędna, bo React i Angular nie wyświetlają już klamer w efekcie końcowym — klamry są tylko częścią składni, nie wyniku. Człowiek łatwo może się pomylić, bo w zwykłym HTML czegoś takiego nie ma i klamry są po prostu tekstem. Moim zdaniem często wynika to z niezrozumienia, jak działa tzw. data binding w frameworkach frontendowych. Warto wyrobić sobie nawyk myślenia o klamrach jako narzędziu do „wstrzykiwania” wartości, nie jako części tekstu. To też pokazuje, jak ważne jest czytanie dokumentacji — oficjalne materiały Reacta i Angulara bardzo wyraźnie podkreślają, że klamry służą do oceny JavaScriptu. Jeśli więc widzimy {2+2} w szablonie, przeglądarka zobaczy tylko „4”, bo wszystko, co w klamrach, jest oceniane przed wyświetleniem. Jeśli wpiszemy tam zmienną lub nawet funkcję, efekt będzie podobny — zawsze podstawiona zostanie końcowa wartość, a nie kod czy same klamry. Takie mechanizmy bardzo upraszczają pracę, bo pozwalają łatwo aktualizować widok w zależności od stanu aplikacji.

Pytanie 37

Co to jest destructuring assignment w JavaScript?

A. Proces konwersji typów danych w JavaScript
B. Metoda usuwania nieużywanych zmiennych z kodu
C. Technika optymalizacji kodu przez kompilator
D. Składnia pozwalająca na rozpakowanie wartości z tablic lub obiektów do oddzielnych zmiennych
Destructuring assignment w JavaScript to technika, która pozwala na wygodne i intuicyjne rozpakowywanie wartości z tablic oraz obiektów, co znacząco ułatwia pracę z danymi. Używając tej składni, możemy przypisywać wartości do zmiennych w bardziej przejrzysty sposób. Na przykład, jeśli mamy obiekt z danymi użytkownika, zamiast pisać wiele linii kodu, aby uzyskać dostęp do poszczególnych właściwości, możemy użyć destructuring. Przykład: const user = { name: 'Jan', age: 30 }; const { name, age } = user; Teraz mamy bezpośredni dostęp do zmiennych name i age, co poprawia czytelność kodu. Destructuring jest również przydatny w kontekście funkcji, gdzie możemy rozpakowywać argumenty w sposób bardziej zrozumiały. Jest to zgodne z najlepszymi praktykami programowania w JavaScript, co sprawia, że kod jest bardziej zwięzły oraz łatwiejszy do utrzymania. Dodatkowo, technika ta wspiera rozwój złożonych aplikacji, gdzie zarządzanie danymi i ich struktura odgrywają kluczową rolę.

Pytanie 38

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. logiczny
B. stałoprzecinkowy
C. zmiennoprzecinkowy
D. łańcuchowy
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 39

Jaki rodzaj testów można scharakteryzować przedstawionym opisem?

NazwaOpisCzynnościPo teście
Formularz osobowySprawdzenie odpowiedzi formularza na błędy użytkownika1. czy wpisano wszystkie wymagane pola?
2. czy e-mail zawiera znak @?
3. czy nr telefonu zawiera cyfry, zgodnie ze wzorcem?
4. czy jest zgoda na przetwarzanie danych?
Usunąć z bazy danych wpisane podczas testowania osoby
A. testy jednostkowe
B. testy wydajnościowe
C. testy funkcjonalne
D. testy zgodności
Wiele osób myli tu pojęcia i sądzi, że sprawdzanie formularza pod kątem walidacji danych to np. testy jednostkowe albo wydajnościowe. Moim zdaniem to typowy błąd wynikający z mylenia poziomów testowania albo niezrozumienia celów tych testów. Testy wydajnościowe koncentrują się na tym, ile system „wytrzyma” – chodzi o liczbę użytkowników, czas odpowiedzi czy zużycie zasobów, a nie o to, czy pola są dobrze sprawdzane. Testy jednostkowe z kolei dotyczą poszczególnych fragmentów kodu, takich jak pojedyncze funkcje czy metody – ich zadaniem jest wyłapywanie błędów logicznych w kodzie, ale nie sprawdzają one całościowego działania funkcji biznesowej z perspektywy użytkownika. Testy zgodności są czymś innym – mają na celu zweryfikowanie, czy system spełnia wymagania formalne, normy prawne albo branżowe standardy (np. czy spełnia RODO, WCAG itp.), a nie typowe błędy użytkownika. W praktyce, jeśli ktoś wskazuje na któryś z tych rodzajów testów w kontekście walidacji formularza, to pewnie wynika to z niejasnego rozróżniania, co jest funkcjonalnością, a co technicznym aspektem systemu. Warto pamiętać, że testy funkcjonalne zawsze dotyczą sprawdzenia, czy konkretny fragment oprogramowania robi dokładnie to, czego oczekuje użytkownik – nie mniej, nie więcej. To najbardziej „namacalne” z testów, bo pozwalają sprawdzić realne scenariusze użycia, często takie, które znajdą się później w rękach klientów. I to właśnie dlatego są kluczowe przy testowaniu formularzy czy innych elementów interfejsu.

Pytanie 40

Podejście obiektowe w rozwiązywaniu problemów obejmuje między innymi:

A. wyzwalacze i polimorfizm
B. pola, metody, rekurencję oraz kwerendy
C. zmienne, procedury oraz funkcje
D. klasy, obiekty oraz hermetyzację
Podejście obiektowe, zwane też programowaniem obiektowym (OOP), naprawdę opiera się na takich pojęciach jak klasy, obiekty i hermetyzacja. Klasa to taki szablon, z którego tworzy się obiekty – czyli konkretne instancje tej klasy działające w pamięci komputera. Hermetyzacja polega na tym, że ukrywamy szczegóły implementacji i wystawiamy na zewnątrz tylko niezbędne interfejsy. Moim zdaniem to jest jeden z najważniejszych aspektów OOP, bo pozwala nam lepiej zarządzać złożonością dużych systemów. Przykładowo, w językach takich jak Java czy C#, klasa samochód może mieć prywatne pola (np. numer VIN), a dostęp do nich uzyskujemy tylko przez określone publiczne metody (gettery i settery). To bardzo pomaga, gdy w zespole kilka osób pracuje nad tym samym kodem – nie trzeba wiedzieć wszystkiego o wnętrzu klasy, by z niej korzystać. W praktyce, modelowanie problemów za pomocą obiektów i klas pozwala odwzorować realne byty z rzeczywistego świata w oprogramowaniu. Standardy branżowe, jak SOLID czy zasada pojedynczej odpowiedzialności, podkreślają konieczność stosowania hermetyzacji, bo to przekłada się na elastyczność i łatwość utrzymania kodu. Z mojego doświadczenia, jeśli dobrze opanujesz te podstawy OOP, dużo szybciej zrozumiesz bardziej zaawansowane koncepty, jak dziedziczenie czy polimorfizm. To naprawdę solidny fundament, z którego korzysta praktycznie każdy nowoczesny język programowania.