Wyniki egzaminu

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

Egzamin niezdany

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

Wymagane minimum: 20 punktów (50%)

Udostępnij swój wynik
Szczegółowe wyniki:
Pytanie 1

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. zadeklarować zmienną sprawdz przed jej wykorzystaniem w linii 11
C. dodać deklarację funkcji sprawdz przed funkcją main
D. poprawnie zapisać warunek w instrukcji if w linii 11, np. sprawdz(x)==true

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Odpowiedź jest trafna, bo w języku C++ kompilator musi wiedzieć o istnieniu funkcji zanim zostanie ona użyta w kodzie, np. w funkcji main. Bez wcześniejszej deklaracji, kompilator nie zna sygnatury funkcji i nie potrafi zweryfikować wywołania, co skutkuje błędem typu 'implicit declaration of function'. Deklaracja funkcji to taki sygnał informujący kompilator „hej, taka funkcja będzie i będzie przyjmować takie argumenty, a zwracać taki typ”. Praktycznie rzecz biorąc, przed funkcją main wystarczy wpisać np. 'bool sprawdz(int x);', żeby wszystko grało. To szczególnie ważne przy większych projektach czy pracy w zespołach, gdzie pliki nagłówkowe z deklaracjami funkcji są standardem. Pozwala to na lepszą czytelność i porządek w kodzie – kompilator wie, czego się spodziewać, a Ty unikasz dziwnych, trudnych do znalezienia błędów. Moim zdaniem taka organizacja kodu to podstawa, szczególnie jeśli kiedyś będziesz korzystać z bibliotek lub cudzych funkcji – deklaracje są wtedy wręcz obowiązkowe. To zasada, której trzyma się większość zespołów programistycznych i, szczerze mówiąc, sam kilka razy w młodości zapomniałem o deklaracji, przez co debugowanie trwało wieki. Warto od razu wyrobić sobie taki nawyk, bo to oszczędza sporo nerwów i czasu, a kod staje się solidniejszy i bardziej profesjonalny.

Pytanie 2

Wskaż właściwość charakterystyczną dla metody abstrakcyjnej?

A. nie ma implementacji w klasie bazowej
B. zawsze jest prywatna
C. jest pusta w klasach dziedziczących
D. jest pusta w klasie nadrzędnej

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Metoda abstrakcyjna to taki specjalny rodzaj metody, który pojawia się w programowaniu obiektowym, głównie w językach jak Java, C# czy Python (tam nazywa się abstractmethod). Jej kluczową właściwością jest to, że nie ma własnej implementacji w klasie bazowej, czyli tej nadrzędnej. To trochę jakby ktoś powiedział: 'Hej, tutaj powinna być jakaś funkcja, ale jeszcze nie wiem, jak dokładnie ma działać – niech ktoś, kto będzie po mnie dziedziczył po tej klasie, sam ją zdefiniuje.' Dzięki temu daje się klasom pochodnym jasny sygnał, że muszą tę metodę zaimplementować, żeby klasa mogła poprawnie funkcjonować. W praktyce, jeśli próbujesz stworzyć obiekt klasy bazowej zawierającej metody abstrakcyjne, kompilator się obrazi (no, rzuci wyjątkiem albo nawet nie pozwoli na kompilację). Moim zdaniem to bardzo praktyczne podejście, bo wymusza spójność w architekturze kodu – każdy, kto dziedziczy po klasie bazowej, nie może zapomnieć o kluczowych metodach. Standardy branżowe, jak SOLID, promują taką separację odpowiedzialności i abstrakcję, dzięki czemu kod jest czytelniejszy i łatwiejszy do rozbudowy. Przykładowo, jeśli masz klasę abstrakcyjną 'Figura', to metoda obliczPole() nie ma sensu bez konkretnej figury, więc w klasie bazowej zostaje abstrakcyjna, a dopiero w 'Kwadracie' czy 'Kole' dostaje realną implementację. Z mojego doświadczenia, takie podejście bardzo pomaga, kiedy projekt robi się większy, bo jasno wiadomo, co jeszcze trzeba dopisać w klasach pochodnych. Jest to wręcz obowiązkowe w wielu wzorcach projektowych, na przykład w strategii albo szablonie metody.

Pytanie 3

Który typ testów jest wykonywany na pojedynczych komponentach lub funkcjach w izolacji?

A. Testy akceptacyjne
B. Testy jednostkowe
C. Testy systemowe
D. Testy integracyjne

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Testy jednostkowe to podstawowy rodzaj testów, które koncentrują się na weryfikacji pojedynczych komponentów lub funkcji aplikacji w izolacji. Ich celem jest upewnienie się, że dany element kodu działa zgodnie z oczekiwaniami. Przykładowo, jeśli mamy funkcję, która oblicza sumę dwóch liczb, test jednostkowy sprawdzi, czy ta funkcja poprawnie zwraca wynik dla różnych zestawów danych wejściowych. Zastosowanie testów jednostkowych jest kluczowe w nowoczesnym programowaniu, ponieważ pozwala na szybkie wykrywanie błędów na wczesnym etapie rozwoju oprogramowania. Dzięki nim można również łatwiej wprowadzać zmiany w kodzie, gdyż mając pewność, że pojedyncze komponenty działają prawidłowo, można modyfikować całą aplikację bez obaw o wprowadzenie nowych błędów. W praktyce, testy jednostkowe są często zautomatyzowane i stanowią integralną część ciągłej integracji (CI), co pozwala na szybkie i efektywne testowanie kodu przy każdej zmianie. Dobre praktyki w zakresie testów jednostkowych obejmują pisanie testów przed właściwą implementacją kodu (tzw. TDD - Test Driven Development) oraz stosowanie odpowiednich narzędzi, takich jak JUnit dla Javy czy NUnit dla .NET.

Pytanie 4

Która z funkcji powinna zostać zrealizowana w warstwie back-end aplikacji webowej?

A. zarządzanie bazą danych
B. zarządzanie zdarzeniami elementów
C. wyświetlanie danych z formularza w przeglądarce
D. sprawdzanie formularzy w czasie rzeczywistym

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Obsługa bazy danych jest fundamentalną częścią warstwy back-end w aplikacjach internetowych. Backend odpowiada za przetwarzanie logiki biznesowej, przechowywanie i zarządzanie danymi, a także komunikację z bazą danych. Dane przesyłane z front-endu (interfejsu użytkownika) są walidowane i przetwarzane po stronie serwera, zanim trafią do bazy danych lub zostaną zwrócone użytkownikowi. W przypadku aplikacji dynamicznych, serwer pobiera informacje z bazy danych, przekształca je zgodnie z wymogami aplikacji i przesyła z powrotem na front-end. Właściwe zarządzanie danymi i bezpieczeństwo operacji na bazie danych to kluczowe zadania back-endu. Równie ważne jest zapobieganie wstrzykiwaniu SQL (SQL Injection) i zapewnienie integralności danych, co stanowi podstawę skalowalnych i bezpiecznych aplikacji.

