Wyniki egzaminu

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

Egzamin zdany!

Wynik: 28/40 punktów (70,0%)

Wymagane minimum: 20 punktów (50%)

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

Który rodzaj kolekcji pozwala na dostęp do elementów w porządku FIFO (First In First Out)?

A. Tablica
B. Kolejka
C. Kolekcja LIFO
D. Sekwencja
Lista to struktura, która pozwala na dowolny dostęp do elementów i nie działa zgodnie z zasadą FIFO. Stos działa na zasadzie LIFO (Last In First Out), co oznacza, że ostatni dodany element jest usuwany jako pierwszy. Wektor to dynamiczna tablica, która umożliwia szybki dostęp do elementów za pomocą indeksów, ale nie działa zgodnie z zasadą FIFO.

Pytanie 2

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

A. Weryfikacja
B. Planowanie
C. Wdrożenie
D. Analiza
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 3

Który z języków programowania jest powszechnie stosowany do tworzenia interfejsów użytkownika przy użyciu XAML?

A. Java
B. C++
C. C#
D. Objective-C
C# to język programowania szeroko stosowany w tworzeniu aplikacji desktopowych, w tym do budowy interfejsów użytkownika przy użyciu XAML. XAML (Extensible Application Markup Language) to język znaczników wykorzystywany w środowisku WPF (Windows Presentation Foundation) oraz UWP (Universal Windows Platform) do projektowania graficznych interfejsów użytkownika. C# i XAML doskonale się uzupełniają, pozwalając na tworzenie nowoczesnych, interaktywnych aplikacji desktopowych, w których logika (C#) jest oddzielona od warstwy wizualnej (XAML). Dzięki tej separacji możliwe jest szybkie prototypowanie i łatwa rozbudowa aplikacji, co czyni je preferowanym wyborem dla deweloperów pracujących w ekosystemie Microsoftu.

Pytanie 4

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

A. Klasa, która dzieli swoje pola z klasami zaprzyjaźnionymi
B. Klasa, która umożliwia wielokrotne dziedziczenie pól prywatnych
C. Klasa, która wykorzystuje pola i metody innej klasy bez ich ponownej definicji
D. Klasa, która nie może posiadać konstruktorów ani destruktorów
Dziedziczenie w programowaniu obiektowym pozwala na tworzenie nowych klas na podstawie istniejących. Klasa dziedziczona (klasa pochodna) automatycznie uzyskuje dostęp do publicznych i chronionych pól oraz metod klasy bazowej, co eliminuje potrzebę ich ponownego definiowania. Dzięki dziedziczeniu można rozszerzać funkcjonalność istniejących klas, co prowadzi do bardziej efektywnego i modułowego kodu. Przykładem może być klasa 'Pojazd', po której dziedziczy klasa 'Samochód', zachowując wszystkie właściwości pojazdu i dodając specyficzne dla samochodu metody lub pola.

Pytanie 5

Jakie są różnice pomiędzy środowiskiem RAD a klasycznym IDE w kontekście aplikacji webowych?

A. RAD funkcjonuje tylko w systemach Windows
B. RAD umożliwia szybsze prototypowanie i rozwój aplikacji dzięki narzędziom wizualnym
C. RAD koncentruje się wyłącznie na budowie frontendu aplikacji
D. RAD nie wspiera żadnych języków backendowych
Rapid Application Development (RAD) to metodologia, która koncentruje się na szybkim prototypowaniu i iteracyjnym tworzeniu aplikacji. Dzięki narzędziom wizualnym RAD umożliwia programistom i projektantom szybkie budowanie interfejsów użytkownika oraz testowanie funkcjonalności aplikacji na wczesnym etapie rozwoju. RAD skraca czas potrzebny na dostarczenie gotowego produktu, co czyni go idealnym rozwiązaniem w dynamicznie zmieniających się projektach webowych. Narzędzia RAD umożliwiają także automatyczne generowanie kodu, co znacznie przyspiesza proces programowania.

Pytanie 6

W przypadku przedstawionych kodów źródłowych, które są funkcjonalnie równoważne, wartość, która zostanie zapisana w zmiennej b po wykonaniu operacji, to

Python:C++ / C# / Java:
x = 5.96;
b = int(x);
double x = 5.96;
int b = (int)x;
A. 6
B. 596
C. 5.96
D. 5
W tym zadaniu mamy do czynienia z fajnym przykładem konwersji liczby 5.96 na liczbę całkowitą w różnych językach, takich jak Python czy C++. Kiedy robimy rzutowanie, to po prostu odcinamy część ułamkową, co daje nam 5 w zmiennej b. To jest trochę klasyczne rzutowanie albo konwersja typu, gdzie w większości języków po prostu się to robi. Ciekawostką jest, że w Pythonie działa to przez funkcję int(), która zawsze zaokrągla w dół. A w C++ czy Javie używasz po prostu (int) i efekt jest ten sam. Warto też zwrócić uwagę, że przy liczbach ujemnych rzutowanie działa inaczej, bo zawsze zmierza w stronę zera. Z doświadczenia wiem, że warto być świadomym użycia takich konwersji, bo w niektórych przypadkach, jak operacje finansowe, nawet małe różnice mogą się okazać bardzo istotne.

Pytanie 7

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

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

Pytanie 8

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

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

Pytanie 9

Która metoda w obrębie klasy jest uruchamiana automatycznie podczas tworzenia kopii obiektu?

A. Destruktor
B. Metoda zaprzyjaźniona
C. Metoda statyczna
D. Konstruktor kopiujący
Metoda statyczna jest związana z klasą, a nie z jej obiektami, więc nie wywołuje się automatycznie, gdy kopiujemy obiekt. Destruktor to kolejna metoda, która odpowiada za usuwanie obiektu i zwalnianie zasobów, ale jego rola pojawia się dopiero na końcu życia obiektu, a nie podczas samego kopiowania. Co do metody zaprzyjaźnionej, to ona ma dostęp do prywatnych i chronionych elementów klasy, ale też nie jest wywoływana automatycznie w procesie kopiowania. Tylko konstruktor kopiujący robi to właściwie, tworząc kopie obiektów.

