Wyniki egzaminu

Informacje o egzaminie:
  • Zawód: Technik programista
  • Kwalifikacja: INF.04 - Projektowanie, programowanie i testowanie aplikacji
  • Data rozpoczęcia: 14 maja 2026 00:15
  • Data zakończenia: 14 maja 2026 00:38

Egzamin zdany!

Wynik: 29/40 punktów (72,5%)

Wymagane minimum: 20 punktów (50%)

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

Programista może wykorzystać framework Angular do realizacji aplikacji

A. desktopowej
B. typu front-end
C. mobilnej
D. typu back-end
Angular to naprawdę fajny framework, stworzony przez Google, który głównie skupia się na tworzeniu aplikacji webowych po stronie klienta, czyli na front-endzie. Umożliwia programistom tworzenie dynamicznych i interaktywnych interfejsów użytkownika. Dzięki tej modularnej budowie, można łatwo zarządzać różnymi częściami aplikacji, co jest super przydatne. Z własnego doświadczenia mogę powiedzieć, że Angular świetnie nadaje się do aplikacji jednoekranowych (SPA), bo pozwala na ładowanie danych asynchronicznie. Przykładem może być aplikacja do zarządzania projektami, gdzie użytkownik może dodawać, edytować i usuwać zadania bez przeładowywania strony. Angular integruje się też z RxJS, co sprawia, że zarządzanie zdarzeniami i strumieniami danych staje się efektywniejsze. Warto również dodać, że Angular CLI pozwala szybko generować komponenty i inne elementy aplikacji, co przyspiesza cały proces tworzenia i pomaga utrzymać spójność projektu.

Pytanie 2

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

A. Typ danych do zapisywania tekstów
B. Zmienna przechowująca adres pamięci
C. Zmienna przechowująca wartość logiczną
D. Funkcja do dynamicznej alokacji pamięci
Zmienne przechowujące wartości logiczne to typ bool (np. true/false) i nie mają związku z wskaźnikami. Funkcje dynamicznie alokujące pamięć, takie jak malloc(), zwracają adresy, ale same nie są wskaźnikami. Typ danych do przechowywania tekstów w C to tablica znaków (char[]) lub wskaźnik do char, ale to nie to samo co wskaźnik w sensie ogólnym, który może wskazywać na dowolny typ danych.

Pytanie 3

Który z wymienionych elementów UI w aplikacjach mobilnych jest odpowiedzialny za przechodzenie pomiędzy ekranami?

A. ListView
B. Pasek narzędziowy
C. Navigation Drawer
D. Przycisk
Navigation Drawer to jeden z najczęściej stosowanych komponentów interfejsu użytkownika w aplikacjach mobilnych na platformie Android. Pozwala na stworzenie bocznego menu nawigacyjnego, które użytkownik może wysunąć z lewej (lub rzadziej z prawej) krawędzi ekranu. Drawer umożliwia szybki dostęp do różnych sekcji aplikacji, co poprawia nawigację i organizację interfejsu. Navigation Drawer jest szeroko wykorzystywany w aplikacjach mobilnych takich jak Gmail, YouTube czy Google Maps, ponieważ zapewnia przejrzysty i intuicyjny sposób poruszania się po aplikacji, zachowując minimalistyczny wygląd interfejsu. Dzięki niemu użytkownik ma dostęp do wielu opcji bez konieczności zaśmiecania głównego ekranu aplikacji przyciskami nawigacyjnymi. W Android Studio Navigation Drawer można zaimplementować poprzez gotowe szablony lub za pomocą komponentu DrawerLayout.

Pytanie 4

Wynik dodawania liczb binarnych 1101 i 1001 to

A. 10110
B. 1001
C. 1110
D. 10111
Dodając liczby binarne 1101 i 1001, otrzymujemy wynik 10110. Wynika to z zasad dodawania bitów, gdzie sumujemy od prawej do lewej, pamiętając o przeniesieniu, gdy suma przekracza 1 (czyli tak jakby pojawia się „dwójka” w systemie dziesiętnym). Tutaj: 1+1=0 i przeniesienie 1, później 0+0+1=1, dalej 1+0=1, potem 1+1=0 i znowu przeniesienie 1, ostatni przeniesiony bit daje nam 1 na początku, więc cały wynik to 10110. Taki sposób sumowania jest podstawą działania procesorów – praktycznie w każdym sprzęcie elektronicznym obliczenia wykonują się właśnie binarnie. To nie tylko teoria – gdy programujesz mikrokontrolery albo pracujesz z układami cyfrowymi, te operacje to chleb powszedni. Moim zdaniem warto ogarnąć ten temat, bo dzięki temu łatwiej zrozumiesz działanie sumatorów w logice cyfrowej czy nawet podstawowe algorytmy komputerowe. W branży IT umiejętność szybkiego przeliczenia binarnego to raczej podstawa, szczególnie jak zabierasz się za elektronikę czy programowanie niskopoziomowe. Dla przykładu – większość protokołów sieciowych, maski IP itp. opiera się właśnie na operacjach binarnych, więc znajomość tego tematu zdecydowanie się przydaje. Poza tym, zgodnie z normami opisu algorytmów (np. IEEE), operacje na bitach są podstawową abstrakcją w projektowaniu sprzętu i oprogramowania.

Pytanie 5

Jakie są cechy testów interfejsu?

