Wyniki egzaminu

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

Egzamin zdany!

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

Wymagane minimum: 20 punktów (50%)

Pochwal się swoim wynikiem!
Szczegółowe wyniki:
Pytanie 1

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

A. 160, 65, 255
B. 160, 64, 255
C. 170, 64, 255
D. 170, 65, 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 2

Co należy do zadań interpretera?

A. przekładanie kodu na kod maszynowy
B. ulepszanie większej części kodu, aby przyspieszyć jego wykonanie
C. sprawdzanie składni całego programu przed jego uruchomieniem
D. wykonanie skryptu instrukcja po instrukcji
Często spotykam się z myleniem interpretera z kompilatorem i optymalizatorami kodu, co prowadzi do błędnych wyobrażeń o jego działaniu. Zacznijmy od podstaw: przekładanie kodu źródłowego na kod maszynowy to domena kompilatorów, które analizują cały program, optymalizują go i generują plik wykonywalny, który można uruchomić niezależnie od środowiska. Interpreter natomiast nie zajmuje się takim tłumaczeniem, tylko odczytuje kod i wykonuje go na bieżąco, bez zapisywania gotowego programu w formie binarnej. Kolejna kwestia to ulepszanie kodu w celu przyspieszenia jego wykonania – to zadanie specjalistycznych narzędzi optymalizujących, często wbudowanych w kompilatory. Interpreter rzadko kiedy ingeruje w optymalizację kodu, bo jego głównym zadaniem jest wierne odtworzenie logiki programu krok po kroku, a nie poprawianie jego wydajności. Jeżeli chodzi o sprawdzanie składni całego programu przed uruchomieniem, to znów domena kompilatorów – interpreter najczęściej wykrywa błędy dopiero w momencie, gdy dociera do konkretnej instrukcji podczas wykonywania skryptu. To właśnie sprawia, że łatwiej eksperymentować, ale też czasem trudniej jest znaleźć błędy, które ujawniają się dopiero w trakcie działania aplikacji. W mojej ocenie te nieporozumienia wynikają z utożsamiania terminów używanych w teorii kompilacji – warto rozróżniać narzędzia na podstawie ich faktycznej roli w cyklu życia programu. Praktyka pokazuje, że zrozumienie różnicy pomiędzy interpretacją a kompilacją jest kluczowe przy wyborze technologii do realizacji konkretnego projektu. Jeżeli zależy nam na szybkim prototypowaniu lub pracy z kodem interaktywnym – interpreter jest świetny, ale nie będzie generował kodu maszynowego ani zaawansowanie go optymalizował.

Pytanie 3

W środowisku IDE przeznaczonym do tworzenia aplikacji okienkowych zdefiniowano okno Form1. Aby wprowadzić zmiany w ustawieniach, w kolejności: tytuł okna na górnym pasku, standardowy kursor na strzałkę oraz kolor tła okna, należy dostosować następujące pola w oknie Properties:

Ilustracja do pytania
A. (Name), UseWaitCursor, BackgroundImage
B. Text, Cursor, BackColor
C. Text, UseWaitCursor, BackColor
D. (Name), Cursor, BackgroundImage
W pracy z IDE do aplikacji okienkowych, bardzo łatwo pomylić znaczenie niektórych właściwości formularza, bo wiele z nich brzmi podobnie albo wydaje się spełniać podobną funkcję. Przykładowo, pole (Name) w oknie Properties nie ma żadnego wpływu na to, co widzi użytkownik w tytule okna – to jest nazwa techniczna obiektu w kodzie, czyli identyfikator, którym odwołujemy się do formularza w trakcie programowania. To megaważna różnica! BackgroundImage natomiast służy do ustawienia grafiki jako tła, a nie koloru – czasem ktoś myli BackColor z BackgroundImage, bo oba dotyczą wyglądu, ale BackColor to czysty kolor, bez obrazków. UseWaitCursor to kolejny haczyk – ta właściwość aktywuje specjalny kursor oczekiwania (taki kręcący się kółek lub klepsydrę), a nie domyślny wskaźnik w kształcie strzałki. Ustawienie tego pola na true sprawia, że użytkownik ma wrażenie, iż aplikacja coś przetwarza – super przydatne w operacjach długotrwałych, ale nie do standardowej obsługi okna. Cursor daje pełną kontrolę nad rodzajem kursora i to jest najlepszy wybór, gdy chodzi o standardowego pointera. Wreszcie, częsty błąd to branie pod uwagę właściwości, które po prostu nie dotyczą zadanego aspektu wizualnego formularza – na przykład mylenie tego, co widzi użytkownik, z tym, jak programista nazywa obiekt. Moim zdaniem, to taki typowy skrót myślowy: patrzymy na nazwę w oknie Properties i wydaje nam się, że to musi być to, co się zmienia na ekranie, a tu czasem logika IDE płata figle. W praktyce, poprawne podejście to zawsze zajrzeć do dokumentacji lub przeprowadzić szybki test – zmienić wartość i zobaczyć, co się realnie dzieje w oknie podglądu. To podstawowa umiejętność każdego, kto na serio chce projektować wygodne i profesjonalne interfejsy, zamiast działać na ślepo.

Pytanie 4

Kolor Pale Green w modelu RGB przedstawia się jako RGB(152, 251, 152). Jaki jest szesnastkowy kod tego koloru?