Pytanie 5

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

A. Gdy poszkodowany cierpi na krwotok zewnętrzny
B. Gdy poszkodowany nie oddycha
C. Gdy poszkodowany jest nieprzytomny, ale oddycha
D. Gdy poszkodowany jest świadomy, lecz ma uraz kończyny

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
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 6

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. Zawierają przeciążenie operatora.
B. Są przeciążone.
C. Służą jako konstruktory w zależności od liczby argumentów.
D. Zawierają błąd, ponieważ nazwy metod powinny być różne.

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
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 7

Co to jest algorytm QuickSort?

A. Algorytm wyszukiwania binarnego w posortowanej tablicy
B. Technika przeszukiwania grafu wszerz
C. Metoda kompresji danych bez strat
D. Wydajny algorytm sortowania oparty na strategii 'dziel i zwyciężaj'

Brak odpowiedzi na to pytanie.

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

Pytanie 8

Co to jest lazy loading w kontekście aplikacji webowych?

A. Strategia optymalizacji, która opóźnia ładowanie zasobów do momentu, gdy są faktycznie potrzebne
B. Metoda kompresji obrazów na stronach internetowych
C. Technika przechowywania danych w pamięci podręcznej przeglądarki
D. Narzędzie do testowania wydajności ładowania strony

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Lazy loading to technika optymalizacji wydajności, która polega na opóźnieniu ładowania zasobów, takich jak obrazy, filmy czy skrypty, do momentu, gdy są one rzeczywiście potrzebne. Dzięki temu zwiększa się szybkość ładowania strony, co jest szczególnie ważne w kontekście doświadczeń użytkowników i SEO. Przykładem zastosowania lazy loading może być strona z długą listą produktów, gdzie obrazy dla produktów znajdujących się poza ekranem są ładowane dopiero, gdy użytkownik przewinie stronę w dół. Praktyka ta nie tylko poprawia czas reakcji strony, lecz także redukuje zużycie pasma, co jest korzystne dla użytkowników na urządzeniach mobilnych. Stosując lazy loading, warto pamiętać o dobrych praktykach, takich jak użycie odpowiednich bibliotek JavaScript, które wspierają tę technikę, oraz zapewnienie odpowiednich fallbacków dla starszych przeglądarek. Wprowadzenie lazy loading jest zgodne z zaleceniami optymalizacji wydajności publikowanymi przez Google, które podkreślają znaczenie ładowania tylko niezbędnych zasobów i poprawę UX.

Pytanie 9

Który aspekt projektu aplikacji jest kluczowy dla zabezpieczenia danych użytkowników?

A. Zastosowanie zaawansowanych systemów ochrony
B. Koncentracja na wyglądzie interfejsu użytkownika
C. Tworzenie prostych formularzy do rejestracji
D. Pominięcie testowania aplikacji w etapie produkcji

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Stosowanie zaawansowanych mechanizmów bezpieczeństwa jest kluczowe dla ochrony danych użytkowników w aplikacjach. Wdrożenie technologii takich jak szyfrowanie, autoryzacja dwuskładnikowa (2FA), firewalle oraz regularne testy penetracyjne pozwala na minimalizację ryzyka ataków i naruszeń danych. Mechanizmy te nie tylko zabezpieczają dane, ale również budują zaufanie użytkowników do aplikacji, co jest niezwykle istotne w branżach takich jak bankowość, medycyna czy e-commerce.

Pytanie 10

Co to jest JWT (JSON Web Token)?

A. Otwarty standard do bezpiecznego przekazywania danych w formacie JSON
B. Protokół transferu plików JSON między serwerami
C. Biblioteka JavaScript do manipulacji danymi JSON
D. Format kompresji danych JavaScript i HTML w aplikacjach webowych

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
JWT (JSON Web Token) to otwarty standard, który pozwala na bezpieczne przesyłanie danych między stronami jako obiekt JSON. Token ten składa się z trzech części: nagłówka (header), ładunku (payload) oraz podpisu (signature). Nagłówek określa typ tokenu i używany algorytm szyfrowania, ładunek zawiera dane, które chcemy przekazać, a podpis zapewnia integralność i autentyczność danych. JWT jest powszechnie wykorzystywany w autoryzacji i wymianie informacji między serwerem a klientem, na przykład w aplikacjach webowych, gdzie po zalogowaniu użytkownik otrzymuje token, który może być użyty do uzyskania dostępu do chronionych zasobów. Dzięki temu mechanizmowi, serwer nie musi przechowywać sesji, co zwiększa jego wydajność. Ważnym aspektem JWT jest jego bezstanowość oraz możliwość łatwego skalowania aplikacji, co czyni go popularnym rozwiązaniem w architekturze mikroserwisów. Dobrą praktyką jest stosowanie JWT w połączeniu z HTTPS, aby zapewnić dodatkową warstwę bezpieczeństwa przy przesyłaniu tokenów.

Pytanie 11

Co to jest Docker?

A. Framework do tworzenia aplikacji mobilnych
B. Platforma do tworzenia, wdrażania i uruchamiania aplikacji w kontenerach
C. Narzędzie do testowania wydajności aplikacji webowych
D. System zarządzania bazami danych NoSQL

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
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 12

Który element HTML5 służy do wyświetlania zawartości video?

A. <film>
B. <media>
C. <play>
D. <video>

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Element HTML5 <video> jest kluczowym składnikiem do wyświetlania treści wideo w przeglądarkach. Dzięki niemu można łatwo osadzić filmy na stronach internetowych, co sprawia, że są one bardziej interaktywne i atrakcyjne dla użytkowników. Przykład użycia tego tagu wygląda następująco: <video src='film.mp4' controls></video>. Atrybut 'controls' pozwala na dodanie prostych przycisków odtwarzania, pauzy i regulacji głośności, co znacząco poprawia doświadczenia użytkownika. Warto również wspomnieć, że element <video> wspiera różne formaty wideo, takie jak MP4, WebM czy Ogg, co jest istotne w kontekście zgodności z różnymi przeglądarkami i urządzeniami. W praktyce, stosowanie <video> pozwala na łatwe zarządzanie wideo, w tym na dodawanie napisów, ustawienie automatycznego odtwarzania czy loopowania. To sprawia, że jest on niezwykle popularny w tworzeniu nowoczesnych stron internetowych, które chcą dostarczać wartościowe multimedia. Zastosowanie tego elementu jest zgodne z najlepszymi praktykami w zakresie dostępności i użyteczności, co czyni go niezwykle ważnym w dzisiejszym web development.

