Wyniki egzaminu

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

Egzamin zdany!

Wynik: 39/40 punktów (97,5%)

Wymagane minimum: 20 punktów (50%)

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

Która metoda cyklu życia komponentu w React.js jest wywoływana tuż po zamontowaniu komponentu w DOM?

A. componentWillUnmount()
B. componentDidMount()
C. componentDidUpdate()
D. componentWillMount()
Odpowiedź 'componentDidMount()' jest poprawna, ponieważ jest to metoda cyklu życia komponentu w React, która jest wywoływana tuż po zamontowaniu komponentu w DOM. To oznacza, że w tym momencie komponent jest już dostępny w drzewie DOM i możemy bezpiecznie wykonywać operacje, które wymagają dostępu do elementów DOM. Przykładem zastosowania tej metody może być wykonywanie zapytań do API w celu pobrania danych, które następnie będą renderowane w komponencie. Dobrą praktyką jest umieszczanie logiki inicjalizacyjnej, takiej jak ustawienie stanu komponentu na podstawie danych z API, w tej metodzie, co pozwala na odpowiednie zarządzanie cyklem życia komponentu. Dodatkowo, 'componentDidMount()' jest także idealnym miejscem do dodawania subskrypcji do zewnętrznych źródeł danych, takich jak sockety lub WebSocket, co również wymaga, aby komponent był zamontowany. Warto pamiętać, że metody cyklu życia są kluczowym elementem architektury React i mają istotny wpływ na wydajność oraz czytelność kodu.

Pytanie 2

Jak wygląda kod uzupełnienia do dwóch dla liczby -5 w formacie binarnym przy użyciu 8 bitów?

A. 11111101
B. 10000101
C. 00000101
D. 11111011
Aby obliczyć kod uzupełnieniowy do dwóch dla liczby -5 w zapisie binarnym na 8 bitach, należy najpierw przedstawić liczbę 5 w postaci binarnej, co daje 00000101. Zgodnie z zasadą uzupełnienia do dwóch, aby uzyskać reprezentację liczby ujemnej, najpierw inwertujemy wszystkie bity tej liczby. Inwersja 00000101 prowadzi do 11111010. Następnie dodajemy 1 do wyniku inwersji: 11111010 + 1 = 11111011. Ostatecznie, kod uzupełnieniowy do dwóch dla -5 na 8 bitach to 11111011. Ta metoda jest powszechnie stosowana w systemach komputerowych i umożliwia efektywne operacje arytmetyczne na liczbach całkowitych, w tym na liczbach ujemnych, co jest kluczowe w kontekście programowania i projektowania systemów. Warto zaznaczyć, że standardy takie jak IEEE 754 definiują zasady reprezentacji liczb zmiennoprzecinkowych, ale w przypadku liczb całkowitych, kod uzupełnieniowy do dwóch pozostaje standardem w większości architektur komputerowych.

Pytanie 3

Którą konwencję nazewnictwa najczęściej stosuje się w JavaScript?

A. kebab-case
B. PascalCase
C. camelCase
D. snake_case
CamelCase to konwencja nazewnictwa, która jest powszechnie stosowana w JavaScript, szczególnie w kontekście definiowania zmiennych i funkcji. W tej metodzie, każde nowe słowo zaczyna się dużą literą, co czyni tekst bardziej czytelnym. Przykładami mogą być zmienne takie jak `userName` czy `getUserInfo`, gdzie pierwsza część jest zapisana małymi literami, a każde kolejne słowo zaczyna się od dużej litery. Stosowanie camelCase jest zgodne z przyjętymi standardami i dobrymi praktykami w Javascript, gdzie wskazano, że zmienne i funkcje powinny być nazwane w sposób, który jasno określa ich przeznaczenie. Dzięki temu, kod staje się bardziej zrozumiały i łatwiejszy do utrzymania. Warto również zauważyć, że wiele z popularnych bibliotek i frameworków JavaScript, takich jak React czy Angular, również korzysta z tej konwencji, co sprawia, że jest to umiejętność niezbędna dla każdego programisty JavaScript. Dobrą praktyką jest również przestrzeganie tej konwencji w nazwach klas i obiektów, co further enhances readability and maintainability of the code.

Pytanie 4

W wyniku realizacji zaprezentowanego kodu na ekranie pojawią się:

int tablica[10];

for (int i = 0; i < 10; i++) {
    if (i % 3 != 0)
        std::cout << tablica[i] << ", ";
}
A. wszystkie elementy tablicy, które są wielokrotnością 3
B. elementy tablicy o indeksach: 1, 2, 4, 5, 7, 8
C. elementy z indeksów tablicy, które są podzielne przez 3
D. wszystkie elementy tablicy, które mają wartość nieparzystą
W tym zadaniu najważniejsze było zrozumienie warunku if oraz sposobu działania instrukcji for. Kod przechodzi po wszystkich elementach tablicy o 10 pozycjach, ale wyświetla tylko te, dla których indeks nie jest podzielny przez 3. Sprawdzenie tego realizuje się przez resztę z dzielenia: i % 3 != 0. Czyli dla i=0,3,6,9 warunek nie zostanie spełniony, więc te elementy zostaną pominięte. Zostaną więc wyświetlone elementy o indeksach 1, 2, 4, 5, 7, 8. To jest bardzo popularny patent w programowaniu, kiedy chcemy pominąć pewne elementy w tablicy lub kolekcji na podstawie prostego warunku logicznego. Często używa się podobnych konstrukcji przy analizie danych, np. przy wykluczaniu co któregoś rekordu z przetwarzania, czy też przy operacjach na grafach lub macierzach. Moim zdaniem warto zapamiętać taki sposób sprawdzania, bo pozwala pisać kod bardziej czytelny i łatwy do modyfikacji. Z mojego doświadczenia, gdy programuje się coś na konkursy albo optymalizuje zadania, takie triki z modulo przyspieszają proces myślowy. Dodam jeszcze, że domyślne wartości w tablicy typu int nie są zainicjalizowane, więc wynik jest zależny od środowiska, ale w tym pytaniu chodzi tylko o indeksy, nie wartości.