Pytanie 10

Z analizy złożoności obliczeniowej różnych algorytmów sortowania na dużych zbiorach danych (przekraczających 100 elementów) wynika, że najefektywniejszą metodą jest algorytm sortowania

sortowanie bąbelkoweO(n²)
sortowanie przez wstawianieO(n²)
sortowanie przez scalanieO(n log n)
sortowanie przez zliczanieO(n)
sortowanie kubełkoweO(n²)
A. kubełkowego
B. przez scalanie
C. przez zliczanie
D. bąbelkowego
Sortowanie bąbelkowe, mimo że jest łatwe do zrozumienia i zaimplementowania, ma złożoność czasową O(n²), co czyni je nieefektywnym dla dużych zbiorów danych, takich jak ponad 100 elementów. Działa poprzez wielokrotne przechodzenie przez listę, porównując sąsiednie elementy i zamieniając je miejscami, jeśli są w niewłaściwej kolejności. To powoduje, że algorytm ten staje się wolny przy większej ilości danych. Sortowanie przez scalanie, choć bardziej wydajne niż bąbelkowe, z złożonością O(n log n), nadal nie dorównuje szybkością sortowaniu przez zliczanie w specyficznych warunkach, gdzie zakres wartości jest ograniczony. Jest to metoda rekurencyjna, która dzieli listę na mniejsze części, sortuje je, a następnie scala w jedną posortowaną listę. Natomiast sortowanie kubełkowe, podobnie jak przez zliczanie, korzysta z dodatkowych struktur danych, lecz jego efektywność zależy od tego, jak elementy są równomiernie rozmieszczone w kubełkach, co może prowadzić do złożoności O(n²) w przypadku złej dystrybucji. Typowe błędy myślowe polegają na przecenianiu prostoty implementacji ponad złożoność czasową, a także niedocenianiu specyfiki danych wejściowych, co jest kluczowe dla wyboru odpowiedniego algorytmu sortującego. Przy rozważaniu wyboru algorytmu należy zawsze brać pod uwagę zarówno jego złożoność, jak i charakterystykę danych, jakie będą przetwarzane, co jest podstawą dobrych praktyk inżynierii oprogramowania.

Pytanie 11

Podaj wspólną cechę wszystkich kontrolek umieszczonych w ramce

<Label Text="5" BackgroundColor="Blue" TextColor="Tan" isVisible="True" />
<Stepper BackgroundColor="Blue" Value="5" isVisible="True" />
<Entry TextColor="Tan" BackgroundColor="Blue" Placeholder="5" />
<Slider ThumbColor="Tan" BackgroundColor="Blue" Value="5" isVisible="False" />
A. mają tło w tym samym kolorze
B. są w nich ustawione te same wartości domyślne
C. mają identyczny kolor czcionki
D. wszystkie są widoczne
W tym przypadku wskazałeś/aś, że wszystkie kontrolki mają tło w tym samym kolorze, i to jest faktycznie prawidłowa odpowiedź. Gdy spojrzymy na definicje: Label ma BackgroundColor="Blue", Stepper także BackgroundColor="Blue", Entry również BackgroundColor="Blue", a Slider—no właśnie—też BackgroundColor="Blue". To pokazuje, że niezależnie od typu kontrolki, wszystkie mają ustawione tło na dokładnie ten sam kolor. W praktyce bardzo często spotyka się wymóg zachowania spójności wizualnej interfejsu, szczególnie w aplikacjach profesjonalnych czy korporacyjnych. Ustalanie wspólnego BackgroundColor jest jednym z najprostszych kroków ku temu, by UI wyglądało porządnie i było czytelne dla użytkownika końcowego. Moim zdaniem, kiedy projektuje się cały ekran lub jakąś sekcję UI, warto od razu narzucić style lub korzystać z szablonów (np. Styles w XAML czy resourcach), żeby uniknąć przypadkowych rozbieżności kolorystycznych, które potem tylko irytują i programistów, i użytkowników. W branży jest to uznawane za dobrą praktykę – jednolity background ułatwia szybkie ogarnięcie, które elementy należą do jednej grupy funkcjonalnej. Poza tym, kolor tła bywa często wykorzystywany do komunikowania stanu albo priorytetu (np. alerty na czerwono itp.), więc to naprawdę ważne, żeby takie detale były przemyślane i konsekwentnie stosowane. No i jeszcze taka ciekawostka: nie wszystkie kontrolki domyślnie wyświetlają tło, więc czasem trzeba to jawnie ustawić, żeby efekt był taki sam na każdej platformie.

Pytanie 12

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 13

Co to jest Cypress?

A. System zarządzania bazami danych dla aplikacji mobilnych
B. Framework do testowania end-to-end aplikacji webowych
C. Biblioteka komponentów UI dla React
D. Narzędzie do kompilacji kodu TypeScript
Cypress to popularny framework do testowania aplikacji webowych, skoncentrowany na testach end-to-end, co oznacza, że pozwala na symulowanie rzeczywistego użytkownika w interakcji z aplikacją. Jego architektura oparta na JavaScript i łatwość integracji z innymi narzędziami sprawiają, że jest chętnie wybierany przez zespoły developerskie. Cypress umożliwia szybkie pisanie testów, które mogą być uruchamiane bezpośrednio w przeglądarce, co ułatwia debugowanie. Przykładem zastosowania może być testowanie formularzy na stronie internetowej, gdzie można sprawdzić, czy wszystkie pola działają poprawnie, czy błędne dane są odpowiednio walidowane oraz czy interfejs użytkownika reaguje jak oczekiwano. Dobrą praktyką jest pisanie testów w sposób, który odzwierciedla rzeczywiste scenariusze użytkowników, co zwiększa jakość i niezawodność aplikacji. Cypress zyskał uznanie w branży dzięki swojej wydajności i możliwościom wizualizacji testów, co czyni go jednym z wiodących narzędzi w obszarze automatyzacji testów.