Pytanie 13

Co oznacza termin 'polimorfizm' w programowaniu obiektowym?

A. Ograniczenie do jednej formy dla obiektu
B. Dziedziczenie metod z klasy bazowej
C. Ustanowienie tylko jednego typu dla klasy
D. Zdolność do przyjmowania wielu form przez obiekt

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Polimorfizm to jedno z fundamentalnych pojęć w programowaniu obiektowym, które pozwala na tworzenie elastycznych i skalowalnych aplikacji. Dzięki polimorfizmowi możemy pisać kod, który operuje na obiektach, nie znając ich dokładnego typu w momencie kompilacji. To bardzo przydatne, gdy mamy do czynienia z hierarchią klas, gdzie różne klasy dziedziczą po jednej bazowej. Praktycznym przykładem może być system, w którym mamy klasę bazową 'Zwierzę' i klasy pochodne, takie jak 'Pies' i 'Kot'. Dzięki polimorfizmowi możemy stworzyć funkcję, która przyjmuje parametr typu 'Zwierzę', a następnie wywołuje metodę, która jest specyficzna dla danej klasy pochodnej. To umożliwia nam pisanie bardziej ogólnego i mniej związanego z konkretnymi typami kodu. Polimorfizm pozwala również na wdrażanie wzorców projektowych, takich jak strategia czy fabryka, które zwiększają modularność i reużywalność kodu. Korzystanie z polimorfizmu jest zgodne z zasadami SOLID, szczególnie zasadą podstawienia Liskov, która mówi, że obiekty klasy bazowej mogą być zastępowane obiektami klasy pochodnej bez wpływu na poprawność działania programu.

Pytanie 14

Czym jest ochrona własności intelektualnej?

A. Rejestr plików przechowywanych w chmurze
B. Zbiór informacji osobowych
C. Koncepcja prawa zabezpieczającego twórczość i innowacje
D. Zestaw przepisów dotyczących ochrony prywatności

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Własność intelektualna to zbiór praw chroniących twórczość i wynalazki, obejmujący patenty, prawa autorskie, znaki towarowe i wzory przemysłowe. Własność intelektualna pozwala twórcom na zarabianie na swoich dziełach oraz kontrolowanie, kto i w jaki sposób może z nich korzystać. W wielu krajach naruszenie praw własności intelektualnej wiąże się z poważnymi konsekwencjami prawnymi. Dla przedsiębiorstw i innowatorów ochrona własności intelektualnej jest kluczowa dla zabezpieczenia ich inwestycji oraz rozwijania nowych technologii.

Pytanie 15

W metodach klasy GoldCustomer dostępne są tylko pola

public class Customer {
    public string Name;
    protected int Id;
    private int Age;
}
public class GoldCustomer: Customer {
    private GoldPoints: int;
}
A. GoldPoints, Name, Id
B. GoldPoints, Name
C. GoldPoints, Name, Id, Age
D. GoldPoints

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Ta odpowiedź dobrze pokazuje, jak działa dziedziczenie i modyfikatory dostępu w C#. W klasie GoldCustomer masz dostęp do własnych pól, czyli GoldPoints, oraz do pól odziedziczonych po klasie bazowej Customer. Tutaj kluczowe jest rozumienie, które pola są faktycznie dostępne. Skoro Name jest publiczne, to bez żadnych kombinacji można się do niego dobrać z dowolnego miejsca – nawet spoza klasy. Id jest chronione (protected), więc według zasad OOP dostępne jest w klasie bazowej oraz wszystkich pochodnych – czyli właśnie w GoldCustomer. To bardzo praktyczne, bo często się zdarza, że potrzebujemy pracować na polach z klasy bazowej, ale nie chcemy, żeby były one widoczne na zewnątrz klasy (np. przez innych programistów korzystających z API). Age jest prywatne i tu już nie da się go bezpośrednio użyć w klasie pochodnej. Z mojego doświadczenia korzystanie z protected dla rzeczy, które mają być dostępne tylko w hierarchii dziedziczenia, to codzienność – pozwala zachować elastyczność, ale i bezpieczeństwo enkapsulacji. Praktycznie rzecz biorąc, jak piszesz klasy dziedziczące po innych, zawsze warto zerknąć na poziomy dostępu, bo od nich zależy, do czego masz dostęp i co możesz odziedziczyć. Wzorce projektowe, jak np. Template Method, mocno polegają na mechanizmach dziedziczenia i odpowiedniego ustawienia widoczności pól czy metod. Przemyślany dobór public, protected, private ułatwia utrzymanie kodu oraz chroni przed przypadkowym wykorzystaniem nieodpowiednich elementów klasy, co w większych projektach bywa naprawdę kluczowe.

Pytanie 16

Jaką wydajność posiada sieć, która przesyła 500 MB danych w czasie 10 sekund?

A. 50 Mbps
B. 400 Mbps
C. 40 Mbps
D. 500 Mbps

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Przepustowość sieci to jeden z najważniejszych parametrów, który określa, jak szybko możemy przesyłać dane pomiędzy urządzeniami w danej infrastrukturze. W najprostszych słowach jest to ilość informacji, jaka może zostać przesłana w jednostce czasu, zazwyczaj wyrażana w bitach na sekundę (bps – bits per second). W praktyce często spotykamy skróty takie jak kbps, Mbps czy Gbps, oznaczające kolejno tysiące, miliony i miliardy bitów przesyłanych w ciągu sekundy. Aby poprawnie obliczyć przepustowość, musimy więc znać ilość przesyłanych danych oraz czas, w jakim ta transmisja się odbywa. W naszym przypadku mamy do czynienia z przesyłaniem 500 MB danych w ciągu 10 sekund. Pierwszym krokiem jest przeliczenie megabajtów (MB) na megabity (Mb), ponieważ przepustowość zawsze wyraża się w bitach. Warto przypomnieć, że 1 bajt to 8 bitów, dlatego 500 MB należy pomnożyć przez 8. W wyniku otrzymujemy 4000 megabitów (Mb). Kiedy już mamy dane w odpowiedniej jednostce, możemy przejść do drugiego kroku, czyli obliczenia przepustowości. Dzielimy 4000 megabitów przez 10 sekund, co daje 400 megabitów na sekundę (400 Mb/s). Wynik ten można również zapisać jako 400 Mbps, ponieważ obie formy zapisu oznaczają dokładnie to samo – megabity na sekundę. Ostatecznie można więc stwierdzić, że sieć, która przesyła 500 MB danych w 10 sekund, ma przepustowość 400 Mbps. To całkiem wysoki wynik, świadczący o bardzo dobrej jakości połączenia, typowej dla nowoczesnych sieci światłowodowych lub infrastruktury o dużej przepustowości. Warto też dodać, że przepustowość to nie to samo, co prędkość internetu widoczna w testach online – rzeczywista prędkość może być mniejsza z powodu opóźnień, strat pakietów czy ograniczeń sprzętowych. Mimo to, obliczenia te dobrze ilustrują, jak przeliczać jednostki i w prosty sposób określać, jak wydajna jest dana sieć.