Pytanie 5

Która z wymienionych zasad jest istotna dla bezpiecznego użytkowania portali społecznościowych?

A. Unikanie stosowania silnych haseł do konta
B. Udostępnianie jak największej ilości informacji osobowych
C. Zgłaszanie treści, które naruszają regulamin
D. Regularne kontrolowanie ustawień prywatności
Regularne sprawdzanie ustawień prywatności jest kluczowym aspektem bezpiecznego korzystania z portali społecznościowych, ponieważ to właśnie te ustawienia decydują o tym, jakie informacje udostępniamy innym użytkownikom. Użytkownicy powinni być świadomi, że domyślne ustawienia prywatności często są skonfigurowane w sposób, który umożliwia szeroką dostępność ich danych osobowych. Przykładowo, wiele platform społecznościowych domyślnie ustawia profile jako publiczne, co oznacza, że każdy może zobaczyć ich zawartość. Zmieniając te ustawienia, użytkownicy mogą ograniczyć widoczność swoich postów, zdjęć, a także informacji osobistych tylko do wybranej grupy osób, co znacząco zwiększa ich bezpieczeństwo. Warto także regularnie aktualizować te ustawienia, ponieważ platformy często wprowadzają nowe funkcje, które mogą zmieniać domyślne zasady dotyczące prywatności. Zgodnie z wytycznymi RODO oraz innymi standardami ochrony danych osobowych, użytkownicy mają prawo do kontrolowania swoich informacji, co czyni regularne sprawdzanie ustawień prywatności nie tylko zaleceniem, ale również obowiązkiem każdego świadomego użytkownika internetu.

Pytanie 6

Który z objawów może sugerować zawał serca?

A. Ból brzucha po spożyciu posiłku
B. Spadek nastroju
C. Intensywny ból w klatce piersiowej promieniujący do lewej ręki
D. Gorączka oraz dreszcze
Silny ból w klatce piersiowej promieniujący do lewej ręki to klasyczny objaw zawału serca (ostrego zespołu wieńcowego). Ból ten często pojawia się nagle, jest intensywny, gniotący lub piekący i może towarzyszyć mu duszność, zawroty głowy, zimne poty i nudności. Zawał serca wynika z zablokowania jednej z tętnic wieńcowych, co prowadzi do niedokrwienia mięśnia sercowego. Szybka reakcja i wezwanie pomocy medycznej mogą uratować życie i zminimalizować uszkodzenia serca. Każda minuta jest kluczowa – nie należy czekać na ustąpienie objawów, lecz natychmiast zadzwonić na numer alarmowy 112 lub udać się do najbliższego szpitala.

Pytanie 7

Jak najlepiej przełożyć oczekiwania klienta na dokumentację techniczną dla programistów?

A. Tworząc szczegółowy dokument z funkcjami oraz wymaganiami technicznymi
B. Opracowując wizualne makiety bez dokładnych opisów
C. Pomijając szczegółowe wymagania techniczne
D. Rozmawiając wyłącznie z zespołem programistów
Sporządzenie szczegółowego dokumentu z funkcjami i wymaganiami technicznymi to najlepszy sposób na przełożenie wymagań klienta na specyfikację techniczną. Dokumentacja techniczna jest podstawą do stworzenia aplikacji zgodnej z oczekiwaniami klienta i pozwala na precyzyjne określenie zakresu prac. Zawiera ona opisy funkcjonalności, diagramy architektury, wymagania dotyczące wydajności oraz harmonogram wdrożenia, co minimalizuje ryzyko błędów i nieporozumień podczas realizacji projektu.

Pytanie 8

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

A. Gdy poszkodowany nie oddycha
B. Gdy poszkodowany cierpi na krwotok zewnętrzny
C. Gdy poszkodowany jest świadomy, lecz ma uraz kończyny
D. Gdy poszkodowany jest nieprzytomny, ale oddycha
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 9

Na równoważnych pod względem funkcjonalnym listingach fragmentów aplikacji Angular oraz React.js utworzono listę punktowaną, która zawiera:

Definicja typu:

books = ["Harry Potter", "Hobbit", "Władca pierścieni"];

Kod Angular:
<ul>
    <li *ngFor = "let book of books"> {{book}} </li>
</ul>

Kod React.js:
<ul>
    {this.books.map(book => <li key={book}> book </li>)}
</ul>
A. Wyłącznie jeden element o treści Harry Potter, Hobbit, Władca pierścieni.
B. Jedynie jeden element o treści Harry Potter.
C. Taką liczbę elementów, ile znajduje się w tablicy books; w każdym punkcie listy umieszczony jest jeden element tablicy.
D. Tyle elementów, ile znajduje się w tablicy books; w każdym punkcie listy widnieje element o treści {book}.
Dokładnie tak właśnie działa iteracja po tablicy w Angularze i React.js. Zarówno Angularowy *ngFor, jak i funkcja map() w Reactcie to narzędzia do dynamicznego generowania elementów listy na podstawie danych z tablicy – w tym przypadku books. Każdy element tablicy tworzy osobny <li>, a więc liczba elementów na stronie zawsze odpowiada długości tablicy. To jest bardzo praktyczne, bo pozwala wyświetlać listy o dowolnej długości, zależnie od zawartości danych, bez przepisywania kodu – wystarczy zmienić dane źródłowe. W Angularze taki sposób budowania widoków jest zgodny z podejściem deklaratywnym – opisujesz, co ma się pojawić, a nie jak dokładnie to zrobić krok po kroku. React „mapuje” dane na elementy JSX, przy okazji warto pamiętać o kluczach (key), bo to pomaga w optymalizacji pracy wirtualnego DOM-u. Takie podejście to dzisiaj absolutny standard w branży – ułatwia utrzymanie kodu, testy i reużywalność komponentów. Moim zdaniem, kiedy raz się to opanuje, ciężko wyobrazić sobie inne podejście do budowy dynamicznych interfejsów. Zauważ, że każdy <li> wyświetla dokładny tekst z tablicy, a nie jakieś szablony czy placeholdery – to bardzo czytelne i naturalne dla użytkownika. W realnych projektach często tak renderuje się np. listy produktów, komentarzy czy zadań do wykonania. Dodatkowo, jeśli zmodyfikujesz tablicę, to widok automatycznie się odświeży – nie musisz ręcznie aktualizować DOM. To ogromne ułatwienie i podstawa nowoczesnego frontendu.