A. Ulepszają kod aplikacji
B. Weryfikują zgodność aplikacji z przepisami prawnymi
C. Analizują wydajność aplikacji w czasie rzeczywistym
D. Sprawdzają prawidłowość pracy elementów graficznych oraz interakcji użytkownika z aplikacją
Testy interfejsu, znane też jako testy GUI (Graphical User Interface), są niesamowicie istotne w codziennej pracy programisty, zwłaszcza jeśli chodzi o aplikacje z graficznym interfejsem użytkownika. Ich głównym celem jest sprawdzanie, czy wszystkie elementy graficzne, takie jak przyciski, pola tekstowe czy menu działają zgodnie z założeniami oraz czy użytkownik może wchodzić z nimi w interakcję w przewidywany sposób. W praktyce zdarza się, że najwięcej błędów wychodzi właśnie na tym etapie – na przykład, kliknięcie w przycisk nie wywołuje żadnej akcji, albo okna dialogowe są nieczytelne. Moim zdaniem regularne wykonywanie takich testów (często automatycznych przy użyciu narzędzi typu Selenium, Cypress czy Playwright) pozwala wykrywać drobne usterki zanim trafią do rąk klienta, co jest zgodne z dobrymi praktykami Continuous Integration. Często też testy te są weryfikowane pod kątem responsywności, dostępności (WCAG) czy kompatybilności z różnymi przeglądarkami. Z mojego doświadczenia to właśnie testy interfejsu najbardziej pomagają w budowaniu pozytywnych doświadczeń użytkowników, bo pomagają wychwycić nieintuicyjne zachowania aplikacji, które ciężko zauważyć samym kodem. Warto więc o nich pamiętać, bo nawet najlepsza logika aplikacji nie obroni się, gdy UI nie działa poprawnie.

Pytanie 6

Jakie jest główne zadanie portali społecznościowych?

A. Analiza rezultatów działalności gospodarczej
B. Zarządzanie handlem produktami i usługami
C. Tworzenie kopii zapasowych plików
D. Udostępnianie informacji i interakcja między użytkownikami
Główna funkcja portali społecznościowych polega na umożliwieniu użytkownikom tworzenia, udostępniania oraz wymiany treści, a także komunikacji w czasie rzeczywistym. Portale takie jak Facebook, Twitter czy Instagram pozwalają na interakcję poprzez posty, komentarze, polubienia oraz wiadomości prywatne. Użytkownicy mogą dzielić się zdjęciami, filmami, artykułami lub osobistymi przemyśleniami, co sprzyja budowaniu społeczności i nawiązywaniu relacji. Funkcjonalności te są zgodne z najlepszymi praktykami UX/UI, które kładą nacisk na intuicyjność i łatwość obsługi. W kontekście SEO, portale społecznościowe są także ważne ze względu na możliwość generowania ruchu na zewnętrzne strony internetowe poprzez linki i udostępnienia. Przykładem może być wykorzystanie platformy Instagram do promocji produktów, gdzie użytkownicy mogą kliknąć w linki do sklepu. Takie działania zwiększają widoczność marki w Internecie oraz angażują odbiorców, co jest kluczowe dla efektywnej strategii marketingowej.

Pytanie 7

Jakie z wymienionych funkcji są typowe dla narzędzi służących do zarządzania projektami?

A. Nadzorowanie postępu realizacji
B. Opracowywanie diagramów przepływu
C. Przeprowadzanie analizy statystycznej
D. Tworzenie interfejsu użytkownika
Monitorowanie postępu prac to jedna z kluczowych funkcji narzędzi do zarządzania projektami. Dzięki temu zespoły mogą śledzić realizację zadań, identyfikować opóźnienia oraz efektywnie alokować zasoby. Narzędzia takie jak Jira, Trello czy Asana pozwalają na wizualizację postępów, co ułatwia kontrolowanie harmonogramu oraz planowanie kolejnych etapów projektu. Monitorowanie postępu prac pomaga także w wykrywaniu wąskich gardeł i umożliwia szybkie podejmowanie decyzji, co znacząco zwiększa efektywność całego zespołu. Funkcja ta jest szczególnie istotna w zarządzaniu projektami IT, budowlanymi i kreatywnymi, gdzie koordynacja wielu zadań jest kluczowa dla sukcesu projektu.

Pytanie 8

Programem służącym do monitorowania błędów oraz organizacji projektów jest:

A. Jira
B. Bugzilla
C. Git
D. Jasmine
Wiele osób myli pojęcia i narzędzia związane z zarządzaniem projektami oraz monitorowaniem błędów, co prowadzi do nieporozumień i błędnych wyborów w codziennej pracy. Git to system kontroli wersji, który służy głównie do zarządzania kodem źródłowym, śledzenia zmian i współpracy programistów. To narzędzie nie nadaje się do monitorowania błędów czy zarządzania projektami w ujęciu zadań, harmonogramów czy backlogów – chociaż można w nim np. dopisywać komentarze do commitów, to nie jest to jego główna rola. Bugzilla natomiast faktycznie umożliwia śledzenie błędów, ale jej funkcjonalności związane z zarządzaniem całymi projektami są dość ograniczone. Moim zdaniem to narzędzie trochę już przestarzałe, rzadziej obecnie używane, bo brakuje mu integracji ze współczesnymi procesami Agile czy automatyzacją typową dla większych platform. Jasmine z kolei to zupełnie inna kategoria – to framework do testów jednostkowych w JavaScript, używany do automatyzacji testów, ale nie do zarządzania zadaniami czy błędami. Często spotykam się z tym, że ktoś widząc znajomą nazwę narzędzia, przypisuje mu inne funkcje niż faktycznie posiada. W praktyce, profesjonalne prowadzenie projektu IT wymaga narzędzia, które pozwoli nie tylko śledzić błędy, ale też zarządzać backlogiem, przydzielać zadania, raportować postępy i integrować się z pozostałymi systemami zespołu programistycznego – te wszystkie cechy ma właśnie Jira. Dobór odpowiedniego narzędzia to nie tylko kwestia mody, ale przede wszystkim skuteczności i zgodności z dobrymi praktykami, jak np. Continuous Integration czy Agile. Warto zawsze najpierw dokładnie zrozumieć, do czego dane narzędzie służy, żeby nie tracić czasu na nieefektywne rozwiązania.

Pytanie 9

Jaką wartość ma zmienna b po wykonaniu poniższego kodu?