Pytanie 17

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

A. stos
B. tablica
C. kolejka
D. drzewo

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Stos to struktura danych, która działa na zasadzie LIFO (Last In, First Out), co oznacza, że ostatni dodany element jest pierwszym, który zostaje usunięty. Ta cecha sprawia, że stos jest idealnym rozwiązaniem dla funkcjonalności cofania operacji, ponieważ pozwala na skuteczne zarządzanie historią działań użytkownika. W przypadku aplikacji, która wymaga cofania ostatnich 20 operacji, stos może przechowywać te operacje, dodając nowe elementy na szczyt, a następnie usuwając je z tej samej pozycji. Przykładem zastosowania stosu w praktyce może być edytor tekstu, w którym użytkownik może cofać swoje ostatnie zmiany. Gdy użytkownik wykonuje operację, taka jak dodanie lub usunięcie tekstu, ta operacja jest umieszczana na stosie. Jeśli użytkownik wybiera opcję cofnięcia, ostatnia operacja jest usuwana z góry stosu, co przywraca wcześniejszy stan dokumentu. Warto również zauważyć, że wiele języków programowania oferuje wbudowane klasy lub biblioteki do zarządzania stosami, co ułatwia jego implementację. Stos jest nie tylko efektywny w kontekście czasowym, ale także pamięciowym, co czyni go doskonałym wyborem dla tego typu aplikacji.

Pytanie 18

Która z poniższych deklaracji w języku C++ poprawnie opisuje tablicę dwuwymiarową?

A. int matrix[3][3][3];
B. int matrix[3][3];
C. int matrix[3];
D. int matrix[];

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Deklaracja 'int matrix[3][3];' poprawnie definiuje tablicę dwuwymiarową w języku C++. Tablice dwuwymiarowe to kluczowe narzędzie do przechowywania macierzy i danych tabelarycznych. Każdy element macierzy jest dostępny poprzez dwa indeksy, co umożliwia łatwe odwzorowanie układów współrzędnych lub plansz w grach. Tablice tego rodzaju są wykorzystywane w algorytmach obliczeniowych, grafice komputerowej oraz analizie danych. Struktura 'matrix[3][3]' tworzy siatkę 3x3, która może przechowywać 9 elementów, co czyni ją efektywnym rozwiązaniem dla problemów wymagających przestrzennych danych.

Pytanie 19

Co zostanie wyświetlone po wykonaniu poniższego kodu w języku Python?

data = [1, 2, 3, 4, 5]
result = list(map(lambda x: x*2, filter(lambda x: x % 2 == 0, data)))
print(result)
A. [4, 8]
B. [2, 6, 10]
C. [1, 2, 3, 4, 5]
D. [2, 4, 6, 8, 10]

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
W kodzie Python, który analizujemy, użyto funkcji map i filter, które są często stosowane w programowaniu funkcyjnym. W pierwszej części, funkcja filter filtruje elementy z listy 'data', zwracając tylko te, które są liczbami parzystymi. W tym przypadku, z listy [1, 2, 3, 4, 5] zostaną wybrane liczby 2 i 4. Następnie, funkcja map mnoży te liczby przez 2. Dla liczby 2 otrzymujemy 4, a dla liczby 4 – 8. Dlatego wynik końcowy to lista [4, 8]. W praktyce, znajomość takich konstrukcji pozwala na efektywne przetwarzanie danych i implementację bardziej złożonych algorytmów w codziennych zastosowaniach programistycznych. Korzystając z filtracji i mapowania można na przykład szybko przetwarzać dane wejściowe w aplikacjach webowych lub analizować duże zestawy danych. Ważne jest, aby pamiętać, że te techniki są bardzo przydatne w kontekście pracy z danymi i powinny być uzupełnione o umiejętność czytania i rozumienia kodu, co jest kluczowe w praktyce programistycznej.

Pytanie 20

Po wykonaniu poniższego kodu na konsoli zostanie wyświetlona liczba:

int a = 0x73;
cout << a;
A. 0
B. 73
C. 108
D. 115

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Wartość 0x73 w kodzie oznacza liczbę zapisaną w systemie szesnastkowym (heksadecymalnym). To bardzo często wykorzystywana notacja w programowaniu, szczególnie gdy pracuje się z pamięcią, kodowaniem kolorów lub niskopoziomową obsługą sprzętu. 0x73 to po prostu 7 * 16 + 3, co daje 115 w systemie dziesiętnym. Gdy taki zapis przekażesz do cout, kompilator automatycznie prezentuje tę wartość jako liczbę w systemie dziesiętnym, czyli właśnie 115. Szczerze mówiąc, moim zdaniem warto jak najczęściej ćwiczyć odczytywanie i zamianę wartości pomiędzy systemami liczbowymi, bo to się naprawdę przydaje przy analizie kodu, debugowaniu czy choćby rozumieniu dokumentacji technicznej. Taka umiejętność jest praktycznie niezbędna w embedded, ale i w zwykłym C++ można czasem natknąć się na takie zapisy – szczególnie w kodzie legacy. Osobiście uważam, że dobrze od razu rozpoznawać takie zapisy i nie tracić czasu na kalkulatory. Warto też pamiętać, że podobnie działają inne systemy: np. 0b1101 to binarny, a 0x to zawsze heksadecymalny. W standardzie C++ zapis z prefiksem 0x jest w pełni poprawny i zalecany przy pracy z wartościami bitowymi. Fajnie, jak ktoś łapie takie rzeczy od razu, bo później w pracy nad większymi projektami to ogromne ułatwienie.

Pytanie 21

Na schemacie widoczny jest fragment diagramu blokowego pewnego algorytmu. Ile razy zostanie zweryfikowany warunek n<7?