Pytanie 10

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

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

Pytanie 11

Który z wymienionych typów danych należy do typu logicznego?

A. char
B. int
C. bool
D. float
Typ danych 'bool' (boolean) jest typem logicznym, który przechowuje jedną z dwóch wartości: 'true' lub 'false'. Typy logiczne są nieodłącznym elementem programowania, ponieważ umożliwiają implementację warunków i pętli sterujących przepływem programu. Typ 'bool' znajduje zastosowanie w praktycznie każdym języku programowania, w tym C++, Java, Python i C#. Operacje logiczne, takie jak 'AND', 'OR' i 'NOT', opierają się na wartościach typu 'bool', co czyni je podstawą dla algorytmów decyzyjnych i strukturalnych. Zastosowanie typów logicznych zwiększa czytelność kodu i pozwala na efektywne zarządzanie warunkami logicznymi.

Pytanie 12

W sekcji, która odpowiada za obsługę wyjątku wygenerowanego przez aplikację, należy to zdefiniować

A. throw
B. catch
C. try
D. finally
Sekcja catch jest dokładnie tą częścią bloku obsługi wyjątków, która przechwytuje wyjątki wygenerowane w sekcji try. Moim zdaniem to podstawowa rzecz, którą musi znać każdy programista, bo obsługa wyjątków to codzienność, zwłaszcza jak pracuje się z zewnętrznymi bibliotekami czy systemami operacyjnymi. W praktyce catch pozwala nam napisać kod, który zareaguje na konkretne typy błędów, np. wyświetli komunikat użytkownikowi albo zapisze log do pliku. Warto też pamiętać o dobrych praktykach – nie łap wszystkich wyjątków jednym ogólnym catch, bo łatwo wtedy ukryć poważniejsze błędy. Lepiej tworzyć osobne sekcje catch dla różnych typów wyjątków. Przykład z życia: kiedy czytasz plik z dysku, może wystąpić FileNotFoundException lub IOException – można wtedy każdy z tych przypadków obsłużyć osobno. Standardy programowania, zwłaszcza w językach takich jak Java czy C#, wyraźnie zalecają stosowanie catch do obsługi określonych i przewidywalnych wyjątków, a nie do łapania wszystkiego na ślepo. Fajnie też podkreślić, że w niektórych językach catch może przyjmować różne formy, np. except w Pythonie, ale logika pozostaje podobna. Cały blok try-catch sprawia, że program jest bardziej odporny na nieoczekiwane sytuacje – dla mnie to podstawa solidnego kodu.

Pytanie 13

Co oznacza skrót CSRF w kontekście bezpieczeństwa aplikacji webowych?

A. Cross-Site Response Filter
B. Cross-Site Request Forgery
C. Client-Side Rendering Framework
D. Cascading Style Rendering Form
CSRF, czyli Cross-Site Request Forgery, to typ ataku, który wykorzystuje zaufanie użytkownika do witryny internetowej. Atakujący może skłonić ofiarę do wysłania niezamierzonego żądania do innej witryny, na przykład za pomocą osadzonego linku w e-mailu lub w złośliwej stronie. W ten sposób można wykonać nieautoryzowane akcje, takie jak zmiana ustawień konta, przelewy finansowe czy inne działania, które powinny być chronione. Aby zabezpieczyć aplikacje przed tym rodzajem ataku, stosuje się różne techniki, takie jak tokeny CSRF, które są weryfikowane przy każdym żądaniu. W praktyce oznacza to, że aplikacja generuje unikalny token dla każdej sesji użytkownika, a ten token musi być dołączony do każdego żądania modyfikującego dane. Warto pamiętać o tym, że nie tylko same aplikacje, ale i przeglądarki muszą mieć odpowiednią konfigurację, aby skutecznie zapobiegać tego typu atakom, co jest zgodne z najlepszymi praktykami bezpieczeństwa w branży. Znajomość CSRF jest kluczowa dla każdego programisty czy specjalisty ds. bezpieczeństwa, ponieważ pozwala na skuteczne zabezpieczanie aplikacji webowych i chronienie danych użytkowników.

Pytanie 14

Jakie informacje mogą być zapisywane w cookies przeglądarki?

A. Preferencje użytkownika, takie jak język lub styl strony
B. Kod źródłowy aplikacji internetowej
C. Dane przechowywane w systemie baz danych
D. Prywatne dane użytkownika, na przykład hasła
Preferencje użytkownika, takie jak język strony, motyw kolorystyczny lub preferencje dotyczące układu, są typowymi danymi przechowywanymi w ciasteczkach przeglądarki. Mechanizm ciasteczek pozwala na personalizację doświadczenia użytkownika i jest szeroko stosowany w aplikacjach webowych w celu dostosowania interfejsu do indywidualnych potrzeb. Cookies umożliwiają także zapamiętywanie sesji użytkownika, co pozwala uniknąć konieczności wielokrotnego logowania. Informacje te są przechowywane lokalnie w przeglądarce użytkownika i mogą być odczytywane przez aplikację podczas każdej wizyty. Stosowanie ciasteczek zgodnie z przepisami, takimi jak RODO (GDPR), wymaga informowania użytkownika o ich przeznaczeniu oraz uzyskiwania jego zgody na ich przechowywanie, co zapewnia transparentność i zgodność z prawem.