Pytanie 14

Który z wymienionych elementów stanowi przykład zbiorowej ochrony?

A. Kask ochronny
B. Okulary ochronne
C. Zatyczki do uszu
D. Ekran akustyczny
Zatyczki do uszu, okulary ochronne i kaski ochronne to środki ochrony indywidualnej, które chronią pojedynczego pracownika przed zagrożeniami. Środki ochrony indywidualnej są stosowane, gdy nie można w pełni wyeliminować zagrożenia za pomocą ochrony zbiorowej. Choć są skuteczne, ich działanie ogranicza się do osób, które je noszą, co oznacza, że zagrożenie nadal istnieje w środowisku pracy dla pozostałych pracowników.

Pytanie 15

Ile kilobajtów (KB) znajduje się w jednym megabajcie (MB)?

A. 1024
B. 100
C. 1000
D. 10
W informatyce jednostki pamięci są często używane do określenia pojemności danych. 1 megabajt (MB) równa się 1024 kilobajtom (KB) w systemie binarnym, który jest podstawowym systemem liczbowym używanym w komputerach. Wynika to z faktu, że komputery operują w systemie binarnym, gdzie wartości są potęgami liczby 2. Z definicji, 1 MB to 2 do potęgi 20 bajtów, co daje 1048576 bajtów. Kiedy dzielimy tę wartość przez 1024, otrzymujemy 1024 kilobajty. W praktyce, ta konwersja jest niezwykle istotna w kontekście zarządzania pamięcią oraz określania rozmiarów plików. Na przykład, przy pobieraniu plików z internetu, znając tę konwersję, można lepiej oszacować czas pobierania oraz zarządzanie przestrzenią dyskową. Warto również zauważyć, że niektóre systemy operacyjne i producenci sprzętu używają systemu dziesiętnego, w którym 1 MB to 1000 KB, co prowadzi do nieporozumień. Dlatego znajomość różnic między systemami binarnym i dziesiętnym jest kluczowa dla zrozumienia pojemności pamięci komputerowej i odpowiednich jednostek.

Pytanie 16

Która grupa typów zawiera wyłącznie typy złożone?

A. class, struct, float
B. char, struct, union
C. class, struct, union
D. unsigned, struct, float
W tej odpowiedzi trafiłeś w sedno, bo class, struct oraz union to typowe przykłady typów złożonych w językach programowania takich jak C++ czy C. Każdy z nich służy do przechowywania bardziej skomplikowanych struktur danych niż zwykłe typy proste jak int czy float. Klasa (class) to podstawa programowania obiektowego. Pozwala łączyć dane i funkcje w jeden byt – obiekt. Z mojego doświadczenia korzystanie z klas daje ogromne możliwości, bo można ukrywać szczegóły implementacji czy stosować dziedziczenie – co jest nieocenione przy większych projektach. Struktura (struct) to taki trochę prostszy wariant klasy, szczególnie w C, gdzie nie obsługuje ona metod czy hermetyzacji, ale w C++ różnice się zacierają. Union natomiast pozwala na oszczędność pamięci – kilka pól dzieli ten sam obszar pamięci, czyli tylko jedno z nich jest aktywne w danej chwili. To się przydaje np. w programowaniu niskopoziomowym, obsłudze różnych protokołów czy pracy z rejestrami sprzętowymi. Według standardów ISO/IEC dla języka C++ (np. 14882:2017), właśnie te trzy typy należą bezdyskusyjnie do grupy złożonych, bo są zbudowane z innych typów i pozwalają lepiej modelować rzeczywistość. Warto pamiętać, że typy złożone są podstawą nowoczesnych technik projektowania oprogramowania. W praktyce, nawet w prostych aplikacjach, korzystanie z tych struktur podnosi czytelność i ułatwia przyszłą rozbudowę kodu.

Pytanie 17

Jakie czynniki powinny być brane pod uwagę podczas organizacji zasobów ludzkich w projekcie?

A. Budżet projektu, bez uwzględnienia kompetencji zespołu
B. Umiejętności oraz doświadczenie członków zespołu
C. Jedynie dostępność technologii
D. Wyłącznie techniczne wymagania projektu
Dostępność technologii jest istotna, ale nie zastąpi kompetencji zespołu, ponieważ to ludzie, a nie narzędzia, realizują projekt. Uwzględnianie tylko wymagań technicznych prowadzi do pomijania aspektu personalnego, co może skutkować niedoborem kompetencji w zespole. Skupienie się wyłącznie na budżecie może prowadzić do zatrudnienia osób o niewystarczających kwalifikacjach, co w dłuższej perspektywie generuje dodatkowe koszty związane z poprawkami i opóźnieniami.

Pytanie 18

Który z wymienionych elementów stanowi przykład złożonego typu danych?

A. bool
B. int
C. char
D. struct
Typ 'struct' w C++ to super sprawa, bo pozwala na trzymanie różnych danych pod jedną nazwą. Dzięki temu można łatwo zorganizować zmienne, które różnią się typami. Wyobraź sobie, że możesz stworzyć strukturę, która będzie reprezentować na przykład samochód z jego marką, rocznikiem i ceną. To naprawdę ułatwia pracę z danymi! Każde pole w strukturze może mieć inny typ, co czyni 'struct' bardzo uniwersalnym narzędziem do modelowania różnych obiektów, jak ludzie czy produkty. W zasadzie, to takie logiczne pudełko, do którego wrzucasz różne informacje i masz do nich szybki dostęp.