A. 98 FB 98
B. A0 FB A0
C. A0 FE A0
D. 98 FE 98
Wybór nieprawidłowego kodu szesnastkowego dla koloru RGB(152, 251, 152) najczęściej wynika z niepełnego zrozumienia konwersji wartości dziesiętnych RGB na ich odpowiedniki w systemie szesnastkowym. W odpowiedziach pojawiły się kody takie jak A0 FB A0, A0 FE A0 czy 98 FE 98, które świadczą o błędnym przeliczaniu przynajmniej jednej składowej. Problem zwykle pojawia się podczas przekładania wartości dziesiętnych (w zakresie 0-255) na szesnastkowe – tutaj największy błąd robi się przy zamianie wartości 152 oraz 251. W wielu przypadkach, przez nieuwagę, ktoś potrafi zamienić 152 na A0, ale to jest 160 w dziesiętnym, a nie 152. Podobnie, 251 nie daje FE (bo FE to 254!), tylko FB. W mojej praktyce często widzę, że takie pomyłki biorą się albo z korzystania z nieprecyzyjnych kalkulatorów online, albo z pośpiechu. Często też myli się kolejność bajtów albo nie zwraca uwagi na to, czy wartości są z zakresu RGB, czy może np. RGBA, co wprowadza dodatkowe zamieszanie. Trzeba pamiętać, że każdy kolor w modelu RGB składa się z trzech osobnych wartości, które muszą być niezależnie przeliczone na szesnastki i dopiero wtedy składane w końcowy kod HEX. Z mojego doświadczenia, błędy tego typu mogą prowadzić do zupełnie innych efektów wizualnych w gotowym projekcie – niby kolor podobny, ale jednak coś nie gra, szczególnie przy projektowaniu interfejsów czy layoutów stron internetowych. Branżowe standardy, takie jak te opisane przez W3C i w dokumentacjach narzędzi Adobe lub GIMP, zawsze zalecają dokładność i niepoleganie wyłącznie na automatycznych konwerterach w tego typu zadaniach. Najlepiej zawsze przeliczyć sobie ręcznie lub używać sprawdzonych narzędzi, wtedy mamy pewność, że odwzorowanie koloru będzie zgodne ze specyfikacją. Takie drobiazgi potrafią realnie wpłynąć na odbiór strony czy aplikacji, więc warto ćwiczyć te konwersje i mieć świadomość, gdzie można popełnić błąd.

Pytanie 5

Podejście obiektowe w rozwiązywaniu problemów obejmuje między innymi:

A. pola, metody, rekurencję oraz kwerendy
B. klasy, obiekty oraz hermetyzację
C. wyzwalacze i polimorfizm
D. zmienne, procedury oraz funkcje
Podejście obiektowe, zwane też programowaniem obiektowym (OOP), naprawdę opiera się na takich pojęciach jak klasy, obiekty i hermetyzacja. Klasa to taki szablon, z którego tworzy się obiekty – czyli konkretne instancje tej klasy działające w pamięci komputera. Hermetyzacja polega na tym, że ukrywamy szczegóły implementacji i wystawiamy na zewnątrz tylko niezbędne interfejsy. Moim zdaniem to jest jeden z najważniejszych aspektów OOP, bo pozwala nam lepiej zarządzać złożonością dużych systemów. Przykładowo, w językach takich jak Java czy C#, klasa samochód może mieć prywatne pola (np. numer VIN), a dostęp do nich uzyskujemy tylko przez określone publiczne metody (gettery i settery). To bardzo pomaga, gdy w zespole kilka osób pracuje nad tym samym kodem – nie trzeba wiedzieć wszystkiego o wnętrzu klasy, by z niej korzystać. W praktyce, modelowanie problemów za pomocą obiektów i klas pozwala odwzorować realne byty z rzeczywistego świata w oprogramowaniu. Standardy branżowe, jak SOLID czy zasada pojedynczej odpowiedzialności, podkreślają konieczność stosowania hermetyzacji, bo to przekłada się na elastyczność i łatwość utrzymania kodu. Z mojego doświadczenia, jeśli dobrze opanujesz te podstawy OOP, dużo szybciej zrozumiesz bardziej zaawansowane koncepty, jak dziedziczenie czy polimorfizm. To naprawdę solidny fundament, z którego korzysta praktycznie każdy nowoczesny język programowania.

Pytanie 6

Jaką strukturę danych można zrealizować, korzystając jedynie z wymienionych metod?

push(arg) – dodaje element
pop() – usuwa ostatnio dodany element
peek() – zwraca ostatnio dodany element bez usuwania
isEmpty() – sprawdza czy istnieją dane w strukturze
A. stos
B. kolejka FIFO
C. tablica
D. drzewo binarne
Zestaw metod przedstawionych w pytaniu – czyli push, pop, peek oraz isEmpty – jednoznacznie wskazuje na strukturę danych zwaną stos (stack). To jest taki bardzo charakterystyczny „magazyn”, gdzie zawsze mamy do czynienia z zasadą LIFO, czyli Last In, First Out. Oznacza to, że ostatni element, który dodaliśmy metodą push, będzie tym pierwszym, który usuniemy przez pop. Peek natomiast pozwala tylko podejrzeć, co jest na górze stosu, ale niczego nie usuwa. isEmpty z kolei daje nam szybki sposób sprawdzenia, czy na stosie w ogóle coś jeszcze zostało. W praktyce, stosy są niezbędne w wielu algorytmach i strukturach programistycznych – na przykład podczas wywołań rekurencyjnych funkcji (sam system operacyjny używa stosu do obsługi wywołań procedur), przy obsłudze nawiasów w kompilatorach czy podczas implementacji algorytmu DFS (Depth-First Search) w grafach. Moim zdaniem, nawet jeśli na początku wydaje się, że stos nie jest tak „potężny” jak inne struktury, to jego prostota jest właśnie największym atutem i dlatego jest tak często wykorzystywany w praktyce. Branżowe standardy, na przykład w językach takich jak Java czy C#, bezpośrednio udostępniają gotowe klasy Stack, które właśnie implementują dokładnie te metody – to pokazuje, jak fundamentalna jest ta struktura. Pewnie warto też pamiętać, że stosy mają swoje ograniczenia (np. nie nadadzą się do kolejkowania zadań), ale tam gdzie trzeba działać LIFO, są niezastąpione.

Pytanie 7

Pierwszym krokiem w procesie tworzenia aplikacji jest