Pytanie 15

Jakie jest podstawowe zadanie funkcji zaprzyjaźnionej w danej klasie?

A. Umożliwienie funkcji dostępu do prywatnych atrybutów klasy
B. Generowanie kopii pól obiektu w innej klasie
C. Dodawanie nowych instancji do klasy
D. Ograniczenie widoczności atrybutów klasy
Funkcja zaprzyjaźniona umożliwia dostęp do prywatnych i chronionych składowych klasy, z którą jest zaprzyjaźniona. To mechanizm, który pozwala na utrzymanie hermetyzacji, jednocześnie umożliwiając wybranym funkcjom lub klasom bezpośredni dostęp do wewnętrznych danych innej klasy. Funkcje zaprzyjaźnione często są stosowane do operacji, które wymagają dostępu do wewnętrznych danych klasy, ale nie powinny być jej metodami, np. operacje arytmetyczne lub porównawcze na obiektach tej klasy.

Pytanie 16

Podczas programowania kontrolki stepper przedstawionej na ilustracji w aplikacji mobilnej, należy zarządzać zmienną, która zawsze przechowuje jej bieżącą wartość. Jakie zdarzenie można wykorzystać do osiągnięcia tej funkcjonalności?

Ilustracja do pytania
A. ValueChanged
B. DescendantAdded
C. SizeChanged
D. Unfocused
Zdarzenie ValueChanged jest kluczowe w kontekście programowania kontrolek takich jak stepper w aplikacjach mobilnych. To zdarzenie jest wywoływane zawsze, gdy wartość kontrolki zostaje zmieniona przez użytkownika, co umożliwia natychmiastowe przetwarzanie tej zmiany i aktualizację interfejsu użytkownika lub innych powiązanych komponentów. W praktyce, użycie zdarzenia ValueChanged to dobry przykład reaktywnego programowania, gdzie aplikacja reaguje na akcje użytkownika w czasie rzeczywistym. Przy implementacji takiego zdarzenia należy zadbać o poprawne sprawdzanie zakresu wartości, aby uniknąć błędów logicznych. Warto również pamiętać o optymalizacji wydajności takiej obsługi, zwłaszcza w aplikacjach złożonych z wielu komponentów zależnych od wartości steppera. Praktyczne zastosowanie tego zdarzenia można znaleźć w aplikacjach e-commerce, gdzie steppery mogą być używane do wyboru ilości produktów w koszyku, a zmiana wartości natychmiast wpływa na obliczenie ceny całkowitej. Używanie zdarzeń takich jak ValueChanged jest zgodne z dobrymi praktykami projektowania interfejsów użytkownika, poprawiając ich responsywność i interaktywność.

Pytanie 17

Programista pragnie wybrać algorytm, który najszybciej przetwarza dane w jego aplikacji. Na podstawie złożoności obliczeniowej przedstawionej w tabeli, należy wskazać algorytm numer

Algorytm 1O(n²)
Algorytm 2O(n!)
Algorytm 3O(n³)
Algorytm 4O(n)
Algorytm 5O(n²)
A. 4
B. 1 lub 5
C. 3
D. 2 lub 3
Wybierając algorytm o najniższej złożoności obliczeniowej, zawsze warto patrzeć na oznaczenia w notacji dużego O. O(n) oznacza, że czas wykonywania algorytmu rośnie liniowo wraz z rozmiarem danych wejściowych. To zdecydowanie najlepszy wynik z dostępnych, szczególnie jeśli porównać do O(n²), O(n³) albo już totalnie niepraktycznego przy większych n: O(n!). Dlatego Algorytm 4, który ma złożoność O(n), to najrozsądniejszy wybór, jeśli zależy nam na szybkości działania programu. Z mojego doświadczenia, właśnie takie algorytmy są wykorzystywane np. do przetwarzania dużych zbiorów danych w aplikacjach webowych albo w sytuacjach, gdzie liczy się czas odpowiedzi dla użytkownika końcowego. W branży IT, jeśli tylko można zejść poniżej złożoności kwadratowej – raczej zawsze warto to zrobić. Oczywiście, sama złożoność to nie wszystko – czasem prostszy, liniowy algorytm może mieć duże stałe ukryte w implementacji, ale w praktyce O(n) to standard optymalny. Warto też pamiętać, że w rekrutacjach często padają pytania o takie porównania złożoności, bo to podstawowa wiedza każdego programisty. Takie podejście pozwala budować skalowalne systemy, które nie „duszą się” przy większej ilości danych. Moim zdaniem, to jedna z tych rzeczy, które naprawdę się przydają w codziennej pracy.

Pytanie 18

W jaki sposób procesor nawiązuje komunikację z pamięcią podręczną (cache)?

A. Za pomocą systemu przerwań
B. Używając wyłącznie pamięci RAM
C. Bezpośrednio, omijając mostki systemowe
D. Poprzez linie danych w magistrali systemowej
Procesor komunikuje się z pamięcią podręczną (cache) za pomocą linii danych w magistrali systemowej, co jest kluczowym elementem architektury komputerowej. Magistrala systemowa to zestaw ścieżek, które umożliwiają przesyłanie danych pomiędzy różnymi komponentami systemu, w tym procesorem, pamięcią RAM oraz pamięcią podręczną. Pamięć podręczna działa jako bufor, który przechowuje najczęściej używane dane, co pozwala na znaczne zwiększenie szybkości operacji, ponieważ dostęp do pamięci cache jest znacznie szybszy niż dostęp do pamięci RAM. W standardach takich jak Intel's QuickPath Interconnect (QPI) czy AMD's HyperTransport, linie danych odgrywają kluczową rolę w efektywnej komunikacji, co przekłada się na ogólną wydajność systemu. Przykładowo, w nowoczesnych procesorach wielordzeniowych, każda rdzeń może mieć własną pamięć podręczną, a komunikacja za pomocą magistrali pozwala na synchronizację danych pomiędzy tymi rdzeniami oraz współdzielenie zasobów. Efektywne zarządzanie pamięcią podręczną i magistralą jest kluczowe dla osiągnięcia wysokiej wydajności w obliczeniach oraz przetwarzaniu danych.

