Wyniki egzaminu

Informacje o egzaminie:
  • Zawód: Technik programista
  • Kwalifikacja: INF.04 - Projektowanie, programowanie i testowanie aplikacji
  • Data rozpoczęcia: 6 maja 2026 13:30
  • Data zakończenia: 6 maja 2026 13:43

Egzamin zdany!

Wynik: 31/40 punktów (77,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

Jakie działania można podjąć, aby uniknąć pogorszenia wzroku podczas korzystania z komputera?

A. Zachować stałą temperaturę w biurze
B. Korzytać ze słuchawek tłumiących dźwięki
C. Stosować ergonomiczne podkładki pod ręce
D. Używać filtrów przeciwodblaskowych na ekranie
Stosowanie filtrów przeciwodblaskowych na monitorze to skuteczny sposób na zapobieganie pogorszeniu wzroku podczas pracy przy komputerze. Filtry te redukują odbicia światła, zmniejszając zmęczenie oczu i poprawiając komfort pracy. Długotrwała praca przy komputerze bez odpowiedniej ochrony może prowadzić do zespołu suchego oka, bólu głowy i problemów z widzeniem. Filtry przeciwodblaskowe to prosty, ale bardzo efektywny sposób na poprawę ergonomii stanowiska pracy. W połączeniu z odpowiednim ustawieniem monitora, regularnymi przerwami oraz ćwiczeniami wzrokowymi, pomagają one w utrzymaniu zdrowia oczu.

Pytanie 2

Która z metod zarządzania projektem jest oparta na przyrostach realizowanych w sposób iteracyjny?

A. Model wodospadowy (waterfall)
B. Metodyki zwinne (Agile)
C. Model spiralny
D. Model prototypowy
Metodyki zwinne, czyli Agile, są naprawdę ciekawe, bo stawiają na iteracyjne podejście. To znaczy, że po trochu, krok po kroku realizujemy projekt, a każda iteracja dostarcza nam kawałek działającego produktu. Dzięki temu możemy łatwo dostosować się do zmieniających się wymagań klienta. W moim doświadczeniu, to świetny sposób na rozwijanie aplikacji, bo pozwala nam regularnie testować i wprowadzać zmiany. W Agile najważniejsza jest współpraca z klientem i szybkie dostarczanie wartości, co czyni ten model bardzo efektywnym, zwłaszcza w szybko zmieniających się warunkach.

Pytanie 3

Zawarty w ramce opis licencji sugeruje, że mamy do czynienia z licencją

Rodzaj licencji, który zapewnia otwarty dostęp do oprogramowania dla wszystkich użytkowników programu, którego dotyczy: prawo do darmowego użytkowania, kopiowania, rozpowszechniania oraz tworzenia modyfikacji, ulepszania i rozbudowania.
A. Open Source
B. Shareware
C. OEM
D. Freeware
Opis podany w pytaniu idealnie pasuje do koncepcji licencji Open Source. W praktyce oznacza to, że każdy użytkownik ma nie tylko prawo korzystać z oprogramowania za darmo, ale także może pobierać kod źródłowy, analizować go, modyfikować, ulepszać i nawet udostępniać dalej własne warianty. To daje ogromne możliwości rozwoju – nie tylko dla pojedynczych programistów, lecz przede wszystkim dla całych społeczności, które budują narzędzia i rozwiązania dużo szybciej niż zamknięte firmy. Przykłady? Linux, GIMP, LibreOffice, czy nawet przeglądarka Firefox. Moim zdaniem, to jest wręcz fundament nowoczesnego IT – wiele firm (nawet tych największych, typu Google czy Microsoft) opiera się dziś na rozwiązaniach Open Source, bo to daje elastyczność, bezpieczeństwo i transparentność. Branżowe standardy, np. licencja GNU GPL lub MIT, jasno określają zasady współdzielenia i ochrony praw autorskich. Dobra praktyka to zawsze sprawdzić warunki licencji przed wdrożeniem projektu w firmie albo szkole. Fajnie jest też pamiętać, że Open Source to nie tylko darmowość, ale przede wszystkim filozofia dzielenia się wiedzą, co w informatyce często prowadzi do innowacji i lepszej jakości kodu.

Pytanie 4

Jaki typ złośliwego oprogramowania funkcjonuje w tle, zbierając dane o wprowadzanych hasłach?

A. Spyware
B. Keylogger
C. Adware
D. Trojan
Trojan, spyware i adware to inne rodzaje złośliwego oprogramowania, które różnią się od keyloggerów. Trojan to taki program, który niby jest legalny, ale tak naprawdę wprowadza złośliwe kody do systemu. Nie zawsze oczywiście rejestruje naciśnięcia klawiszy, ale potrafi wpuścić inne złośliwe oprogramowanie, które już działa jak keylogger. Spyware zbiera dane o użytkownikach, ale to bardziej pasywne działanie, więc nie zawsze chodzi o klawisze. Adware z kolei wyświetla uciążliwe reklamy, jego celem jest zarabianie na reklamach. Mimo że adware może zbierać dane, to nie jest tak groźne jak keyloggery, które naprawdę potrafią przechwycić hasła i inne poufne informacje. Każdy z tych typów malware ma swoje unikalne cechy i sposoby działania.

Pytanie 5

Resuscytacja krążeniowo-oddechowa polega na realizowaniu

A. 30 ucisków klatki piersiowej oraz 2 oddechy ratunkowe
B. 15 ucisków klatki piersiowej oraz 3 oddechy ratunkowe
C. 20 ucisków klatki piersiowej oraz 1 oddech ratunkowy
D. 10 ucisków klatki piersiowej oraz 5 oddechów ratunkowych
Resuscytacja krążeniowo-oddechowa (RKO) w obecnych wytycznych Europejskiej Rady Resuscytacji polega właśnie na wykonywaniu 30 ucisków klatki piersiowej na przemian z 2 oddechami ratunkowymi. Taki schemat jest rekomendowany zarówno dla dorosłych, jak i dzieci (poza niemowlętami i sytuacjami szczególnymi), bo zapewnia optymalną perfuzję mózgu i serca, a jednocześnie daje szansę na dostarczenie tlenu do organizmu. Gdyby skrócić liczbę ucisków albo oddechów, efektywność spada, a szansa przeżycia jest mniejsza. Ja zawsze powtarzam, że praktyka czyni mistrza – jak ćwiczyliśmy na fantomach, to właśnie ten rytm: 30 ucisków, potem 2 szybkie oddechy, bez zbędnych przerw. Praktycznie, w stresie łatwo się pogubić, ale jak sobie utrwalicie ten schemat, działa automatycznie. Warto wiedzieć, że uciski muszą być na głębokość około 5–6 cm u dorosłych, z częstotliwością co najmniej 100–120 na minutę – to jest kluczowe dla skuteczności. Z mojego doświadczenia wynika, że najczęściej popełnianym błędem jest zbyt płytkie uciskanie i zbyt długie przerwy na oddechy, warto to poćwiczyć. Kiedy nie chce się robić oddechów (np. obawa przed zakażeniem), można prowadzić tylko uciski, ale pełne RKO daje największe szanse. Takie podejście jest sprawdzone praktycznie na całym świecie i jak dla mnie, nie ma sensu kombinować z innymi proporcjami.

Pytanie 6

Wskaż typy numeryczne o stałej precyzji

A. bool char, string
B. long long, long double
C. int, short, long
D. float, double
Typy numeryczne o stałej precyzji (czyli tzw. typy całkowite) to na przykład int, short, long – dokładnie te, które wskazałeś. Działają one trochę jak liczniki – przechowują liczby całkowite w określonym zakresie, bez przecinka. Moim zdaniem to podstawa, jeśli chodzi o reprezentowanie wartości typu liczba sztuk, indeks, identyfikator – wszędzie tam, gdzie nie potrzebujemy części ułamkowej. Ich precyzja wynika z tego, że są zdefiniowane w standardzie (np. w C++ czy Javie) jako liczby całkowite reprezentowane przez określoną liczbę bitów. Dla przykładu, 32-bitowy int zawsze pomieści wartości od -2 147 483 648 do 2 147 483 647 i każdy bit jest tu ważny. W praktyce, programując mikrokontrolery albo systemy wbudowane, właściwy wybór typu o stałej precyzji potrafi decydować o stabilności i wydajności całego programu. Warto też wiedzieć, że typy te – int, short, long – nie mają błędu zaokrągleń, co często zdarza się przy operacjach na liczbach zmiennoprzecinkowych. No i jeszcze takie małe spostrzeżenie: dobrym zwyczajem jest wybieranie najmniejszego typu całkowitego, który pokryje wymagany zakres, żeby zoptymalizować zużycie pamięci. Takie podejście mocno się przydaje, zwłaszcza jak się pracuje nad większym projektem, gdzie każda optymalizacja jest na wagę złota.

Pytanie 7

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

A. <play>
B. <video>
C. <media>
D. <film>
Odpowiedzi takie jak <media>, <film> czy <play> są nieprawidłowe, ponieważ nie istnieją jako standardowe elementy HTML5. <media> to dość szerokie pojęcie i nie odnosi się bezpośrednio do konkretnego tagu w HTML. W kontekście HTML5, nie ma elementu <media>, który mógłby służyć w sposób analogiczny do <video>. Z kolei <film> oraz <play> nie mają żadnego uznania w standardach HTML i nie pełnią roli w kontekście osadzania multimediów. Często błędne rozumienie tych terminów wynika z nieprzemyślanej analizy dostępnych możliwości HTML. Na przykład, <film> kojarzy się z filmami, ale w rzeczywistości nie ma takiego tagu, co może prowadzić do frustracji developerów. Podobnie <play> jest bardziej funkcją lub akcją, a nie elementem HTML. Współczesne standardy webowe jasno definiują, że do obsługi treści wideo należy używać elementu <video>, co jest zgodne z normami W3C. Ignorując te zasady, twórcy stron mogą napotkać problemy z kompatybilnością oraz wydajnością ich aplikacji. Warto zawsze opierać się na sprawdzonych dokumentacjach oraz standardach, aby unikać takich błędów i móc tworzyć wysokiej jakości produkty internetowe.

Pytanie 8

W jakiej sytuacji kolekcja typu lista okaże się bardziej wydajna niż tablica?

A. Gdy liczba elementów w kolekcji jest niezmienna
B. Gdy mamy pewność co do dokładnego rozmiaru kolekcji przed kompilacją
C. Gdy liczba elementów w kolekcji zmienia się dynamicznie
D. Gdy chcemy uzyskać dostęp do elementów przy pomocy indeksu
Lista to dynamiczna struktura danych, która pozwala na efektywne dodawanie i usuwanie elementów, zwłaszcza gdy liczba elementów zmienia się w trakcie działania programu. Listy są bardziej elastyczne niż tablice, ponieważ mogą dynamicznie dostosowywać swoją wielkość bez potrzeby alokacji dodatkowej pamięci. W przypadku dynamicznych operacji, takich jak częste wstawianie i usuwanie elementów, listy są znacznie bardziej wydajne niż tablice, które wymagają przesunięcia wszystkich elementów po każdej operacji. Listy świetnie sprawdzają się w implementacji kolejek, stosów oraz w strukturach, które muszą rosnąć i kurczyć się podczas działania aplikacji.

Pytanie 9

Aby wykorzystać framework Django, należy pisać w języku

A. C#
B. Java
C. Python
D. JavaScript
Czasami można się pomylić, bo widząc te wszystkie języki jak Java, C# czy JavaScript, łatwo założyć, że każdy framework webowy działa podobnie i może bazować na różnych technologiach. Jednak Django to nie jest uniwersalny framework na każdą platformę czy język. C# i Java są oczywiście bardzo popularne w środowiskach enterprise, służą do tworzenia rozbudowanych aplikacji biznesowych, ale mają swoje własne frameworki, jak ASP.NET dla C# czy Spring dla Javy. Próba wykorzystania Django z C# lub Javą to jak próba włożenia okrągłego klocka do kwadratowego otworu – po prostu nie pasuje, bo Django ma zupełnie inne API i korzysta z mechanizmów charakterystycznych dla Pythona. JavaScript natomiast, choć jest niezbędny we front-endzie i pozwala budować dynamiczne interfejsy użytkownika (szczególnie przy użyciu Reacta, Angulara czy Vue), nie jest wykorzystywany do pisania logiki serwera w Django. Owszem, istnieje Node.js, który pozwala na backend w JavaScript, ale to zupełnie inna bajka. Typowym błędem myślowym jest też zakładanie, że frameworki webowe są zamienne i można je „przełączyć” między językami – praktyka pokazuje, że każdy framework jest głęboko zintegrowany z konkretnym językiem, jego bibliotekami i narzędziami. Django powstał dla Pythona i tylko w tym języku można w pełni wykorzystać jego możliwości. Uważam, że warto zagłębić się w dokumentację i zobaczyć, jak wygląda kod przykładowych aplikacji – szybko widać, że całość bazuje na Pythonie, łącznie z konfiguracją, obsługą modeli i migracjami bazy danych. W profesjonalnych projektach przestrzega się tej zasady i nie próbuje się na siłę mieszać środowisk, tylko korzysta z narzędzi zgodnych z wybranym językiem.

Pytanie 10

Jakie metody można wykorzystać do przechowywania informacji o użytkownikach w aplikacji mobilnej na systemie Android?

A. Za pomocą plików SharedPreferences
B. Wyłącznie w zewnętrznych bazach danych
C. Tylko w pamięci RAM
D. W rejestrze systemu
SharedPreferences to jedno z najprostszych i najczęściej stosowanych narzędzi do przechowywania danych użytkownika w aplikacjach mobilnych na Androidzie. SharedPreferences umożliwia zapisywanie małych porcji danych w postaci par klucz-wartość. Jest to idealne rozwiązanie do przechowywania ustawień użytkownika, preferencji aplikacji oraz stanów interfejsu. Dane przechowywane w SharedPreferences są zapisywane w plikach XML i pozostają na urządzeniu nawet po zamknięciu aplikacji, co czyni je doskonałym narzędziem do przechowywania trwałych informacji. Deweloperzy cenią SharedPreferences za prostotę implementacji i wydajność, co sprawia, że jest to jedno z najbardziej uniwersalnych narzędzi do lokalnego przechowywania danych w aplikacjach mobilnych.

Pytanie 11

Wartości składowych RGB koloru #AA41FF zapisane w systemie szesnastkowym po przekształceniu na system dziesiętny są odpowiednio

A. 160, 64, 255
B. 170, 65, 255
C. 160, 65, 255
D. 170, 64, 255
Kolor zapisany w postaci szesnastkowej #AA41FF to jeden z najpopularniejszych formatów wykorzystywanych np. w CSS i projektowaniu graficznym. Składa się z trzech dwucyfrowych wartości: AA dla czerwonego (R), 41 dla zielonego (G) i FF dla niebieskiego (B). Zamiana tych wartości na system dziesiętny jest kluczowa, żeby lepiej zrozumieć jak działa model RGB – czyli mieszanie trzech podstawowych barw światła w różnych proporcjach. AA w szesnastkowym to 170 w dziesiętnym (bo A=10, więc 10*16+10=170), 41 to 4*16+1=65, a FF to 15*16+15=255. Taka konwersja przydaje się w codziennej pracy z grafiką czy front-endem – na przykład podczas ręcznego tworzenia palet kolorów lub dostosowywania barw ikon w interfejsach użytkownika. Co ciekawe, w wielu narzędziach do projektowania można dowolnie przełączać się między tymi zapisami, żeby precyzyjnie ustawić wybrane odcienie. Moim zdaniem, zrozumienie tej konwersji pomaga lepiej ogarnąć, jak komputery interpretują kolory i jak potem wyświetlają je na ekranie. Praktyka pokazuje, że większość błędów przy pracy z kolorami wynika właśnie z nieprawidłowego przeliczania wartości. No i taka wiedza to prawdziwy fundament dla każdego, kto myśli poważnie o pracy z grafiką czy programowaniem front-endu – nie da się jej pominąć w żadnym sensownym kursie.

Pytanie 12

Jaką jednostkę zaleca się stosować przy projektowaniu interfejsu aplikacji?

A. px
B. mm
C. pt
D. dp
No i właśnie, dp (density-independent pixels) to taki trochę złoty standard przy projektowaniu interfejsów na Androida. W praktyce chodzi o to, żeby elementy UI wyglądały podobnie na różnych urządzeniach – niezależnie czy ktoś ma ekran gęsty jak sito, czy telefon z bardzo dużymi pikselami. Używanie dp pozwala unikać sytuacji, gdzie tekst albo przyciski na jednym urządzeniu są czytelne i wygodne w obsłudze, a na innym są mikroskopijne lub przeciwnie – przesadnie wielkie. Oczywiście, wszystko to wynika z tego, że piksele na różnych ekranach mają inną fizyczną wielkość – tzw. density. Stosując dp, projektanci mogą być pewni, że rozmiary będą proporcjonalnie takie same niezależnie od sprzętu. Sam system Android automatycznie przelicza dp na odpowiednią liczbę pikseli na danym urządzeniu. To bardzo wygodne! Moim zdaniem każdy, kto zaczyna projektować aplikacje mobilne, powinien od razu przyzwyczajać się do pracy z dp, bo to po prostu ułatwia życie i ogranicza potem poprawki. To też zgodne z oficjalnymi wytycznymi Google – praktycznie każda dokumentacja do Material Design kładzie na to nacisk. Warto jeszcze pamiętać, że inne jednostki jak px, pt czy mm mogą się sprawdzić w wyjątkowych sytuacjach, ale raczej tylko wtedy, gdy faktycznie zależy nam na absolutnych rozmiarach – a to w UI mobilnym prawie się nie zdarza.

Pytanie 13

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

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

Pytanie 14

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

A. Relacyjna baza danych
B. Grafowa baza danych
C. Dokumentowa baza danych
D. Routing Database
Pojęcia relacyjnej bazy danych, grafowej bazy danych oraz dokumentowej bazy danych mają swoje fundamenty w różnych modelach przechowywania i organizacji danych. Relacyjne bazy danych wykorzystują struktury tabelaryczne do zarządzania danymi, co pozwala na efektywne wykonywanie zapytań i analizy danych. W tym modelu dane są przechowywane w wierszach i kolumnach, a związki między danymi są ustanawiane dzięki kluczom obcym, co sprzyja integralności danych i ich normalizacji. Zastosowanie relacyjnych baz danych jest szerokie, obejmuje systemy finansowe, aplikacje e-commerce oraz wiele innych systemów wymagających ścisłego zarządzania danymi. Grafowe bazy danych, takie jak Neo4j, opierają się na strukturze grafów, co umożliwia modelowanie bardziej skomplikowanych relacji i hierarchii. Ten typ bazy danych znajduje zastosowanie w analizie sieci społecznych, zarządzaniu danymi o połączeniach i rekomendacjach, gdzie tradycyjne podejścia relacyjne mogą być niewystarczające. Dokumentowe bazy danych, jak MongoDB, przechowują dane w formie JSON, co umożliwia elastyczne modelowanie danych oraz skalowalność w aplikacjach, które potrzebują szybko dostosowywać swoje struktury danych do zmieniających się potrzeb. Wybór odpowiedniego typu bazy danych jest kluczowy w zależności od charakterystyki danych i wymagań aplikacji. Typowe błędy myślowe, które prowadzą do pomyłek w identyfikacji typów baz danych, obejmują mylenie terminologii oraz nieznajomość podstawowych zasad działania różnych modeli. Zrozumienie, że niektóre z terminów są stosowane w kontekście różnych dziedzin, takich jak sieci komputerowe i zarządzanie danymi, jest istotne dla podejmowania właściwych decyzji w projektowaniu systemów informacyjnych.

Pytanie 15

Które z wymienionych sytuacji jest przykładem hermetyzacji w programowaniu obiektowym?

A. Wykorzystanie klasy nadrzędnej w innej klasie
B. Ograniczenie dostępu do pól klasy poprzez modyfikatory dostępu
C. Tworzenie klasy abstrakcyjnej
D. Tworzenie wielu metod o tej samej nazwie w różnych klasach
Hermetyzacja (ang. encapsulation) to mechanizm programowania obiektowego, który polega na ukrywaniu wewnętrznych danych obiektu oraz udostępnianiu dostępu do nich tylko za pośrednictwem metod publicznych (gettery i settery). Dzięki hermetyzacji dane klasy są chronione przed bezpośrednią modyfikacją, co zwiększa bezpieczeństwo i stabilność kodu. Przykład w C++: `class Konto { private: double saldo; public: void wplata(double kwota) { saldo += kwota; } }` – saldo jest polem prywatnym, które można modyfikować tylko poprzez metody publiczne, co zapobiega nieautoryzowanemu dostępowi.

Pytanie 16

Co to jest shadow DOM?

A. Technika stylizacji elementów w CSS przy użyciu cieni
B. Wirtualny DOM używany przez biblioteki jak React i Vue.js
C. Metoda renderowania grafiki 3D w przeglądarkach
D. Mechanizm enkapsulacji kodu HTML, CSS i JavaScript w komponenty webowe
Zastosowanie błędnych koncepcji w kontekście Shadow DOM prowadzi do nieporozumień na temat jego funkcji. Przykładem niepoprawnego podejścia jest mylenie Shadow DOM z technikami stylizacji CSS przy użyciu cieni, co jest całkowicie innym zagadnieniem. W rzeczywistości Shadow DOM nie zajmuje się stylizacją w tradycyjnym sensie, lecz umożliwia tworzenie izolowanych instancji DOM, co jest kluczowe w kontekście wielokrotnego użycia komponentów. Innym błędnym zrozumieniem jest myślenie, że Shadow DOM jest metodą renderowania grafiki 3D, czego nie jest; techniki 3D w przeglądarkach są zazwyczaj związane z WebGL. Ponadto, wirtualny DOM, używany przez biblioteki takie jak React czy Vue.js, nie ma związku z Shadow DOM, ponieważ wirtualny DOM jest abstrakcyjną reprezentacją rzeczywistego DOM, mającą na celu optymalizację aktualizacji UI. Shadow DOM natomiast skupia się na izolacji i enkapsulacji kodu. Zrozumienie tych różnic jest kluczowe dla efektywnego wykorzystania technologii webowych, a ich ignorowanie może prowadzić do błędnych implementacji oraz zwiększenia złożoności projektów webowych. Aby skutecznie pracować z komponentami, należy znajomość Shadow DOM zintegrować z innymi technologiami, trzymając się najlepszych praktyk i standardów.

Pytanie 17

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

A. RSA
B. AES
C. DES
D. MD5
MD5 to przykład klasycznej funkcji skrótu, czyli właśnie tej funkcji, która generuje z dowolnie długych danych wejściowych stałej długości skrót (hash). Funkcje haszujące są szeroko stosowane w informatyce, szczególnie tam, gdzie potrzebna jest szybka weryfikacja integralności danych albo przechowywanie haseł w bazie danych w sposób bezpieczny (chociaż MD5 dziś już nie poleca się do haseł przez znane luki bezpieczeństwa – lepsze są SHA-256 czy bcrypt). To, co wyróżnia funkcje skrótu jak MD5, to ich jednokierunkowość: znając wynik, praktycznie nie jesteśmy w stanie odtworzyć oryginalnych danych wejściowych, a nawet minimalnie różniące się dane dają zupełnie inne hashe. Przykład praktyczny? Sprawdzenie sumy kontrolnej pliku po pobraniu z internetu – porównujemy hash MD5 z podanym na stronie wydawcy i mamy pewność, że plik nie został podmieniony. W praktyce branżowej, zgodnie z normami bezpieczeństwa jak np. ISO/IEC 27001, funkcje haszujące są podstawą wielu procesów kryptograficznych. Moim zdaniem, znajomość takich algorytmów jak MD5, nawet jeśli już nie jest zalecany w nowych systemach, to podstawa do zrozumienia ogólnego działania funkcji skrótu i różnicy między nimi a szyfrowaniem. Często spotykałem się z myleniem tych pojęć, więc warto to dobrze rozumieć.

Pytanie 18

Który z wymienionych algorytmów działających na tablicy jednowymiarowej ma złożoność obliczeniową \( O(n^2) \)?

A. Sortowanie bąbelkowe
B. Sortowanie szybkie
C. Wyświetlenie elementów
D. Wyszukiwanie metodą binarną
Sortowanie bąbelkowe to taki klasyczny algorytm, który ma złożoność \( O(n^2) \). Chociaż jest dość prosty w zrozumieniu, to nie za bardzo sprawdza się w większych zbiorach danych. Działa tak, że porównuje sąsiadujące ze sobą elementy i zamienia je miejscami, jeśli są w złej kolejności. Trochę to czasochłonne, ale warto znać ten algorytm, bo pokazuje podstawy sortowania.

Pytanie 19

Który z podanych algorytmów można zrealizować zarówno w sposób iteracyjny, jak i rekurencyjny?

A. Algorytm wyszukiwania binarnego
B. Algorytm generowania liczb losowych
C. Algorytm sortowania bąbelkowego
D. Algorytm mapowania kluczy w tablicach asocjacyjnych
Sortowanie bąbelkowe to algorytm iteracyjny i nie ma naturalnej wersji rekurencyjnej, ponieważ jego działanie opiera się na powtarzających się pętlach. Algorytm mapowania kluczy w tablicach asocjacyjnych nie korzysta z rekurencji – jest to proces przypisywania wartości do odpowiednich kluczy, który realizowany jest w sposób iteracyjny. Algorytm generowania liczb losowych nie wymaga rekurencji ani iteracji – jest to operacja oparta na wywołaniu odpowiednich funkcji w zależności od użytej biblioteki i języka programowania.

Pytanie 20

Jakie określenie w programowaniu obiektowym odnosi się do "zmiennej klasy"?

A. Metoda
B. Konstruktor
C. Pole
D. Obiekt
Pole (ang. field) to zmienna należąca do klasy, która przechowuje dane opisujące stan obiektu. Jest to integralna część definicji klasy, a każde wystąpienie klasy (obiekt) ma swoje własne kopie pól. Przykład w C++: `class Osoba { public: string imie; int wiek; }`. W tym przypadku `imie` i `wiek` to pola klasy `Osoba`, które opisują właściwości każdej osoby. Pola mogą mieć różne poziomy dostępu (`public`, `private`, `protected`), co umożliwia kontrolowanie, które części programu mają do nich dostęp. Dzięki polom obiekty przechowują swój stan i mogą zmieniać go podczas działania programu.

Pytanie 21

W języku C# szablon List zapewnia funkcjonalność listy. Z tworzenia obiektu typu List wynika, że jego składnikami są:

List<int> wykaz = new List<int>();
A. elementy typu List
B. elementy o nieokreślonym typie
C. liczby rzeczywiste
D. liczby całkowite
Szablon List<int> w języku C# implementuje listę, której elementami są liczby całkowite. Jest to przykład zastosowania kolekcji generycznych, które wprowadzają typowanie silne w czasie kompilacji, co pozwala na uniknięcie błędów typowych dla kolekcji niegenerycznych. Definiując List<int> deklarujesz, że lista będzie przechowywać tylko liczby całkowite. Dzięki temu kompilator może wykrywać błędy związane z typowaniem już podczas pisania kodu, co zwiększa jego niezawodność i bezpieczeństwo. Typ generyczny T w List<T> umożliwia tworzenie kolekcji przechowujących dowolny typ, co ułatwia ponowne wykorzystanie kodu i zgodność z zasadą DRY (Don't Repeat Yourself). W praktyce List<int> jest szeroko stosowany w scenariuszach wymagających dynamicznie rozwijanych kolekcji, które nie ograniczają się do statycznej liczby elementów, takich jak tablice. Listy generyczne są wydajniejsze i bardziej elastyczne dzięki metodom takim jak Add, Remove czy Contains, które operują na elementach określonego typu. Dzięki implementacji IEnumerable/Listy są również zgodne z LINQ, co umożliwia stosowanie złożonych zapytań i operacji na danych, takich jak filtrowanie i sortowanie, w sposób czytelny i efektywny.

Pytanie 22

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

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

Pytanie 23

Definicja konstruktora dla zaprezentowanej klasy w języku C++ może być sformułowana jak poniżej:

class Owoc
{
    public:
        double waga;
        string nazwa;
        Owoc(double waga, string nazwa);
};

Deklaracja 1:
Owoc::Owoc(double waga, string nazwa) {
    this -> waga = waga;
    this -> nazwa = nazwa;
}

Deklaracja 2:
Construct::Owoc(double waga, string nazwa) {
    this -> waga = waga;
    this -> nazwa = nazwa;
}

Deklaracja 3:
Construct::Owoc(double waga, string nazwa) {
    this.waga = waga;
    this.nazwa = nazwa;
}

Deklaracja 4:
Owoc::Owoc(double waga, string nazwa) {
    this.waga = waga;
    this.nazwa = nazwa;
}
A. Deklaracji 1
B. Deklaracji 4
C. Deklaracji 2
D. Deklaracji 3
Deklaracja 1 pokazuje dokładnie taką definicję konstruktora, jaka powinna być użyta w języku C++. Nazwa klasy i konstruktora musi być identyczna, a składnia Owoc::Owoc(double waga, string nazwa) jest kanoniczna w C++ dla implementacji konstruktora poza klasą. Użycie this->waga = waga jasno wskazuje, że chodzi o przypisanie wartości z parametru do pola składowego klasy. W praktyce to jest bardzo często spotykany wzór przy pisaniu konstruktorów dla klasy, która ma kilka pól – tak można odróżnić parametry funkcji od pól klasy. Moim zdaniem warto zawsze zwracać uwagę na taki zapis, bo to pomaga unikać błędów, zwłaszcza przy większych projektach, gdzie pól może być sporo i łatwo się pomylić. W dodatku stosowanie składni this-> od razu sygnalizuje, że działamy na polach konkretnej instancji obiektu. Takie podejście jest zgodne ze wszystkimi standardami C++ i bez problemu skompiluje się w każdym środowisku. W praktyce często spotykam się z tym, że ktoś próbuje stosować inne notacje czy podpatrzone w innych językach konstrukcje, ale w C++ to właśnie taki zapis jest poprawny i klarowny dla każdego programisty. Dla czytelności kodu i łatwości utrzymania projektu, zdecydowanie polecam trzymać się tej formy. Dobrze jest też pamiętać, że w nowszych wersjach C++ można też użyć listy inicjalizacyjnej, ale tutaj przedstawiony sposób jest w pełni poprawny i zrozumiały.

Pytanie 24

Zaprezentowany diagram Gantta odnosi się do projektu IT. Przy założeniu, że każdy członek zespołu dysponuje wystarczającymi umiejętnościami do realizacji każdego z zadań oraz że do każdego zadania można przypisać jedynie jedną osobę, która poświęci na zadanie pełny dzień pracy, to minimalna liczba członków zespołu powinna wynosić:

Ilustracja do pytania
A. 4 osoby
B. 1 osobę
C. 5 osób
D. 2 osoby
Wybrana odpowiedź jest trafna, bo minimalna liczba członków zespołu wynosi właśnie 2 osoby. W projekcie przedstawionym na diagramie Gantta, kluczowe jest zwrócenie uwagi na to, ile zadań nakłada się w danym tygodniu – a nie łączna liczba zadań. Największe obciążenie zespołu wypada na okresy, gdzie równolegle realizowane są dwa zadania, np. w pierwszym tygodniu są to Projekt aplikacji i Grafika, później w ostatnim tygodniu dwie aplikacje: front-end i back-end. W żadnym momencie nie występuje potrzeba, by więcej niż dwie osoby pracowały równolegle nad różnymi zadaniami. To bardzo praktyczna sytuacja – w realnych projektach IT planuje się obłożenie pracą właśnie przez analizę diagramu Gantta, by nie generować sztucznego przestoju lub nadmiaru ludzi. Moim zdaniem taka optymalizacja zespołu to podstawa w IT, bo pozwala ograniczyć koszty i lepiej zarządzać zasobami. Warto pamiętać, że zgodnie z dobrymi praktykami zarządzania projektami, np. w metodykach PMBOK czy Prince2, zawsze analizuje się ścieżki krytyczne i równoległość zadań, dokładnie w taki sposób, żeby nie dublować niepotrzebnie rąk do pracy. Świetnie, jeśli już na etapie planowania potrafisz to zauważyć i wyciągnąć praktyczne wnioski – to naprawdę przydaje się potem przy rozpisywaniu harmonogramów na czasach rzeczywistych projektów.

Pytanie 25

Jaki jest kluczowy zamysł wzorca "Kompozyt" (Composite)?

A. Stworzenie jednej klasy do zarządzania wieloma obiektami tego samego rodzaju
B. Umożliwienie klientom obsługi obiektów oraz ich zbiorów w spójny sposób
C. Określenie interfejsu komunikacji pomiędzy składnikami systemu
D. Danie możliwości dynamicznej zmiany zachowania obiektu
Zarządzanie wieloma obiektami tego samego typu to cecha wzorca Fabryka (Factory) lub Builder, a nie Kompozyt. Definiowanie interfejsu komunikacji między komponentami systemu to rola wzorca Mediator, który organizuje interakcje między różnymi obiektami. Umożliwienie dynamicznej zmiany zachowania obiektu jest domeną wzorca Strategia (Strategy) lub Dekorator (Decorator), które oferują elastyczność w zakresie modyfikacji zachowania podczas działania programu.

Pytanie 26

Która z wymienionych właściwości najlepiej charakteryzuje biblioteki dynamiczne?

A. Są ładowane podczas kompilacji
B. Zawierają kod źródłowy aplikacji
C. Są statycznie dołączane do pliku wykonywalnego
D. Są ładowane w trakcie działania aplikacji
Biblioteki dynamiczne, znane też jako DLL w Windows czy SO w Unix/Linux, ładują się do pamięci, gdy program działa. To super, bo dzięki temu aplikacja nie marnuje zasobów, a jak zajdzie potrzeba, to może z nich korzystać. Można też aktualizować te biblioteki bez potrzeby rekompilacji całego programu – to duża wygoda. Dzięki dynamicznemu ładowaniu kod może być współdzielony przez różne aplikacje, a to zmniejsza rozmiar plików i sprawia, że łatwiej się tym wszystkim zarządza.

Pytanie 27

Jaki tekst zostanie wyświetlony po uruchomieniu jednego z poniższych fragmentów kodu?
Kod w React:

<h2>{2+2}</h2>
Kod w Angular:
<h2>{{2+2}}</h2>
A. {2+2}
B. 4
C. {{2+2}}
D. {4}
To pytanie jest świetną okazją, żeby zobaczyć, jak działają wyrażenia w szablonach Reacta i Angulara. Odpowiedź „4” jest prawidłowa, bo zarówno w React, jak i w Angularze, zawarte w nawiasach klamrowych wyrażenie matematyczne 2+2 jest oceniane przez silnik JavaScript podczas renderowania komponentu. Nie jest to zwykły tekst, tylko dynamiczne wyliczenie. Dzięki temu React (w JSX) oraz Angular (w interpolacji {{}}) najpierw obliczają sumę, a potem podstawiają wynik w miejsce wyrażenia – czyli na ekranie pojawia się zwykły tekst „4”. Moim zdaniem to jedna z największych zalet tych frameworków, bo pozwala na bardzo elastyczne budowanie UI, gdzie dynamiczne dane mogą być wstawiane praktycznie wszędzie, bez potrzeby ręcznego tworzenia dodatkowych zmiennych czy długich instrukcji warunkowych. W praktyce często stosuje się takie podejście chociażby do wyświetlania wyników obliczeń, liczników, czy dynamicznych podsumowań. Z mojego doświadczenia, warto pamiętać, że każde wyrażenie w takich miejscach powinno być możliwie proste — złożone logiki lepiej wynieść do funkcji, bo wtedy szablon pozostaje czytelny. Warto też mieć świadomość, że React i Angular automatycznie konwertują wynik na tekst, więc nie trzeba się martwić o jawne rzutowanie. To podejście jest zgodne z dobrymi praktykami branżowymi – prosty, czytelny kod to podstawa w nowoczesnych aplikacjach webowych.

Pytanie 28

Które z poniższych twierdzeń najlepiej charakteryzuje metodę wirtualną?

A. Metoda, która jest zawsze stosowana w konstruktorach danej klasy
B. Metoda, która działa wyłącznie dla statycznych pól danej klasy
C. Metoda, która może być przesłonięta w klasie dziedziczącej
D. Metoda, która może być wywoływana tylko przez klasę nadrzędną
Wirtualna metoda to taka, która jest zdefiniowana w klasie bazowej i można ją nadpisać w klasie pochodnej. Fajna sprawa z tą metodą wirtualną jest taka, że działa na zasadzie dynamicznego wiązania, co w praktyce oznacza, że program decyduje w czasie działania, którą wersję metody wywołać. Dzięki temu mamy polimorfizm – możemy użyć różnych wersji tej samej metody, w zależności od typu obiektu, na którym pracujemy. To naprawdę ważny aspekt programowania obiektowego, bo pozwala na większą elastyczność i łatwiejsze rozwijanie kodu. W hierarchiach klas to się sprawdza, bo klasa bazowa ma ogólne metody, a klasy pochodne mogą je dostosować do swoich potrzeb.

Pytanie 29

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

A. jest pusta w klasach dziedziczących
B. nie ma implementacji w klasie bazowej
C. zawsze jest prywatna
D. jest pusta w klasie nadrzędnej
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 30

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

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

Pytanie 31

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

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

Pytanie 32

Co to jest WebSockets?

A. Biblioteka JavaScript do manipulacji danymi JSON
B. Format zapisu danych w bazach NoSQL
C. Protokół komunikacyjny zapewniający dwukierunkową komunikację między przeglądarką a serwerem
D. Metoda zabezpieczania połączeń HTTP
WebSockets to protokół komunikacyjny, który umożliwia dwukierunkową, pełnodupleksową komunikację między klientem a serwerem. To oznacza, że zarówno przeglądarka, jak i serwer mogą wysyłać dane w dowolnym momencie, co znacząco różni się od tradycyjnego modelu HTTP, gdzie klient inicjuje każde połączenie. Przykładem zastosowania WebSockets jest aplikacja czatu w czasie rzeczywistym, gdzie użytkownicy mogą widzieć wiadomości natychmiastowo, bez potrzeby odświeżania strony. Dodatkowo, WebSockets zmniejszają opóźnienia w komunikacji, co jest kluczowe w aplikacjach wymagających szybkiej interakcji, takich jak gry online czy platformy do handlu. Warto zaznaczyć, że WebSockets są zdefiniowane w standardzie IETF jako RFC 6455, a ich wykorzystanie powinno być zgodne z najlepszymi praktykami w zakresie bezpieczeństwa, takimi jak użycie protokołu wSecure WebSockets (wss://) do zapewnienia bezpieczeństwa przesyłanych danych.

Pytanie 33

W aplikacji mobilnej, aby określić warianty grafiki w zależności od wielkości ekranu, należy (uwaga: odpowiedzi wariantowe dla dwóch systemów - sugerować się systemem omawianym na zajęciach)

A. iOS: dodać do nazw plików sufiksy @2x, @3x. Android: umieścić grafikę w odpowiednich folderach drawable: -hdpi, -xhpi, xxhdpi
B. iOS: dodać do nazw sufiksy oznaczające rozdzielczość, np. 32ppi. Android: umieścić grafikę w odpowiednich katalogach: 32ppi, 64ppi, 96ppi
C. iOS: utworzyć katalogi hdpi, lhpi, xhpi i dodać do nich grafiki. Android: utworzyć katalogi 32x32, 64x64, 96x96 i dodać do nich grafiki
D. iOS: dodać do nazw sufiksy #2x, #3x. Android: dodać do nazw sufiks rozdzielczości: -32x32, -64x64, -96x96
Kiedy chcemy, żeby grafiki w aplikacjach mobilnych wyglądały dobrze na różnych ekranach, musimy zastosować odpowiednie strategie, które zależą od platformy. Na iOS używa się przyrostków @2x lub @3x, co oznacza, że grafiki są przygotowane dla ekranów Retina, które mają wyższą gęstość pikseli. Na Androidzie z kolei, grafiki umieszcza się w folderach drawable z takimi nazwami jak -hdpi, -xhdpi czy -xxhdpi. Dzięki temu system wie, jaką wersję grafiki wybrać w zależności od rozdzielczości urządzenia. Moim zdaniem, taki system pozwala na super jakość obrazów i lepszą wydajność aplikacji.

Pytanie 34

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

A. float
B. decimal
C. double
D. int
Typ danych 'int' (integer) to przykład typu stałoprzecinkowego, który przechowuje liczby całkowite. Stałoprzecinkowe typy danych są podstawą w programowaniu, ponieważ pozwalają na efektywne przechowywanie wartości bez części ułamkowej, co przyspiesza obliczenia i redukuje zużycie pamięci. Typ 'int' jest szeroko stosowany w językach takich jak C, C++, Java i Python, a jego główną zaletą jest szybkość operacji arytmetycznych oraz przewidywalność wyników. Stałoprzecinkowe typy danych znajdują zastosowanie w algorytmach, systemach sterowania i aplikacjach embedded, gdzie precyzja obliczeń jest kluczowa.

Pytanie 35

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

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

Pytanie 36

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

A. obsługa przycisku ekranu dotykowego
B. obsługa wciśniętego przycisku
C. kod XML
D. kod Java
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 37

Jakie są różnice między testami funkcjonalnymi a niefunkcjonalnymi?

A. Testy funkcjonalne oceniają zgodność działania aplikacji z założeniami, a niefunkcjonalne analizują aspekty wydajności, bezpieczeństwa i użyteczności
B. Testy funkcjonalne koncentrują się na interfejsie, a niefunkcjonalne na backendzie aplikacji
C. Testy funkcjonalne oceniają wydajność aplikacji, podczas gdy niefunkcjonalne weryfikują poprawność kodu
D. Testy funkcjonalne są realizowane tylko przez końcowych użytkowników, natomiast niefunkcjonalne przez programistów
Testy funkcjonalne sprawdzają, czy aplikacja działa zgodnie z założeniami i spełnia określone wymagania użytkownika. Obejmują one testowanie interfejsu, przepływu pracy oraz funkcji kluczowych dla działania oprogramowania. Testy niefunkcjonalne koncentrują się na aspektach takich jak wydajność, skalowalność, bezpieczeństwo i użyteczność. Różnica polega na tym, że testy funkcjonalne oceniają 'co' robi aplikacja, podczas gdy testy niefunkcjonalne oceniają 'jak dobrze' aplikacja działa w różnych warunkach. Testy niefunkcjonalne obejmują testy obciążeniowe (load testing), testy penetracyjne oraz analizy UX. Oba typy testów są niezbędne dla zapewnienia wysokiej jakości oprogramowania i jego niezawodności w środowisku produkcyjnym.

Pytanie 38

Co to jest event bubbling w JavaScript?

A. System powiadomień o błędach w konsoli JavaScript
B. Proces, w którym zdarzenie zaczyna się od najbardziej szczegółowego elementu i propaguje w górę hierarchii DOM
C. Metoda zarządzania kolejką zdarzeń w aplikacjach asynchronicznych
D. Technika optymalizacji wydajności zdarzeń na stronie
Zrozumienie koncepcji event bubbling jest kluczowe dla pracy z interaktywnymi aplikacjami webowymi, a nieprawidłowe interpretacje mechanizmu zdarzeń mogą prowadzić do wielu problemów w codziennej pracy programisty. Twierdzenie, że event bubbling jest techniką optymalizacji wydajności zdarzeń na stronie, jest mylące, ponieważ owszem, skuteczne wykorzystanie event bubbling może poprawić wydajność, ale sam mechanizm nie jest techniką optymalizacji. Zamiast tego, jest to naturalna cecha modelu zdarzeń w JavaScript, która umożliwia propagację zdarzeń w hierarchii DOM. Warto również zauważyć, że zarządzanie kolejką zdarzeń w aplikacjach asynchronicznych to zupełnie inny temat, który dotyczy asynchroniczności oraz mechanizmu event loop, a nie procesu przekazywania zdarzeń. Dodatkowo, twierdzenie, że event bubbling jest systemem powiadomień o błędach w konsoli JavaScript, wprowadza w błąd, gdyż event bubbling dotyczy jedynie propagacji zdarzeń interfejsu użytkownika, a nie obsługi błędów czy logowania. Często nieporozumienia te wynikają z braku znajomości podstawowych zasad dotyczących zdarzeń w JavaScript oraz z pomylenia różnych mechanizmów, które wspierają interaktywność aplikacji. Dobrze jest zapoznać się z dokumentacją i przykładami, aby lepiej zrozumieć te kluczowe koncepcje.

Pytanie 39

Co to jest JWT (JSON Web Token)?

A. Protokół do przesyłania danych JSON przez sieć
B. Biblioteka JavaScript do manipulacji danymi JSON
C. Format zapisu danych w bazach NoSQL
D. Kompaktowy format do bezpiecznego przekazywania informacji między stronami jako obiekt JSON
JWT (JSON Web Token) to kompaktowy format, który umożliwia bezpieczne przesyłanie informacji pomiędzy różnymi stronami. Główną zaletą tokenów JWT jest ich struktura, która składa się z trzech części: nagłówka, ładunku (payload) oraz podpisu. Nagłówek zazwyczaj wskazuje typ tokena oraz algorytm użyty do podpisania, co pozwala na szybką weryfikację integralności danych. Ładunek zawiera informacje, często nazywane roszczeniami (claims), które mogą dotyczyć użytkownika lub sesji, a podpis zapewnia, że token nie został zmodyfikowany w trakcie przesyłania. W praktyce JWT jest często wykorzystywany w systemach autoryzacyjnych, gdzie po pomyślnym zalogowaniu, użytkownik otrzymuje token, który następnie może być używany do autoryzacji dostępu do różnych zasobów. Standard JWT definiuje sposób kodowania i dekodowania tokenów, a jego stosowanie pozwala na zwiększenie bezpieczeństwa aplikacji webowych oraz mobilnych poprzez ograniczenie konieczności przechowywania sesji na serwerze, co jest zgodne z najlepszymi praktykami w dziedzinie inżynierii oprogramowania.

Pytanie 40

Jaką rolę odgrywa program Jira?

A. Zarządzanie edycjami systemu operacyjnego
B. Produkcja grafik 3D
C. Modyfikowanie arkuszy kalkulacyjnych
D. Planowanie, śledzenie oraz raportowanie zadań projektowych
Jira to jedno z najpopularniejszych narzędzi do zarządzania projektami, wykorzystywane głównie w metodykach Agile i Scrum. Umożliwia planowanie, monitorowanie i raportowanie zadań projektowych na różnych etapach ich realizacji. Dzięki elastycznym tablicom kanban i sprintom, Jira pozwala zespołom programistycznym śledzić postępy, zarządzać backlogiem oraz efektywnie przydzielać zasoby. Funkcjonalności takie jak automatyzacja procesów, śledzenie błędów (bug tracking) i integracja z innymi narzędziami (np. GitHub, Bitbucket) sprawiają, że Jira jest wszechstronnym rozwiązaniem do zarządzania nawet najbardziej złożonymi projektami. Dzięki generowanym raportom i wykresom burndown, menedżerowie mogą dokładnie analizować tempo pracy i podejmować decyzje w oparciu o dane.