A. stworzenie przypadków testowych
B. opracowanie architektury systemu
C. wybór zestawu typów i zmiennych dla aplikacji
D. analiza wymagań klienta
Analiza wymagań klienta to taki trochę fundament całego procesu tworzenia aplikacji. Bez niej ciężko ruszyć dalej, bo nie wiadomo, co właściwie trzeba zbudować i jakie cele ma spełniać projekt. Z mojego doświadczenia wynika, że rozmowy z klientem potrafią odkryć wiele niewypowiedzianych oczekiwań – czasem nawet takie, o których sam klient nie pomyślał, ale są kluczowe dla sukcesu produktu. Bez szczegółowego zrozumienia, czego dokładnie potrzebuje użytkownik końcowy, łatwo wpaść w pułapkę budowania funkcjonalności na ślepo lub tworzenia rozwiązań, które nikomu się nie przydadzą. W branży IT mówi się, że im lepsza analiza na starcie, tym mniej poprawek i niespodzianek później w trakcie realizacji. Standardy takie jak IEEE 830 czy metodyki typu Agile i Scrum mocno podkreślają rolę rozmów z klientem oraz dokumentowania wymagań, zanim przejdzie się dalej. Praktycznie każda większa firma najpierw zbiera wymagania – czy to poprzez warsztaty, wywiady, czy analizę procesów biznesowych. Takie podejście pozwala lepiej zaplanować zakres projektu, oszacować koszty i ustalić priorytety. Bez tego nawet najlepsza architektura czy testy nie uratują projektu przed nieporozumieniami i opóźnieniami.

Pytanie 8

Po uruchomieniu poniższego kodu w języku C++ na konsoli zobaczymy następujący tekst:

#include <stdio.h>
int main() {
    int a = 5;
    float b = 5.12345;
    double w;
    w = a + b;
    printf("%s dodawania: %d + %.2f = %f", "Wynik", a, b, w);
    return 0;
}
A. "%s dodawania: %d + %.2f=%f", "Wynik", a, b, w
B. dodawania: 5+5.12345=10.123450 Wynik
C. Wynik dodawania: 5+5.12=10.123450
D. "%s dodawania: %d + %.2f = %f", "Wynik", 5, 5.12345, 10.123450
Wiele osób daje się złapać na nieco podchwytliwe formatowanie tekstu i nie do końca rozumie mechanizm działania funkcji printf w języku C++. Kluczowe jest, że printf nie wypisuje dosłownie wszystkiego, co znajduje się w cudzysłowie, tylko podmienia tzw. specyfikatory formatu na konkretne wartości przekazane po przecinku. Próby dosłownego przepisania wywołania funkcji printf jako wyjścia na ekran są mylące – program nie drukuje ""%s dodawania: %d + %.2f = %f"", tylko zamienia to na odpowiednie liczby i teksty. Równie powszechnym błędem jest niedopasowanie precyzji – np. wypisanie 5.12345 zamiast 5.12 przy %.2f, bo printf automatycznie zaokrągla wynik do dwóch miejsc po przecinku w tym miejscu. Część osób pomija też fakt, że argumenty w printf muszą być przekazane w tej samej kolejności, co specyfikatory – co jest bardzo istotne przy większej liczbie zmiennych. Należy zwrócić szczególną uwagę na to, jak typy danych są prezentowane i obsługiwane przez printf: %d to zawsze liczba całkowita, %.2f – liczba zmiennoprzecinkowa dokładnie z dwoma cyframi po przecinku, %f – domyślnie sześć miejsc po przecinku. W praktyce niepoprawne jest zapisywanie wywołania funkcji jako tekst do wyświetlenia albo przestawianie kolejności czy branie wartości z pamięci bez sprawdzenia ich formatu. Z mojego doświadczenia takie potknięcia wynikają raczej z braku praktyki z printf i nieuważnego czytania dokumentacji. Warto zawsze sprawdzać, jak formatowanie będzie wyglądać na wyjściu i testować fragmenty kodu – bo komputer nie domyśli się, co autor miał na myśli, tylko wykona dokładnie to, co zadeklarowano w kodzie.

Pytanie 9

Do zadań widoku w architekturze MVVM (Model-View-ViewModel) należy

A. zarządzanie logiką aplikacji - obejmuje wdrażanie algorytmów
B. obsługa interakcji użytkownika, stworzenie UI
C. przekazywanie danych do widoku oraz wymiana informacji z modelem
D. przechowywanie ściągniętych i przetworzonych informacji
Wiele osób myli zadania widoku w architekturze MVVM z innymi warstwami, przez co później pojawiają się spore problemy przy rozwijaniu i utrzymywaniu większych aplikacji. Przede wszystkim, widok nigdy nie powinien zarządzać logiką aplikacji ani implementować algorytmów – to zadanie Modelu lub ewentualnie ViewModelu. Przenoszenie takich odpowiedzialności do UI prowadzi do tzw. „smrodu kodu” i utrudnia refaktoryzację czy testowanie. Spotkałem się w praktyce z projektami, gdzie próbowano do widoku wrzucić obsługę serwisów, walidację czy sterowanie workflow – efektem był totalny chaos. Równie często pojawia się błędne przekonanie, że widok powinien przekazywać dane do widoku i wymieniać informacje z modelem – tymczasem w MVVM przepływ danych realizuje głównie ViewModel dzięki data bindingowi, a widok jest raczej pasywny i nie zarządza wymianą informacji bezpośrednio z modelem. To ViewModel łączy model z warstwą prezentacji, pozwalając na luźne powiązanie i wysoką elastyczność. Kolejna mylna koncepcja dotyczy przechowywania pobranych i przetworzonych informacji – tym zajmuje się Model, ewentualnie ViewModel, a nie widok. Wrzucając takie rzeczy do UI, łamiemy zasadę separacji odpowiedzialności. Moim zdaniem, warto zapamiętać, że długofalowy rozwój systemu, możliwość testowania oraz opcja łatwego podmieniania warstw bez ruszania całej reszty zależą właśnie od tego, jak precyzyjnie trzymamy się podziału ról. MVVM został zaprojektowany po to, żeby każda warstwa miała jasno określone zadania – i tylko wtedy architektura ma sens, jeśli się tego trzymamy. Odpowiedzialności widoku ograniczają się do prezentacji i obsługi interakcji użytkownika; wszystko, co wykracza poza to, powinno być delegowane do innych warstw. To pozwala na czysty kod i zgodność z najlepszymi praktykami programistycznymi.

Pytanie 10

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

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

Pytanie 11