Pytanie 19

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

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

Pytanie 20

Który z przedstawionych poniżej przykładów ilustruje prawidłową deklarację zmiennej typu całkowitego w języku C++?

A. bool liczba;
B. float liczba;
C. char liczba;
D. int liczba;
W języku C++ zmienna typu całkowitego jest deklarowana za pomocą słowa kluczowego `int`. Przykładowa poprawna deklaracja to `int liczba;`, co oznacza, że `liczba` jest zmienną, która może przechowywać wartości całkowite, takie jak 1, 42 lub -15. Deklarowanie zmiennych w C++ pozwala na statyczne typowanie, co oznacza, że każda zmienna ma określony typ i nie może przechowywać wartości innego typu. Dzięki temu kod jest bardziej przejrzysty i mniej podatny na błędy związane z niezgodnością typów.

Pytanie 21

Wskaż język programowania, który pozwala na stworzenie aplikacji mobilnej w środowisku Android Studio?

A. C++
B. Swift
C. Java
D. Objective-C
Java to jeden z podstawowych języków programowania używanych do tworzenia aplikacji mobilnych na platformę Android. Jest to język, który został stworzony przez firmę Sun Microsystems, a jego pierwsza wersja została wydana w 1995 roku. Java charakteryzuje się silnym typowaniem, obiektowością oraz wsparciem dla programowania wielowątkowego, co czyni go idealnym do tworzenia wydajnych aplikacji mobilnych. Android Studio, oficjalne zintegrowane środowisko programistyczne (IDE) dla Androida, oferuje pełne wsparcie dla Javy, w tym możliwość korzystania z bibliotek Android SDK. Dzięki temu programiści mogą łatwo tworzyć interfejsy użytkownika, zarządzać zasobami oraz implementować logikę aplikacji. Przykładowo, pisząc aplikację do zarządzania zadaniami, programista może użyć Javy do stworzenia klas modelujących zadania oraz do obsługi interfejsu graficznego z wykorzystaniem XML i Java. Ponadto, Java jest zgodna z zasadami programowania obiektowego, co pozwala na łatwe zarządzanie kodem i jego ponowne wykorzystanie. Warto również zaznaczyć, że Java jest wspierana przez dużą społeczność, co zapewnia bogaty ekosystem bibliotek oraz narzędzi, ułatwiających rozwój aplikacji na Androida.

Pytanie 22

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

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

Pytanie 23

Co to jest Docker?

A. Framework do tworzenia aplikacji mobilnych
B. Narzędzie do testowania wydajności aplikacji webowych
C. System zarządzania bazami danych NoSQL
D. Platforma do tworzenia, wdrażania i uruchamiania aplikacji w kontenerach
Docker jest platformą do tworzenia, wdrażania i uruchamiania aplikacji w kontenerach, co oznacza, że umożliwia programistom izolowanie aplikacji oraz ich zależności w samodzielne jednostki, niezależne od środowiska, w którym są uruchamiane. Dzięki konteneryzacji, aplikacje działają zgodnie w różnych środowiskach, co znacząco upraszcza procesy związane z wdrażaniem i zarządzaniem. Przykładowo, z wykorzystaniem Dockera, programiści mogą stworzyć kontener z aplikacją webową, a następnie wdrożyć go na serwerze produkcyjnym, nie obawiając się, że aplikacja nie zadziała z powodu różnic w konfiguracjach systemu operacyjnego. Ponadto, Docker wspiera DevOps, co jest zgodne z obecnymi trendami w inżynierii oprogramowania, promując podejście Continuous Integration/Continuous Deployment (CI/CD). Używanie Dockera zwiększa efektywność pracy zespołów deweloperskich oraz ułatwia zarządzanie infrastrukturą, co jest istotne w kontekście dużych projektów. Dodatkowo, wspiera on standardy branżowe, takie jak microservices, które ze względu na swoje zalety są szeroko stosowane w nowoczesnych architekturach aplikacyjnych.

Pytanie 24

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. Niepoprawnym użyciu funkcji cout, co skutkuje tym, że zmienna jest wczytywana w pętli.
B. Braku zainicjowania zmiennej x, co powoduje, że zmienna nie ma wartości początkowej.
C. Nieprawidłowym warunku pętli, który sprawia, że pętla jest nieskończona.
D. Niewłaściwym warunku pętli, co powoduje, że pętla nigdy się nie wykona.
Nieprawidłowy warunek pętli powoduje, że staje się ona nieskończona, co jest częstym problemem w programowaniu. W tym przypadku warunek while(x != 0 || x != 5) jest zawsze prawdziwy, ponieważ dla każdej wartości x, która nie jest jednocześnie równa 0 i 5, pętla nigdy się nie zakończy. To logiczny błąd, ponieważ zmienna x nigdy nie osiągnie stanu, w którym oba warunki będą jednocześnie fałszywe. W praktyce powinno się stosować warunki logiczne, które mogą stać się fałszywe dla jakiegoś stanu zmiennych, co pozwala pętli zakończyć działanie. Częstym wzorcem jest użycie operatora && zamiast ||, aby sprawdzić, czy zmienna osiągnęła konkretny zakres wartości. W ten sposób można zagwarantować, że program nie wejdzie w nieskończoną pętlę. Tego typu błędy są często wykrywane podczas testowania i debugowania kodu, a ich unikanie jest kluczowe w zapewnieniu poprawnego działania aplikacji. Dobre praktyki obejmują dokładne przemyślenie warunków pętli i testowanie ich w różnych scenariuszach.

Pytanie 25

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

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

Pytanie 26

Mobilna aplikacja przedstawia listę, w której każdy element można dotknąć palcem, aby zobaczyć jego detale. Zdarzenie, które odpowiada tej czynności, to