int a = 1, b = 20, c = 3;
while (a <= 10) {
    b = b - c;
    a += 2;
}
A. 11
B. 20
C. 5
D. 2
Po przeanalizowaniu przedstawionego kodu, możemy zauważyć, że zmienne a b i c są zainicjalizowane odpowiednio wartościami 1 20 i 3. Pętla while jest zależna od warunku a <= 10 co oznacza że będzie się wykonywać dopóki a nie przekroczy 10. W ciele pętli najpierw zmniejszamy wartość b o wartość c czyli b = b - c a następnie zwiększamy a o 2 czyli a += 2. Ponieważ a jest początkowo równe 1 pętla będzie się wykonywać pięć razy zanim a stanie się większe niż 10 (1 3 5 7 9). Podczas każdej iteracji wartość b zmniejsza się o 3 (ponieważ c=3). Po pięciu iteracjach wartość b zostanie zmniejszona o 15 (5*3) z początkowej wartości 20 uzyskując ostatecznie 5. W tym kontekście poprawna odpowiedź to 5. Takie podejście do analizy pętli i zmiennych jest kluczowe podczas programowania ponieważ pozwala zrozumieć jak zmieniają się wartości zmiennych w czasie wykonywania programu. Zrozumienie tych zasad jest fundamentalne w programowaniu proceduralnym oraz w debugowaniu kodu.

Pytanie 10

Która z wymienionych sytuacji stanowi naruszenie praw autorskich?

A. Nabycie licencji na oprogramowanie
B. Tworzenie kopii zapasowej legalnie zakupionego programu
C. Używanie programu typu open-source zgodnie z warunkami licencji
D. Udostępnianie filmu objętego prawami autorskimi bez zgody właściciela
Publikowanie filmu chronionego prawami autorskimi bez zgody właściciela jest naruszeniem praw autorskich. Prawa autorskie chronią twórców przed nieuprawnionym kopiowaniem, dystrybucją i rozpowszechnianiem ich dzieł. W przypadku filmów, muzyki czy oprogramowania, każde użycie bez odpowiednich licencji lub zgody właściciela jest niezgodne z prawem. Twórcy mają prawo do wynagrodzenia za swoją pracę, a naruszenia mogą skutkować wysokimi grzywnami, a nawet postępowaniem sądowym. Przestrzeganie praw autorskich wspiera rozwój kultury i technologii, chroniąc interesy twórców.

Pytanie 11

Do czego służy operator spread (...) w JavaScript?

A. Do konwersji liczby na string
B. Do rozwinięcia tablicy lub obiektu na poszczególne elementy
C. Do łączenia dwóch różnych typów danych
D. Do sprawdzania typu danych
Operator spread (...) w JavaScript jest niezwykle użytecznym narzędziem, które pozwala na łatwe rozwijanie tablic i obiektów do ich poszczególnych elementów lub właściwości. Umożliwia to na przykład przekazywanie elementów tablicy jako argumentów do funkcji lub łączenie wielu obiektów w jeden. Przykładowo, jeśli mamy tablicę `const arr = [1, 2, 3];` to używając operatora spread, możemy przekazać te elementy do funkcji tak: `Math.max(...arr)`, co zwróci 3. Dodatkowo, operator ten jest często używany przy tworzeniu nowych obiektów na podstawie istniejących. Na przykład, mając obiekt `const obj = { a: 1, b: 2 };`, możemy stworzyć nowy obiekt z dodatkową właściwością: `const newObj = { ...obj, c: 3 };` co da `newObj = { a: 1, b: 2, c: 3 };`. Operator spread jest zgodny z ES6 i stał się standardem w praktykach programistycznych, ułatwiając pisanie czystszych i bardziej elastycznych kodów. Warto go stosować, aby poprawić czytelność i efektywność swojego kodu.

Pytanie 12

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

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

Pytanie 13

Która z wymienionych reguł należy do netykiety?

A. Zaniechanie odpowiadania na wiadomości od innych użytkowników
B. Stosowanie nieformalnego języka w każdej rozmowie
C. Unikanie używania dużych liter w komunikacji
D. Udostępnianie treści bez zgody właścicieli
Unikanie pisania wielkimi literami w wiadomościach jest kluczowym elementem netykiety, ponieważ tekst pisany dużymi literami w internecie jest powszechnie interpretowany jako krzyk. To zasada, która ma na celu utrzymanie kultury komunikacji online oraz zapewnienie komfortu odbiorcy. Gdy użytkownik korzysta z wielkich liter, może to być odbierane jako agresywne lub dominujące, co może prowadzić do nieporozumień oraz negatywnych reakcji. Przykładem może być sytuacja, w której osoba, pisząc do grupy na forum internetowym, używa wyłącznie wielkich liter, co może zniechęcić innych do interakcji. Dobrą praktyką jest pisanie w sposób przystępny i zrozumiały, co sprzyja pozytywnej atmosferze w komunikacji. Standardy netykiety, takie jak te przedstawione w dokumentach związanych z etyką w internecie, podkreślają znaczenie szacunku i zrozumienia w interakcjach online, co obejmuje również sposób formułowania wiadomości. Warto także pamiętać o tym, że różne platformy społecznościowe mają swoje zasady, które podkreślają unikanie pisania krzykiem, co potwierdza ogólne podejście do netykiety.

Pytanie 14

Cytat zaprezentowany powyżej dotyczy metodyki RAD. Co oznacza ten skrót w języku polskim?

... (RAD) .... is a general term for adaptive software development approaches, and the name for James Martin's method of rapid development. In general, RAD approaches to software development put less emphasis on planning and more emphasis on an adaptive process. Prototypes are often used in addition to or sometimes even instead of design specifications.
Źródło: https://en.wikipedia.org/wiki Dostęp: 25.03.2021
A. szybki rozwój aplikacji
B. środowisko do tworzenia aplikacji
C. zintegrowane środowisko deweloperskie
D. środowisko błyskawicznego programowania
RAD czyli Rapid Application Development to podejście do tworzenia oprogramowania które skupia się na szybkim wytwarzaniu aplikacji. Kluczowym elementem tej metodyki jest minimalizacja czasu spędzanego na planowaniu i projektowaniu na rzecz szybkiego prototypowania i elastycznego dostosowywania się do zmieniających się wymagań. W praktyce RAD wykorzystuje krótkie cykle rozwoju oraz intensywną współpracę z użytkownikami końcowymi co pozwala na szybkie reagowanie na ich potrzeby. W porównaniu do tradycyjnych metod RAD zapewnia większą elastyczność i skrócenie czasu dostarczenia produktu co jest szczególnie wartościowe w dynamicznie zmieniających się środowiskach biznesowych. Dobre praktyki w RAD obejmują użycie narzędzi do szybkiego prototypowania oraz zaangażowanie użytkowników w proces testowania co pozwala na bieżące wprowadzanie zmian i udoskonaleń. Dzięki temu uzyskuje się produkt lepiej dopasowany do oczekiwań użytkowników co zwiększa jego użyteczność i satysfakcję końcową. RAD jest często stosowany w projektach gdzie czas dostarczenia jest krytycznym czynnikiem sukcesu co odzwierciedla jego praktyczne zastosowanie w wielu branżach