W C++ mechanizm programowania obiektowego, który wykorzystuje funkcje wirtualne (ang. Virtual) i umożliwia programiście pominięcie kontroli klasy pochodnej podczas wywoływania metod, nazywa się

A. dziedziczeniem
B. przeciążeniem
C. hermetyzacją
D. polimorfizmem
Dziedziczenie pozwala na przejmowanie metod i właściwości z klasy bazowej, ale samo w sobie nie umożliwia dynamicznego wyboru metody w czasie działania programu. Przeciążenie (overloading) polega na definiowaniu wielu metod o tej samej nazwie, ale różnych parametrach, co nie jest równoznaczne z polimorfizmem. Hermetyzacja (encapsulation) koncentruje się na ukrywaniu szczegółów implementacyjnych i dostępie do danych tylko przez interfejs klasy, ale nie dotyczy mechanizmu wyboru metody w trakcie działania aplikacji.

Pytanie 12

Wskaż odpowiedź, która używa parafrazowania jako metodę aktywnego słuchania, gdy klient mówi: "Interesuje mnie aplikacja, która działa szybko, niezależnie od tego, czy korzysta z niej kilku czy tysiąc użytkowników"?

A. Dlaczego Pani potrzebuje takiej aplikacji?
B. Ilu użytkowników planuje z niej skorzystać?
C. Czuję pewne wątpliwości w Pani głosie. Czy mogę zadać kilka pytań?
D. Jeśli dobrze zrozumiałam, chodzi o aplikację, która efektywnie obsługuje różne obciążenia
Parafraza to świetna technika, która pomaga zrozumieć, co rozmówca ma na myśli. Jak w tym przypadku – odpowiedź, która mówi: 'Jeśli dobrze rozumiem, chodzi o aplikację, która radzi sobie z różnym obciążeniem,' naprawdę dobrze oddaje to, co klient próbował przekazać. Klient podkreśla, że ważne jest dla niego, aby aplikacja była wydajna, niezależnie od tego, ile osób z niej korzysta. Użycie terminu 'radzi sobie z obciążeniem' jest trafne, bo dotyczy zdolności systemu do przystosowywania się do zmieniającej się liczby użytkowników i ich aktywności. To pokazuje, że konsultant dobrze zrozumiał potrzeby klienta i otwiera możliwości do dalszej rozmowy o technicznych detalach aplikacji, a to jest kluczowe w sprzedaży i budowaniu dobrych relacji z klientem.

Pytanie 13

Zapisany fragment w C# wskazuje na definicję klasy Car, która:

public class Car: Vehicle {     ...   }
A. jest powiązana z klasą Vehicle
B. używa prywatnych pól klasy Vehicle
C. stanowi klasę bazową (nie dziedziczy po żadnej klasie)
D. dziedziczy po Vehicle
W przedstawionym kodzie w języku C# mamy definicję klasy Car, która dziedziczy po klasie Vehicle. Dziedziczenie to fundamentalny mechanizm programowania obiektowego, pozwalający jednej klasie przejąć właściwości i metody innej klasy. W praktyce oznacza to, że klasa Car automatycznie zyskuje dostęp do metod i właściwości publicznych oraz chronionych klasy Vehicle, co umożliwia ponowne użycie kodu i zwiększa jego przejrzystość. Dziedziczenie jest kluczowe w projektowaniu skalowalnych systemów, gdzie umożliwia tworzenie bardziej specyficznych klas na podstawie klas ogólnych, co jest zgodne z zasadą DRY (Don't Repeat Yourself). Przykładowo, jeżeli klasa Vehicle zawiera metody takie jak Start() i Stop(), klasa Car może je wykorzystać bez konieczności ponownego definiowania. Dobre praktyki w programowaniu obiektowym zalecają wykorzystywanie dziedziczenia do tworzenia hierarchii klas, które logicznie odwzorowują relacje „jest-a” pomiędzy obiektami w systemie. Ważne jest też unikanie zbyt głębokiego dziedziczenia, co może prowadzić do skomplikowanego i trudnego w utrzymaniu kodu. Zrozumienie dziedziczenia jest kluczowe dla efektywnego wykorzystania wzorców projektowych, takich jak wzorzec projektowy Adapter czy Dekorator.

Pytanie 14

Jakie narzędzie można wykorzystać do tworzenia aplikacji mobilnych typu cross-platform w C#?

A. platformę Xamarin
B. środowisko XCode
C. platformę React Native
D. środowisko Android Studio
Xamarin to potężna platforma do tworzenia aplikacji mobilnych typu cross-platform w języku C#. Dzięki wykorzystaniu technologii .NET, deweloperzy mogą pisać kod raz, a następnie wdrażać go na różnych systemach operacyjnych, takich jak iOS i Android. Xamarin umożliwia korzystanie z natywnych interfejsów użytkownika oraz dostęp do funkcji urządzeń mobilnych, co zapewnia dużą wydajność i płynność działania aplikacji. Przykładowo, aplikacja stworzona w Xamarinie może korzystać z natywnych komponentów UI, co pozwala na zachowanie specyficznych dla platformy wzorców interakcji oraz UX. Dzięki wsparciu dla C# i .NET, deweloperzy mogą również łatwo integrować istniejące biblioteki oraz korzystać z ekosystemu .NET, co znacząco przyspiesza proces deweloperski. Warto również zaznaczyć, że Xamarin jest zgodny z wieloma standardami, co ułatwia współpracę w zespołach projektowych oraz utrzymanie kodu na dłuższą metę.

Pytanie 15

Który z wymienionych etapów w procesie przetwarzania instrukcji przez procesor odbywa się jako pierwszy?