A. toggled.
B. value changed.
C. tapped.
D. button clicked.
Zdarzenie 'tapped' oznacza, że stuknęliśmy w coś na liście na naszym telefonie. To takie podstawowe zdarzenie, które przydaje się w aplikacjach mobilnych. Dzięki temu możemy wchodzić w interakcje z różnymi elementami, na przykład, gdy klikniemy na coś w liście, pojawią się dodatkowe szczegóły. Ta obsługa zdarzeń 'tap' jest naprawdę ważna w aplikacjach mobilnych, bo to w zasadzie główny sposób, w jaki poruszamy się po interfejsie.

Pytanie 27

Która funkcja z biblioteki jQuery w JavaScript służy do naprzemiennego dodawania oraz usuwania klasy z elementu?

A. .bingClass()
B. .toggleClass()
C. .changeClass()
D. .switchClass()
Wybrałeś .toggleClass() i to jest strzał w dziesiątkę pod względem praktycznego stosowania jQuery. Funkcja .toggleClass() dokładnie odpowiada na potrzebę dynamicznej zmiany wyglądu elementu — pozwala jednym wywołaniem dodać klasę, jeśli jej nie ma, albo usunąć, jeśli już istnieje. To niesamowicie przydatne, zwłaszcza przy tworzeniu efektów interaktywnych, takich jak menu rozwijane, animacje kliknięcia, czy zmiany stanów przycisków. W praktyce wygląda to często tak: $('div').toggleClass('active'), gdzie po każdym kliknięciu div otrzymuje lub traci klasę 'active'. Warto zauważyć, że .toggleClass() obsługuje też opcjonalny drugi argument typu boolean, więc możesz wymusić dodanie lub usunięcie klasy zależnie od logiki — to takie jQuery’owe „sprytne przełączanie”. Z mojego doświadczenia, ta metoda jest zdecydowanie jednym z fundamentów, kiedy chodzi o szybkie prototypowanie i pisanie kodu front-endowego zgodnego z zasadami DRY (Don’t Repeat Yourself). Dobrą praktyką jest też, żeby nie nadużywać tej funkcji do zbyt skomplikowanych operacji, bo wtedy łatwo się pogubić w logice klas CSS. No i jak patrzę na projekty w branży, to .toggleClass() jest stosowane praktycznie wszędzie tam, gdzie chodzi o responsywną zmianę interfejsu klienta bez potrzeby pisania rozbudowanego JavaScriptu.

Pytanie 28

W zaprezentowanym kodzie stworzono abstrakcyjną klasę figura oraz klasę prostokąta, która dziedziczy po niej, zawierającą zdefiniowane pola i konstruktory. Wskaż minimalną wersję implementacji sekcji /* metody klasy */ dla klasy Prostokat:

abstract class Figura
{
    abstract double Pole();
    abstract double Obwod();
}

public class Prostokat extends Figura
{
    private double a;
    private double b;

    ... /* Konstruktory */
    ... /* Metody klasy */
}
AB
public double Pole() {
    return a * b;
}

public double Obwod() {
    return 2*a + 2*b;
}
public double Pole() {
    return a * b;
}
CD
public double LiczPole()
{
    return a * b;
}

public double LiczObwod()
{
    return 2*a + 2*b;
}
abstract double Pole()
{
    return a * b;
}

abstract double LiczObwod()
A. C
B. A
C. B
D. D
Analizując pozostałe propozycje implementacji, łatwo zauważyć pewne typowe błędy, które pojawiają się podczas pracy z dziedziczeniem i klasami abstrakcyjnymi. Przede wszystkim odpowiedzi, które pomijają implementację jednej z metod abstrakcyjnych zadeklarowanych w klasie Figura (jak w przypadku wariantu B), nie spełniają podstawowego wymogu języka Java – klasa pochodna musi zaimplementować wszystkie metody zadeklarowane jako abstract w klasie bazowej. W odpowiedzi B mamy tylko metodę Pole(), więc przy próbie kompilacji kodu pojawiłby się błąd i konieczność oznaczenia Prostokata jako klasy abstrakcyjnej, co zupełnie mija się z celem. Z kolei odpowiedź C wprowadza metody o innych nazwach (LiczPole, LiczObwod) niż te zadeklarowane w klasie Figura. To bardzo częsty błąd początkujących – niepoprawnie myślą, że wystarczy zaimplementować metody o tej samej funkcjonalności, bez zachowania ich nazw. Tymczasem kontrakt narzucony przez klasę bazową musi być spełniony dokładnie, razem z nazwami, typami argumentów i zwracanym typem. Ignorowanie tych szczegółów prowadzi do niespójności i niekompatybilności klas pochodnych. No i ostatnia propozycja – D – zawiera próbę napisania metody z modyfikatorem abstract w klasie, która już nie jest abstrakcyjna, co jest wprost błędem kompilacji. Dodatkowo, używanie abstract razem z ciałem metody jest niezgodne z językiem – metody abstrakcyjne nie mogą mieć implementacji w klasie abstrakcyjnej, a tym bardziej w pochodnej. To wszystko pokazuje, jak ważne w programowaniu obiektowym jest zrozumienie zasad dziedziczenia, poprawnego nadpisywania metod oraz konsekwentne trzymanie się sygnatur narzucanych przez klasy bazowe. Z praktyki wiem, że takie błędy potrafią zablokować rozwój projektu albo wymusić czasochłonne refaktoryzacje. Warto od początku przyzwyczaić się do czytania kodu bazowego i dokładnego kopiowania sygnatur metod – to oszczędza dużo nerwów i nieporozumień w pracy zespołowej.

Pytanie 29

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

A. 10
B. 1024
C. 100
D. 1000
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 30

Jakie środowisko developerskie służy do tworzenia aplikacji na platformę iOS?