Pytanie 15

Jakie obliczenia można wykonać za pomocą poniższego algorytmu, który operuje na dodatnich liczbach całkowitych?

Ilustracja do pytania
A. sumę wprowadzonych liczb
B. największy wspólny dzielnik wprowadzonej liczby
C. sumę cyfr wprowadzonej liczby
D. liczbę cyfr w wprowadzonej liczbie
Analizując algorytm przedstawiony na schemacie, łatwo zauważyć, że nie wykonuje on ani sumowania cyfr, ani nie oblicza największego wspólnego dzielnika, ani nie sumuje wprowadzonych liczb. W praktyce mylenie tych operacji wynika często z pobieżnego czytania algorytmu lub automatycznego kojarzenia słowa „wynik” z sumą. Jednak podstawą analizy algorytmów zawsze powinno być zwracanie uwagi na konkretne instrukcje i sposób przetwarzania danych. W tym przypadku liczba jest dzielona przez 10 w każdej iteracji pętli, a licznik jest zwiększany o jeden za każdym razem, gdy to się dzieje. Nie ma tu żadnego dodawania poszczególnych cyfr, co wyklucza sumowanie cyfr. Nie pojawia się przetwarzanie wielu różnych liczb, więc niemożliwe jest sumowanie wprowadzonych liczb – algorytm pracuje wyłącznie na jednej wartości podanej na wejściu. Narzędzie do obliczania największego wspólnego dzielnika musiałoby operować na dwóch liczbach i wykorzystywać inne operacje, jak reszta z dzielenia. Typowym błędem jest też utożsamianie każdej pętli z operacją sumowania lub łączenia danych, co w tym przypadku nie ma uzasadnienia merytorycznego. Kluczowe jest przy analizie algorytmów zwracanie uwagi na to, jakie operacje są wykonywane w każdej iteracji i czy pojawia się obsługa wielu wartości, czy tylko jednej. Z mojego doświadczenia wynika, że takie drobne błędy myślowe prowadzą często do fałszywych wniosków, dlatego warto dokładnie czytać algorytm krok po kroku i analizować, do czego rzeczywiście prowadzą poszczególne instrukcje. W tym przypadku algorytm po prostu liczy liczbę dziesiętnych „pozycji” w liczbie aż do jej wyzerowania, co odpowiada liczbie cyfr, a nie żadnej z pozostałych interpretacji.

Pytanie 16

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

A. Pola tekstowe do wprowadzania danych użytkownika
B. Nagłówek HTTP
C. Tabela w bazie danych
D. Plik graficzny
Pola tekstowe do wprowadzania danych użytkownika są kluczowym elementem dynamicznego formularza logowania. Umożliwiają one użytkownikowi wprowadzenie informacji, takich jak nazwa użytkownika i hasło, co jest niezbędne do uwierzytelnienia w systemie. Formularze HTML wykorzystują tagi <input> do tworzenia pól tekstowych, a ich interakcja z użytkownikiem może być wspierana przez JavaScript lub inne technologie frontendowe, które walidują dane i zapewniają bezpieczeństwo procesu logowania. Pola tekstowe mogą być wzbogacone o atrybuty, takie jak 'required', 'pattern' czy 'type', które dodatkowo zabezpieczają formularz i ułatwiają użytkownikowi poprawne wypełnienie danych.

Pytanie 17

Który z poniższych formatów jest najczęściej używany do wymiany danych w aplikacjach webowych?

A. YAML
B. JSON
C. XML
D. CSV
JSON (JavaScript Object Notation) jest najczęściej używanym formatem wymiany danych w aplikacjach webowych ze względu na swoją prostotę, czytelność oraz łatwość w integracji z JavaScript. JSON jest lekki i pozwala na szybkie przetwarzanie danych, co czyni go idealnym wyborem w kontekście nowoczesnych aplikacji webowych, które często korzystają z technologii AJAX do komunikacji z serwerem. Przykładem zastosowania JSON może być przesyłanie danych z serwera do przeglądarki w aplikacjach SPA (Single Page Applications), gdzie asynchroniczne żądania wymagają formatu, który można łatwo zdeserializować na obiekt JavaScript. JSON wspiera zagnieżdżone struktury danych i kolekcje, co pozwala na modelowanie złożonych relacji między danymi. Ponadto, jego popularność doprowadziła do rozwoju wielu bibliotek i narzędzi, które ułatwiają pracę z tym formatem, takich jak `JSON.parse()` i `JSON.stringify()` w JavaScript. W związku z tym, JSON stał się de facto standardem dla wymiany danych w ekosystemie webowym, co potwierdzają również standardy takie jak REST, które często wykorzystują właśnie ten format do komunikacji z API.

Pytanie 18

Jaki kod może być związany z treścią wygenerowaną w trakcie działania programu Java?