A. Realizacja instrukcji (Execution)
B. Rozkodowanie rozkazu (Decode)
C. Pobranie rozkazu z pamięci (Fetch)
D. Zapis wyników do pamięci (Write Back)
Pierwszą rzeczą, jaką robi procesor, jest pobranie rozkazu z pamięci, co nazywamy Fetch. To bardzo ważny etap w budowie komputera. Normalnie cykl wykonywania instrukcji składa się z trzech głównych kroków: pobierania, dekodowania i wykonania. W fazie Fetch procesor dobiera się do pamięci i ściąga instrukcję, którą zaraz wykona. Do tego używa rejestru wskaźnika instrukcji, czyli Instruction Pointer, który pokazuje, gdzie w pamięci jest następna instrukcja. Jak to działa w praktyce? Można to zobaczyć na przykładzie procesora x86, gdzie CPU na początku cyklu sprawdza pamięć RAM, szukając instrukcji według adresu, który podaje wskaźnik. Standardy takie jak ISA (Instruction Set Architecture) mówią, że ten krok to podstawa, bo to właśnie od niego zaczyna się wszystko, co robi procesor.

Pytanie 16

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

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

Pytanie 17

Jakiego rodzaju zmiennej użyjesz w C++, aby przechować wartość "true"?

A. tekst
B. bool
C. liczba całkowita
D. liczba zmiennoprzecinkowa
Typ danych 'bool' w języku C++ jest przeznaczony do przechowywania wartości 'true' lub 'false'. Deklaracja 'bool isReady = true;' to przykład poprawnego przypisania wartości logicznej do zmiennej. Typ boolean jest kluczowy w warunkach decyzyjnych, pętlach i operacjach porównawczych. W programowaniu typ 'bool' jest wykorzystywany do kontroli przepływu programu, obsługi wyjątków oraz sprawdzania poprawności danych. Użycie booleanów w kodzie zwiększa jego czytelność i pozwala na bardziej przejrzyste budowanie logiki aplikacji.

Pytanie 18

Który algorytm sortowania opiera się na metodzie "dziel i zwyciężaj"?

A. Sortowanie przez wybór
B. Sortowanie bąbelkowe
C. Sortowanie szybkie (QuickSort)
D. Sortowanie przez wstawianie
QuickSort to algorytm sortowania wykorzystujący podejście 'dziel i zwyciężaj', co oznacza, że dzieli tablicę na mniejsze części wokół elementu zwanego pivotem, a następnie rekurencyjnie sortuje każdą z tych części. Ta strategia pozwala na efektywne sortowanie dużych zbiorów danych w czasie O(n log n) w większości przypadków. Dziel i zwyciężaj to potężne narzędzie algorytmiczne, które znajduje zastosowanie w wielu innych algorytmach, takich jak Merge Sort i algorytmy wyszukiwania binarnego. QuickSort jest często używany w aplikacjach wymagających szybkiego przetwarzania dużych ilości danych.

Pytanie 19

Który z wymienionych wzorców projektowych jest najbardziej odpowiedni do uproszczenia interfejsu złożonego systemu?

A. Kompozyt (Composite)
B. Metoda szablonowa (Template method)
C. Fasada (Facade)
D. Singleton (Singleton)
Wzorzec Kompozyt (Composite) umożliwia traktowanie pojedynczych obiektów i ich grup w jednakowy sposób, co ułatwia zarządzanie hierarchicznymi strukturami. Metoda szablonowa (Template Method) definiuje szkielet algorytmu w klasie bazowej, pozwalając podklasom na dostosowanie poszczególnych kroków. Singleton to wzorzec zapewniający istnienie tylko jednej instancji klasy, co jest użyteczne w zarządzaniu zasobami systemowymi, ale nie służy do upraszczania interfejsu do złożonego systemu.

Pytanie 20

Jaką rolę pełni debugger w trakcie programowania?

A. Do konwersji kodu źródłowego na język maszynowy
B. Do wykrywania błędów w czasie działania programu
C. Do automatycznego generowania dokumentacji projektu
D. Do kontrolowania wersji kodu źródłowego
Debugger to takie narzędzie, które pomaga programistom w znajdowaniu błędów i śledzeniu, co się dzieje z programem, kiedy go uruchamiamy. Można go zatrzymać w dowolnym momencie, co nazywamy breakpoints, i wtedy można zobaczyć, jakie zmienne mają jakie wartości. Dzięki temu można łatwiej dostrzegać błędy logiczne czy składniowe. Wydaje mi się, że to naprawdę ważne narzędzie w pracy każdego programisty, bo ułatwia życie!

Pytanie 21

Jaką komendę w języku C++ używa się do wielokrotnego uruchamiania tego samego bloku kodu?

A. if
B. while
C. break
D. switch
Instrukcja `while` w języku C++ i innych językach programowania pozwala na wielokrotne wykonanie tego samego fragmentu kodu, dopóki warunek logiczny jest spełniony. Przykład: `while (x < 10) { x++; }` będzie zwiększać zmienną `x` o 1, dopóki jej wartość nie osiągnie 10. Pętle `while` są przydatne, gdy liczba iteracji nie jest z góry znana i zależy od spełnienia określonego warunku w trakcie wykonywania programu.

Pytanie 22

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 wielu metod o tej samej nazwie w różnych klasach
D. Tworzenie klasy abstrakcyjnej
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 23

Jaką rolę pełni instrukcja throw w języku C++?

A. Inicjuje nowy wyjątek podczas działania aplikacji
B. Zgłasza wyjątek, który można przechwycić za pomocą bloku catch
C. Przerywa działanie programu, gdy wystąpi wyjątek
D. Ogranicza zasięg zmiennych w bloku try
Tworzenie nowego wyjątku to nieco inne zastosowanie – 'throw' zgłasza wyjątek, ale jego utworzenie odbywa się wcześniej (np. przez wywołanie 'new Exception()'). Kończenie działania programu to skutek nieprzechwyconego wyjątku, ale samo 'throw' nie kończy programu – pozwala na jego kontynuację, jeśli wyjątek zostanie przechwycony. Ograniczenie zakresu zmiennych w bloku 'try' nie jest funkcją instrukcji 'throw' – to raczej wynik działania samego bloku 'try', który wprowadza ograniczony zakres zmiennych do czasu obsługi wyjątku.

Pytanie 24

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

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

Pytanie 25

Które z wymienionych stwierdzeń najtrafniej charakteryzuje WPF?