Ilustracja do pytania
A. 6
B. 5
C. 8
D. 7

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Warunek 'n < 7' będzie sprawdzany dokładnie 6 razy. To dlatego, że w klasycznej pętli for czy while liczba powtórzeń jest zawsze o jeden mniejsza niż wartość graniczna. Jak widzisz, w takich schematach liczba porównań idzie w parze z liczbą iteracji, a pętla zatrzymuje się, jak tylko warunek zostanie spełniony.

Pytanie 22

Który z wymienionych programów jest przeznaczony do zarządzania projektami przy pomocy tablic kanban?

A. Word
B. Jira
C. Trello
D. Photoshop

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Trello to narzędzie do zarządzania projektami, które wykorzystuje tablice kanban do organizacji i monitorowania zadań. Użytkownicy mogą tworzyć karty reprezentujące poszczególne zadania, które następnie są przenoszone między kolumnami odzwierciedlającymi etapy realizacji. Dzięki swojej prostocie i intuicyjności Trello jest szeroko stosowane zarówno w małych zespołach, jak i dużych organizacjach. Umożliwia efektywne zarządzanie projektami, planowanie sprintów oraz monitorowanie bieżącego statusu prac. Tablice kanban pomagają wizualizować przepływ pracy, co ułatwia identyfikację wąskich gardeł i zarządzanie priorytetami.

Pytanie 23

Przeprowadzając analizę kodu interfejsu graficznego napisanego w języku XAML, można zauważyć, że:

<StackLayout Orientation="Vertical">
  <Label Text="Fotograf" />
  <Image Source="obraz.jpg" Aspect="AspectFill" />
  <StackLayout Orientation="Horizontal">
    <Button Text="Like" />
    <Button Text="Share" />
  </StackLayout>
  <Label Text="Fotka z moich wakacji" />
</StackLayout>
A. tekst "Fotograf" znajduje się po prawej stronie obrazu
B. przyciski są ustawione poziomo obok siebie
C. obraz znajduje się po lewej stronie, a pozostałe elementy po prawej
D. elementy: tekst, obraz, przycisk Like, przycisk Share, tekst są ułożone jeden pod drugim

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
W analizowanym kodzie XAML widzimy, że element <StackLayout> z atrybutem Orientation="Horizontal" zawiera przyciski <Button> z tekstami "Like" i "Share". W XAML, stosując stack layout z orientacją poziomą, elementy w nim zawarte są umieszczane obok siebie w rzędzie. To sprawia, że przyciski "Like" i "Share" są widoczne na interfejsie użytkownika ułożone poziomo, zgodnie z tym, co jest opisane w poprawnej odpowiedzi. Użycie StackLayout z orientacją poziomą to często spotykana praktyka w projektowaniu interfejsów, gdy chcemy zorganizować elementy w rzędzie, na przykład przyciski na pasku narzędzi. Zrozumienie tego mechanizmu jest istotne, ponieważ pozwala na efektywne zarządzanie przestrzenią w aplikacjach mobilnych i webowych, gdzie dostępne miejsce może być ograniczone. Praktyczne zastosowanie takiego układu można zobaczyć na przykład w projektowaniu formularzy, gdzie grupujemy elementy w logiczny sposób, ułatwiając użytkownikowi interakcję z aplikacją. Dobre praktyki w projektowaniu interfejsów użytkownika zalecają, aby układ elementów był intuicyjny i zgodny z oczekiwaniami użytkowników, co StackLayout z orientacją poziomą doskonale realizuje w wielu przypadkach.

Pytanie 24

Który z dokumentów stosowanych w metodologii Agile zawiera listę funkcjonalności produktu uporządkowanych według ich ważności?

A. Diagram Gantta
B. Harmonogram projektu
C. Product backlog
D. Backlog sprintu

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Product backlog to dokument zawierający listę funkcjonalności produktu uporządkowanych według priorytetów. Jest to jedno z głównych narzędzi w metodykach Agile, szczególnie w Scrumie, gdzie backlog stanowi podstawę do planowania sprintów. Zawiera on wszystkie elementy, które muszą zostać zaimplementowane, w tym nowe funkcje, poprawki błędów oraz zadania techniczne. Priorytety są ustalane przez właściciela produktu (Product Ownera) i dostosowywane na bieżąco w zależności od zmieniających się wymagań i potrzeb biznesowych. Dzięki backlogowi zespół może skupić się na dostarczaniu najważniejszych funkcji, co pozwala na szybkie reagowanie na feedback i rozwój aplikacji zgodnie z oczekiwaniami klienta.

Pytanie 25

Jaka będzie złożoność czasowa wyszukiwania w posortowanej tablicy przy użyciu algorytmu binarnego?

A. O(n²)
B. O(n)
C. O(log n)
D. O(n log n)

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Algorytm binarny to efektywny sposób wyszukiwania elementu w posortowanej tablicy, który działa w czasie O(log n). Działa on na zasadzie dzielenia przestrzeni wyszukiwania na pół w każdym kroku. Przykładowo, jeśli mamy tablicę z miliona elementów, to po pierwszym porównaniu możemy wykluczyć połowę z nich, a następnie kontynuować wyszukiwanie w pozostałej części. W praktyce oznacza to, że nawet dla dużych zbiorów danych, czas wyszukiwania pozostaje stosunkowo krótki. Algorytm ten jest powszechnie stosowany w różnych dziedzinach, takich jak programowanie, grafika komputerowa czy bazy danych, gdzie szybkość wyszukiwania jest kluczowa. Warto również wspomnieć, że aby móc zastosować algorytm binarny, tablica musi być wcześniej posortowana, co może wymagać dodatkowego nakładu czasu, ale po posortowaniu, zyskujemy efektywność algorytmu binarnego.

Pytanie 26

Jaki jest zasadniczy cel ataku phishingowego?