Pytanie 19

Co to jest Service Worker w kontekście Progressive Web Apps?

A. Narzędzie do testowania wydajności aplikacji
B. Usługa hostingowa dla aplikacji webowych
C. Protokół komunikacji między przeglądarką a serwerem
D. Skrypt działający w tle przeglądarki, niezależnie od strony webowej
Pojęcia związane z usługami hostingowymi, narzędziami do testowania wydajności oraz protokołami komunikacyjnymi są istotne w kontekście aplikacji webowych, ale nie mają bezpośredniego związku z tym, czym jest Service Worker. Usługa hostingowa dla aplikacji webowych zajmuje się udostępnianiem treści w Internecie, co jest zupełnie innym zagadnieniem. Aplikacje webowe mogą być hostowane na serwerach, ale to nie ma wpływu na sposób, w jaki działają one w przeglądarkach. Narzędzia do testowania wydajności są pomocne, ale nie są częścią samego procesu tworzenia aplikacji z użyciem Service Workera. Protokół komunikacji między przeglądarką a serwerem dotyczy wymiany danych, ale nie odnosi się do koncepcji działania skryptu w tle. Typowe błędy myślowe prowadzące do takich niepoprawnych wniosków to mylenie różnych aspektów technologii webowych i niezdolność do zrozumienia, jak elementy te współpracują w ekosystemie aplikacji. Aby lepiej zrozumieć Service Worker, warto przyjrzeć się jego roli w kontekście działania offline i poprawy doświadczeń użytkownika, co jest kluczowe dla nowoczesnych aplikacji webowych.

Pytanie 20

Do stworzenia zbioru danych potrzebnego do uruchomienia algorytmu sortowania bąbelkowego tablicy, wymagane są przynajmniej następujące typy:

A. jeden tablicowy, jeden liczbowy do nadzorowania pętli, dwa do zamiany miejscami elementów
B. dwa tablicowe, jeden liczbowy do nadzorowania pętli
C. jeden tablicowy, dwa liczbowe do nadzorowania pętli, jeden do zamiany miejscami elementów
D. dwa tablicowe, dwa do zamiany miejscami elementów
Analizując temat tworzenia zbioru danych do sortowania bąbelkowego, nietrudno zauważyć kilka typowych nieporozumień. Spotykam się z nimi dość często, szczególnie u początkujących. Przede wszystkim, używanie jedynie jednego indeksu liczbowego do sterowania pętlą to stanowczo za mało – bubble sort opiera się przecież na dwóch przebiegach przez tablicę: zewnętrznym i wewnętrznym. Jedna zmienna sterująca nie jest w stanie ogarnąć tego mechanizmu, bo tracimy kontrolę nad porównywaniem odpowiednich elementów. Z drugiej strony, stosowanie dwóch tablic do sortowania tego samego zbioru to zupełnie niepotrzebne komplikacje i nieefektywność pamięciowa. Algorytm sortowania bąbelkowego sortuje 'in-place', czyli bez przenoszenia danych między różnymi tablicami – całość odbywa się w jednej strukturze danych. Często pojawia się też przekonanie, że do zamiany elementów trzeba dwóch oddzielnych zmiennych, co jest trochę błędnym tropem. Do zamiany miejscami wystarcza jedna zmienna tymczasowa; bardziej rozbudowane podejścia niepotrzebnie zaśmiecają kod. Pewną pułapką jest także myślenie, że liczba zmiennych sterujących pętlami można ograniczyć – w praktyce dla pełnej kontroli i zachowania standardów potrzebujemy dwóch liczbowych indeksów. Wśród branżowych dobrych praktyk przyjęło się nie tylko używanie minimum niezbędnych zmiennych, ale także dbanie o czytelność kodu i unikanie zbędnych komplikacji – bo to ułatwia późniejsze utrzymanie i zrozumienie algorytmu, zwłaszcza gdy kod przekazywany jest dalej. Moim zdaniem, te nieporozumienia wynikają z chęci uproszczenia algorytmu lub braku doświadczenia z klasycznymi, zagnieżdżonymi pętlami. Warto poświęcić chwilę, żeby prześledzić działanie sortowania bąbelkowego krok po kroku na kartce – wtedy od razu widać, ile i jakich zmiennych naprawdę potrzeba, żeby całość działała sprawnie i zgodnie ze sztuką programowania.

Pytanie 21

Jakie zdarzenie jest wywoływane, gdy kliknięta zostaje myszą nieaktywna kontrolka lub okno?

A. focus
B. validating
C. blur
D. keyup
W momencie, kiedy klikamy na nieaktywną kontrolkę lub okno w aplikacji, wywoływane jest zdarzenie focus. To jest dość kluczowe w interakcji człowieka z interfejsem graficznym — focus decyduje, która kontrolka staje się „aktywnym” odbiorcą zdarzeń klawiatury oraz innych operacji wejścia. W praktyce, np. w aplikacjach webowych czy desktopowych, jeśli użytkownik kliknie w pole tekstowe, to właśnie focus oznacza, że to pole jest gotowe do przyjęcia tekstu. Co ciekawe, focus można też ustawiać programowo, np. za pomocą metody focus() w JavaScript, co jest często używane do poprawiania użyteczności formularzy (od razu ustawiamy kursor w pierwszym polu). Z mojego doświadczenia, dobrze jest zawsze przemyśleć, które elementy mogą i powinny otrzymywać focus, bo to wpływa na dostępność (ang. accessibility) aplikacji – osoby korzystające z klawiatury czy czytników ekranu są bardzo zależne od logiki focusowania. Branżowe standardy, szczególnie WCAG, mocno podkreślają, żeby nie blokować możliwości uzyskania focusa przez kluczowe kontrolki. Zdarzenie focus ma też kilka niuansów – na przykład nie bąbelkuje w DOM, co czasem zaskakuje początkujących. Moim zdaniem, zrozumienie roli focus w każdej aplikacji interaktywnej to taki absolutny fundament, bez którego łatwo pogubić się w późniejszych, bardziej złożonych interakcjach.