A. Framework przeznaczony do budowy aplikacji internetowych
B. Framework przeznaczony do budowy aplikacji stacjonarnych w systemie Windows
C. Biblioteka do obróbki danych w Pythonie
D. Framework umożliwiający zarządzanie urządzeniami IoT
No dobra, WPF to framework, którego używamy, żeby robić aplikacje na Windowsa. Jest częścią platformy .NET i super się nadaje do tworzenia ładnych interfejsów z użyciem XAML, co jest takim językiem, który pozwala na zaprojektowanie interfejsu. Dzięki WPF możemy korzystać z fajnych animacji i ogólnie mieć niezłe wizualizacje. W dodatku, wspiera model MVVM, co ułatwia rozdzielenie logiki aplikacji od tego, co widzi użytkownik. Także w wielu firmach, gdzie potrzebna jest zaawansowana grafika, WPF jest chętnie wykorzystywane.

Pytanie 26

Który z języków programowania jest powszechnie wykorzystywany do tworzenia aplikacji na komputery stacjonarne?

A. HTML
B. C++
C. PHP
D. JavaScript
C++ jest jednym z najczęściej wykorzystywanych języków programowania do tworzenia aplikacji desktopowych. Jego wysoka wydajność, niskopoziomowy dostęp do pamięci i możliwość zarządzania zasobami sprawiają, że jest idealnym wyborem do tworzenia aplikacji wymagających dużej mocy obliczeniowej, takich jak gry, oprogramowanie do obróbki grafiki czy aplikacje systemowe. Frameworki takie jak Qt i biblioteki standardowe C++ (STL) umożliwiają budowanie zarówno prostych, jak i zaawansowanych aplikacji z bogatym interfejsem użytkownika. C++ jest wykorzystywany na szeroką skalę w przemyśle, co czyni go jednym z kluczowych języków w ekosystemie programistycznym.

Pytanie 27

Jakie są różnice pomiędzy środowiskiem RAD a klasycznym IDE w kontekście aplikacji webowych?

A. RAD koncentruje się wyłącznie na budowie frontendu aplikacji
B. RAD umożliwia szybsze prototypowanie i rozwój aplikacji dzięki narzędziom wizualnym
C. RAD funkcjonuje tylko w systemach Windows
D. RAD nie wspiera żadnych języków backendowych
Rapid Application Development (RAD) to metodologia, która koncentruje się na szybkim prototypowaniu i iteracyjnym tworzeniu aplikacji. Dzięki narzędziom wizualnym RAD umożliwia programistom i projektantom szybkie budowanie interfejsów użytkownika oraz testowanie funkcjonalności aplikacji na wczesnym etapie rozwoju. RAD skraca czas potrzebny na dostarczenie gotowego produktu, co czyni go idealnym rozwiązaniem w dynamicznie zmieniających się projektach webowych. Narzędzia RAD umożliwiają także automatyczne generowanie kodu, co znacznie przyspiesza proces programowania.

Pytanie 28

Jaką funkcję pełnią mechanizmy ciasteczek w aplikacjach internetowych?

A. Do zapisywania danych użytkownika na serwerze
B. Do zapisywania danych użytkownika w przeglądarce
C. Do generowania dynamicznych interfejsów dla użytkowników
D. Do przechowywania informacji w bazie danych
Mechanizm ciasteczek (cookies) w aplikacjach webowych służy do przechowywania danych użytkownika bezpośrednio w przeglądarce. Ciasteczka mogą przechowywać różnego rodzaju informacje, takie jak preferencje językowe, identyfikatory sesji czy dane logowania, co pozwala na personalizację doświadczenia użytkownika oraz śledzenie jego aktywności na stronie. Dzięki ciasteczkom aplikacje webowe mogą zapamiętać użytkownika i dostosować treści do jego potrzeb przy kolejnych wizytach. Cookies są nieodłącznym elementem zarządzania stanem w aplikacjach stateless, takich jak te oparte na protokole HTTP. Mogą być one również wykorzystywane w systemach reklamowych i analitycznych do monitorowania zachowań użytkowników. Prawidłowe zarządzanie ciasteczkami i stosowanie odpowiednich polityk prywatności są kluczowe dla zgodności z przepisami RODO oraz regulacjami dotyczącymi ochrony danych osobowych.

Pytanie 29

Jakie kroki należy podjąć po wykryciu błędu w kodzie podczas testowania?

A. Pominąć błąd, jeżeli aplikacja funkcjonuje poprawnie
B. Naprawić błąd i przeprowadzić ponowne testy aplikacji
C. Zgłosić błąd użytkownikowi końcowemu
D. Usunąć moduł, który zawiera błąd
Po znalezieniu błędu w kodzie podczas testowania kluczowym krokiem jest poprawienie błędu i ponowne przetestowanie aplikacji. Taki cykl iteracyjny pozwala na eliminację błędów i zapewnienie, że aplikacja działa zgodnie z oczekiwaniami. Testowanie po każdej poprawce jest niezbędne, aby upewnić się, że wprowadzone zmiany nie wpłynęły negatywnie na inne części aplikacji. Taka praktyka jest integralną częścią Continuous Integration (CI) i Continuous Deployment (CD), które zakładają częste wdrażanie i testowanie kodu. Poprawienie błędów na wczesnym etapie rozwoju minimalizuje koszty i czas potrzebny na naprawę błędów w fazie produkcyjnej, co przyczynia się do stabilności i wysokiej jakości końcowego produktu.

Pytanie 30

Jaki typ testów ocenia funkcjonalność aplikacji z punktu widzenia użytkownika końcowego?

A. Testy obciążeniowe
B. Testy użyteczności
C. Testy funkcjonalne
D. Testy zgodności
Testy obciążeniowe skupiają się na sprawdzaniu, jak aplikacja działa pod dużym ruchem lub obciążeniem, co pozwala ocenić jej wydajność, ale nie dotyczy to bezpośrednio doświadczeń użytkownika. Testy funkcjonalne mają na celu sprawdzenie, czy poszczególne funkcje aplikacji działają zgodnie z założeniami, ale nie badają wygody użytkowania. Testy zgodności natomiast weryfikują, czy aplikacja spełnia określone normy i standardy, co ma niewiele wspólnego z oceną użyteczności aplikacji przez użytkownika końcowego.

