Wyniki egzaminu

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

Egzamin zdany!

Wynik: 20/40 punktów (50,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óre z podanych logo reprezentuje narzędzie, które nie jest używane do tworzenia aplikacji mobilnych?

Ilustracja do pytania
A. 3
B. 2
C. 4
D. 1
Wybrałeś odpowiedź nr 4, czyli logo Xcode. To rzeczywiście poprawny wybór, bo Xcode to środowisko programistyczne stworzone przez Apple głównie do tworzenia aplikacji na systemy iOS, macOS, watchOS oraz tvOS. W praktyce Xcode jest praktycznie niezbędny, jeśli chodzi o natywny rozwój aplikacji mobilnych na iPhone’a czy iPada – zresztą Apple wymaga używania tego narzędzia do publikowania aplikacji w App Store. Jednak gdy spojrzymy na pozostałe loga: Android Studio (1), Xamarin (3) oraz Angular (2), to tylko Angular nie jest narzędziem do budowy natywnych aplikacji mobilnych. Angular to framework frontendowy, używany głównie do tworzenia aplikacji webowych typu SPA (Single Page Application). Oczywiście, da się użyć Angulara z Cordovą czy Ionicem, żeby zrobić hybrydową aplikację na telefon, ale to nie jest to samo, co pełnoprawny toolchain do mobilnych aplikacji natywnych. W branży panuje przekonanie, że lepiej korzystać z narzędzi dedykowanych platformie, bo to daje lepszą wydajność i stabilność, a Angular to rozwiązanie, które jest bliżej weba niż mobile. Takie rozróżnienie jest ważne zwłaszcza przy podejmowaniu decyzji o technologii przy większych projektach mobilnych.

Pytanie 2

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. 5
C. 596
D. 5.96
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 3

Która z metod zarządzania projektami jest najbardziej odpowiednia, gdy w początkowej fazie projektu zakres nie jest w pełni określony, wymagania mogą zmieniać się podczas realizacji, a także mogą wystąpić nowe potrzeby?

A. PRINCE2
B. Agile
C. Model kaskadowy
D. Model V
W praktyce zarządzanie projektem, kiedy zakres i wymagania nie są w pełni określone, wymaga podejścia elastycznego i zdolności do szybkiego reagowania na zmiany. Tradycyjne metody, takie jak PRINCE2, model V czy model kaskadowy, zawsze zakładają większy nacisk na planowanie upfront, czyli na początku projektu, gdzie cały zakres (lub jego większość) jest ustalany przed rozpoczęciem realizacji. Model kaskadowy bywa stosowany głównie w środowiskach, gdzie produkty są powtarzalne i łatwe do przewidzenia – tutaj zmiany w wymaganiach są prawie niemożliwe do wprowadzenia bez cofnięcia się do wcześniejszych etapów. Model V, często stosowany w testowaniu oprogramowania czy inżynierii systemów, również zakłada ścisłe powiązanie etapów rozwoju i testowania; bardzo trudno tu o zmianę wymagań w trakcie, bo każda poprawka oznacza powrót przez wiele faz. PRINCE2 co prawda na papierze jest elastyczny, ale w praktyce lepiej sprawdza się, gdy mamy jasno zdefiniowany projekt i dużo formalności – jego framework przewiduje „kontrolowane” zmiany, ale to nie to samo, co adaptacja w locie, jaką daje Agile. Moim zdaniem problem polega na tym, że wybór tych klasycznych podejść wynika często z przyzwyczajenia do sztywnego planowania i przeświadczenia, że lepsza dokumentacja rozwiąże wszystkie niespodzianki. Tymczasem w środowiskach, gdzie klient nagle zmienia zdanie albo pojawiają się nowe potrzeby, takie metody zawodzą, bo są zbyt oporne na zmiany. Warto pamiętać, że Agile nie jest panaceum na wszystkie projekty, ale właśnie przy niejasnych wymaganiach i bardzo zmiennych warunkach rynkowych jego iteracyjność i stały kontakt z klientem pozwalają uniknąć wielu typowych pułapek planowania z góry.

Pytanie 4

Jakie informacje można uzyskać na temat metod w klasie Point?

public class Point {
    public void Move(int x, int y) {...}
    public void Move(int x, int y, int z) {...}
    public void Move(Point newPt) {...}
}
A. Służą jako konstruktory w zależności od liczby argumentów.
B. Są przeciążone.
C. Zawierają błąd, ponieważ nazwy metod powinny być różne.
D. Zawierają przeciążenie operatora.
Metody klasy Point są przeciążone, co oznacza, że mogą mieć tę samą nazwę, ale różnią się liczbą lub typem parametrów. Przeciążenie metod to jedna z podstawowych technik programowania obiektowego, która pozwala na bardziej elastyczne projektowanie kodu. Dzięki temu programista może tworzyć metody dostosowane do różnych sytuacji, zachowując spójność nazw i intuicyjność użycia. To zwiększa czytelność i utrzymanie kodu, ponieważ wywołania metod o tej samej nazwie, ale różnych parametrach, są łatwe do zrozumienia i odnalezienia.

Pytanie 5

Jakie pola powinny być umieszczone w klasie nadrzędnej w strukturze dziedziczenia?

A. Pola, które są wykorzystywane tylko w funkcjach statycznych
B. Pola, które są charakterystyczne jedynie dla pojedynczej klasy pochodnej
C. Pola, które są wspólne dla wszystkich klas pochodnych
D. Pola, które są tylko prywatne
Pola specyficzne dla jednej klasy pochodnej nie powinny znajdować się w klasie bazowej, ponieważ zwiększałoby to złożoność i naruszało zasadę separacji odpowiedzialności. Prywatne pola są ukryte i nie są dziedziczone przez klasy pochodne – są dostępne wyłącznie w ramach klasy, w której zostały zdefiniowane. Pola używane wyłącznie w metodach statycznych nie muszą znajdować się w klasie bazowej, ponieważ są to elementy niezależne od instancji klasy i są przypisane do samej klasy, a nie jej obiektów.

Pytanie 6

Jakie z wymienionych narzędzi pozwala na jednoczesne korzystanie z systemów BIN, DEC i HEX?

A. Kalkulator systemowy
B. GIMP
C. Przeglądarka grafów
D. Microsoft Word
Kalkulator systemowy to narzędzie, które umożliwia użytkownikom pracę z różnymi systemami liczbowymi, takimi jak system dziesiętny (DEC), binarny (BIN) oraz szesnastkowy (HEX). Jego funkcjonalność pozwala na konwersję wartości liczbowych pomiędzy tymi systemami, co jest niezwykle przydatne w kontekście programowania, inżynierii komputerowej oraz nauk przyrodniczych. Dzięki kalkulatorowi systemowemu, użytkownicy mogą wprowadzać liczby w jednym systemie, a następnie uzyskiwać ich odpowiedniki w pozostałych systemach, co znacznie ułatwia analizę danych. Na przykład, wpisując liczbę w systemie binarnym, można natychmiast zobaczyć jej reprezentację w systemie dziesiętnym i szesnastkowym, co jest kluczowe w zadaniach związanych z konwersją kodów czy obliczeniami w architekturze komputerowej. Ponadto, kalkulatory systemowe często zawierają funkcje umożliwiające przeprowadzanie bardziej skomplikowanych operacji, takich jak dodawanie czy odejmowanie w różnych systemach liczbowych, co czyni je nieocenionym narzędziem w programowaniu i obliczeniach naukowych. Narzędzia te są zgodne z powszechnie przyjętymi standardami, takimi jak IEEE 754 dla reprezentacji liczb zmiennoprzecinkowych, co zapewnia ich wysoką dokładność i niezawodność w obliczeniach.

Pytanie 7

Oznaczenie ochrony przeciwpożarowej przedstawione na symbolu wskazuje na

Ilustracja do pytania
A. rozdzielnię elektryczną
B. punkt remote release
C. przełącznik zasilania
D. system alarmowy przeciwpożarowy
Ten symbol jednoznacznie wskazuje na ręczny ostrzegacz pożarowy, będący kluczowym elementem systemu alarmowego przeciwpożarowego. W praktyce taki przycisk znajdziesz w korytarzach szkół, biur czy dużych hal, zwykle przy wyjściach ewakuacyjnych. Po naciśnięciu wywołuje on alarm w całym obiekcie, pozwalając na szybką reakcję służb oraz ewakuację osób znajdujących się w strefie zagrożenia. Moim zdaniem zrozumienie działania i lokalizacji ręcznych ostrzegaczy jest absolutnie fundamentalne dla bezpieczeństwa pożarowego każdego budynku. Zgodnie z normą PN-EN 54-11 oraz wytycznymi Państwowej Straży Pożarnej, oznaczenie to musi być dobrze widoczne, z wyraźną, czerwoną barwą tła i prostym, czytelnym symbolem. Praktyka pokazuje, że w sytuacjach krytycznych ludzie dużo szybciej reagują na jednoznaczne oznaczenia graficzne niż na same napisy. Właśnie dlatego tak bardzo przykłada się wagę do poprawnej widoczności i rozmieszczenia tych znaków. Sam system alarmowy przeciwpożarowy, którego częścią są takie przyciski, jest podstawą nie tylko ochrony ludzi, ale też minimalizowania strat materialnych, bo pozwala na natychmiastowe powiadomienie odpowiednich służb. Warto zapamiętać, że ręczne ostrzegacze są regularnie testowane podczas przeglądów PPOŻ i ich prawidłowe oznakowanie to wymóg prawny oraz element dobrej praktyki branżowej.

Pytanie 8

Który z podanych algorytmów operujących na jednowymiarowej tablicy posiada złożoność obliczeniową O(n²)?

A. Sortowanie szybkie
B. Wyszukiwanie binarne
C. Sortowanie bąbelkowe
D. Wypisanie elementów
Sortowanie bąbelkowe, znane również jako bubble sort, to prosty algorytm sortowania, który działa na zasadzie wielokrotnego przechodzenia przez tablicę i porównywania sąsiadujących ze sobą elementów. Algorytm ten ma złożoność obliczeniową O(n^2), co oznacza, że w najgorszym przypadku liczba operacji porównania wzrasta kwadratowo wraz ze wzrostem liczby elementów w tablicy. Przykładowo, dla tablicy o 5 elementach algorytm może wykonać do 10 porównań. W praktyce sortowanie bąbelkowe jest rzadko stosowane w dużych zbiorach danych ze względu na swoją niską efektywność, jednak jest to dobry przykład do nauki podstaw algorytmów sortujących. Standardy algorytmów sortujących, takie jak te zawarte w podręcznikach algorytmiki, często używają sortowania bąbelkowego jako przykładu do omówienia prostych koncepcji związanych z sortowaniem. Warto zauważyć, że chociaż algorytm ten jest prosty do zrozumienia, jego złożoność czasowa sprawia, że nie jest on praktyczny do stosowania w produkcyjnych rozwiązaniach, gdyż bardziej optymalne algorytmy, jak sortowanie szybkie czy sortowanie przez scalanie, osiągają złożoność O(n log n).

Pytanie 9

Co to jest kontener Docker?

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

Pytanie 10

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

A. Narzędzie do testowania wydajności aplikacji
B. Skrypt działający w tle przeglądarki, niezależnie od strony webowej
C. Usługa hostingowa dla aplikacji webowych
D. Protokół komunikacji między przeglądarką a serwerem
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 11

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

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

Pytanie 12

Która z poniższych nie jest prawidłową metodą zarządzania stanem w React?

A. useState hook
B. Redux
C. Context API
D. React.stateManager
Odpowiedzi, które wskazałeś, takie jak Redux, Context API oraz useState hook, są w rzeczywistości powszechnie uznawanymi metodami zarządzania stanem w React. Redux, jako zewnętrzna biblioteka, usprawnia zarządzanie stanem poprzez wprowadzenie centralnego store'a, który przechowuje wszystkie dane w aplikacji. Dzięki temu, każdy komponent może subskrybować zmiany w stanie, co pozwala na prostą synchronizację danych oraz ich śledzenie. Context API jest wbudowane w React i pozwala na udostępnianie danych między komponentami bez potrzeby przekazywania propsów, co znacząco upraszcza hierarchię komponentów i poprawia ich czytelność. Hook useState natomiast, jest prostym i intuicyjnym rozwiązaniem do zarządzania lokalnym stanem w komponentach funkcyjnych, co jest szczególnie przydatne w mniejszych projektach. Zrozumienie, dlaczego te metody są uznawane za poprawne, jest kluczowe, ponieważ pozwala na efektywne zarządzanie stanem w aplikacjach React. Często błędne wnioski wynikają z nieznajomości narzędzi dostępnych w ekosystemie React lub z mylnego przekonania, że dany sposób zarządzania stanem musi być uniwersalny. W rzeczywistości, najlepsze podejście zależy od skali oraz specyfiki projektu.

Pytanie 13

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

A. C++
B. Objective-C
C. Swift
D. Java
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 14

Który z wymienionych poniżej typów danych stanowi przykład typu stałoprzecinkowego?

A. decimal
B. float
C. double
D. int
Typ 'float' przechowuje liczby zmiennoprzecinkowe, co oznacza, że może reprezentować wartości z częściami dziesiętnymi, ale nie jest to typ stałoprzecinkowy. Typ 'double' to również typ zmiennoprzecinkowy, charakteryzujący się większą precyzją niż 'float'. Typ 'decimal' służy do przechowywania liczb zmiennoprzecinkowych z dużą dokładnością, głównie w aplikacjach finansowych, gdzie precyzja jest kluczowa, ale nie zalicza się do typów stałoprzecinkowych.

Pytanie 15

Co to jest lazy loading?

A. Proces opóźnionego ładowania bibliotek JavaScript
B. Algorytm kompresji obrazów w aplikacjach webowych
C. Metoda przechowywania danych w pamięci podręcznej przeglądarki
D. Technika optymalizacji polegająca na ładowaniu zasobów dopiero wtedy, gdy są potrzebne
Odpowiedź wskazująca na technikę optymalizacji polegającą na ładowaniu zasobów dopiero wtedy, gdy są one potrzebne, jest prawidłowa, ponieważ lazy loading skutecznie zwiększa wydajność aplikacji webowych. Ta metoda minimalizuje ilość danych przesyłanych na początku ładowania strony, co znacząco poprawia czas ładowania oraz doświadczenie użytkownika. Przykładowo, w przypadku stron z dużą ilością obrazów, lazy loading zapewnia, że grafiki są pobierane tylko wtedy, gdy zbliżają się do obszaru widocznego w przeglądarce. To podejście jest zgodne z najlepszymi praktykami optymalizacji wydajności, jak określone w dokumentach Web Performance Optimization. W praktyce często implementuje się lazy loading za pomocą różnych bibliotek JavaScript, takich jak Intersection Observer API, co pozwala na efektywne zarządzanie zasobami oraz ich asynchroniczne ładowanie. Dzięki temu aplikacje mogą działać bardziej responsywnie, co jest kluczowe w czasie, gdy użytkownicy oczekują szybkiej oraz płynnej interakcji ze stronami internetowymi.

Pytanie 16

Jakie środowisko deweloperskie jest najczęściej używane do programowania w C#?

A. Visual Studio
B. NetBeans
C. PyCharm
D. Eclipse
PyCharm to środowisko dedykowane programowaniu w języku Python, a nie C#. Eclipse jest popularnym środowiskiem do tworzenia aplikacji w językach Java, C i C++, ale nie oferuje pełnego wsparcia dla platformy .NET. NetBeans to IDE stworzone głównie z myślą o Javie, choć wspiera inne języki, jego wsparcie dla C# jest ograniczone, co czyni Visual Studio zdecydowanie lepszym wyborem dla tej technologii.

Pytanie 17

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

int x = 5;
int y = 10;
Console.WriteLine($"Suma {x} i {y} wynosi {x + y}");
A. Suma 5 i 10 wynosi x + y
B. Suma x i y wynosi 15
C. Error: niewłaściwa składnia
D. Suma 5 i 10 wynosi 15
Kod w języku C# wykonuje operację dodawania dwóch zmiennych, x i y, oraz wyświetla wynik w sformatowanym ciągu tekstowym. Poprawna odpowiedź to 'Suma 5 i 10 wynosi 15', ponieważ zmienna x ma wartość 5, a zmienna y ma wartość 10. Kiedy dodajemy te dwie liczby, otrzymujemy 15. Warto zwrócić uwagę na wykorzystanie interpolacji ciągów, co jest istotnym elementem w nowoczesnym C#. Umożliwia to w prosty sposób łączyć tekst z wartościami zmiennych, co zwiększa czytelność kodu. Interpolacja jest szczególnie przydatna w kontekście generowania komunikatów użytkownika i raportów. Przykład zastosowania może obejmować aplikacje, które prezentują wyniki obliczeń lub statystyki, gdzie ważne jest, aby w przyjazny sposób przedstawiać dane. Dobre praktyki programistyczne sugerują, aby unikać twardego kodowania wartości zamiast tego używać zmiennych, co ułatwia późniejsze modyfikacje i utrzymanie kodu.

Pytanie 18

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

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

Pytanie 19

Który z wymienionych parametrów określa prędkość procesora?

A. Liczba rdzeni
B. Rodzaj złącza
C. Częstotliwość taktowania
D. Wielkość pamięci podręcznej
Ilość rdzeni w procesorze odnosi się do liczby jednostek obliczeniowych w jego architekturze. Choć większa liczba rdzeni może przyczynić się do zwiększenia multitaskingu i wydajności w aplikacjach obsługujących równoległe przetwarzanie, sama ilość rdzeni nie definiuje szybkości procesora w kontekście jego podstawowych cykli zegara. Pojemność pamięci podręcznej, z kolei, dotyczy ilości pamięci dostępnej bezpośrednio w procesorze, co wpływa na szybkość dostępu do często używanych danych. Większa pamięć podręczna może przyspieszyć operacje, ale znowu, nie jest to bezpośredni wskaźnik szybkości działania procesora. Typ złącza jest parametrem technicznym, który określa, w jaki sposób procesor łączy się z płytą główną. Różne rodzaje złączy, jak LGA czy PGA, wpływają na kompatybilność, ale nie mają bezpośredniego wpływu na samą szybkość obliczeniową procesora. W kontekście oceny wydajności procesora, istotne jest zrozumienie, że chociaż ilość rdzeni, pamięć podręczna i typ złącza są ważnymi parametrami, to jednak to częstotliwość taktowania jest kluczowym wskaźnikiem wskazującym na szybkość jego działania.

Pytanie 20

Jaki protokół komunikacyjny jest używany w aplikacjach IoT (Internet of Things)?

A. SMTP
B. FTP
C. HTTP
D. MQTT
HTTP, FTP i SMTP to protokoły, które mają swoje zastosowania, jednak w kontekście IoT nie są optymalnym wyborem. HTTP (Hypertext Transfer Protocol) jest protokołem opartym na połączeniach, który jest szeroko stosowany w aplikacjach webowych do przesyłania dokumentów i zasobów. Jego charakterystyka, związana z dużym narzutem na dane i brakiem mechanizmów publikacji-subskrypcji, sprawia, że nie nadaje się do efektywnej komunikacji między dużą liczbą urządzeń IoT. FTP (File Transfer Protocol) służy głównie do przesyłania plików, co w kontekście IoT jest rzadko potrzebne, a jego złożoność oraz wymóg ciągłego połączenia czynią go nieodpowiednim do komunikacji w czasie rzeczywistym. SMTP (Simple Mail Transfer Protocol), z kolei, to protokół do wysyłania wiadomości e-mail, co również nie jest adekwatne dla urządzeń IoT, które często potrzebują szybkiej i niezawodnej wymiany danych. Typowym błędem myślowym jest założenie, że ponieważ te protokoły są powszechnie używane w innych kontekstach, mogą być równie skuteczne w IoT. W rzeczywistości, specyfika IoT wymaga odmiennych podejść, jak te, jakie oferuje MQTT, które są dostosowane do ograniczeń i wymagań tego dynamicznego środowiska.

Pytanie 21

Jakie elementy powinny być zawarte w instrukcji dla użytkownika danej aplikacji?

A. Harmonogram realizacji projektu
B. Informacje o narzędziach programistycznych zastosowanych w procesie tworzenia aplikacji
C. Opis instalacji, konfiguracji oraz obsługi oprogramowania
D. Wyjaśnienie struktur danych wykorzystywanych w kodzie
W instrukcji użytkownika aplikacji warto, żeby był opis tego, jak zainstalować, skonfigurować i korzystać z programu. Taka dokumentacja, pisana krok po kroku, pomaga użytkownikowi przejść przez wszystkie etapy, od pobrania oprogramowania, przez instalację, aż po to, żeby w pełni wykorzystać wszystkie funkcje. Dobrze, żeby były tam też info o wymaganiach systemowych, sposobach radzenia sobie z problemami czy aktualizacjach oprogramowania. Moim zdaniem, taka dokładna instrukcja jest mega ważna, bo zmniejsza szanse na napotkanie kłopotów podczas korzystania z aplikacji i sprawia, że łatwiej jest wdrożyć ją w pracy. Jak użytkownicy mają porządnie napisaną instrukcję, to są bardziej zadowoleni i szybciej przyzwyczajają się do nowego narzędzia.

Pytanie 22

Przedstawiony na filmie kod napisany w języku C++ nie kompiluje się. Co należy zmienić w tym kodzie, aby proces kompilacji wykonał się bez błędów?

A. naprawić błąd w funkcji sprawdz, który polega na braku nawiasów {} w pętli for
B. poprawnie zapisać warunek w instrukcji if w linii 11, np. sprawdz(x)==true
C. zadeklarować zmienną sprawdz przed jej wykorzystaniem w linii 11
D. dodać deklarację funkcji sprawdz przed funkcją main
Wielu początkujących programistów skupia się na szczegółach składniowych lub drobiazgach logicznych, kiedy pojawia się błąd kompilacji w C++. Jednak często przyczyną jest coś bardzo podstawowego, jak brak deklaracji funkcji przed jej użyciem. Jeśli chodzi o zapis warunku w instrukcji 'if', to kompilator nie zgłasza błędu, gdy używamy wyrażenia typu 'if (sprawdz(x))' – to całkowicie poprawna składnia, a dopisywanie '==true' jest redundantne i nie wnosi niczego nowego. Bardzo często widzę, że ktoś skupia się na tym, żeby warunek koniecznie porównywać do true, ale tak naprawdę to kwestia stylu, nie poprawności. Pozostawienie nawiasów klamrowych w pętli for jest oczywiście dobrą praktyką, ale ich brak nie zawsze generuje błąd kompilacji, jeśli pętla ma tylko jedną instrukcję. Kompilator C++ potrafi to rozpoznać i nie zgłasza błędu – sprowadza się to bardziej do czytelności i unikania błędów logicznych niż do samej poprawności kompilacji. Odpowiedź dotycząca deklarowania zmiennej 'sprawdz' to już nieporozumienie – 'sprawdz' to funkcja, a nie zmienna, więc nie deklarujemy jej w ten sposób. Ten błąd pokazuje, jak łatwo pomylić pojęcia w językach programowania, zwłaszcza jeśli dopiero zaczynamy przygodę z kodowaniem. Główna zasada, którą warto tu zapamiętać, to: każda funkcja używana przed jej zdefiniowaniem musi być zadeklarowana – to właśnie tego brakuje w typowym przykładzie z pytania. Bez deklaracji kompilator nie wie, jaką sygnaturę ma funkcja, a to skutkuje błędem już na poziomie kompilacji. Z mojego doświadczenia wynika, że takie drobne rzeczy potrafią skutecznie utrudnić życie, dlatego warto czytać komunikaty kompilatora i znać podstawowe zasady działania języka C++.

Pytanie 23

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

console.log(typeof null);
console.log(typeof undefined);
console.log(typeof []);
console.log(typeof NaN);
A. object, undefined, object, number
B. null, undefined, array, number
C. object, undefined, array, number
D. null, undefined, object, NaN
Typowe błędy związane z błędnymi odpowiedziami wynikają często z mylnych koncepcji dotyczących typów danych w JavaScript. Warto zauważyć, że odpowiedź sugerująca, że null jest typem 'null' nie jest zgodna z rzeczywistością. Null nie jest odrębnym typem, lecz jest klasyfikowany jako obiekt, co jest wynikają z tego, że w JavaScript wszystko jest obiektowe z wyjątkiem prostych typów. Również opinia, że NaN powinien być uznawany za typ 'NaN' jest myląca. NaN jest specjalnym przypadkiem liczby, co można zobaczyć przy użyciu typeof. Tablica z kolei nie ma własnego typu w JavaScript, jest traktowana jako obiekt. To jest powód, dla którego typeof zwraca 'object' dla tablic. Niezrozumienie tych zasad prowadzi do błędnych konkluzji i może wpływać na jakość kodu. W praktyce powinno się zawsze stosować typeof do sprawdzania typów zmiennych, co zapewnia lepszą kontrolę nad danymi i eliminuje potencjalne błędy podczas wykonywania operacji na różnych typach. Warto zwracać uwagę na te aspekty, ponieważ wpływają one na wydajność i stabilność aplikacji.

Pytanie 24

Który z wymienionych dokumentów jest najczęściej stosowany w zarządzaniu pracą zespołu Scrum?

A. Specyfikacja techniczna
B. Lista zasobów ludzkich
C. Product backlog
D. Diagram Gantta
Diagram Gantta jest fajnym narzędziem do pokazywania harmonogramu, ale nie ma go w zarządzaniu backlogiem. Specyfikacja techniczna to co innego – tam są szczegóły implementacyjne, a nie priorytety funkcji. Lista zasobów ludzkich to temat o zarządzaniu personelem, a nie o zadaniach i priorytetach w Scrumie. Więc tu bardziej musisz uważać na to, co do czego pasuje.

Pytanie 25

W jakim języku został stworzony framework Angular?

A. C#
B. PHP
C. Typescript
D. Postscript
Często spotykam się z przekonaniem, że frameworki takie jak Angular powstają w starszych lub bardziej popularnych językach, np. PHP czy C#, bo te technologie są szeroko wykorzystywane w backendzie i znane wielu programistom. Jednak tu warto rozróżnić backend od frontend – Angular to framework stricte frontendowy, więc PHP, będący językiem głównie serwerowym, nie miałby tu zastosowania. PHP świetnie sprawdza się w budowie dynamicznych stron internetowych, ale nie jest używany do aplikacji uruchamianych bezpośrednio w przeglądarce. Z kolei C# to technologia Microsoftu, wykorzystywana przede wszystkim w aplikacjach desktopowych, grach lub serwerach opartych na .NET – praktycznie nie pojawia się w kontekście nowoczesnych aplikacji webowych uruchamianych po stronie klienta. Trochę osób kojarzy Angulara z językiem Postscript, ale to jest zupełnie inna bajka – Postscript służy do opisu grafiki wektorowej i drukowania, zupełnie nie nadaje się do budowania interaktywnych interfejsów użytkownika. Myślę, że taka pomyłka wynika z braku rozróżnienia, do czego służą poszczególne języki programowania i jaką mają rolę w ekosystemie webowym. W rzeczywistości Angular został napisany w TypeScript, który jest specjalnie zaprojektowany do większych, skalowalnych aplikacji frontendowych. W przypadku Angulara wybrano TypeScript świadomie, żeby można było lepiej zarządzać dużymi projektami, korzystać z silnego typowania i mieć nowoczesne narzędzia do programowania. Dlatego znajomość TypeScriptu to w zasadzie podstawa przy pracy z Angular, a wybór innego języka po prostu się tu nie sprawdza.

Pytanie 26

Jakie środowisko jest natywne do tworzenia aplikacji desktopowych w języku C#?

A. PyCharm
B. MS Visual Studio
C. NetBeans
D. Eclipse
W branży często spotykam się z przekonaniem, że każde większe środowisko programistyczne nada się do wszystkiego, ale to nie do końca prawda, szczególnie jeśli chodzi o C# i aplikacje desktopowe. Eclipse kojarzy się głównie z Javą i choć można doinstalować różne wtyczki, to w praktyce wsparcie dla C# jest tam bardzo ograniczone, zwłaszcza w kontekście aplikacji desktopowych pod Windows. NetBeans to podobna historia – projektowano go pod kątem Javy i Swinga, a rozwiązania dla C# są bardzo niszowe i raczej eksperymentalne. PyCharm natomiast to świetne narzędzie do Python’a, ale nie ma natywnego wsparcia dla C# czy .NET Framework. Często początkujący zakładają, że „duży edytor” to od razu uniwersalne środowisko, jednak rzeczywistość jest taka, że tylko Visual Studio zapewnia pełną integrację z narzędziami Microsoftu oraz obsługą platformy Windows. Dla aplikacji desktopowych w C# ważne jest wsparcie dla Windows Forms, WPF czy nowoczesnych rozwiązań typu .NET MAUI – a tego nie dostaniemy w Eclipse, NetBeans czy PyCharm. Warto pamiętać, że wybierając nieodpowiednie IDE, można sobie skomplikować życie już na starcie, bo konfiguracja i debugowanie aplikacji może być bardzo uciążliwe, a nawet często niemożliwe bez natywnego wsparcia. Zdarza się też, że mylenie środowisk wynika z tego, że na uczelniach promuje się Eclipse czy NetBeans przez pryzmat Javy, stąd czasami ktoś próbuje używać ich do C#, ale to naprawdę nie jest efektywna droga. W praktyce, jeśli zależy nam na solidnych narzędziach i szybkim wdrażaniu gotowych aplikacji na Windows, Visual Studio jest właściwym wyborem i tak też uczą tego na kursach oraz szkoleniach branżowych.

Pytanie 27

Jaki modyfikator umożliwia dostęp do elementu klasy z każdego miejsca w kodzie?

A. Protected
B. Public
C. Static
D. Private
Modyfikator 'Public' umożliwia dostęp do składowych klasy z dowolnego miejsca w programie, zarówno w ramach tej samej klasy, jak i poza nią. To najbardziej otwarty modyfikator dostępu, który pozwala na tworzenie interfejsów API, umożliwiających korzystanie z publicznych metod i właściwości przez inne klasy oraz moduły. W praktyce oznacza to, że publiczne metody są widoczne globalnie, co pozwala na ich wywoływanie bez ograniczeń. Jest to przydatne w przypadkach, gdy dana funkcjonalność musi być dostępna w różnych częściach programu lub aplikacji.

Pytanie 28

Przedstawiony fragment dotyczy funkcji resize w języku C++. Ta funkcja obniży długość elementu string, gdy wartość parametru

Resize string
Resizes the string to a length of n characters.

If n is smaller than the current string length, the current value is shortened to its first n character, removing the characters beyond the nth.

If n is greater than the current string length, the current content is extended by inserting at the end as many characters as needed to reach a size of n. If c is specified, the new elements are initialized as copies of c; otherwise, they are value-initialized characters (null characters).

Parameters
n
New string length, expressed in number of characters.
size_t is an unsigned integral type (the same as member type string::size_type).
c
Character used to fill the new character space added to the string (in case the string is expanded).
Źródło: http://www.cplusplus.com/reference/string/string/resize/
A. n jest większa od aktualnej długości łańcucha
B. c jest mniejsza od aktualnej długości łańcucha
C. c jest większa od aktualnej długości łańcucha
D. n jest mniejsza od aktualnej długości łańcucha
To jest dokładnie to, o co chodzi w funkcji resize dla std::string w C++. Jeśli podany parametr n jest mniejszy od aktualnej długości łańcucha, to obcinamy stringa do tych właśnie n znaków – reszta znika bezpowrotnie. Moim zdaniem to bardzo wygodne, bo nie trzeba ręcznie wycinać fragmentu czy bawić się w operacje na podłańcuchach. Praktycznie rzecz biorąc, można dzięki temu szybko skrócić dane wejściowe, np. gdy pobieramy z pliku długi tekst, a potrzebujemy tylko jego fragment do dalszego przetwarzania. W branży często się to przydaje – na przykład ograniczając długość nicku użytkownika do określonej liczby znaków lub przytrzymując długość serializowanych danych w protokołach sieciowych. Resize działa wprost i zgodnie ze standardem C++, usuwając znaki od indeksu n wzwyż. Co ciekawe, metoda nie tylko skraca, ale też rozszerza string – wtedy wypełnia go nowymi znakami (np. 'x' czy znakiem pustym), ale to właśnie skracanie jest często pomijane przez początkujących, a jest naprawdę przydatne. No i trzeba pamiętać, że oryginalne znaki spoza zakresu po prostu znikają – nie ma żadnych ostrzeżeń. Z mojego doświadczenia to jedna z tych funkcji, do których z czasem nabiera się szacunku – bo ułatwia życie na co dzień przy operacjach na łańcuchach znaków.

Pytanie 29

Co to jest JWT (JSON Web Token)?

A. Protokół komunikacyjny do transferu danych między klientem a serwerem
B. Biblioteka JavaScript do walidacji formularzy webowych
C. Format zapisu danych używany w bazach NoSQL
D. Standard definiujący sposób bezpiecznego przekazywania informacji jako obiekt JSON
JWT, czyli JSON Web Token, jest standardem, który definiuje sposób bezpiecznego przekazywania informacji między dwiema stronami w postaci obiektu JSON. Tokeny JWT są powszechnie wykorzystywane w systemach autoryzacji i autoryzacji, umożliwiając przekazywanie zweryfikowanych i podpisanych danych. Struktura tokena składa się z trzech części: nagłówka, ładunku (payload) oraz podpisu. Nagłówek zazwyczaj określa typ tokena oraz algorytm użyty do podpisania, ładunek zawiera dane, które chcemy przesłać, a podpis jest generowany przy użyciu tajnego klucza, co zapewnia integralność danych. Przykładem zastosowania JWT może być system logowania, gdzie po pomyślnym zalogowaniu użytkownik otrzymuje token, który jest następnie używany do autoryzacji kolejnych zapytań do serwera. Dzięki swojej strukturze, JWT nie tylko zwiększa bezpieczeństwo, ale także umożliwia łatwą wymianę informacji między różnymi systemami, co jest szczególnie ważne w architekturach mikroserwisowych.

Pytanie 30

Które z poniższych nie jest wzorcem architektonicznym aplikacji mobilnych?

A. MVVM (Model-View-ViewModel)
B. Clean Architecture
C. Linear Sequential Flow
D. MVC (Model-View-Controller)
Wszystkie wymienione odpowiedzi, z wyjątkiem Linear Sequential Flow, są uznawane za wzorce architektoniczne aplikacji mobilnych. MVC, MVVM i Clean Architecture to powszechnie stosowane podejścia, które mają swoje unikalne cechy i zalety. MVC, czyli Model-View-Controller, dzieli aplikację na trzy główne komponenty, co ułatwia zarządzanie kodem oraz rozdzielanie logiki biznesowej od logiki prezentacji. Dzięki temu, programiści mogą pracować nad różnymi częściami aplikacji równolegle, co przyspiesza rozwój i ułatwia testowanie. MVVM, z kolei, jest często wykorzystywany w aplikacjach opartych na technologiach takich jak WPF czy Xamarin, gdzie wprowadza dwukierunkowe powiązania danych, co poprawia interaktywność i responsywność aplikacji. Clean Architecture jest bardziej złożonym podejściem, które sugeruje, aby aplikacja była podzielona na warstwy, co ułatwia jej rozwój, testowanie i utrzymanie. Wybierając niewłaściwy wzorzec, jak Linear Sequential Flow, programiści mogą napotkać problemy z elastycznością i możliwością dostosowania aplikacji do zmieniających się wymagań. Często takie podejście prowadzi do tzw. „technical debt”, gdzie trudności w wprowadzaniu zmian kumulują się, co w dłuższym okresie może być kosztowne i czasochłonne.

Pytanie 31

Co oznacza termin 'hoisting' w JavaScript?

A. Przenoszenie deklaracji zmiennych i funkcji na górę ich zakresu podczas fazy kompilacji
B. Optymalizacja kodu wykonywana przez silnik JavaScript
C. Metoda ładowania skryptów z zewnętrznych źródeł
D. Technika zarządzania pamięcią polegająca na usuwaniu nieużywanych obiektów
Nieprawidłowe odpowiedzi na to pytanie mogą wynikać z nieporozumienia na temat podstawowych zasad działania JavaScript i jego mechanizmu wykonawczego. Optymalizacja kodu przez silnik JavaScript to proces, który ma miejsce w tle, ale nie odnosi się bezpośrednio do hoistingu, ponieważ ten termin dotyczy przenoszenia deklaracji na górę zakresu. Kolejna koncepcja zarządzania pamięcią, polegająca na usuwaniu nieużywanych obiektów, odnosi się do garbage collection, a nie do hoistingu. Garbage collection jest procesem, w którym silnik JavaScript automatycznie zwalnia pamięć zajmowaną przez obiekty, do których już nie ma odniesienia, co jest niezwiązane z mechanizmem przenoszenia deklaracji. Metoda ładowania skryptów z zewnętrznych źródeł dotyczy sposobu, w jaki JavaScript może być integrowany z HTML, ale nie ma związku z hoistingiem. Często mylone są te koncepcje ze względu na złożoność JavaScript i jego asynchroniczny charakter. Kluczowe w pracy z JavaScript jest zrozumienie, jak różne mechanizmy, takie jak hoisting, wpływają na organizację kodu i mogą prowadzić do błędów, jeśli nie są prawidłowo stosowane. Programiści powinni być świadomi, że niewłaściwe użycie hoistingu może skutkować trudnymi do wykrycia błędami, co podkreśla wagę dobrej praktyki w zakresie strukturyzacji kodu.

Pytanie 32

Z jakiego obiektu można skorzystać, aby stworzyć kontrolkę wskazaną strzałką na ilustracji?

Ilustracja do pytania
A. Text - dla biblioteki WPF; JText - dla biblioteki Swing
B. Box - dla biblioteki WPF; JField - dla biblioteki Swing
C. TextBox - dla biblioteki WPF; JTextField - dla biblioteki Swing
D. Windows - dla biblioteki WPF; JFrame - dla biblioteki Swing
Wybrałeś dokładnie to, co w praktyce programisty jest najważniejsze, czyli TextBox dla WPF i JTextField dla Swinga. Te dwa komponenty to absolutna podstawa, jeśli chodzi o pola do wprowadzania tekstu, zarówno w aplikacjach .NET, jak i Java. W WPF TextBox pozwala na przyjmowanie danych od użytkownika, obsługę zdarzeń, walidację, formatowanie tekstu – ogólnie wszystko, co potrzeba do pracy z tekstem w GUI. W Swingu JTextField jest odpowiednikiem, bardzo intuicyjnym i prostym w użyciu, świetnie się sprawdza przy prostych formularzach czy interfejsach użytkownika. Co ciekawe, oba te komponenty są bardzo elastyczne, można je stylizować, podłączać do systemów walidacji czy nawet rozbudowywać o własne mechanizmy autouzupełniania. Spotkałem się wielokrotnie z sytuacją, gdzie poprawne zastosowanie TextBoxa lub JTextFielda znacząco podnosiło jakość aplikacji – bo jednak wygoda użytkownika i poprawność danych są kluczowe. Takie wybory są zgodne z dokumentacją Microsoftu oraz Oracla, więc trzymasz się dobrych praktyk. Z mojej perspektywy, jeśli chcesz pisać nowoczesne, użytkowe aplikacje desktopowe, znajomość tych kontrolek to absolutny must-have.

Pytanie 33

Która z wymienionych bibliotek stanowi element standardowego zestawu narzędzi programistycznych w Pythonie?

A. vector
B. <math.h>
C. sys
D. <stdio.h>
Biblioteka `<math.h>` to standardowa biblioteka w języku C/C++, używana do wykonywania operacji matematycznych, ale nie jest częścią Pythona. Biblioteka `<stdio.h>` to biblioteka C, która umożliwia obsługę wejścia i wyjścia (I/O), ale również nie jest dostępna w Pythonie. `vector` to część standardowej biblioteki C++ (STL) i służy do obsługi dynamicznych tablic, ale nie jest elementem środowiska Python. Biblioteki te są związane z innymi językami programowania i nie mają zastosowania w Pythonie.

Pytanie 34

Jaki jest zasadniczy cel ataku phishingowego?

A. Zakłócanie pracy sieci przez nadmiarowe zapytania
B. Zbieranie danych osobowych za pomocą podszywających się stron lub wiadomości
C. Kradzież haseł z pamięci operacyjnej urządzenia
D. Uniemożliwienie dostępu do usług internetowych
Atak phishingowy różni się od innych form cyberataków, które również mogą mieć na celu uzyskanie danych, lecz realizowane są w inny sposób. Zakłócenie działania sieci poprzez nadmiar zapytań, znane jako atak DDoS, polega na przesyłaniu ogromnej ilości zapytań do serwera, co skutkuje jego przeciążeniem i niedostępnością dla użytkowników. Tego typu ataki są ukierunkowane na infrastrukturę, a nie na pojedyncze dane osobowe użytkowników. W przypadku wykradania haseł z pamięci operacyjnej urządzenia, technika ta wymaga stosowania złośliwego oprogramowania, które potrafi skanować pamięć RAM i wyłuskiwać informacje. Jest to bardziej złożony proces, który wymaga bezpośredniego dostępu do systemu ofiary, co różni się od prostoty i zasięgu ataku phishingowego. Ostatnia z wymienionych możliwości, blokowanie dostępu do usług online, często jest związana z ransomware, które szyfruje pliki użytkownika i żąda okupu za ich odblokowanie. W przeciwieństwie do phishingu, tego typu ataki są bardziej destrukcyjne i mają na celu zaszkodzenie systemowi, a nie kradzież danych osobowych przez oszustwa. Dlatego też, mimo że wszystkie wymienione metody są niebezpieczne, to jednak ich mechanizmy i cele są zupełnie inne niż w przypadku ataku phishingowego.

Pytanie 35

Jakie znaczenie ma termin "przesłanianie metody" w kontekście programowania obiektowego?

A. Zmiana metody prywatnej na metodę publiczną
B. Przenoszenie metod z jednej klasy do drugiej
C. Zastosowanie tej samej nazwy metody w klasie bazowej i pochodnej, ale z inną implementacją w klasie pochodnej
D. Tworzenie nowej metody w klasie bazowej
Przesłanianie metody to mechanizm, w którym metoda w klasie pochodnej ma taką samą nazwę, typ zwracany i listę parametrów jak metoda w klasie bazowej, ale zawiera inną implementację. To kluczowy element polimorfizmu, umożliwiający dostosowanie zachowania klasy pochodnej do jej specyficznych potrzeb, przy zachowaniu spójnego interfejsu. Przesłanianie metod pozwala na elastyczne projektowanie kodu i jest szeroko stosowane w dużych projektach, aby umożliwić rozszerzalność oraz ponowne wykorzystanie istniejącej logiki. W C++ przesłanianie osiąga się za pomocą słowa kluczowego 'virtual' w klasie bazowej, a następnie redefinicji metody w klasie pochodnej.

Pytanie 36

Który z wymienionych elementów jest fundamentalny w architekturze klient-serwer?

A. Scentralizowane przechowywanie danych
B. Wyłącznie komunikacja synchroniczna
C. Zdalne wykonywanie aplikacji na urządzeniu klienta
D. Brak podziału na funkcje klienta i serwera
Scentralizowane przechowywanie danych to podstawowy element architektury klient-serwer. W takim modelu dane przechowywane są na serwerze, a klient uzyskuje do nich dostęp na żądanie. Dzięki temu możliwa jest efektywna synchronizacja danych oraz ich ochrona przed nieautoryzowanym dostępem. Architektura klient-serwer jest skalowalna i umożliwia obsługę wielu klientów jednocześnie, co czyni ją fundamentem dla większości nowoczesnych aplikacji webowych i mobilnych.

Pytanie 37

Jakie elementy powinny być ujęte w dokumentacji programu?

A. Szczegóły dotyczące konfiguracji serwera
B. Zestawienie błędów zidentyfikowanych w trakcie testów
C. Opis funkcji, klas i zmiennych w kodzie
D. Strategia marketingowa aplikacji
Opis funkcji, klas i zmiennych w kodzie to kluczowy element dokumentacji programu. Tego rodzaju dokumentacja pozwala na lepsze zrozumienie struktury aplikacji, jej logiki biznesowej oraz wzajemnych zależności pomiędzy poszczególnymi komponentami. Dokumentacja techniczna obejmuje szczegółowe informacje na temat implementacji, interfejsów API, schematów baz danych oraz sposobów integracji z innymi systemami. Dzięki niej programiści mogą szybciej wdrażać się w projekt, a błędy i niejasności są minimalizowane. Kompleksowa dokumentacja zawiera także przykłady użycia poszczególnych funkcji, co dodatkowo ułatwia rozwój i rozbudowę aplikacji. W dobrze prowadzonym projekcie dokumentacja kodu jest na bieżąco aktualizowana, co zwiększa jego przejrzystość i wspiera proces refaktoryzacji.

Pytanie 38

Co to jest SQL injection?

A. Technika ataku polegająca na wstrzyknięciu złośliwego kodu SQL do zapytania
B. Proces automatyzacji tworzenia zapytań SQL
C. Metoda optymalizacji zapytań SQL w bazach danych
D. Narzędzie do importowania danych do bazy SQL
SQL injection to technika ataku, polegająca na wstrzyknięciu złośliwego kodu SQL do zapytań, które są przetwarzane przez aplikacje bazodanowe. Atakujący wykorzystuje luki w zabezpieczeniach aplikacji, aby wprowadzić własne instrukcje SQL, które są następnie wykonywane przez bazę danych. Na przykład, jeśli aplikacja nie waliduje poprawnie danych wprowadzanych przez użytkownika, napastnik może wprowadzić złośliwy kod w miejsce oczekiwanego wejścia. Taki atak może prowadzić do ujawnienia poufnych danych, a nawet pełnej kontroli nad bazą danych. Ważne jest, aby stosować tzw. 'prepared statements' oraz 'parameterized queries', co znacząco obniża ryzyko tego typu ataków. Zgodnie z najlepszymi praktykami bezpieczeństwa, aplikacje powinny być regularnie testowane pod kątem podatności na SQL injection, a także powinny stosować odpowiednie mechanizmy autoryzacji i walidacji, aby minimalizować ryzyko wykorzystania takich technik.

Pytanie 39

Jakie narzędzie jest używane do automatyzacji testów interfejsu użytkownika aplikacji webowych?

A. Slack
B. JIRA
C. Trello
D. Selenium
Pozostałe odpowiedzi, takie jak JIRA, Slack i Trello, nie są narzędziami przeznaczonymi do automatyzacji testów interfejsu użytkownika. JIRA to popularne narzędzie do zarządzania projektami, które często wykorzystuje się do śledzenia błędów i planowania zadań w zespołach programistycznych. Jest ono nieocenione w kontekście zarządzania cyklem życia aplikacji i usprawniania komunikacji w zespole, ale nie służy do automatyzacji testów. Slack natomiast to narzędzie do komunikacji zespołowej, które umożliwia szybką wymianę informacji i współpracę w czasie rzeczywistym. Choć może być używane do powiadomień o wynikach testów, nie jest narzędziem do ich automatyzacji. Trello, z kolei, to aplikacja do zarządzania projektami, która pomaga w organizacji zadań i pracy zespołowej za pomocą tablic i kart. Choć może wspomagać procesy zarządzania testami poprzez wizualizację postępów, nie jest narzędziem testowym samym w sobie. Często zdarza się, że osoby nowe w branży mylą narzędzia wspomagające zarządzanie projektami z narzędziami do testowania, co może prowadzić do nieporozumień. Warto więc zrozumieć ich różne zastosowania, by skutecznie wykorzystać każde z nich według ich przeznaczenia.

Pytanie 40

W języku C# szablon List umożliwia korzystanie z listy. Z definicji obiektu kolekcji wynika, że jego elementami mogą być:

List<int> wykaz = new List<int>();
A. elementy typu List
B. liczby rzeczywiste
C. liczby całkowite
D. elementy o nieokreślonym typie
W C# kolekcje generyczne typu List<> są jednym z podstawowych narzędzi do zarządzania zbiorem danych o określonym typie. Typ elementów w takiej liście nie jest przypadkowy ani dowolny, tylko wynika bezpośrednio z tego, co wpiszemy w nawiasach ostrych. Wiele osób na początku ulega mylnemu przekonaniu, że List<> może przechowywać elementy o nieokreślonym typie, co jest nieporozumieniem – właściwie tylko List<object> pozwala na taką elastyczność, ale i wtedy każda operacja na elementach wymaga rzutowania. Jeśli natomiast chodzi o liczby rzeczywiste, to one są reprezentowane przez typy double lub float, więc List<int> kompletnie się do tego nie nadaje – jeśli spróbujesz przechować tam np. 3.14, kompilator od razu zaprotestuje. Zdarza się, że ktoś sądzi, iż List<int> może przechowywać inne kolekcje typu List, ale to również nieporozumienie. Wtedy należałoby użyć List<List<int>> lub List<List<T>>, jeśli chcemy mieć listę list, a nie pojedynczych wartości. Typowe błędy wynikają tu moim zdaniem z nieznajomości, jak działa generyczność i jak ściśle typowana jest ta kolekcja. Może się to wydawać ograniczające, ale na co dzień ułatwia życie i zmniejsza ryzyko błędów już na etapie kompilacji. Dobrym nawykiem jest więc zawsze przyglądać się, jaki typ przypisujemy w List<>, bo to rzutuje na wszystkie operacje, jakie potem wykonamy na tej liście. Kluczowe jest, żeby dobrze rozumieć typy w C# i korzystać z nich świadomie, bo to podstawa solidnego i bezpiecznego kodu, zgodnie z praktykami profesjonalnych zespołów programistycznych.