Exception in thread "main" java.lang.ArithmeticException: / by zero
A. if (x > y) ...
B. x = 0;
C. x = tablica[6];
D. x = x % y;
Kod x = x % y; jest klasycznym przykładem operacji, która może prowadzić do wystąpienia wyjątku ArithmeticException w Javie, szczególnie gdy zmienna y przyjmuje wartość zero. Operator modulo (%) w języku Java nie toleruje dzielenia przez zero – w przeciwieństwie do niektórych innych języków, które mogą zwracać np. NaN lub Infinity, tutaj od razu zostanie zgłoszony wyjątek. Taki wyjątek jest dość powszechny w pracy programisty, zwłaszcza w aplikacjach, gdzie dane wejściowe nie są do końca kontrolowane. Moim zdaniem dobrze jest od razu przyzwyczaić się do zabezpieczania wszystkich operacji dzielenia i modulo poprzez wcześniejsze sprawdzenie wartości dzielnika. Rekomenduje się stosowanie warunków typu if (y != 0) przed wykonaniem takiej instrukcji, co jest zgodne z dobrymi praktykami defensywnego programowania. Dodatkowo, w środowiskach produkcyjnych często otacza się te fragmenty kodu blokiem try-catch, aby elegancko obsłużyć wyjątek i np. wyświetlić użytkownikowi zrozumiały komunikat. Warto pamiętać, że ArithmeticException dziedziczy po RuntimeException, a więc nie musimy jej jawnie obsługiwać, ale nie oznacza to, że powinniśmy ją ignorować – w dobrze napisanym kodzie zawsze należy przewidywać takie sytuacje. Z mojego doświadczenia wynika, że najwięcej błędów z tym związanych pojawia się w aplikacjach przetwarzających dane liczbowe, gdzie nawet niepozorna operacja modulo może „wywalić” cały proces, jeśli nie zostanie odpowiednio zaopiekowana.

Pytanie 19

W jaki sposób definiuje się konstruktor kopiujący w ramach klasy?

A. Inicjuje obiekt klasy na podstawie klasy dziedziczącej
B. Generuje nowy obiekt i usuwa wcześniejszy
C. Generuje nowy obiekt klasy bez przypisywania wartości
D. Tworzy nowy obiekt jako wierną kopię innego obiektu
Tworzenie nowego obiektu bez przypisania wartości to zadanie domyślnego konstruktora, który inicjalizuje obiekt, ale nie kopiuje stanu innego obiektu. Tworzenie obiektu na podstawie klasy pochodnej to proces dziedziczenia, a nie kopiowania – w tym przypadku tworzona jest nowa instancja klasy dziedziczącej, ale nie kopiowany jest stan innego obiektu. Usunięcie obiektu i stworzenie nowego nie jest zadaniem konstruktora kopiującego – za usuwanie odpowiada destruktor, który działa automatycznie podczas niszczenia obiektów.

Pytanie 20

Co to jest destructuring assignment w JavaScript?

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

Pytanie 21

Który system operacyjny jest podstawowym środowiskiem do tworzenia aplikacji mobilnych w języku Swift?

A. LG UX
B. Windows UWP
C. iOS
D. Android
Swift to język programowania stworzony przez Apple specjalnie z myślą o ekosystemie tej firmy, czyli głównie o systemach iOS, macOS, watchOS oraz tvOS. To właśnie iOS jest podstawową, domyślną platformą, na której programiści wykorzystują Swift do budowania aplikacji mobilnych. Praktycznie każda nowoczesna aplikacja na iPhone’a czy iPada, która powstała po 2014 roku, jest przynajmniej w części napisana w Swifcie, bo to obecnie standard branżowy w świecie Apple. Moim zdaniem to jest super wygodne, bo Apple dostarcza kompletne narzędzia do pracy ze Swiftem, jak Xcode czy rozbudowane frameworki (UIKit, SwiftUI). Z mojego doświadczenia wynika, że programowanie w Swifcie dla iOS to nie tylko prostsza składnia, ale też większa stabilność i bezpieczeństwo aplikacji – Apple bardzo dba o aktualizacje narzędzi i dobre praktyki. Warto też pamiętać, że od wersji SwiftUI rozwijanie aplikacji na iOS stało się jeszcze bardziej intuicyjne, bo można korzystać z deklaratywnego podejścia do interfejsów. W realnych projektach spotyka się też Objective-C, ale obecnie Swift wygrywa czytelnością i wsparciem społeczności. Gdyby ktoś chciał tworzyć aplikacje mobilne poza ekosystemem Apple, to niestety Swift nie będzie najlepszym wyborem – właśnie dlatego iOS jest tym środowiskiem, do którego Swift został stworzony i tam najbardziej się sprawdza.

Pytanie 22

Który z poniższych procesów jest wyłącznie związany z kompilowaniem kodu?

A. Generating an executable file
B. Detection of logical errors during program execution
C. Real-time translation of instructions
D. Executing code step by step
Tłumaczenie instrukcji w czasie rzeczywistym to coś, co robi interpreter, a nie kompilator. Jeśli chodzi o błędy logiczne, to są one wykrywane podczas debugowania albo testów – nie podczas samego wykonywania kodu. Debugger zajmuje się wykonywaniem kodu krok po kroku, a kompilacja to coś zupełnie innego, bo nie dzieje się na żywo. Kompilacja przetwarza kod przed jego uruchomieniem, co różni ją od interpretacji. Takie podejście ma swoje plusy i minusy, ale na pewno warto je znać.

Pytanie 23

Jakie jest zastosowanie metody fetch() w JavaScript?

A. Filtrowanie elementów tablicy
B. Pobieranie zasobów z sieci asynchronicznie
C. Sortowanie kolekcji obiektów
D. Manipulacja elementami DOM
Pojęcia związane z manipulacją danymi w JavaScript mogą prowadzić do mylnych interpretacji i wyborów. Filtrowanie elementów tablicy dotyczy operacji na danych już załadowanych w aplikacji i służy do selekcji określonych elementów na podstawie zdefiniowanych kryteriów. W JavaScript istnieje metoda filter(), która realizuje to zadanie, ale nie ma związku z pobieraniem zasobów z sieci. Z kolei manipulacja elementami DOM dotyczy interakcji z drzewem dokumentu HTML, a nie z komunikacją sieciową. To podejście koncentruje się na dynamicznych zmianach w strukturze strony, co jest innym aspektem programowania webowego. Z kolei sortowanie kolekcji obiektów odbywa się poprzez różne metody, takie jak sort(), które zmieniają kolejność elementów w tablicy bazując na określonych kryteriach. W kontekście fetch(), te operacje są nieadekwatne, ponieważ fetch() nie zajmuje się przetwarzaniem danych, które już znajdują się w aplikacji, lecz ich asynchronicznym pobieraniem z zewnętrznych źródeł. Często błędne zrozumienie funkcji fetch() prowadzi do myślenia, że jest narzędziem do manipulacji danymi, gdy w rzeczywistości jest to potężne narzędzie do komunikacji z serwerami. Ważne jest, aby w programowaniu pamiętać o specyfice metod i ich odpowiednich zastosowaniach, aby unikać nieporozumień i błędów w kodzie.