Pytanie 31

Co to jest automatyzacja testowania procesów?

A. Integracją testów w środowisku deweloperskim
B. Używaniem narzędzi oraz skryptów do wykonywania testów w sposób automatyczny bez udziału człowieka
C. Sprawdzaniem poprawności działania aplikacji na urządzeniach przenośnych
D. Kompilowaniem kodu w celu zwiększenia efektywności
Automatyzacja procesu testowania to zastosowanie narzędzi, skryptów i technologii do przeprowadzania testów oprogramowania w sposób zautomatyzowany, bez konieczności ciągłej ingerencji człowieka. Automatyzacja pozwala na szybkie i wielokrotne uruchamianie testów regresyjnych, co znacząco zwiększa efektywność testowania, redukuje czas potrzebny na wykrycie błędów i umożliwia jednoczesne testowanie wielu funkcji. Narzędzia takie jak Selenium, JUnit czy TestNG pozwalają na tworzenie skryptów testowych, które automatycznie weryfikują poprawność działania aplikacji na różnych urządzeniach i w różnych środowiskach. Automatyzacja testów to nie tylko oszczędność czasu, ale także wyższa dokładność i powtarzalność testów, co minimalizuje ryzyko przeoczenia krytycznych błędów.

Pytanie 32

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

A. push()
B. pop()
C. shift()
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 33

Jakie jest zastosowanie metody fetch() w JavaScript?

A. Pobieranie zasobów z sieci asynchronicznie
B. Filtrowanie elementów tablicy
C. Manipulacja elementami DOM
D. Sortowanie kolekcji obiektów
Metoda fetch() w JavaScript jest kluczowym narzędziem do asynchronicznego pobierania zasobów z sieci. Umożliwia ona wykonywanie zapytań HTTP do serwerów w sposób, który nie blokuje głównego wątku aplikacji, co jest istotne w kontekście zapewnienia płynności działania aplikacji webowych. Użycie fetch() pozwala na pobieranie różnych typów danych, takich jak JSON, tekst, czy pliki binarne. Przykład zastosowania fetch() może wyglądać następująco: fetch('https://api.example.com/data') .then(response => { if (!response.ok) { throw new Error('Network response was not ok'); } return response.json(); }) .then(data => console.log(data)); W tym przykładzie, po nawiązaniu połączenia z API, sprawdzamy, czy odpowiedź jest poprawna, a następnie przetwarzamy dane w formacie JSON. Ponadto, fetch() wspiera nowoczesne praktyki, takie jak obsługa promes (Promises) oraz async/await, co upraszcza kod i poprawia jego czytelność. Użycie tej metody jest zgodne z aktualnymi standardami webowymi, co czyni ją preferowanym rozwiązaniem w nowoczesnym programowaniu JavaScript.

Pytanie 34

Co to jest JWT (JSON Web Token)?

A. Standard definiujący sposób bezpiecznego przekazywania informacji jako obiekt JSON
B. Protokół komunikacyjny do transferu danych między klientem a serwerem
C. Format zapisu danych używany w bazach NoSQL
D. Biblioteka JavaScript do walidacji formularzy webowych
Chociaż różne podejścia do komunikacji i transferu danych są istotne, żadna z pozostałych odpowiedzi nie odnosi się bezpośrednio do istoty JWT. Protokół komunikacyjny do transferu danych między klientem a serwerem, choć może obejmować różne metody, nie wyraża istoty JWT. Standardy takie jak HTTP, WebSocket czy REST, które służą do przesyłania danych, nie definiują struktury ani zasad bezpieczeństwa związanych z JWT. Format zapisu danych używany w bazach NoSQL, jak MongoDB, nie ma związku z JWT, który jest specyficznie zaprojektowany do przesyłania informacji w formacie JSON, a nie do przechowywania ich w bazach danych. Bazy NoSQL mają swoje własne struktury danych i modele, które różnią się znacznie od modelu JSON Web Token. Podobnie, biblioteka JavaScript do walidacji formularzy webowych nie ma nic wspólnego z JWT, który jest narzędziem do zarządzania autoryzacją i sesjami użytkownika. Te błędne odpowiedzi mogą prowadzić do pomyłek w zrozumieniu, co oznacza JWT i do jakich celów jest przeznaczony. Kluczowym błędem myślowym jest mylenie różnych warstw architektury aplikacji, gdzie JWT jest konkretnym rozwiązaniem do zarządzania bezpieczeństwem, a nie ogólnym protokołem komunikacyjnym czy formatem danych.

Pytanie 35

Co oznacza pojęcie MVP w kontekście projektowania aplikacji?

A. Minimum Viable Product - produkt o minimalnej funkcjonalności zdolny do działania
B. Multiple Value Platform - platforma wspierająca wiele typów wartości danych
C. Most Valuable Program - program uznany za najbardziej wartościowy w organizacji
D. Mobile Virtual Platform - platforma do testowania aplikacji mobilnych
Pojęcie Minimum Viable Product (MVP) odnosi się do koncepcji projektowania produktów, która zakłada stworzenie wersji produktu z minimalną funkcjonalnością, zdolnej do spełnienia podstawowych potrzeb użytkowników. Celem MVP jest jak najszybsze wprowadzenie produktu na rynek, co pozwala na zbieranie danych od rzeczywistych użytkowników i dostosowywanie produktu na podstawie ich feedbacku. Tego rodzaju podejście jest zgodne z metodologią Lean Startup, która promuje szybkie cykle iteracyjne i minimalizację ryzyka inwestycyjnego. Przykładem MVP może być aplikacja mobilna, która oferuje tylko najważniejsze funkcje, na przykład możliwość rejestracji i przeglądania treści, zamiast pełnej gamy opcji. Dzięki temu zespół developerski może szybko identyfikować kluczowe potrzeby użytkowników i wprowadzać odpowiednie udoskonalenia. W praktyce MVP pozwala nie tylko na szybsze wprowadzenie produktu na rynek, ale również na optymalizację kosztów i czasów rozwoju, co jest szczególnie istotne w dynamicznie zmieniającym się środowisku technologicznym.

Pytanie 36

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

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