A. XCode
B. Eclipse
C. Studio Androida
D. Visual Studio Code
XCode to oficjalne środowisko programistyczne (IDE) firmy Apple, które jest wykorzystywane do tworzenia aplikacji na systemy iOS, macOS, watchOS i tvOS. XCode oferuje pełne wsparcie dla języków Swift i Objective-C oraz narzędzia do projektowania interfejsów użytkownika (Storyboard), debugowania aplikacji, testowania wydajności i optymalizacji kodu. XCode posiada także symulatory urządzeń Apple, co umożliwia testowanie aplikacji na różnych modelach iPhone’ów, iPadów oraz Apple Watch. XCode jest niezbędnym narzędziem dla deweloperów tworzących aplikacje na ekosystem Apple i pozwala na łatwą publikację aplikacji w App Store.

Pytanie 31

Którego nagłówka używamy w C++ do obsługi plików?

A. <stdio.h>
B. <iostream>
C. <fstream>
D. <fileio.h>
Nagłówek '<fstream>' w języku C++ jest używany do pracy z plikami, umożliwiając odczyt i zapis danych na dysku. Biblioteka fstream udostępnia klasy 'ifstream', 'ofstream' i 'fstream', które pozwalają na operacje wejścia i wyjścia plików. 'ifstream' służy do odczytu plików, 'ofstream' do zapisu, a 'fstream' umożliwia zarówno odczyt, jak i zapis. Praca z plikami jest kluczowa w wielu aplikacjach, od prostych narzędzi do przetwarzania danych po złożone systemy zarządzania plikami i bazami danych. Dzięki 'fstream' programiści mogą efektywnie zarządzać danymi na różnych poziomach aplikacji.

Pytanie 32

Wskaż fragment kodu, który wykreuje przedstawioną kontrolkę?

Ilustracja do pytania
A. Kod2
B. Kod1
C. Kod3
D. Kod4
Odpowiednim kodem do wygenerowania przedstawionej kontrolki jest Kod3 który korzysta z klasy RatingBar w Androidzie. RatingBar to bardzo przydatny element interfejsu użytkownika pozwalający użytkownikom na ocenę w skali gwiazdek. W tym przypadku RatingBar posiada atrybut android:rating ustawiony na 2.5 co oznacza że kontrolka wyświetli dwie pełne gwiazdki i jedną połowę co odpowiada przedstawionej grafice. Dodatkowo atrybut android:progressTint ustawiony na #4682B4 zmienia kolor gwiazdek na niebieski. Użycie RatingBar jest standardową praktyką w aplikacjach mobilnych dla zbierania opinii użytkowników. Ważne jest aby pamiętać że RatingBar może być konfigurowany do obsługi różnych wartości minimalnych i maksymalnych oraz do dostosowywania wyglądu za pomocą stylów i tematów. Dobrym zwyczajem jest dbanie o czytelność i intuicyjność interfejsu co osiąga się m.in. przez odpowiednie oznaczanie i rozmieszczanie kontrolek takich jak RatingBar.

Pytanie 33

Które z wymienionych stanowi przykład struktury dziedziczenia?

A. Klasa Pojazd nie dziedziczy z żadnej klasy
B. Klasa Pojazd ma dziedziczenie od klasy Samochód
C. Klasa Samochód ma dziedziczenie od klasy Pojazd
D. Klasa Samochód i Pojazd nie są ze sobą powiązane
Hierarchia dziedziczenia to struktura klas, w której klasa pochodna dziedziczy właściwości i metody klasy bazowej. Klasa 'Samochód' dziedzicząca po klasie 'Pojazd' jest przykładem prawidłowej hierarchii dziedziczenia – klasa 'Samochód' rozszerza klasę 'Pojazd', dziedzicząc ogólne właściwości pojazdu, takie jak prędkość czy typ silnika. Dziedziczenie umożliwia rozszerzanie istniejącej funkcjonalności bez konieczności przepisywania tego samego kodu, co jest jednym z fundamentów programowania obiektowego.

Pytanie 34

Która z poniższych technologii nie jest używana do tworzenia aplikacji mobilnych?

A. Kotlin
B. React Native
C. COBOL
D. Flutter
COBOL, czyli Common Business Oriented Language, jest językiem programowania opracowanym w latach 50. XX wieku, głównie do zastosowań w administracji i biznesie, takich jak systemy bankowe czy zarządzanie danymi. Nie jest on przeznaczony do tworzenia aplikacji mobilnych, które wymagają nowoczesnych technologii i frameworków dostosowanych do dynamicznego rozwoju rynku. W przeciwieństwie do Kotlin, React Native i Flutter, które są współczesnymi technologiami umożliwiającymi tworzenie aplikacji mobilnych, COBOL nie posiada narzędzi ani bibliotek, które wspierałyby rozwój aplikacji na systemy iOS czy Android. W praktyce, programiści wykorzystujący te nowoczesne technologie, mogą tworzyć aplikacje, które są responsywne i działają płynnie na różnych urządzeniach mobilnych, co znacząco wpływa na doświadczenia użytkowników. Warto zatem znać różnice między tymi technologiami, aby dobrze zrozumieć, jakie języki i narzędzia są adekwatne do danego projektu.

Pytanie 35

Jakie jest podstawowe zadanie firewalla w systemie komputerowym?