Pytanie 24

W frameworkach do budowy aplikacji mobilnych lub desktopowych znajduje zastosowanie wzorzec MVVM, oznaczający Model-View-ViewModel. Te podejście do programowania oznacza, że

A. interfejs użytkownika oraz logika aplikacji są oddzielone
B. kontrolki i widoki interfejsu użytkownika są zintegrowane z logiką aplikacji
C. interfejs użytkownika i logika aplikacji są umieszczone w jednym pliku
D. w aplikacji obecny jest jedynie interfejs użytkownika
Wzorzec MVVM, czyli Model-View-ViewModel, jest jednym z kluczowych podejść w architekturze aplikacji, szczególnie w kontekście aplikacji mobilnych i desktopowych. Zakłada on wyraźne rozdzielenie logiki aplikacji (Model) od warstwy prezentacji (View), z pomocą komponentu ViewModel, który działa jako mediator. Dzięki temu programiści mogą łatwiej zarządzać kodem, testować poszczególne komponenty oraz wprowadzać zmiany w interfejsie użytkownika bez wpływu na logikę aplikacji. Przykładem zastosowania MVVM jest framework WPF (Windows Presentation Foundation), w którym dane są wiązane do kontrolek w interfejsie użytkownika, co pozwala na automatyczną aktualizację widoków w przypadku zmian w modelu. Standardy takie jak Data Binding w WPF oraz Reactive Programming w Xamarin i Avalonia, pokazują, jak MVVM ułatwia rozwój aplikacji poprzez separację odpowiedzialności, co prowadzi do większej przejrzystości kodu i łatwości w jego utrzymywaniu.

Pytanie 25

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

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

Pytanie 26

Które z poniższych NIE jest typem wartości zwracanej przez funkcję w języku JavaScript?

A. Number
B. Object
C. Method
D. Undefined
W języku JavaScript funkcje mogą zwracać różne typy wartości, takie jak obiekty, liczby czy typ undefined. Wśród wymienionych opcji, 'Method' nie jest typem wartości zwracanej przez funkcję. W rzeczywistości, metoda w JavaScript to funkcja przypisana do obiektu. Jeżeli definiujemy funkcję wewnątrz obiektu, to możemy ją nazwać metodą tego obiektu, ale nie jest to typ wartości. Przykładowo, jeżeli mamy obiekt o nazwie 'person' i metodę 'greet', która zwraca powitanie: const person = { name: 'Jan', greet: function() { return 'Cześć, ' + this.name; } }; W powyższym przypadku, 'greet' jest metodą, ale jej wartością zwracaną jest typ string, co jest typowym zachowaniem funkcji. Dobrą praktyką jest zrozumienie różnicy między funkcjami a ich zastosowaniami w obiektach, co pozwala na lepsze projektowanie kodu oraz ukierunkowanie na zasady programowania obiektowego, które są kluczowe w JavaScript.

Pytanie 27

Jaką kategorię reprezentuje typ danych "array"?

A. Typ wskaźników
B. Typ logiczny
C. Typ danych prosty
D. Typ danych złożony
Tablica ('array') jest przykładem złożonego typu danych, który pozwala na przechowywanie wielu wartości tego samego typu pod wspólną nazwą. Każdy element tablicy jest dostępny za pomocą indeksu, co umożliwia szybkie i efektywne operacje na dużych zbiorach danych. Tablice są szeroko wykorzystywane w programowaniu do przechowywania list, macierzy i innych struktur, gdzie konieczne jest przechowywanie dużych ilości danych tego samego rodzaju. Dzięki tablicom można zorganizować dane w sposób uporządkowany, co ułatwia ich przetwarzanie, sortowanie i wyszukiwanie.

Pytanie 28

Zaprezentowany diagram ilustruje wyniki przeprowadzonych testów:

Ilustracja do pytania
A. wydajnościowych
B. ochrony
C. użyteczności
D. funkcjonalności
To właśnie są testy wydajnościowe – dokładnie takie parametry jak czasy ładowania, liczba żądań HTTP, rozmiar przesyłanych danych czy ilość przekierowań analizuje się w praktyce podczas oceny wydajności stron internetowych. Moim zdaniem ten typ testów jest absolutnie kluczowy w projektowaniu nowoczesnych aplikacji webowych, bo użytkownicy szybko rezygnują, jeśli strona się długo ładuje albo jest zbyt zasobożerna. W branży zwraca się obecnie ogromną uwagę na to, by strony były 'lekkie', szybkie i zoptymalizowane pod kątem przesyłu danych. Nawet Google premiuje szybkie serwisy w wynikach wyszukiwania, co niejeden programista już odczuł na własnej skórze. Testy wydajnościowe sprawdzają, jak aplikacja zachowuje się pod dużym obciążeniem i ile danych realnie pobierają użytkownicy. W praktyce polecam korzystać z narzędzi takich jak Google Lighthouse, WebPageTest czy nawet prosty DevTools w przeglądarce – pozwalają szybko wyłapać największe problemy z czasem ładowania. Warto też pamiętać, że optymalizacja wydajności to nie tylko lepsze wrażenia użytkownika, ale bardzo wymierne oszczędności na transferze i infrastrukturze. Dobry zwyczaj to cyklicznie monitorować te wskaźniki, nawet gdy wydaje się, że wszystko działa OK – bo sytuacja może się szybko zmienić po wdrożeniu nowych funkcjonalności lub zmianach w kodzie.

Pytanie 29

Które narzędzie służy do zarządzania zależnościami w projekcie JavaScript?