Pytanie 37

Co oznacza pojęcie TDD w kontekście programowania?

A. Test-Driven Development - praktyka pisania testów przed implementacją kodu
B. Type Definition Document - dokumentacja typów danych w aplikacji
C. Technical Design Document - dokumentacja techniczna projektu
D. Task Deployment Diagram - schemat wdrażania zadań w projekcie
Test-Driven Development (TDD) to metodologia programowania, w której proces tworzenia kodu zaczyna się od pisania testów. TDD polega na cyklicznym podejściu do rozwoju oprogramowania, w którym najpierw definiujemy, jakie funkcjonalności będzie miał nasz kod, a następnie implementujemy tylko te elementy, które są niezbędne do przejścia wcześniej napisanych testów. Dzięki temu, deweloperzy mają możliwość natychmiastowego sprawdzenia poprawności swojego kodu, co sprzyja eliminacji błędów na wczesnym etapie. Przykład zastosowania TDD można zobaczyć w tworzeniu aplikacji webowych, gdzie programista pisze testy jednostkowe dla nowych funkcji, a następnie implementuje te funkcje, poprawiając kod tylko w przypadku, gdy testy nie przechodzą. Takie podejście pozwala na zwiększenie jakości oprogramowania oraz jego łatwiejszą refaktoryzację. Warto również zauważyć, że TDD jest zgodne z praktykami Agile i Continuous Integration, co pozwala na efektywniejsze zarządzanie projektem i dostosowywanie go do wymagań zmieniającego się rynku.

Pytanie 38

Co to jest XSS (Cross-Site Scripting)?

A. Luka bezpieczeństwa pozwalająca na wstrzyknięcie złośliwego kodu do stron przeglądanych przez innych użytkowników
B. Technika optymalizacji kodu JavaScript do zwiększenia wydajności strony
C. Framework do tworzenia responsywnych stron internetowych
D. Protokół komunikacyjny używany w aplikacjach internetowych
Cross-Site Scripting (XSS) to luka bezpieczeństwa, która umożliwia atakującym wstrzykiwanie złośliwego kodu JavaScript do stron internetowych, które są następnie przeglądane przez innych użytkowników. W wyniku tego ataku, złośliwy kod może być wykonany w kontekście przeglądarki ofiary, co może prowadzić do kradzieży sesji, danych osobowych, czy też przejęcia kontroli nad kontem użytkownika. Aby zapobiegać XSS, programiści powinni stosować techniki takie jak walidacja i oczyszczanie danych wejściowych, a także korzystanie z nagłówków HTTP, takich jak Content Security Policy (CSP). Przykładem może być sytuacja, gdy aplikacja webowa przyjmuje dane w formularzach bez odpowiedniego sprawdzenia, co pozwala na umieszczenie skryptu, który zyskuje dostęp do cookies użytkownika. Zrozumienie i zabezpieczenie się przed XSS jest kluczowe w kontekście budowania bezpiecznych aplikacji webowych, co jest zgodne z najlepszymi praktykami branżowymi.

Pytanie 39

Które z poniższych narzędzi służy do analizy wydajności stron internetowych?

A. Lighthouse
B. Postman
C. Docker
D. Webpack
Postman to narzędzie, które służy przede wszystkim do testowania API. Jego główna funkcjonalność polega na umożliwieniu użytkownikom wysyłania zapytań do serwerów oraz analizy odpowiedzi, co jest niezbędne w procesie rozwijania aplikacji webowych. Jednakże, Postman nie ma za zadanie oceny wydajności stron internetowych, ponieważ koncentruje się na interakcjach z API, a nie na aspekcie wydajności samej strony. Docker jest platformą do konteneryzacji, która pozwala deweloperom na łatwe zarządzanie aplikacjami w różnych środowiskach. Chociaż Docker może mieć wpływ na wydajność aplikacji poprzez ułatwienie zarządzania zasobami, nie jest narzędziem dedykowanym do analizy wydajności stron internetowych. Webpack to narzędzie służące do bundlingu zasobów JavaScript, które skupia się na optymalizacji i kompresji plików. Jego zadaniem jest usprawnienie dostarczania skryptów do przeglądarek, jednak nie jest to narzędzie, które ocenia wydajność strony jako całości. Błędem jest zatem mylenie funkcji, jakie pełnią te narzędzia. Zamiast skupić się na testowaniu wydajności, można skupić się na testowaniu API czy optymalizacji zasobów, co nie odnosi się bezpośrednio do analizy całkowitej wydajności strony internetowej. Dlatego ważne jest zrozumienie, jakie narzędzia służą do jakich celów, aby skutecznie poprawiać jakość aplikacji internetowych.

Pytanie 40

Co to jest polimorfizm w programowaniu obiektowym?

A. Zdolność obiektów różnych klas do reagowania na tę samą metodę w sposób odpowiedni dla ich klasy
B. Mechanizm ukrywania szczegółów implementacji przed zewnętrznymi klasami
C. Proces tworzenia nowej klasy na podstawie istniejącej
D. Zdolność klasy do posiadania wielu konstruktorów
Polimorfizm jest fundamentalnym pojęciem w programowaniu obiektowym, które pozwala obiektom różnych klas na reagowanie na tę samą metodę w sposób odpowiedni dla ich konkretnej klasy. Przykładowo, jeśli mamy klasę `Zwierze` z metodą `dźwięk()`, a następnie klasy `Pies` i `Kot`, każda z tych klas może implementować metodę `dźwięk()` w inny sposób: pies może wydawać dźwięk 'Hau', podczas gdy kot 'Miau'. Dzięki temu, gdy wywołujemy `dźwięk()` na obiekcie typu `Zwierze`, a dokładnie na obiekcie, który może być różnego typu, uzyskujemy różne wyniki w zależności od klasy. Polimorfizm zwiększa elastyczność i skalowalność kodu, co jest zgodne z zasadami SOLID, szczególnie z zasadą otwarte-zamknięte. W praktyce polimorfizm umożliwia programistom tworzenie bardziej złożonych systemów, w których obiekty mogą być używane zamiennie, co ułatwia ich rozwój i konserwację.