Pytanie 22

Które z poniższych nie jest rodzajem bazy danych?

A. Grafowa baza danych
B. Dokumentowa baza danych
C. Routing Database
D. Relacyjna baza danych
Routing Database to termin, który nie odnosi się do konkretnego rodzaju bazy danych w tradycyjnym sensie, jak to ma miejsce w przypadku relacyjnych, grafowych czy dokumentowych baz danych. Relacyjne bazy danych organizują dane w tabelach oraz umożliwiają wykonywanie złożonych zapytań przy użyciu języka SQL, co jest standardem branżowym. Grafowe bazy danych, z kolei, są zoptymalizowane do przechowywania i przetwarzania danych o relacjach, co sprawia, że są idealne do zastosowań w obszarze analizy sieci społecznych czy systemów rekomendacyjnych. Dokumentowe bazy danych przechowują dane w formie dokumentów, co ułatwia ich przechowywanie i przetwarzanie, szczególnie w kontekście aplikacji webowych i mobilnych. Routing Database nie jest typowym przykładem bazy danych w tym sensie, ponieważ odnosi się do mechanizmów zarządzania ruchem w sieciach komputerowych, co nie jest związane z obiegiem danych w stylu relacyjnym lub NoSQL. Zrozumienie tych różnic jest kluczowe dla właściwego wyboru technologii bazodanowej w zależności od potrzeb aplikacji.

Pytanie 23

Jakie działania należy podjąć, aby uniknąć nieskończonej rekurencji w danej funkcji?

A. Dodać warunek zakończenia w funkcji
B. Rozszerzyć zakres zmiennych globalnych
C. Wykorzystać automatyczny debugger w kompilatorze
D. Zastosować iterację zamiast rekurencji
Warunek stopu to taki kluczowy element w rekurencji, który właściwie mówi, kiedy funkcja powinna przestać się wywoływać. Jak masz ten warunek, to funkcja wraca z wynikiem zamiast kręcić się w kółko, co mogłoby prowadzić do jakiegoś szaleństwa, tzn. przepełnienia stosu. Myślę, że warto zwrócić uwagę, że dodanie tego warunku to naprawdę podstawowa sprawa w programowaniu, bo bez niego wszystko może się posypać i przestanie działać tak, jak powinno.

Pytanie 24

Co to jest destructuring assignment w JavaScript?

A. Technika optymalizacji kodu przez kompilator
B. Proces konwersji typów danych w JavaScript
C. Metoda usuwania nieużywanych zmiennych z kodu
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 25

W jakiej okoliczności należy umieścić poszkodowanego w pozycji bezpiecznej?

A. Gdy poszkodowany nie oddycha
B. Gdy poszkodowany jest nieprzytomny, ale oddycha
C. Gdy poszkodowany cierpi na krwotok zewnętrzny
D. Gdy poszkodowany jest świadomy, lecz ma uraz kończyny
Pozycja bezpieczna (czyli pozycja boczna ustalona) to jedno z kluczowych narzędzi w udzielaniu pierwszej pomocy. Stosuje się ją wtedy, gdy poszkodowany jest nieprzytomny, ale oddycha samodzielnie i nie ma podejrzenia urazu kręgosłupa. Chodzi przede wszystkim o zabezpieczenie dróg oddechowych przed ewentualnym zadławieniem np. przez ślinę, krew czy wymiociny. Niby proste, ale w praktyce często ludzie mają wątpliwości, czy powinni ruszać nieprzytomną osobę. Ja sam widziałem jak ktoś bał się tego zrobić, bo nie był pewny, czy to bezpieczne. Moim zdaniem lepiej tu działać niż zwlekać – oczywiście, jeśli nie podejrzewasz złamania kręgosłupa. Ważne jest, by pozycję bezpieczną stosować dopiero po sprawdzeniu oddechu – to naprawdę podstawa i tak uczą na wszystkich szkoleniach BLS według standardów Europejskiej Rady Resuscytacji. Przykład z życia: ktoś zasłabł na przystanku, jest nieprzytomny, ale oddycha. Przekręcasz go na bok, głowa odchylona, żeby język nie zablokował gardła – i masz spokój, dużo zmniejszone ryzyko uduszenia. Warto też pamiętać, że trzeba regularnie monitorować stan poszkodowanego, bo sytuacja może się pogorszyć, wtedy przechodzisz do resuscytacji. Pozycja bezpieczna to taki złoty środek kiedy nie musisz jeszcze reanimować, ale musisz chronić życie przez zabezpieczenie oddechu.

Pytanie 26

Diagram Gantta, który został zaprezentowany, odnosi się do projektu IT. Przyjmując, że każdy członek zespołu posiada odpowiednie kompetencje do realizacji każdego z zadań, a każde zadanie może być przypisane tylko jednej osobie, która poświęca na nie pełen dzień pracy, to minimalna liczba osób w zespole wynosi

Ilustracja do pytania
A. 2 osoby
B. 5 osób
C. 4 osoby
D. 1 osobę
Diagram Gantta to narzędzie wizualne używane do planowania i zarządzania projektami. Pokazuje harmonogram zadań w czasie. Na przedstawionym diagramie mamy pięć zadań projektowych: Projekt aplikacji Grafika Strona WWW Aplikacja front-end i Aplikacja back-end. Aby określić minimalną liczbę osób potrzebnych do realizacji projektu należy zidentyfikować które zadania mogą być realizowane równocześnie. Z diagramu wynika że w pierwszym tygodniu (1.02 - 7.02) realizowane są zadania Projekt aplikacji i Grafika które wymagają dwóch osób. W kolejnych tygodniach zadania są ułożone tak by unikać nakładania się co oznacza że w każdej kolejnej fazie projektu można kontynuować prace przydzielając jedną osobę do każdego zadania. Dlatego minimalna liczba osób wymagana do realizacji tego projektu to dwie. Taki sposób planowania jest zgodny z zasadami efektywnego zarządzania zasobami w projektach informatycznych co pozwala na optymalne wykorzystanie czasu i umiejętności zespołu. Zastosowanie metody diagramu Gantta jest powszechną praktyką w branży IT pozwalającą na lepsze zobrazowanie zależności i potrzeb kadrowych w projektach.