A. docker
B. npm
C. git
D. postman
Git, Docker i Postman to narzędzia, które są niezwykle przydatne w procesie tworzenia oprogramowania, ale pełnią zupełnie inne funkcje niż npm. Git to system kontroli wersji, który umożliwia śledzenie zmian w kodzie oraz współpracę zespołową. Chociaż jest kluczowy w zarządzaniu projektami, nie ma zastosowania w zarządzaniu zależnościami, co jest głównym celem npm. Docker to z kolei platforma do tworzenia, uruchamiania i zarządzania aplikacjami w kontenerach, co pozwala na łatwe przenoszenie i uruchamianie aplikacji w różnych środowiskach, ale również nie dotyczy bezpośrednio zarządzania paczkami JavaScript. Postman jest narzędziem do testowania interfejsów API, co także nie ma związku z instalowaniem i śledzeniem zależności w projektach. Typowym błędem jest mylenie funkcji tych narzędzi, co może prowadzić do nieefektywnego zarządzania projektem. Na przykład, jeśli projektant zdecyduje się nie korzystać z npm, może to prowadzić do problemów z zarządzaniem wersjami zewnętrznych bibliotek, co w konsekwencji może skutkować błędami w działaniu aplikacji. Dlatego ważne jest, aby zrozumieć, że każde z tych narzędzi ma swoje unikalne zastosowanie i są one komplementarne, a nie zamienne.

Pytanie 30

Który z wymienionych terminów dotyczy klasy, która stanowi podstawę dla innych klas, lecz nie może być tworzona w instancji?

A. Klasa pochodna
B. Klasa abstrakcyjna
C. Klasa finalna
D. Klasa statyczna
Klasa abstrakcyjna to klasa, która nie może być instancjonowana i służy jako szablon dla innych klas. Definiuje ona ogólną strukturę oraz interfejs, który klasy pochodne muszą zaimplementować. Klasy abstrakcyjne mogą zawierać zarówno metody z ciałem (zdefiniowane), jak i metody czysto wirtualne (bez implementacji), które muszą być przesłonięte w klasach pochodnych. W C++ deklaracja czysto wirtualnej metody odbywa się za pomocą '= 0'. Klasa abstrakcyjna zapewnia spójność interfejsu i narzuca implementację określonych metod we wszystkich klasach dziedziczących, co prowadzi do bardziej przewidywalnego i bezpiecznego kodu.

Pytanie 31

Jakie operacje na plikach można uznać za podstawowe?

A. Zmiana rozszerzenia plików podczas działania programu
B. Usuwanie oraz tworzenie nowych plików
C. Jedynie otwieranie oraz zamykanie plików
D. Otwieranie, zapisywanie, odczytywanie, zamykanie
Podstawowe operacje na plikach obejmują otwieranie, zapisywanie, odczytywanie i zamykanie. Te cztery operacje są fundamentem zarządzania plikami w programowaniu i pozwalają na efektywne przechowywanie oraz przetwarzanie danych. Otwarcie pliku umożliwia dostęp do jego zawartości, zapis pozwala na modyfikację lub tworzenie nowych plików, odczyt umożliwia pobieranie danych, a zamknięcie pliku zapewnia integralność danych i zwalnia zasoby systemowe. W wielu językach, takich jak C++, Java czy Python, operacje te są realizowane za pomocą dedykowanych funkcji i klas, co ułatwia ich implementację w kodzie.

Pytanie 32

Programista umieścił poniższą linię kodu w pliku HTML, aby

<script src="jquery-3.5.1.min.js"></script>
A. pobrać z Internetu w momencie otwierania strony i użyć biblioteki jQuery
B. skorzystać z funkcji biblioteki jQuery, która była wcześniej pobrana i zapisana lokalnie
C. zadeklarować własną funkcję JavaScript o nazwie min.js
D. wstawić kod JavaScript pomiędzy znacznikami &lt;script&gt;&lt;/script&gt;
Kod HTML jest często używany do włączania zewnętrznych bibliotek JavaScript, takich jak jQuery, które zostały wcześniej pobrane i zapisane lokalnie na serwerze. W tym przypadku atrybut src w znaczniku script wskazuje na lokalnie przechowywany plik jQuery, co oznacza, że przeglądarka załaduje bibliotekę z serwera, na którym znajduje się nasza strona. Korzystanie z lokalnych kopii bibliotek jest dobrą praktyką w przypadku ograniczonego lub niestabilnego dostępu do internetu, ponieważ gwarantuje dostępność bibliotek niezależnie od zewnętrznych źródeł. Zaletą tego rozwiązania jest redukcja potencjalnych opóźnień w ładowaniu strony, ponieważ plik jest już dostępny na tym samym serwerze. Użycie lokalnych plików jest również korzystne z punktu widzenia bezpieczeństwa, gdyż pozwala kontrolować dokładną wersję załadowanej biblioteki i uniknąć potencjalnych zagrożeń wynikających z modyfikacji zewnętrznych plików. W praktyce, programiści często łączą lokalne i zdalne zasoby, wybierając odpowiednią metodę w zależności od potrzeb projektu i dostępnych zasobów sieciowych.

Pytanie 33

Który fragment kodu ilustruje zastosowanie rekurencji?

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

Pytanie 34

Do implementacji w aplikacji jednokierunkowej funkcji skrótu, zwanej funkcją haszującą, można wykorzystać algorytm

A. DES
B. AES
C. MD5
D. RSA
Wiele osób myli funkcje szyfrujące z funkcjami skrótu i to jest dość powszechny błąd – spotkałem się z tym wielokrotnie podczas różnych zajęć czy projektów. Algorytmy takie jak DES, AES czy RSA to klasyczne przykłady szyfrów, czyli narzędzi do szyfrowania i odszyfrowywania danych, a nie do generowania skrótu. DES i AES to algorytmy szyfrowania symetrycznego, w których ten sam klucz jest używany zarówno do szyfrowania, jak i odszyfrowywania. RSA z kolei jest przykładem szyfrowania asymetrycznego – opiera się na parze kluczy: publicznym i prywatnym. Różnica jest fundamentalna: szyfrowanie zawsze daje możliwość odzyskania oryginalnych danych przy posiadaniu właściwego klucza, natomiast funkcja skrótu ma być jednokierunkowa, czyli nie ma (w praktyce) sposobu, by z hasha odzyskać oryginał. Stosowanie DES, AES czy RSA wszędzie tam, gdzie chodzi wyłącznie o weryfikację integralności albo podpisanie niewielkiego fragmentu danych, jest nieefektywne, niezgodne z dobrymi praktykami i standardami (np. NIST czy ISO/IEC 27001). Co więcej, taka pomyłka może prowadzić do poważnych błędów w zabezpieczeniach aplikacji. Przykład: szyfrując hasło zamiast haszować, narażamy się na jego łatwe odzyskanie przez atakującego, jeśli wycieknie klucz. Funkcje skrótu (np. MD5, SHA-256) są do tego stworzone – nie pozwalają odtworzyć wejścia, dają szybkie porównania. Warto rozumieć te różnice, bo w praktyce branżowej od tego zależy bezpieczeństwo całych systemów. Moim zdaniem, zaskakująco często nawet doświadczeni programiści się tutaj mylą, zwłaszcza jeśli nie zajmują się na co dzień bezpieczeństwem IT.