A. Zakłócanie pracy sieci przez nadmiarowe zapytania
B. Kradzież haseł z pamięci operacyjnej urządzenia
C. Zbieranie danych osobowych za pomocą podszywających się stron lub wiadomości
D. Uniemożliwienie dostępu do usług internetowych

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Głównym celem ataku phishingowego jest przejęcie danych osobowych ofiary, co realizowane jest poprzez wykorzystanie fałszywych stron internetowych lub wiadomości. Atakujący tworzą atrakcyjne i wiarygodne kopie legalnych stron, często podszywając się pod znane instytucje bankowe, portale społecznościowe czy serwisy e-commerce. Użytkownik, nieświadomy zagrożenia, wprowadza swoje dane logowania, numery kart kredytowych lub inne wrażliwe informacje, które trafiają w ręce cyberprzestępców. Aby ułatwić ten proces, phisherzy często wykorzystują techniki inżynierii społecznej, takie jak fałszywe powiadomienia o konieczności weryfikacji konta. Przykłady skutecznych ataków phishingowych obejmują kampanie wysyłania e-maili, które informują użytkowników o rzekomych problemach z kontem, kierując ich na podszyte strony. Standardy bezpieczeństwa, takie jak DMARC, SPF i DKIM, są kluczowe dla ochrony przed tego rodzaju atakami, jednak ich brak lub niewłaściwe wdrożenie zwiększa podatność na phishing.

Pytanie 27

Jakie są różnice między konstruktorem a zwykłą metodą w klasie?

A. Konstruktor zawsze nosi tę samą nazwę co klasa i nie zwraca wartości
B. Konstruktor jest uruchamiany jedynie przez destruktor
C. Konstruktor powinien zwracać jakąś wartość
D. Konstruktor można wywołać bez konieczności tworzenia obiektu

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Konstruktor różni się od zwykłych metod klasy tym, że nosi taką samą nazwę jak klasa i nie zwraca żadnej wartości, nawet `void`. Konstruktor jest wywoływany automatycznie podczas tworzenia obiektu i nie można go wywołać ręcznie jak zwykłą metodę. Jego zadaniem jest inicjalizacja pól obiektu i przygotowanie go do działania. Przykład w C++: `class Samochod { public: Samochod() { marka = "Ford"; } }`. W przeciwieństwie do innych metod konstruktor nie wymaga deklaracji typu zwracanego, co jest jedną z jego najbardziej charakterystycznych cech.

Pytanie 28

Jaką złożoność obliczeniową posiada podany algorytm?
Dane:
Tablica: tab[n]
Index: i = 0, 1, ..., n-1
x: szukana

Algorytm:

// K1: i0
// K2: dopóki i < (n - 1)
    // K3: jeżeli tab[i] = x to wypisz i
    // K4: ii + 1
    // K5: idź do K2
// K6: zakończ
A. O(n)
B. O(n2)
C. O(n log n)
D. O(1)

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Analizując podany algorytm, warto zauważyć, że przechodzi on przez każdy element tablicy dokładnie raz, zaczynając od indeksu 0 aż do n-1. To jest klasyczny przykład przeszukiwania liniowego (linear search), które w najgorszym przypadku ma złożoność czasową O(n), gdzie n to liczba elementów w tablicy. Moim zdaniem to jedna z najbardziej podstawowych i jednocześnie często używanych technik, szczególnie tam, gdzie dane nie są posortowane albo kiedy oczekujemy prostoty implementacji. W praktyce taki algorytm stosuje się, gdy nie zależy nam na super efektywności, a raczej na łatwości zrozumienia kodu lub szybkim prototypowaniu, na przykład podczas pisania skryptów narzędziowych lub prostych aplikacji. Branżowe standardy, chociażby w programowaniu niskopoziomowym lub w zastosowaniach embedded, też często bazują na tego typu rozwiązaniach, ponieważ nie wymagają one dodatkowej pamięci ani zaawansowanych struktur danych. Fajnie zwrócić uwagę, że O(n) oznacza, iż czas wykonywania rośnie proporcjonalnie do liczby elementów – czyli dla 1 000 elementów algorytm wykona się około 1 000 razy wolniej niż dla pojedynczego elementu, chociaż w praktyce zależy to oczywiście od wielu czynników sprzętowych. Dobrym zwyczajem jest zawsze na początku próbować rozwiązać problem najprostszym algorytmem, takim jak ten, a dopiero potem – jeśli wydajność zawiedzie – szukać bardziej zaawansowanych rozwiązań, jak wyszukiwanie binarne czy struktury indeksujące.

Pytanie 29

Jak przedstawia się liczba dziesiętna 255 w systemie szesnastkowym?

A. EF
B. FF
C. FE
D. 100

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Liczba dziesiętna 255 jest reprezentowana w systemie szesnastkowym jako FF. Aby zrozumieć, dlaczego tak jest, należy przyjrzeć się procesowi konwersji z systemu dziesiętnego na szesnastkowy. System dziesiętny oparty jest na podstawie 10, co oznacza, że używa dziesięciu cyfr od 0 do 9. W systemie szesnastkowym, który ma podstawę 16, używane są cyfry od 0 do 9 oraz litery od A do F, gdzie A odpowiada 10, B - 11, C - 12, D - 13, E - 14, a F - 15. Aby przeliczyć 255 na system szesnastkowy, dzielimy tę liczbę przez 16. Pierwsza operacja daje nam 15 jako wynik całkowity oraz 15 jako resztę, co w systemie szesnastkowym jest reprezentowane literą F. Dalsze dzielenie 15 przez 16 daje wynik 0 oraz resztę 15, co również jest reprezentowane jako F. Zatem, zapisując reszty w odwrotnej kolejności, otrzymujemy FF. Taki zapis jest używany w różnych standardach, takich jak HTML i CSS, gdzie kolory są przedstawiane w formacie szesnastkowym. Przykładem może być kolor czerwony, którego zapis to #FF0000, co oznacza maksymalną wartość czerwonego składnika i zera dla niebieskiego oraz zielonego. Warto znać te konwersje, zwłaszcza w programowaniu i projektowaniu stron internetowych, gdzie często pracuje się z wartościami szesnastkowymi.

Pytanie 30

Jakie znaczenie ma deklaracja zmiennej w programowaniu?

A. Zarezerwowanie miejsca w pamięci dla wyników operacji arytmetycznych
B. Stworzenie nowej wartości w bazie danych
C. Przypisanie zmiennej wartości domyślnej
D. Określenie typu oraz nazwy zmiennej w kodzie programu

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Deklaracja zmiennej to podstawowy krok w programowaniu, który polega na określeniu typu oraz nazwy zmiennej, zanim zostanie do niej przypisana wartość. W językach takich jak C++, Java, czy C# deklaracja wygląda na przykład tak: `int liczba;`. Określenie typu zmiennej pozwala kompilatorowi lub interpreterowi zarezerwować odpowiednią ilość pamięci oraz kontrolować, jakie operacje mogą być na niej wykonywane. Deklaracja zmiennej zwiększa czytelność kodu, umożliwia wykrywanie błędów na wczesnym etapie kompilacji i jest kluczowa w zarządzaniu zasobami aplikacji.

Pytanie 31