Pytanie 27

Jakie znaczenie ma określenie "klasa zaprzyjaźniona" w kontekście programowania obiektowego?

A. Klasa, która ma dostęp do prywatnych i chronionych elementów innej klasy
B. Klasa, która może być dziedziczona przez inne klasy
C. Klasa, w której wszystkie komponenty są publiczne
D. Klasa, która nie ma możliwości zawierania metod statycznych
Klasa zaprzyjaźniona (ang. 'friend class') to klasa, która ma dostęp do prywatnych i chronionych składowych innej klasy, dzięki specjalnej deklaracji 'friend' wewnątrz tej klasy. Jest to kluczowe narzędzie w programowaniu obiektowym, które umożliwia ściślejszą współpracę między klasami, jednocześnie zapewniając hermetyzację kodu w miejscach, gdzie jest to wymagane. Używanie klas zaprzyjaźnionych umożliwia bardziej efektywne zarządzanie zależnościami między klasami, co jest istotne w dużych projektach programistycznych. Klasy zaprzyjaźnione są często stosowane w bibliotekach standardowych i frameworkach, pozwalając na eleganckie rozwiązania problemów związanych z ukrywaniem implementacji i udostępnianiem tylko niezbędnych fragmentów kodu innym komponentom systemu.

Pytanie 28

Co oznacza walidacja kodu programu?

A. Czynnością związaną z tworzeniem dokumentacji kodu
B. Czynnością weryfikującą poprawność i zgodność kodu z założeniami
C. Czynnością dotyczącą publikacji aplikacji w sklepie
D. Czynnością polegającą na kompilowaniu kodu
Walidacja kodu programu to proces sprawdzania jego poprawności i zgodności z założeniami projektowymi oraz standardami programistycznymi. Celem walidacji jest wykrycie błędów logicznych, składniowych i zgodności kodu z wymaganiami aplikacji. Walidacja może obejmować analizę statyczną kodu (bez jego wykonywania) oraz testy jednostkowe i integracyjne, które sprawdzają funkcjonalność aplikacji. Dzięki walidacji programiści mogą uniknąć błędów na późniejszych etapach rozwoju projektu, co znacząco zwiększa niezawodność i stabilność aplikacji. Proces ten jest nieodzowny w metodykach Agile i Continuous Integration, gdzie regularne testowanie kodu stanowi podstawę dostarczania wysokiej jakości oprogramowania.

Pytanie 29

Jakie jest główne zadanie ochrony danych osobowych?

A. Zabezpieczenie danych osobowych przed nieautoryzowanym dostępem i ich wykorzystaniem
B. Gwarantowanie anonimowości dla internautów
C. Utrudnianie działalności organom ścigania
D. Udostępnianie danych osobowych w celach marketingowych
Ochrona danych osobowych przed nieuprawnionym dostępem i wykorzystaniem to podstawowy cel ochrony danych osobowych. Zasady ochrony prywatności, takie jak RODO (GDPR), zapewniają użytkownikom prawo do kontroli nad swoimi danymi i decydowania, kto może je przetwarzać. Firmy i organizacje muszą wdrażać środki techniczne oraz organizacyjne, aby zabezpieczyć dane przed wyciekiem, kradzieżą i nadużyciami. Przestrzeganie tych zasad nie tylko chroni jednostki, ale również buduje zaufanie klientów do przedsiębiorstw.

Pytanie 30

Jakie znaczenie ma przystosowanie interfejsu użytkownika do różnych platform?

A. Usuwa konieczność testowania na różnych platformach
B. Pozwala na unifikację kodu niezależnie od używanej platformy
C. Gwarantuje optymalne korzystanie z aplikacji na każdym urządzeniu
D. Umożliwia skoncentrowanie się wyłącznie na funkcjonalności aplikacji
Dostosowanie interfejsu do różnych urządzeń to naprawdę ważna sprawa, żeby wszystko działało jak należy. Aplikacje, które dobrze się przystosowują do różnych ekranów czy systemów, dają lepsze doświadczenie użytkownikom. Użycie takich technik jak responsywny design czy elastyczne układy, jak flexbox czy grid, to super pomysł. Dzięki temu elementy interfejsu same się skalują, a aplikacja wygląda spójnie na telefonach, tabletach i komputerach. Nie ma nic gorszego niż chaotyczny interfejs na różnych urządzeniach, więc to naprawdę kluczowa kwestia.

Pytanie 31

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

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

Pytanie 32

Który z wymienionych procesów NIE jest częścią etapu kompilacji?

A. Analiza działania programu w czasie rzeczywistym
B. Weryfikacja błędów składniowych
C. Optymalizacja kodu
D. Tłumaczenie kodu źródłowego na język maszynowy
Optymalizacja kodu to integralna część kompilacji, mająca na celu zwiększenie wydajności programu poprzez usunięcie zbędnych instrukcji i usprawnienie algorytmów. Tłumaczenie kodu źródłowego na język maszynowy jest głównym zadaniem kompilatora, który generuje plik wykonywalny. Weryfikacja błędów składniowych jest jednym z pierwszych etapów kompilacji, mającym na celu upewnienie się, że kod jest poprawny pod względem składni, zanim zostanie przekształcony na kod maszynowy.

Pytanie 33