A. Ochrona danych na poziomie aplikacji internetowych
B. Zapobieganie wyciekom informacji na skutek awarii systemu
C. Szyfrowanie danych przesyłanych w sieci
D. Zarządzanie ruchem sieciowym i blokowanie nieautoryzowanego dostępu
Firewall to taki strażnik w sieci, który decyduje, co może wejść lub wyjść z naszego systemu. Główną jego rolą jest właśnie zarządzanie ruchem sieciowym – analizuje każde połączenie, każdy pakiet danych i na podstawie ustalonych reguł pozwala albo blokuje ruch. Z mojego doświadczenia wynika, że bez firewalla w firmowej sieci to jak zostawić otwarte drzwi na oścież, serio. To narzędzie nie tylko zatrzymuje nieautoryzowany dostęp z zewnątrz, ale czasem też może blokować ryzykowne próby połączeń wychodzących – na przykład, gdy jakiś wirus próbuje kontaktować się z serwerem złodziei danych. W praktyce najczęściej spotkasz firewalle sprzętowe w routerach firmowych oraz programowe na komputerach i serwerach. Branżowo przyjmuje się, że firewall działa na poziomie sieci (warstwa 3 i 4 modelu OSI), co jest najlepszym miejscem, żeby odsiać niepożądany ruch zanim w ogóle dotrze do cennych serwisów. Ważne jest też, że dobrze skonfigurowany firewall to podstawa każdej strategii bezpieczeństwa, zgodnie z normami ISO/IEC 27001. W sumie, moim zdaniem żaden admin nie wyobraża sobie bez niego sensownej ochrony sieci – to absolutna podstawa.

Pytanie 36

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

A. Customer Interface/Customer Design - projektowanie interfejsów zorientowane na klienta
B. Component Isolation/Component Deployment - izolacja i wdrażanie komponentów aplikacji
C. Code Implementation/Code Delivery - metodyka implementacji i dostarczania kodu
D. Ciągła integracja i ciągłe dostarczanie - praktyki automatyzujące proces wdrażania 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.

Pytanie 37

Który język programowania jest używany do stylizacji stron internetowych?

A. HTML
B. CSS
C. PHP
D. JavaScript
CSS, czyli Cascading Style Sheets, jest językiem stylizacji, który służy do opisywania wyglądu dokumentów napisanych w HTML i XML. Umożliwia on oddzielenie treści od prezentacji, co jest kluczowe w tworzeniu nowoczesnych, responsywnych i estetycznie atrakcyjnych stron internetowych. Dzięki CSS można definiować różne aspekty stylów, takie jak kolory, czcionki, marginesy, a także układ elementów na stronie. Przykładowo, za pomocą prostych reguł CSS można zmienić kolor tła na zielony, a tekst na biały, co można osiągnąć przy pomocy następującego kodu: `body { background-color: green; color: white; }`. Współczesne standardy CSS, jak CSS3, wprowadzają także zaawansowane techniki, takie jak animacje czy przejścia, co daje jeszcze większe możliwości w stylizacji stron. Ponadto, dobre praktyki obejmują użycie arkuszy stylów w zewnętrznych plikach, co pozwala na ich ponowne wykorzystanie i lepszą organizację kodu, a także ułatwia zarządzanie stylem w dużych projektach.

Pytanie 38

Co to jest wskaźnik w języku C?

A. Zmienna przechowująca wartość logiczną
B. Zmienna przechowująca adres pamięci
C. Typ danych do zapisywania tekstów
D. Funkcja do dynamicznej alokacji pamięci
Wskaźnik w języku C to zmienna przechowująca adres pamięci innej zmiennej. Umożliwia bezpośrednią manipulację pamięcią, co czyni wskaźniki niezwykle potężnym narzędziem w programowaniu niskopoziomowym. Dzięki wskaźnikom można dynamicznie alokować pamięć, przekazywać duże struktury danych do funkcji bez ich kopiowania oraz implementować struktury danych, takie jak listy, drzewa czy grafy. Wskaźniki umożliwiają także iterowanie po tablicach i efektywne zarządzanie zasobami systemowymi, co czyni je kluczowym elementem w programowaniu systemowym.

Pytanie 39

Co to jest dokumentacja instruktażowa programu?

A. Dokumentem przedstawiającym plany rozwoju oprogramowania
B. Zbiorem szczegółów technicznych dotyczących kodu źródłowego
C. Instrukcją opisującą, jak używać funkcji programu
D. Kolekcją testów jednostkowych oraz ich wyników
Instrukcja wyjaśniająca, jak korzystać z funkcji programu, to podstawowy element dokumentacji pomocy programu. Tego rodzaju dokumentacja jest skierowana do użytkowników końcowych i zawiera opisy interfejsu, funkcji oraz dostępnych narzędzi. Instrukcja użytkownika może obejmować zrzuty ekranu, filmy instruktażowe oraz FAQ (często zadawane pytania), co ułatwia szybkie wdrożenie w obsługę aplikacji. Celem dokumentacji pomocy jest nie tylko wyjaśnienie podstawowych funkcji programu, ale także zwiększenie komfortu użytkownika i minimalizacja problemów związanych z obsługą oprogramowania. Przejrzysta i dobrze napisana instrukcja wpływa na pozytywne doświadczenia użytkowników, redukując liczbę zgłoszeń do działu wsparcia technicznego.

Pytanie 40

Jakie są główne różnice między środowiskiem RAD (Rapid Application Development) a klasycznymi IDE w odniesieniu do aplikacji mobilnych?

A. RAD nie obsługuje interfejsu użytkownika
B. RAD pozwala na szybsze budowanie aplikacji dzięki narzędziom do wizualnego designu i automatycznego generowania kodu
C. RAD koncentruje się wyłącznie na procesie debugowania aplikacji
D. RAD działa tylko na urządzeniach z systemem iOS
RAD (Rapid Application Development) umożliwia szybsze tworzenie aplikacji mobilnych dzięki narzędziom do wizualnego projektowania i automatycznego generowania kodu. RAD koncentruje się na iteracyjnym podejściu do rozwoju oprogramowania, w którym prototypy są budowane i testowane w krótkich cyklach, co pozwala na szybkie dostosowywanie aplikacji do zmieniających się wymagań użytkowników. W kontekście aplikacji mobilnych, RAD skraca czas tworzenia poprzez graficzne narzędzia do budowy interfejsów, gotowe komponenty oraz integrację z backendem. Frameworki RAD, takie jak OutSystems, Mendix czy Flutter, pozwalają na szybkie wdrażanie i modyfikację aplikacji mobilnych, co znacząco zwiększa efektywność programistów.