Jakie wyrażenie logiczne powinno być użyte, aby zweryfikować, czy zmienna x zawiera wartości ujemne lub znajduje się w zakresie (10, 100)?

A. x > 10 || x < 100 || x < 0
B. (x > 10 || x < 100) && x < 0
C. (x > 10 && x < 100) || x < 0
D. x > 10 || x < 100 || x < 0

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
To wyrażenie logiczne: (x > 10 && x < 100) || x < 0 jest najtrafniejsze, bo dokładnie oddaje założone warunki: zmienna x powinna być ujemna lub znajdować się w zakresie od 10 do 100 (bez tych wartości granicznych, czyli przedział otwarty). Z mojego doświadczenia wynika, że takie podejście jest stosowane wszędzie tam, gdzie istotne są szczegółowe warunki – np. w walidacji danych wejściowych czy podczas filtrowania w bazach danych. Operator || gwarantuje, że jeśli chociaż jeden z warunków jest prawdziwy (czyli x jest mniejsze od 0 lub należy do przedziału 10-100), całe wyrażenie zwróci true. Warto też pamiętać, że zastosowanie operatora && wewnątrz nawiasu zapewnia, że oba warunki (x > 10 oraz x < 100) muszą być spełnione jednocześnie, czyli x leży pomiędzy tymi liczbami. Odpowiedniki takiego zapisu znajdziesz praktycznie w każdym języku programowania – od Javy po Pythona. Branżowe standardy jasno wskazują na czytelność i jednoznaczność warunków logicznych, szczególnie jeśli kod ma być utrzymywany przez inne osoby lub przez nas samych za kilka miesięcy. Uważam, że precyzyjne formułowanie wyrażeń tego typu to podstawa dobrego programisty – naprawdę warto się tego trzymać, bo później mniej błędów wychodzi na produkcji, a kod jest dużo łatwiej przetestować. Często spotykam się z przypadkami, gdzie ktoś pomija nawiasy lub źle łączy operatory i potem są problemy z błędami logicznymi, dlatego warto wyrobić sobie taki nawyk dokładnego zapisywania warunków.

Pytanie 32

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. Agile
B. Model kaskadowy
C. Model V
D. PRINCE2

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Agile to podejście, które w mojej ocenie świetnie sprawdza się właśnie w sytuacjach, kiedy zakres projektu nie jest jasny od samego początku albo wymagania klienta mogą się zmieniać w trakcie prac. To nie tylko teoria – branża IT, ale i coraz więcej innych, korzysta z Agile'a tam, gdzie nie da się wszystkiego przewidzieć. Główna zaleta to iteracyjność i elastyczność. Zamiast jednego dużego planu, praca dzieli się na krótkie sprinty lub iteracje, gdzie co chwilę można coś poprawić, zmienić, dodać nową funkcjonalność albo wycofać się z pomysłu, który okazał się nietrafiony. W praktyce, jak klient zmienia zdanie albo rynek wymusza inne podejście – Agile pozwala szybko reagować bez katastrofalnych opóźnień. Moim zdaniem to właśnie dlatego standardy, takie jak Scrum czy Kanban (oba w duchu Agile), są dziś tak popularne nie tylko w software, ale nawet w marketingu czy budowlance. Co ciekawe, Agile promuje współpracę całego zespołu z klientem na każdym etapie, więc ryzyko, że coś zostanie źle zrozumiane i pójdzie do produkcji, jest dużo mniejsze niż w klasycznych podejściach. Warto pamiętać, że to nie jest model totalnego chaosu – są tu zasady i dobre praktyki, ale największym atutem jest właśnie ta adaptacyjność do zmieniających się warunków projektu.

Pytanie 33

Który z poniższych przykładów stanowi aplikację mobilną wykorzystującą bazę danych?

A. Aplikacja gromadząca listę kontaktów użytkownika
B. Aplikacja do robienia zdjęć
C. Aplikacja kalkulator
D. Aplikacja wyświetlająca lokalny czas

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Aplikacja przechowująca listę kontaktów użytkownika korzysta z bazy danych do przechowywania, odczytywania i zarządzania danymi. Tego typu aplikacje mobilne muszą efektywnie zarządzać dużą ilością danych i zapewniać ich szybki dostęp. Bazy danych, takie jak SQLite czy Firebase, są szeroko stosowane w aplikacjach mobilnych, umożliwiając przechowywanie kontaktów, wiadomości, notatek i innych informacji użytkownika. Dzięki bazom danych możliwe jest także synchronizowanie danych pomiędzy urządzeniami i przechowywanie ich w chmurze.

Pytanie 34

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

A. Trello
B. Git
C. Jira
D. Bugzilla

Brak odpowiedzi na to pytanie.

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

Pytanie 35

Co to jest lazy loading w kontekście ładowania obrazów na stronie?

A. Technika ładowania obrazów dopiero w momencie, gdy stają się widoczne dla użytkownika
B. Metoda kompresji obrazów przed wysłaniem na serwer
C. Format przechowywania obrazów w pamięci podręcznej przeglądarki
D. Protokół transferu obrazów między serwerem a przeglądarką

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Lazy loading to technika, która pozwala na ładowanie obrazów oraz innych zasobów dopiero w momencie, gdy stają się one widoczne dla użytkownika na ekranie. Dzięki temu oszczędzamy zasoby sieciowe i poprawiamy czas ładowania strony, co jest szczególnie istotne w kontekście optymalizacji SEO oraz doświadczenia użytkownika. Na przykład, w przypadku długiej strony internetowej z wieloma obrazami, lazy loading sprawia, że podczas przewijania strony obrazy nie są ładowane od razu, co zmniejsza obciążenie serwera i przyspiesza wczytywanie widocznych części strony. W praktyce można zastosować atrybuty takie jak "loading='lazy'" w znaczniku <img>, co jest zgodne z nowoczesnymi standardami HTML. Ponadto, wiele bibliotek i frameworków, jak np. Intersection Observer API, umożliwia zaawansowaną implementację lazy loadingu, co sprawia, że jest to obecnie powszechnie stosowana praktyka.

Pytanie 36

Co to jest Webpack?