Pytanie 35

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

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

Pytanie 36

Wskaż poprawny pod względem składniowym kod dla formatu JSON, który jest używany do wymiany danych między backendem a frontendem aplikacji.

osoby: [
  {imię: 'Anna', wiek: '31' },
  {imię: 'Krzysztof', wiek: '25' }
]
"osoby": [
  {"imię": "Anna", "wiek": 31 },
  {"imię": "Krzysztof", "wiek": 25 }
]
Kod 1Kod 2
<osoby>
  <imie>Anna</imie>
  <wiek>31</wiek>
  <imie>Krzysztof</imie>
  <wiek>25</wiek>
</osoby>
struct osoby {
  imie: {Anna}, wiek:{31};
  imie: {Krzysztof}, wiek:{25}
};
Kod 3Kod 4
A. Kod4
B. Kod2
C. Kod3
D. Kod1
Kod2 jest spoko, bo składnia jest w porządku dla JSON. Używasz odpowiednich znaków i struktur, więc wszystko gra. JSON to taki format do wymiany danych, który często wykorzystuje się w komunikacji między frontendem a backendem. Zgadza się ze standardem ECMA-404. Pamiętaj, że klucze i wartości tekstowe powinny być w podwójnych cudzysłowach, co widać w Kod2. Twój przykładowy kod pokazuje tablicę obiektów, gdzie każdy obiekt ma pary klucz-wartość, a przecinki i nawiasy klamrowe są na swoim miejscu. To naprawdę dobry sposób, bo ułatwia współpracę między różnymi elementami aplikacji. JSON ma ważne zastosowanie w AJAX, bo dzięki niemu możemy dynamicznie aktualizować treści na stronie bez jej przeładowania. To jest mega przydatne w nowoczesnych aplikacjach typu SPA, gdzie JSON odgrywa kluczową rolę w zarządzaniu stanem aplikacji i komunikacji.

Pytanie 37

Który z wymienionych frameworków jest charakterystyczny dla aplikacji komputerowych pisanych w C#?

A. React
B. WPF (Windows Presentation Foundation)
C. Spring
D. Qt
WPF (Windows Presentation Foundation) to framework firmy Microsoft, który jest powszechnie wykorzystywany do tworzenia aplikacji desktopowych w języku C#. WPF pozwala na projektowanie zaawansowanych interfejsów użytkownika (UI) z wykorzystaniem XAML (Extensible Application Markup Language), co umożliwia oddzielenie logiki aplikacji od warstwy prezentacyjnej. WPF wspiera grafikę wektorową, animacje oraz różne efekty wizualne, co czyni go idealnym narzędziem do budowy nowoczesnych, estetycznych aplikacji dla systemu Windows. Integracja z .NET i Visual Studio umożliwia szybkie tworzenie aplikacji oraz korzystanie z bogatych bibliotek i gotowych komponentów UI. WPF jest szczególnie ceniony za elastyczność, obsługę danych i możliwość tworzenia aplikacji responsywnych.

Pytanie 38

Jakie środowisko deweloperskie jest najczęściej wykorzystywane do budowy aplikacji na platformę Android?

A. Android Studio
B. Visual Studio
C. PyCharm
D. XCode
Android Studio to oficjalne środowisko programistyczne (IDE) do tworzenia aplikacji na system Android. Zostało opracowane przez Google i zapewnia pełne wsparcie dla języków takich jak Java, Kotlin oraz C++. Android Studio oferuje narzędzia do projektowania interfejsu użytkownika (UI), emulatory urządzeń, a także debugger i profiler, które pozwalają na testowanie i optymalizację aplikacji. IDE to jest zintegrowane z Android SDK, co ułatwia dostęp do API systemu Android oraz narzędzi takich jak ADB (Android Debug Bridge). Android Studio to kluczowe narzędzie dla deweloperów mobilnych, umożliwiające szybkie wdrażanie aplikacji na różne urządzenia oraz publikację w Google Play Store.

Pytanie 39

Która z poniższych metod HTTP służy do aktualizacji zasobu?

A. DELETE
B. GET
C. PUT
D. POST
Metoda GET jest używana do pobierania danych z serwera, a nie do ich modyfikacji. Często błędnie uważa się, że ponieważ GET może zwracać aktualne dane, to można go użyć do aktualizacji zasobów. Jednakże, zgodnie z zasadami HTTP, GET nie powinien mieć żadnych efektów ubocznych na serwerze, co oznacza, że nie zmienia stanu zasobów. Z kolei metoda POST jest zazwyczaj używana do tworzenia nowych zasobów, a nie do ich aktualizacji. Choć można jej użyć do przesyłania danych, które następnie prowadzą do aktualizacji, nie jest to jej pierwotny cel. POST generuje nowe zasoby i w rezultacie nie jest idempotentny, co oznacza, że wielokrotne użycie tej samej operacji prowadzi do różnych rezultatów. Metoda DELETE, jak sama nazwa wskazuje, służy do usuwania zasobów, a nie ich aktualizacji. Wybierając niewłaściwe metody HTTP, można wprowadzić chaos w interfejsie API, co prowadzi do błędnych operacji oraz trudności w zarządzaniu zasobami. Dlatego ważne jest, aby dobrze zrozumieć, jakie są różnice między tymi metodami oraz jak właściwie je stosować w praktyce programistycznej, aby zapewnić zgodność z najlepszymi praktykami oraz standardami branżowymi.

Pytanie 40

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

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