W zaprezentowanym fragmencie kodu występuje błąd logiczny. Na czym on polega?

int x = 0;
while (x != 0 || x != 5) {
  std::cout << x << " ";
  x++;
}
A. Nieprawidłowym warunku pętli, który sprawia, że pętla jest nieskończona.
B. Niewłaściwym warunku pętli, co powoduje, że pętla nigdy się nie wykona.
C. Niepoprawnym użyciu funkcji cout, co skutkuje tym, że zmienna jest wczytywana w pętli.
D. Braku zainicjowania zmiennej x, co powoduje, że zmienna nie ma wartości początkowej.
W programowaniu istotne jest zrozumienie inicjalizacji zmiennych, poprawnego użycia funkcji oraz logicznych warunków sterujących. Brak inicjalizacji zmiennej może prowadzić do nieprzewidywalnego zachowania programu, jednak w tym przypadku zmienna x jest prawidłowo zainicjalizowana wartością 0, co eliminuje ten problem. Błędne zastosowanie funkcji cout mogłoby wskazywać na niepoprawne wywołanie tej funkcji, ale w przedstawionym kodzie funkcja cout jest użyta w sposób poprawny, służąc do wyświetlania wartości zmiennej x w pętli. Ważne jest, aby zrozumieć, że cout jest funkcją wyjściową, a nie wejściową, więc nie ma wpływu na logikę pętli w kontekście wczytywania danych. Co więcej, jednym z częstych błędów jest nieprawidłowy warunek pętli, który może prowadzić do jej nieoczekiwanego zakończenia lub nieskończoności. Warunki pętli powinny być precyzyjnie określone, aby mogły ulec zmianie do wartości fałszywej w pewnym momencie, co pozwala na zakończenie iteracji. Warto również zwrócić uwagę na typowe błędy myślowe, takie jak niewłaściwe operatory logiczne, które mogą prowadzić do błędnych założeń co do działania kodu. Dbałość o te aspekty jest kluczowa w praktyce programistycznej, a znajomość typowych problemów i ich rozwiązań zwiększa jakość i niezawodność oprogramowania.

Pytanie 34

Ergonomiczną oraz właściwą pozycję do pracy przy komputerze zapewni fotel, którego

A. podłokietniki są 30 cm powyżej blatu
B. podłokietniki znajdują się 20 cm poniżej blatu
C. oparcie wspiera lordozę w dolnym odcinku pleców
D. oparcie w rejonie szyi jest nachylone do przodu o 40ᵒ
Prawidłowa i ergonomiczna pozycja pracy przy komputerze jest kluczowa dla zdrowia i komfortu użytkownika. Oparcie krzesła, które zapewnia lordozę w odcinku lędźwiowym, jest niezbędne, ponieważ pozwala na zachowanie naturalnej krzywizny kręgosłupa. Lordoza lędźwiowa to naturalne wygięcie kręgosłupa w dolnej części pleców, które wspiera prawidłowe ułożenie ciała podczas siedzenia. Krzesło powinno być zaprojektowane tak, aby oparcie przylegało do krzywizny ciała, co minimalizuje ryzyko bólu pleców oraz przeciążeń. Praktycznym przykładem ergonomicznej pozycji jest ustawienie oparcia w taki sposób, aby jego dolna część była dostosowana do odcinka lędźwiowego. Zgodnie z normami ISO 9241, które dotyczą ergonomii miejsc pracy przy komputerze, krzesło powinno umożliwiać użytkownikowi przyjęcie wygodnej pozycji z podparciem dla dolnej części pleców. W odpowiedniej pozycji stopy powinny spoczywać płasko na podłodze, a kolana powinny być na poziomie bioder, co wspiera prawidłowe krążenie krwi oraz redukuje napięcia mięśniowe.

Pytanie 35

W przedsiębiorstwie IT obowiązują określone zasady dotyczące zarządzania projektami, co wskazuje, że firma wykorzystuje model zarządzania

  • Prace dzielimy na sprinty 1 tygodniowe.
  • Każdy sprint obejmuje mały fragment funkcjonalności aplikacji.
  • Sprint rozpoczynamy od podziału prac i dyskusji.
  • Sprint kończymy na zatwierdzeniu testów przez klienta.
A. prototypowy
B. zwinny
C. spiralny
D. kaskadowy
Wybrałeś zarządzanie zwinne – i to jest strzał w dziesiątkę. W praktyce, podejścia zwinne, jak Scrum czy Kanban, opierają się właśnie na podziale pracy na krótkie iteracje, czyli tzw. sprinty. W opisie z pytania mamy tygodniowe sprinty, czyli czas, gdy zespół skupia się na realizacji konkretnego, małego fragmentu produktu. Rozpoczęcie sprintu to planowanie i dyskusja w zespole, a zakończenie – akceptacja przez klienta, zazwyczaj po przeprowadzeniu testów. Takie podejście jest w IT bardzo cenione, bo pozwala szybko reagować na zmiany i stale dostarczać działające fragmenty aplikacji. Z mojego doświadczenia, firmy IT prawie zawsze wybierają taki model, jeśli klient wymaga elastyczności. Typowe dla zwinnnych metod są też codzienne spotkania (daily stand-up), retrospektywy i bliski kontakt z klientem, który daje feedback na bieżąco. Warto wiedzieć, że metody zwinne są opisane np. w Agile Manifesto i są rekomendowane przez wiele organizacji branżowych, takich jak PMI Agile czy Scrum.org. Dzięki temu zespoły mogą szybciej dostarczać wartość, minimalizować ryzyko i lepiej zarządzać wymaganiami klienta. Co istotne, zwinność to nie tylko sposób pracy, ale cały sposób myślenia o projekcie – nastawienie na ciągłą poprawę i współpracę. Tak naprawdę, większość nowoczesnych projektów IT nie wyobraża sobie dziś pracy inaczej niż w modelu zwinnym.