A. Narzędzie do budowania modułów i zarządzania zależnościami w aplikacjach JavaScript
B. Framework JavaScript do tworzenia aplikacji mobilnych
C. System zarządzania bazami danych dla aplikacji Node.js
D. Biblioteka do testowania kodu JavaScript

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Webpack to zaawansowane narzędzie do budowania modułów, które znacząco ułatwia zarządzanie zależnościami w aplikacjach JavaScript. Umożliwia on zorganizowane łączenie różnych zasobów, takich jak skrypty JavaScript, style CSS, obrazy i inne pliki, w jeden lub kilka plików wyjściowych. Dzięki temu programiści mogą zoptymalizować czas ładowania aplikacji, minimalizując rozmiar plików i eliminując zbędne zapytania do serwera. Przykładowo, korzystając z Webpacka, można skonfigurować automatyczną kompresję kodu i zastosowanie technik takich jak kod dzielony (code splitting), co znacząco podnosi wydajność aplikacji. Dodatkowo, Webpack wspiera różne wtyczki i loadery, co pozwala na łatwą integrację z narzędziami do kompilacji, takimi jak Babel, umożliwiający użycie nowoczesnych funkcji JavaScript, które mogą nie być jeszcze wspierane przez wszystkie przeglądarki. Standardy branżowe kładą duży nacisk na efektywność i utrzymywalność kodu, a Webpack, będąc częścią ekosystemu JavaScript, skutecznie wspiera te zasady.

Pytanie 37

Jakie jest rozwiązanie dla dodawania binarnego liczb 1011 oraz 110?

A. 10001
B. 10101
C. 11101
D. 11001

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Dodawanie binarne to podstawowa operacja w systemie liczbowym, który używa tylko dwóch cyfr: 0 i 1. W przypadku dodawania liczb binarnych, proces ten przypomina dodawanie w systemie dziesiętnym, jednak z pewnymi różnicami ze względu na ograniczony zestaw cyfr. Gdy dodajemy liczby 1011 i 110, należy ustawić je w kolumnach, podobnie jak w dodawaniu dziesiętnym. Zaczynamy od najmniej znaczącej cyfry. W pierwszej kolumnie mamy 1 + 0, co daje 1. W drugiej kolumnie mamy 1 + 1, co daje 0, ale musimy przenieść 1 do następnej kolumny (przeniesienie jest kluczowym elementem w dodawaniu binarnym). W trzeciej kolumnie dodajemy 1 (przeniesienie) + 0 + 1, co daje 0 i przenosimy 1 do następnej kolumny. W czwartej kolumnie dodajemy przeniesienie 1 + 1 (z liczby 1011), co daje 10 w systemie binarnym, co oznacza 0 i przeniesienie 1. Końcowym wynikiem dodawania daje 10001 w systemie binarnym. To podejście jest zgodne z zasadami arytmetyki binarnej, które są fundamentem działania komputerów i systemów cyfrowych, w których operacje na danych są realizowane w systemie binarnym.

Pytanie 38

Co to jest git rebase?

A. Technika integracji zmian z jednej gałęzi do drugiej przez przeniesienie lub połączenie sekwencji commitów
B. Narzędzie do rozwiązywania konfliktów między plikami
C. Polecenie do tworzenia nowego repozytorium
D. Metoda tworzenia kopii zapasowej repozytorium

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Git rebase to technika stosowana w systemach kontroli wersji, która umożliwia integrację zmian z jednej gałęzi do drugiej poprzez przeniesienie lub połączenie sekwencji commitów. W praktyce, rebase pozwala na 'przeniesienie' commitów z gałęzi roboczej na szczyt gałęzi docelowej, co skutkuje liniowym historią commitów. Taka struktura jest bardziej przejrzysta i ułatwia śledzenie wprowadzonych zmian. Przykładem zastosowania może być sytuacja, gdy pracujesz nad nową funkcjonalnością w gałęzi feature, a w międzyczasie na gałęzi main wprowadzono istotne poprawki. Wykonując rebase na swojej gałęzi feature, możesz szybko zintegrować zmiany z main, co pozwala na uniknięcie problemów z późniejszym scaleniem. Rebase jest zgodny z dobrymi praktykami branżowymi, ponieważ wspiera utrzymanie czystej historii projektu. Należy jednak pamiętać, że rebase zmienia historię, co sprawia, że nie powinno się go stosować na publicznych gałęziach, aby nie komplikować pracy innych deweloperów.

Pytanie 39

Zajmując się pracą w zespole oraz dbając o jego efektywne funkcjonowanie, nie powinniśmy

A. przyjmować odpowiedzialności za swoje decyzje
B. sumiennie i w ustalonym terminie realizować swoje zadania
C. skupiać się jedynie na własnych korzyściach
D. wspierać się nawzajem

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Dokładnie o to chodzi – skupianie się tylko na własnych korzyściach prawie zawsze działa na szkodę zespołu. W praktyce, gdy ktoś patrzy wyłącznie na siebie, najczęściej zaniedbuje współpracę, co prowadzi do napięć i spadku efektywności grupy. W zespole liczy się wspólny cel, a nie indywidualne interesy, bo to właśnie dzięki wzajemnemu wsparciu i otwartej komunikacji można osiągnąć lepsze wyniki. Z mojego doświadczenia wynika, że projekty, w których członkowie współpracowali i dzielili się odpowiedzialnością, szły sprawniej i bez zbędnych spięć. Profesjonalne standardy, np. metodyki Scrum czy Agile, akcentują wartość pracy zespołowej i transparentności – jeśli każdy ciągnie w swoją stronę, cały model współpracy się sypie. Warto pamiętać, że nawet najlepszy specjalista sam nie pociągnie projektu, jeśli nie będzie działał fair wobec innych. Najlepiej się sprawdza takie podejście, gdzie ludzie podchodzą do pracy z otwartością, potrafią poprosić o pomoc i wspólnie świętują sukcesy, a nie tylko skupiają się na własnych liczbach czy bonusach. To naprawdę widać w praktyce – zespoły, gdzie nie liczy się tylko własny interes, mają zwykle znacznie lepsze efekty i atmosferę pracy.

Pytanie 40

Jaką rolę odgrywa destruktor w definicji klasy?

A. Generuje nowe instancje klasy
B. Realizuje testy jednostkowe klasy
C. Ustawia wartości pól klasy
D. Usuwa instancje i zwalnia pamięć

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Destruktor to specjalna metoda klasy, która jest automatycznie wywoływana w momencie, gdy obiekt przestaje być używany. Jego zadaniem jest zwalnianie zasobów, takich jak pamięć dynamiczna, uchwyty do plików lub połączenia sieciowe. Destruktor ma tę samą nazwę co klasa, poprzedzoną symbolem `~` w C++ (`~Samochod()`). Destruktor zapobiega wyciekom pamięci i zapewnia, że wszystkie zasoby są poprawnie zwalniane po zakończeniu pracy obiektu. Jest to kluczowy element zarządzania cyklem życia obiektu w językach takich jak C++.