Pytanie 36

W języku C++, zakładając, że przedstawiony fragment kodu poprawnie się skompiluje i zostanie wykonany, to zmiennej liczba przypisana zostanie wartość:

int liczba = rand() % 1000;
A. pseudolosowa nie większa niż 999
B. równa 1000
C. dowolna pseudolosowa z przedziału typu int
D. rzeczywista podzielna przez 1000
Błędne odpowiedzi wynikają z niezrozumienia mechaniki działania funkcji rand() i operatora modulo w języku C++. Pierwsza koncepcja, że liczba mogłaby być równa 1000, jest błędna, ponieważ operator modulo ogranicza wynik do wartości mniejszych niż dzielnik, w tym przypadku 1000. Dlatego wynik nigdy nie osiągnie wartości 1000. Drugą błędną koncepcją jest przypisanie dowolnej liczby pseudolosowej w zakresie typu int. Funkcja rand() bez operacji modulo generuje liczby w zakresie od 0 do RAND_MAX, ale zastosowanie modulo 1000 zawęża ten zakres do wartości od 0 do 999. Trzecia koncepcja, że wynik musi być liczbą rzeczywistą podzielną przez 1000, wynika z błędnego założenia o typie danych i działaniach matematycznych. W kontekście języka C++ kod operuje na liczbach całkowitych, a nie rzeczywistych, i wynik modulo nie może być podzielny przez 1000, gdyż wartości te nigdy nie osiągną 1000. Kluczowe jest zrozumienie, że operacja modulo ogranicza zakres wyników i zapobiega wyjściu poza określoną wartość maksymalną, co jest fundamentalnym aspektem generowania liczb pseudolosowych w kontrolowanych zakresach. Dzięki temu podejściu można bezpiecznie i efektywnie wykorzystywać generowane wyniki w wielu zastosowaniach informatycznych, unikając typowych błędów logicznych i zakresowych w programowaniu.

Pytanie 37

Przedstawione w filmie działania wykorzystują narzędzie

A. generatora GUI przekształcającego kod do języka XAML
B. generatora kodu java
C. kompilatora dla interfejsu graficznego
D. debuggera analizującego wykonujący kod
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 38

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

Termin ryzyko zawodowe odnosi się do

A. efektów zagrożeń wypadkowych, jakie występują w miejscu zatrudnienia
B. zagrożenia wypadkowego, które może wystąpić w miejscu pracy
C. prawdopodobieństwa, że zdarzenia niepożądane związane z pracą spowodują straty, w szczególności negatywne skutki zdrowotne dla pracowników
D. ciężkości skutków niepożądanych zdarzeń związanych z pracą
Pojęcie ryzyka zawodowego w branży BHP jest dość precyzyjnie zdefiniowane i, moim zdaniem, bardzo praktyczne. Chodzi tu właśnie o prawdopodobieństwo, że w wyniku zdarzeń niepożądanych w pracy pojawią się straty – najczęściej w postaci szkód zdrowotnych u pracowników, ale czasem też finansowych czy środowiskowych. To nie tylko sam fakt istnienia zagrożenia, ale ocena, czy i jak bardzo ono może się zaktualizować. W praktyce, np. w branży budowlanej czy energetycznej, ocena ryzyka zawodowego to podstawa organizacji bezpiecznej pracy. W Polsce normy PN-N-18002 i wytyczne Głównego Inspektoratu Pracy jasno mówią, że trzeba analizować zarówno prawdopodobieństwo wystąpienia zagrożenia, jak i potencjalne skutki. Co ciekawe, dla różnych zawodów i stanowisk ocena tego ryzyka może wyglądać zupełnie inaczej – czasem to analiza prostych czynności, czasem złożony audyt. Najlepsze firmy nie ograniczają się do szacowania samego zagrożenia, ale regularnie aktualizują ocenę ryzyka, szkolą pracowników i wdrażają środki zapobiegawcze. Moim zdaniem bez rzetelnej oceny ryzyka nie da się realnie podnieść bezpieczeństwa pracy – to taki fundament wszystkich dalszych działań. Warto zwracać uwagę, że ryzyko zawodowe zawsze wynika z kombinacji zagrożenia i prawdopodobieństwa, a nie tylko z obecności niebezpieczeństwa czy dotychczasowych wypadków.

Pytanie 40

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

A. Component Isolation/Component Deployment - izolacja i wdrażanie komponentów aplikacji
B. Ciągła integracja i ciągłe dostarczanie - praktyki automatyzujące proces wdrażania kodu
C. Customer Interface/Customer Design - projektowanie interfejsów zorientowane na klienta
D. Code Implementation/Code Delivery - metodyka implementacji i dostarczania kodu
CI/CD, czyli ciągła integracja i ciągłe dostarczanie, to zbiór praktyk i narzędzi stosowanych w rozwoju oprogramowania w celu automatyzacji procesów budowy, testowania i wdrażania aplikacji. CI polega na regularnym integrowaniu kodu do wspólnego repozytorium, co pozwala na wczesne wykrywanie błędów i konfliktów. Umożliwia to zespołom deweloperskim wykrywanie problemów w kodzie na wczesnym etapie, co znacząco przyspiesza cykl rozwoju. CD natomiast odnosi się do automatyzacji procesu wdrażania aplikacji na środowiska produkcyjne, co minimalizuje czas potrzebny na dostarczenie nowych funkcji do użytkowników. Przykłady praktycznego zastosowania CI/CD obejmują użycie narzędzi takich jak Jenkins, GitLab CI, czy CircleCI, które umożliwiają automatyczne uruchamianie testów oraz wdrażanie aplikacji na różnych platformach. Dobre praktyki w CI/CD obejmują tworzenie małych i częstych aktualizacji, co pozwala na łatwiejsze zarządzanie projektami i szybsze reagowanie na potrzeby klientów.