Wyniki egzaminu

Informacje o egzaminie:
  • Zawód: Technik programista
  • Kwalifikacja: INF.04 - Projektowanie, programowanie i testowanie aplikacji
  • Data rozpoczęcia: 20 stycznia 2026 17:42
  • Data zakończenia: 20 stycznia 2026 17:45

Egzamin niezdany

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

Wymagane minimum: 20 punktów (50%)

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

Kompilator może wygenerować błąd "incompatible types", gdy

A. w trakcie deklaracji zmiennej wystąpił błąd, zastosowano nieistniejący typ
B. do zmiennej typu int przypisano wartość 243
C. funkcja zwraca typ void, a w momencie wywołania nie jest przypisana do żadnej zmiennej
D. funkcja oczekuje całkowitej jako argumentu, a została wywołana z napisem jako parametrem
Zła deklaracja zmiennej raczej spowoduje inne komunikaty o błędach, jak 'cannot find symbol', a nie 'incompatible types'. Jak przypisujesz liczbę do zmiennej typu int, to jest wszystko w porządku, więc błędu nie będzie. Pamiętaj, że funkcje typu void nie zwracają wartości, ale jeśli próbujesz coś przypisać, to dostaniesz raczej komunikat 'void type not allowed here'. To różne sprawy.

Pytanie 2

Przedstawione w filmie działania wykorzystują narzędzie

A. generatora kodu java
B. debuggera analizującego wykonujący kod
C. generatora GUI przekształcającego kod do języka XAML
D. kompilatora dla interfejsu graficznego
Patrząc na wszystkie dostępne opcje, łatwo się pomylić, bo terminologia może być trochę podchwytliwa. Debugger analizujący wykonujący kod rzeczywiście jest kluczowym narzędziem w pracy programisty, ale jego zadaniem jest szukanie błędów i obserwowanie działania programu w czasie rzeczywistym, a nie generowanie kodu czy interfejsów. Myślę, że sporo osób utożsamia narzędzia developerskie z debuggerem, bo to jedno z najczęściej używanych rozwiązań – jednak tutaj akurat nie ma on nic wspólnego z przekształcaniem kodu do XAML-a. Generator kodu Java brzmi sensownie, jeśli ktoś pracuje więcej w środowiskach Javy, ale w tym przypadku mówimy o ekosystemie .NET i XAML-u, a Java ma zupełnie inne formaty i narzędzia (np. FXML dla JavaFX, ale to zupełnie inna bajka). Generator GUI przekształcający kod do języka XAML to narzędzie dedykowane platformie Microsoftu, bo XAML funkcjonuje właśnie w tych technologiach. Ostatnia odpowiedź, czyli kompilator dla interfejsu graficznego, to trochę pomieszanie pojęć – kompilator rzeczywiście tłumaczy kod na wykonywalny plik (np. EXE), ale nie jest narzędziem służącym do generowania czy przekształcania opisów interfejsów graficznych. Sporo osób może mieć tendencję do mylenia generatorów z kompilatorami, bo oba „tworzą coś automatycznie”, ale ich przeznaczenie jest zupełnie inne. Moim zdaniem najważniejsze to rozumieć, że generatory GUI ułatwiają życie, pozwalając szybko przenieść projekt interfejsu do kodu XAML, a reszta narzędzi ma zupełnie inne zadania. To rozróżnienie jest naprawdę kluczowe w branży.

Pytanie 3

Jakie z wymienionych narzędzi służy do testowania aplikacji?

A. WordPress
B. Git
C. Selenium
D. Photoshop
Git to system kontroli wersji, który umożliwia śledzenie zmian w kodzie źródłowym i współpracę w zespołach deweloperskich, ale nie służy do automatycznego testowania aplikacji webowych. Photoshop to narzędzie graficzne do edycji zdjęć i tworzenia grafik, nie ma zastosowania w testowaniu oprogramowania. WordPress to system zarządzania treścią (CMS), który pozwala na tworzenie i zarządzanie stronami internetowymi, ale nie pełni funkcji narzędzia do testowania aplikacji webowych.

Pytanie 4

W klasie pracownik zdefiniowano następujące metody:

pracownik()   { ... }
static void wypisz()   { ... }
int operator== (const pracownik &prac) { ... }
~pracownik()   { ... }
Która z nich jest odpowiednia do dodania elementu diagnostycznego o treści:
cout << "Obiekt został usunięty";
Ilustracja do pytania
A. ~pracownik
B. operator==
C. wypisz
D. pracownik
Destruktor to specjalna metoda w języku C++ oznaczona tyldą przed nazwą klasy która jest wywoływana automatycznie w momencie usuwania obiektu danego typu z pamięci. Dlatego dodanie elementu diagnostycznego cout<<Obiekt został usunięty; jest najbardziej sensowne w destruktorze ponieważ pozwala na śledzenie momentu w którym obiekt przestaje istnieć. Takie podejście jest zgodne z dobrymi praktykami programistycznymi ponieważ pomaga w debugowaniu i zarządzaniu zasobami w programie. Warto zauważyć że destruktory są kluczowe w kontekście zarządzania pamięcią szczególnie gdy klasa dynamicznie alokuje zasoby. Wówczas destruktor powinien zawierać kod zwalniający te zasoby aby uniknąć wycieków pamięci. Dodawanie diagnostycznych komunikatów może pomóc programistom w identyfikacji potencjalnych błędów związanych z zarządzaniem cyklem życia obiektów i poprawić ogólną stabilność i czytelność kodu. Praktyka ta jest szczególnie ważna w dużych projektach gdzie ręczne śledzenie wszystkich obiektów byłoby trudne i czasochłonne. Warto stosować taką diagnostykę w połączeniu z nowoczesnymi narzędziami do profilowania i analizy pamięci co zwiększa efektywność procesu programistycznego.

Pytanie 5

Które z poniższych jest podstawowym rodzajem testów używanych w testowaniu jednostkowym?

A. Testy systemowe
B. Testy jednostkowe
C. Testy akceptacyjne
D. Testy integracyjne
Pozostałe rodzaje testów, mimo że są istotne w procesie testowania oprogramowania, nie są podstawowymi elementami testowania jednostkowego. Testy integracyjne mają na celu sprawdzenie, czy różne moduły systemu współpracują ze sobą poprawnie. Są one wykonywane po testach jednostkowych i skupiają się na interakcjach między komponentami. Testy systemowe to kolejny poziom testowania, który bada cały zintegrowany system pod kątem zgodności z wymaganiami. Są one szeroko zakrojone i testują zarówno funkcjonalność, jak i niefunkcjonalne aspekty systemu, takie jak wydajność czy bezpieczeństwo. Testy akceptacyjne to ostatnia faza testowania, w której sprawdza się, czy system spełnia kryteria akceptacji i jest gotowy do wdrożenia. Są one często wykonywane przez końcowych użytkowników lub klientów, aby upewnić się, że system spełnia ich potrzeby i oczekiwania. Wszystkie te formy testowania są ważne, ale nie zastępują testów jednostkowych, które są fundamentem weryfikacji poprawności poszczególnych części kodu. Typowym błędem jest myślenie, że można całkowicie polegać na testach wyższego poziomu, zaniedbując testy jednostkowe, co może prowadzić do trudnych do wykrycia błędów w późniejszych etapach projektów.

Pytanie 6

W języku Java wyjątek ArrayIndexOutOfBoundsException występuje, gdy następuje próba dostępu do elementu tablicy, którego

A. indeks mieści się w zakresie od 0 do n-1, gdzie n oznacza rozmiar tablicy
B. wartość przewyższa jego indeks
C. wartość przekracza rozmiar tablicy
D. indeks jest równy lub większy od rozmiaru tablicy
Wyjątek ArrayIndexOutOfBoundsException w Javie to taki klasyk, na który łatwo się naciąć, zwłaszcza gdy operujesz na tablicach dynamicznie lub masz jakieś pętle i zapomnisz o poprawnych granicach. Ta odpowiedź jest prawidłowa, bo w języku Java indeksowanie tablic zaczyna się od 0, a ostatni poprawny indeks to zawsze rozmiar tablicy minus jeden. Jeśli próbujesz dostać się do elementu, którego indeks jest równy lub większy od rozmiaru tablicy, silnik uruchomieniowy Javy od razu rzuci ten wyjątek. Przykład? Masz tablicę int[] t = new int[5]; i próbujesz odwołać się do t[5] albo t[10] – nie zadziała, bo legalne są tylko indeksy 0, 1, 2, 3, 4. Moim zdaniem to jeden z tych wyjątków, które wyraźnie pokazują, jak ważne jest zabezpieczanie kodu i stosowanie praktyk takich jak sprawdzanie długości tablicy przed dostępem do jej elementów. W profesjonalnym kodzie, zwłaszcza komercyjnym, nie zostawia się takich rzeczy przypadkowi – często stosuje się pętle typu for (int i = 0; i < array.length; i++), żeby mieć pewność, że nigdzie nie wyjedziemy poza zakres. Dobra praktyka to też wykorzystywanie narzędzi jak testy jednostkowe, żeby wyłapywać takie błędy. Warto pamiętać, że ten wyjątek jest unchecked, czyli nie musisz go łapać w kodzie, ale dobrze jest rozumieć, że jego pojawienie się oznacza błąd w logice programu. Osobiście uważam, że jeśli ktoś raz się na tym przejedzie, to już zawsze sprawdza rozmiar tablicy przed dostępem – taka nauczka na całe życie programisty.

Pytanie 7

Co będzie wynikiem działania poniższego kodu JavaScript?

const obj = { name: 'John', greet: function() { setTimeout(function() { console.log(`Hello, ${this.name}`); }, 1000); } }; obj.greet();
A. Hello, undefined
B. Hello, John
C. TypeError
D. Hello, null
Odpowiedzi `Hello, John`, `TypeError` oraz `Hello, null` są wynikiem niepełnego zrozumienia zasad działania kontekstu `this` w JavaScript oraz mechanizmów związanych z wywołaniami funkcji w różnych kontekstach. W przypadku pierwszej z tych odpowiedzi, można by sądzić, że `this` w funkcji anonimowej odwołuje się do obiektu `obj`, co jest błędne, ponieważ w momencie wywołania funkcji przez `setTimeout` kontekst `this` traci odniesienie do obiektu, a zamiast tego wskazuje na obiekt globalny. W efekcie `this.name` nie zwraca wartości `'John'`, lecz `undefined`. Druga odpowiedź, związana z `TypeError`, nie zrozumiała, że żadne błędy nie są generowane w tym kodzie, a funkcja anonimowa wykonuje się bezproblemowo, jednak z błędnym kontekstem. Ostatnia propozycja, `Hello, null`, również jest nietrafiona, ponieważ nie istnieje sytuacja, w której `this` w tym kontekście mogłoby się odwoływać do `null`. Należy również pamiętać, że JavaScript różni się od wielu innych języków programowania, gdzie `this` jest bardziej ściśle powiązane z obiektem, w którym metoda została wywołana. Zrozumienie kontekstu `this` jest kluczowe w pracy z JavaScript, szczególnie w pracy z funkcjami asynchronicznymi oraz w zastosowaniach programowania obiektowego.

Pytanie 8

Zmienna o typie logicznym może mieć następujące wartości:

A. trzy dowolne liczby naturalne
B. 0 oraz każda liczba całkowita
C. true, false
D. 1, -1
Wartości 1 i -1 mogą być interpretowane jako prawda/fałsz w niektórych językach, takich jak C, ale nie są standardowymi wartościami typu boolean. Wartości 0 lub dowolna liczba całkowita mogą być stosowane w kontekście warunków, ale nie są typowymi wartościami logicznymi. Trzy dowolne liczby naturalne nie mają żadnego związku z typem logicznym – typ boolean zawsze przyjmuje dokładnie dwie wartości, co odróżnia go od typów numerycznych.

Pytanie 9

Który z wymienionych procesów NIE jest częścią etapu kompilacji?

A. Optymalizacja kodu
B. Analiza działania programu w czasie rzeczywistym
C. Tłumaczenie kodu źródłowego na język maszynowy
D. Weryfikacja błędów składniowych
Optymalizacja kodu to integralna część kompilacji, mająca na celu zwiększenie wydajności programu poprzez usunięcie zbędnych instrukcji i usprawnienie algorytmów. Tłumaczenie kodu źródłowego na język maszynowy jest głównym zadaniem kompilatora, który generuje plik wykonywalny. Weryfikacja błędów składniowych jest jednym z pierwszych etapów kompilacji, mającym na celu upewnienie się, że kod jest poprawny pod względem składni, zanim zostanie przekształcony na kod maszynowy.

Pytanie 10

Jakie aspekty powinny być brane pod uwagę przy tworzeniu zestawów danych?

A. Typ zastosowanego kompilatora
B. Metoda alokacji pamięci dla danych
C. Narzędzia do analizy błędów
D. Ilość linii kodu programu
Długość kodu programu wpływa na czytelność i utrzymanie, ale nie jest kluczowym czynnikiem przy projektowaniu zestawów danych. Kompilator decyduje o tym, jak kod jest przekształcany w kod maszynowy, ale nie ma bezpośredniego wpływu na strukturę danych. Narzędzia do debugowania są istotne w procesie testowania i wykrywania błędów, ale nie odgrywają kluczowej roli w początkowej fazie projektowania zestawów danych. Kluczowe jest odpowiednie zaplanowanie struktury danych i sposobu ich przechowywania, co decyduje o efektywności aplikacji.

Pytanie 11

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

A. try
B. finally
C. catch
D. throw

Brak odpowiedzi na to pytanie.

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

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

A. Selenium
B. Trello
C. JIRA
D. Slack

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Selenium to jedno z najpopularniejszych narzędzi do automatyzacji testów interfejsu użytkownika aplikacji webowych. Jest to otwartoźródłowe oprogramowanie, które umożliwia tworzenie skryptów testowych w różnych językach programowania, takich jak Java, C#, Python czy Ruby. Dzięki Selenium testerzy mogą symulować interakcje użytkownika z przeglądarką, takie jak klikanie przycisków, wypełnianie formularzy czy nawigacja po stronach. Co ważne, Selenium jest kompatybilne z wieloma przeglądarkami, w tym Chrome, Firefox i Safari, co pozwala na testowanie aplikacji w różnych środowiskach. Jest to narzędzie szeroko stosowane w branży IT, zwłaszcza w ramach podejścia ciągłej integracji i dostarczania (CI/CD), gdzie automatyzacja testów jest kluczowym elementem zapewniającym szybkie i niezawodne dostarczanie oprogramowania. Dodatkowo, Selenium WebDriver, jako część tej rodziny narzędzi, umożliwia bezpośrednią komunikację z przeglądarką, co zwiększa jego efektywność i precyzję w porównaniu do starszych wersji Selenium.

Pytanie 13

Wynikiem wykonania poniższego fragmentu kodu jest wyświetlenie liczb z zakresu od 2 do 20, które są

for (let number = 2; number <= 20; number++) {
    let check = true;
    for (let test = 2; test < number; test++) {
        if (number % test === 0) {
            check = false;
            break;
        }
    }
    if (check) console.log(number);
}
A. pierwsze.
B. podzielne przez wartość zmiennej test.
C. parzyste.
D. podzielne przez wartość zmiennej check.

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Kod wypisuje liczby pierwsze, czyli takie, które mają dokładnie dwa dzielniki: 1 i samą siebie. Liczby pierwsze są podstawą w wielu dziedzinach matematyki i informatyki, szczególnie w kryptografii i algorytmach. Wyszukiwanie liczb pierwszych w danym przedziale to popularne zadanie, które pozwala na lepsze zrozumienie iteracji, pętli i warunków logicznych w programowaniu. Algorytm ten jest również wykorzystywany w optymalizacji algorytmów szyfrowania i generowania kluczy.

Pytanie 14

Jak zrealizować definiowanie własnego wyjątku w języku C++?

A. Skorzystać z domyślnej metody obsługi błędów
B. Wykorzystać blok try z pustym blokiem catch
C. Automatycznie wywołać funkcję throw
D. Utworzyć klasę, która dziedziczy po std::exception

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Aby zdefiniować własny wyjątek w języku C++, należy stworzyć klasę dziedziczącą po standardowej klasie 'std::exception' lub jednej z jej pochodnych. Klasa ta może zawierać własne metody i pola, dostosowując obsługę błędów do specyficznych potrzeb aplikacji. Dziedziczenie z 'std::exception' umożliwia korzystanie z funkcji takich jak 'what()', która zwraca opis błędu. Dzięki temu programista może precyzyjnie określić typ i przyczynę wyjątku, co prowadzi do bardziej czytelnego i łatwiejszego w utrzymaniu kodu. Tworzenie własnych wyjątków jest szczególnie przydatne w dużych projektach, gdzie występuje potrzeba kategoryzacji i obsługi różnych typów błędów w zależności od ich źródła.

Pytanie 15

Jaką technologię stosuje się do powiązania aplikacji internetowej z systemem baz danych?

A. JavaScript
B. CSS
C. HTTP
D. SQL

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
SQL, czyli język do zarządzania danymi, to mega ważna rzecz, jeśli chodzi o relacyjne bazy danych. Dzięki niemu można tworzyć, modyfikować, a nawet usuwać tabele. To taki most, który łączy aplikacje webowe z bazą danych. Dzięki SQL programiści mogą łatwo przechowywać i przetwarzać różne informacje na serwerze. Przykłady? Można generować listy produktów, ogarniać użytkowników czy analizować dane z transakcji. Właściwie bez SQL-a nie dałoby się zbudować solidnych aplikacji, na przykład tych, które działają na MySQL, PostgreSQL czy Microsoft SQL Server. Chociaż pewnie o tym wiesz, ale warto to zaznaczyć.

Pytanie 16

Co to jest SQL injection?

A. Technika ataku polegająca na wstrzyknięciu złośliwego kodu SQL do zapytania
B. Narzędzie do importowania danych do bazy SQL
C. Metoda optymalizacji zapytań SQL w bazach danych
D. Proces automatyzacji tworzenia zapytań SQL

Brak odpowiedzi na to pytanie.

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

Pytanie 17

Co następuje, gdy błąd nie zostanie uchwycony przez blok catch?

A. Instrukcja throw zostanie automatycznie wykreślona
B. Program kontynuuje działanie, pomijając błąd
C. Błąd zostanie zignorowany przez kompilator
D. Program zakończy działanie z błędem

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Jeśli wyjątek nie zostanie przechwycony przez blok 'catch', program zakończy działanie z błędem i wygeneruje komunikat o nieobsłużonym wyjątku. Jest to domyślne zachowanie w C++ i innych językach obsługujących wyjątki, co ma na celu zapobieganie dalszemu wykonywaniu kodu, który mógłby prowadzić do nieprzewidywalnych rezultatów. Obsługa wyjątków jest kluczowym elementem zapewniania stabilności i bezpieczeństwa aplikacji – brak jej implementacji może prowadzić do awarii programu. Dlatego zaleca się, aby zawsze stosować odpowiednie bloki 'try-catch' wokół kodu, który może generować wyjątki.

Pytanie 18

Który z wymienionych typów testów najlepiej ocenia odporność aplikacji na intensywne obciążenie?

A. Testy obciążeniowe
B. Testy bezpieczeństwa
C. Testy zgodności
D. Testy funkcjonalne

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Testy obciążeniowe to rodzaj testów, które sprawdzają, jak aplikacja radzi sobie z dużym ruchem użytkowników lub przetwarzaniem dużych ilości danych. Celem testów obciążeniowych jest wykrycie potencjalnych wąskich gardeł, identyfikacja problemów z wydajnością oraz określenie maksymalnej przepustowości aplikacji. Testy te są kluczowe dla aplikacji o wysokim natężeniu ruchu, takich jak sklepy internetowe czy systemy bankowe, gdzie stabilność pod obciążeniem jest krytyczna dla sukcesu.

Pytanie 19

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

def fun(x, l=[]):
    l.append(x)
    return l

print(fun(1))
print(fun(2))
print(fun(3, []))
print(fun(4))
A. [1], [1, 2], [3], [1, 2, 4]
B. [1], [1, 2], [3], [3, 4]
C. [1], [2], [3], [4, 3]
D. [1], [2], [3], [4]

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Wynik działania tego kodu jest poprawny i wynika z zrozumienia, jak Python obsługuje domyślne argumenty funkcji. W momencie, gdy funkcja 'fun' jest wywoływana po raz pierwszy z argumentem 1, lista 'l' jest pusta i dodawany jest do niej element 1, co skutkuje wynikiem [1]. Przy kolejnym wywołaniu z argumentem 2, lista 'l' nie jest tworzona na nowo, a zamiast tego używane jest to samo odniesienie do istniejącej listy, co oznacza, że 2 zostaje dodane do listy, przekształcając ją w [1, 2]. W trzecim wywołaniu funkcji, przekazujemy nową, pustą listę, więc wynik to [3]. Kiedy po raz czwarty wywołujemy funkcję z argumentem 4, znowu używamy tej samej listy, do której dodano już 1 i 2, co daje nam wynik [1, 2, 4]. Kluczowe jest zrozumienie, że domyślne argumenty w Pythonie są tworzone raz, więc nie są resetowane przy kolejnych wywołaniach funkcji. Takie zarządzanie pamięcią w Pythonie jest zgodne z dobrymi praktykami programistycznymi oraz pozwala na efektywne użycie zasobów.

Pytanie 20

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

let arr = [1, 2, 3, 4, 5];
let result = arr.filter(num => num % 2 === 0);
console.log(result);
A. 2,4
B. [1, 2, 3, 4, 5]
C. [1, 3, 5]
D. [2, 4]

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Wynik działania podanego kodu to [2, 4], ponieważ zastosowana funkcja filter tworzy nową tablicę, w której znajdują się tylko te elementy, które spełniają określony warunek. W tym przypadku warunkiem jest to, że element musi być parzysty (num % 2 === 0). Z tablicy arr, która zawiera liczby od 1 do 5, tylko liczby 2 i 4 spełniają ten warunek. Filtracja danych jest bardzo przydatna w programowaniu, zwłaszcza w kontekście pracy z dużymi zbiorami danych, gdzie można łatwo wyodrębnić interesujące nas elementy. Stosowanie takich metod, jak filter, jest zgodne z zasadami programowania funkcyjnego, które promują użycie funkcji do przetwarzania danych w sposób bardziej zwięzły i czytelny. W praktyce, funkcja filter może być używana do filtrowania danych z API, przetwarzania zbiorów danych w aplikacjach, czy też w analizach danych. Takie podejście zwiększa wydajność i czytelność kodu, co jest istotne w długoterminowym utrzymaniu projektów.

Pytanie 21

Zaprezentowany wykres ilustruje wyniki przeprowadzonych testów

Ilustracja do pytania
A. wydajności
B. funkcjonalności
C. ochrony
D. użyteczności

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Wykres przedstawia czasy odpowiedzi strony internetowej co jest kluczowe w kontekście testów wydajnościowych. Testy wydajnościowe mają na celu zmierzenie jak system radzi sobie pod określonym obciążeniem i jak szybko potrafi odpowiedzieć na zapytania użytkowników. Tego typu analiza pomaga zidentyfikować potencjalne wąskie gardła w infrastrukturze IT. Przykładowo jeżeli czasy odpowiedzi DNS lub połączenia są zbyt długie może to wskazywać na potrzebę optymalizacji serwerów DNS lub infrastruktury sieciowej. Testy te są nieodłącznym elementem zapewnienia jakości oprogramowania a ich prawidłowe wykonanie wpływa na doświadczenia użytkowników końcowych. Dobra praktyka w branży IT zakłada regularne przeprowadzanie testów wydajnościowych w celu monitorowania stabilności systemu w warunkach zbliżonych do rzeczywistych. Warto również zauważyć że narzędzia takie jak JMeter czy LoadRunner są powszechnie używane do przeprowadzania takich testów co umożliwia symulację różnorodnych scenariuszy obciążenia i analizę wyników w czasie rzeczywistym.

Pytanie 22

Który z wymienionych elementów NIE stanowi części instrukcji dla użytkownika programu?

A. Opis metody instalacji aplikacji
B. Opis testów jednostkowych
C. Instrukcje dotyczące obsługi poszczególnych funkcji aplikacji
D. Rozwiązywanie problemów związanych z użytkowaniem aplikacji

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Instrukcja użytkownika programu zawiera opisy dotyczące sposobu instalacji aplikacji, konfiguracji oraz obsługi poszczególnych funkcji. Jest to kluczowy dokument pomagający użytkownikom w szybkim wdrożeniu się w pracę z oprogramowaniem. Zawiera również sekcje dotyczące rozwiązywania typowych problemów oraz wskazówki, jak efektywnie korzystać z narzędzi i funkcji aplikacji. Instrukcja użytkownika może być dostępna w formie elektronicznej (PDF, strony WWW) lub papierowej, a jej celem jest uproszczenie procesu wdrażania oraz ograniczenie liczby zgłoszeń do działu wsparcia technicznego. Dokumentacja tego typu stanowi również ważny element budowania pozytywnego doświadczenia użytkownika (UX).

Pytanie 23

W przedstawionych funkcjonalnie równoważnych kodach źródłowych po przeprowadzeniu operacji w zmiennej b zostanie zapisany wynik:

Python:C++/C#/Java:
x = 5.96;
b = int(x);
double x = 5.96;
int b = (int)x;
A. 6
B. 5.96
C. 5
D. 596

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Odpowiedź 5 jest prawidłowa, bo w większości popularnych języków programowania, takich jak Python, C++, C#, czy Java, rzutowanie liczby zmiennoprzecinkowej (czyli typu float lub double) na typ całkowity (int) powoduje odcięcie części ułamkowej, a nie zaokrąglenie. To jest bardzo ważne, bo wiele osób intuicyjnie spodziewa się zaokrąglenia, a tu po prostu wszystko po przecinku ląduje w koszu. W przypadku podanego przykładu zmienna x ma wartość 5.96, ale po rzutowaniu na int, zarówno w Pythonie poprzez funkcję int(), jak i w pozostałych językach przez klasyczne rzutowanie (int)x, zostaje tylko 5. Dokładnie tak działa konwersja: odcina się część po przecinku niezależnie od tego, jak blisko liczba jest kolejnej całości. To niesamowicie przydatne np. podczas pracy z indeksami tablic albo gdy chcemy szybko zamienić wynik dzielenia na liczbę całkowitą. W praktyce, warto pamiętać, że takie rzutowanie nie wykonuje żadnej walidacji ani sprawdzania – jeśli liczba jest ujemna, to po prostu też odcina część ułamkową w kierunku zera, więc int(-5.96) da -5. Z mojego doświadczenia bardzo często spotyka się błąd w kodzie, kiedy ktoś oczekuje zaokrąglenia i nie otrzymuje go, bo rzutowanie zawsze odcina, nie zaokrągla. Warto znać tę różnicę przy projektowaniu algorytmów i korzystać np. z funkcji round() jeśli potrzebujemy zaokrąglenia, a nie odcinania. To takie małe niuanse, ale potem wchodzą w nawyk i bardzo ułatwiają życie podczas kodowania.

Pytanie 24

Kiedy w programie występuje problem z działaniem, a programista musi zweryfikować wartości znajdujące się w zmiennych w momencie działania aplikacji, to w tym celu należy zastosować

A. wirtualną maszynę
B. analizator składni
C. interpreter
D. debugger

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Debugger to jedno z podstawowych narzędzi, bez którego praktycznie żaden programista nie wyobraża sobie efektywnej pracy przy diagnozowaniu usterek w kodzie. Pozwala on na zatrzymanie wykonania programu w wybranym miejscu (tzw. breakpoint), podgląd wartości zmiennych, śledzenie stosu wywołań i krokowe przechodzenie przez kod. Praca z debuggerem znacznie skraca czas poszukiwania przyczyn błędów, pozwalając od razu zobaczyć, co dokładnie dzieje się „pod maską” aplikacji w konkretnym momencie jej działania. W mojej opinii – i myślę, że większość osób z branży się tu zgodzi – opanowanie obsługi debuggera to absolutna podstawa, jeśli ktoś myśli poważnie o programowaniu. Narzędzia te są dostępne w praktycznie każdym środowisku IDE, zarówno do języków kompilowanych jak i interpretowanych. Można dzięki nim sprawdzać nawet bardzo złożone przypadki, które trudno byłoby wychwycić samym czytaniem kodu albo przez dodawanie tymczasowych printów. Debugger umożliwia też dynamiczne modyfikowanie wartości w trakcie działania programu, co czasem bardzo się przydaje przy testowaniu różnych scenariuszy. Branżowe dobre praktyki wręcz zalecają regularne wykorzystywanie debuggera podczas pracy z większymi projektami, bo to po prostu ogromna oszczędność czasu i nerwów.

Pytanie 25

Zaprezentowany diagram ilustruje wyniki przeprowadzonych testów:

Ilustracja do pytania
A. ochrony
B. wydajnościowych
C. użyteczności
D. funkcjonalności

Brak odpowiedzi na to pytanie.

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

Pytanie 26

Jakie narzędzie najlepiej wykorzystać do testowania API REST?

A. Git
B. Jasmine
C. Postman
D. Selenium

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Postman to jedno z najpopularniejszych narzędzi do testowania API REST, które oferuje wiele funkcji ułatwiających pracę z interfejsami programistycznymi. Jego intuicyjny interfejs użytkownika pozwala na łatwe wysyłanie zapytań HTTP, takich jak GET, POST, PUT, DELETE, co jest kluczowe w testowaniu API. Dzięki wsparciu dla kolekcji zapytań, użytkownicy mogą organizować i grupować swoje testy, co ułatwia zarządzanie projektem i iteracyjne testowanie. Ponadto, Postman umożliwia automatyzację testów poprzez skrypty testowe, które można uruchomić po wykonaniu zapytania, co pozwala na szybką weryfikację odpowiedzi API i ich zgodności z oczekiwaniami. Narzędzie wspiera także integracje z CI/CD, co czyni je idealnym dla zespołów pracujących w metodykach Agile. Postman jest zgodny z najlepszymi praktykami branżowymi, takimi jak RESTful API design, co czyni go niezbędnym w każdym projekcie wykorzystującym API.

Pytanie 27

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

const promise = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('success');
  }, 1000);
});

promise
  .then(res => {
    console.log(res);
    return 'first then';
  })
  .then(res => {
    console.log(res);
  });
A. first then, success
B. first then
C. success, first then
D. success

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Podany kod JavaScript korzysta z obietnic (Promises), co jest nowoczesnym podejściem do zarządzania asynchronicznością w JavaScript. W momencie, gdy tworzymy nową obietnicę, wykorzystujemy funkcję `setTimeout`, która po 1 sekundzie wywołuje metodę `resolve`, przekazując tekst 'success'. To jest pierwszy krok, w którym obietnica zostaje spełniona. Następnie, w łańcuchu `then`, pierwsza funkcja `then` przyjmuje wynik obietnicy, czyli 'success', loguje go na konsolę, a następnie zwraca nowy tekst 'first then'. Druga funkcja `then` odbiera ten wynik i również go loguje. W rezultacie na konsoli pojawią się kolejno: 'success' oraz 'first then'. Taki sposób tworzenia łańcuchów obietnic jest zgodny z najlepszymi praktykami programowania asynchronicznego w JavaScript, ponieważ pozwala na czytelniejsze i bardziej zrozumiałe zarządzanie kodem asynchronicznym, eliminując złożoność związaną z tzw. „callback hell”. Warto zaznaczyć, że obietnice mogą być stosowane do radzenia sobie z żądaniami sieciowymi, operacjami na plikach czy innymi długotrwałymi procesami, co czyni je niezbędnym narzędziem w nowoczesnym programowaniu webowym.

Pytanie 28

Jakie elementy powinny być uwzględnione w dokumentacji testowej aplikacji?

A. Harmonogram wdrożenia aplikacji
B. Specyfikacje techniczne serwera
C. Zalecenia dotyczące optymalizacji kodu
D. Opis procedur testowych oraz rezultaty wykonanych testów

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Opis procedur testowych i wyników przeprowadzonych testów to kluczowy element dokumentacji testów aplikacji. Tego rodzaju dokumentacja obejmuje szczegółowe instrukcje dotyczące metod testowania, użytych narzędzi oraz kroków niezbędnych do przeprowadzenia testów jednostkowych, integracyjnych i systemowych. W dokumentacji znajdują się również raporty z wynikami testów, które wskazują, czy aplikacja działa zgodnie z wymaganiami oraz jakie błędy zostały wykryte. Testy pozwalają na wczesne wychwycenie problemów i eliminację błędów przed wdrożeniem aplikacji na produkcję, co znacząco zwiększa jakość oprogramowania. Dokumentacja testowa jest także nieocenionym źródłem informacji dla zespołów QA (Quality Assurance), umożliwiając śledzenie historii testów i zapewnienie, że wszystkie elementy aplikacji zostały przetestowane zgodnie z procedurami.

Pytanie 29

Przedstawione kody zawierają realizację funkcji oraz jeden zdefiniowany test automatyczny, który weryfikuje działanie funkcji w przypadku, gdy argumentem jest liczba ujemna. W miejsce kropek należy dodać drugi test, który sprawdzi funkcjonalność funkcji, kiedy argumentem jest liczba dodatnia. Który z poniższych kodów jest odpowiedni do tego testu?

export function fun1(number) {
    if (number < 0)
        number = number * (-1);
    return number;
}
describe('fun1', () => {
    it('test1', () => {
        const result = fun1(-1);
        expect(result).toBe(1);
    })
    ...
})
it('test2', () => {
    const result = fun1(1);
    expect(result).toBe(result+1);
})
A.
it('test2', () => {
    const result = fun1(2);
    expect(result).toBe(-2);
})
B.
it('test2', () => {
    const result = fun1(2);
    expect(result).toBe(2);
})
C.
it('test2', () => {
    const result = fun1(1);
    expect(result).toBe(-1);
})
D.
A. Odpowiedź B
B. Odpowiedź D
C. Odpowiedź A
D. Odpowiedź C

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Poprawna odpowiedź to C ponieważ funkcja fun1 zwraca liczbę taką jaka jest z wyjątkiem sytuacji gdy liczba jest ujemna wtedy zwraca jej wartość bezwzględną Test C sprawdza wartość dodatnią 2 gdzie rezultat jest zgodny z oczekiwaniami i funkcja zwraca 2 co jest poprawnym wynikiem To testowanie zgodne z zasadą jednostkowych testów gdzie ważne jest aby funkcje były testowane na różne przypadki brzegowe w tym na wartości ujemne i dodatnie Implementacja jednostkowych testów pozwala na automatyczne sprawdzanie poprawności działania kodu co jest dobrą praktyką w programowaniu Szczególnie ważne jest aby testować funkcje krytyczne i te które mają potencjał do wystąpienia błędów związanych z nieoczekiwanymi danymi wejściowymi Przykład ten pokazuje jak ważne jest aby testy były dokładne i pokrywały różnorodne scenariusze użytkowania co pozwala na wczesne wychwycenie błędów i zapewnienie stabilności aplikacji W tej sytuacji testując wartość 2 zapewniamy że funkcja zachowuje się poprawnie dla wartości dodatnich co jest zgodne z oczekiwaniami programistycznymi

Pytanie 30

Jakie znaczenie ma pojęcie "debugowanie" w kontekście programowania?

A. Tworzenie nowych funkcjonalności aplikacji
B. Wyszukiwanie i usuwanie błędów w kodzie
C. Wdrażanie aplikacji w środowisku produkcyjnym
D. Przygotowywanie dokumentacji kodu

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Debugowanie to proces wyszukiwania i eliminowania błędów (bugów) w kodzie źródłowym programu. Polega na analizowaniu działania aplikacji linia po linii, śledzeniu wartości zmiennych, analizie stosu wywołań i wykrywaniu miejsc, w których program działa niezgodnie z oczekiwaniami. Debugowanie umożliwia programistom szybkie odnajdywanie błędów logicznych, składniowych oraz problemów z wydajnością aplikacji. Narzędzia takie jak Visual Studio, PyCharm, IntelliJ IDEA czy Chrome DevTools oferują zaawansowane funkcje debugowania, takie jak punkty przerwań (breakpoints), krokowe wykonywanie kodu i podgląd pamięci. Proces debugowania jest kluczowy w każdym etapie rozwoju oprogramowania, ponieważ znacząco wpływa na stabilność i jakość finalnego produktu.

Pytanie 31

Które z wymienionych działań, które są częścią procesu kreowania prostej galerii zdjęć w formie aplikacji mobilnej, powinno być realizowane przez zespół?

A. Przygotowanie testu jednostkowego dla funkcji przegladajZdjecia()
B. Wdrożenie funkcji dodajZdjecie()
C. Przygotowanie i konfiguracja repozytorium dla projektu
D. Stworzenie dokumentacji kodu aplikacji

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Utworzenie dokumentacji kodu aplikacji jest zadaniem zespołowym, gdyż wymaga współpracy kilku osób, które muszą zrozumieć ogólną architekturę projektu oraz zasady, jakie powinny zostać zastosowane w dokumentacji. Dokumentacja kodu jest kluczowa dla przyszłej konserwacji i rozwoju aplikacji, a jej przygotowanie powinno obejmować nie tylko opis funkcji i klas, ale także konwencje nazewnictwa, style kodowania oraz strategie testowania. Przykładem może być zastosowanie standardu JSDoc, który pozwala na generowanie dokumentacji z komentarzy w kodzie, co ułatwia zrozumienie struktury i funkcjonowania aplikacji. Dobra dokumentacja zapewnia, że nowi członkowie zespołu będą mogli szybko odnaleźć się w projekcie. Zespołowa praca nad dokumentacją gwarantuje, że wszystkie aspekty projektu zostaną uwzględnione i odpowiednio udokumentowane, co jest niezbędne dla efektywności projektu.

Pytanie 32

Jakie rezultaty pojawią się po uruchomieniu poniższego kodu napisanego w języku C++?

class KlasaBazowa {
    public:
        virtual void metoda() {
            cout << "Bazowa. ";
        }
};

class KlasaPochodna : public KlasaBazowa {
    public:
        void metoda() {
            cout << "Pochodna. ";
        }
};

int main() {
    KlasaBazowa *bazowa = new KlasaPochodna();
    KlasaPochodna *pochodna = new KlasaPochodna();

    bazowa->metoda();
    pochodna->metoda();
    return 0;
}
A. Pochodna. Bazowa.
B. Bazowa. Pochodna.
C. Bazowa. Bazowa.
D. Pochodna. Pochodna.

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Kod wyświetla 'Pochodna. Pochodna.', co wskazuje, że metody klasy pochodnej przejęły kontrolę nad tymi z klasy bazowej. To fajny przykład polimorfizmu, jaki mamy w C++. Tutaj metoda w klasie pochodnej jest lepsza od metody w klasie bazowej. To, jakie wywołanie się wykona, zależy od konkretnego obiektu, a nie od tego, jaką metodę zdefiniowaliśmy w klasie bazowej.

Pytanie 33

Jakie działania należy podjąć, aby uniknąć nieskończonej rekurencji w danej funkcji?

A. Rozszerzyć zakres zmiennych globalnych
B. Wykorzystać automatyczny debugger w kompilatorze
C. Zastosować iterację zamiast rekurencji
D. Dodać warunek zakończenia w funkcji

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Warunek stopu to taki kluczowy element w rekurencji, który właściwie mówi, kiedy funkcja powinna przestać się wywoływać. Jak masz ten warunek, to funkcja wraca z wynikiem zamiast kręcić się w kółko, co mogłoby prowadzić do jakiegoś szaleństwa, tzn. przepełnienia stosu. Myślę, że warto zwrócić uwagę, że dodanie tego warunku to naprawdę podstawowa sprawa w programowaniu, bo bez niego wszystko może się posypać i przestanie działać tak, jak powinno.

Pytanie 34

Jakie są cechy testów interfejsu?

A. Sprawdzają prawidłowość pracy elementów graficznych oraz interakcji użytkownika z aplikacją
B. Analizują wydajność aplikacji w czasie rzeczywistym
C. Ulepszają kod aplikacji
D. Weryfikują zgodność aplikacji z przepisami prawnymi

Brak odpowiedzi na to pytanie.

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

Pytanie 35

Które z poniższych nie jest typem testu w programowaniu?

A. Testy integracyjne
B. Testy kompilacyjne
C. Testy jednostkowe
D. Testy end-to-end

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Testy kompilacyjne, w przeciwieństwie do testów jednostkowych, integracyjnych czy end-to-end, nie są typowym rodzajem testowania oprogramowania w kontekście zapewnienia jakości. Testy te koncentrują się na poprawności składni kodu pod kątem kompilacji, a nie na weryfikacji jego funkcjonalności. W praktyce programiści muszą upewnić się, że ich kod jest poprawny syntaktycznie, aby mógł zostać skompilowany przez kompilator. Warto zwrócić uwagę, że testy kompilacyjne są pierwszym krokiem w procesie programowania, ponieważ pozwalają na szybkie wychwycenie błędów, które mogłyby uniemożliwić dalsze etapy rozwoju oprogramowania. Testy jednostkowe koncentrują się na testowaniu pojedynczych funkcji lub metod, natomiast testy integracyjne sprawdzają interakcje między różnymi modułami. Testy end-to-end z kolei symulują zachowanie użytkownika i weryfikują, czy aplikacja działa zgodnie z wymaganiami biznesowymi. Zrozumienie różnicy między tymi rodzajami testów jest kluczowe dla skutecznego zarządzania jakością oprogramowania.

Pytanie 36

Wskaż rodzaj testów, które przeprowadza się podczas fazy tworzenia kodu źródłowego

A. testy wydajnościowe
B. testy kompatybilności
C. testy jednostkowe
D. testy wdrożeniowe

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Testy jednostkowe to, moim zdaniem, absolutny fundament solidnego programowania. Są to niewielkie, automatyczne testy, które programista pisze zwykle równolegle z kodem albo nawet przed nim, jeśli stosuje się TDD (Test-Driven Development). Chodzi o to, żeby każda najmniejsza część programu – funkcja, metoda czy klasa – była dokładnie sprawdzona, czy zachowuje się zgodnie z założeniami już na etapie pisania kodu. W praktyce wygląda to tak: piszesz sobie funkcję, która np. liczy VAT, i od razu piszesz kilka testów, które sprawdzają, czy dla różnych wartości zwraca ona poprawne wyniki. Gdy coś się zmieni w kodzie, testy jednostkowe pozwalają od razu wychwycić, że coś zepsułeś (albo, oby nie, ktoś inny). Standardy branżowe, jak np. ISTQB czy wytyczne IEEE 829, bardzo mocno podkreślają wagę testów jednostkowych – bez nich zarządzanie jakością oprogramowania jest po prostu niemożliwe na dłuższą metę. W praktyce nawet proste projekty szybko bez nich zamieniają się w chaos. Co ciekawe, dobrze napisane testy jednostkowe ułatwiają refaktoryzację, bo masz pewność, że po zmianach wszystko działa jak należy. W mojej opinii, jeśli ktoś naprawdę poważnie myśli o pracy w branży IT, powinien umieć pisać testy jednostkowe z marszu.

Pytanie 37

Jakie jest główne zadanie debuggera w środowisku programowania?

A. Analiza i usuwanie błędów w kodzie
B. Tworzenie kodu źródłowego
C. Kompilowanie kodu źródłowego
D. Generowanie plików wykonywalnych

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Debugger to narzędzie programistyczne służące do analizy i usuwania błędów w kodzie źródłowym. Pozwala na krokowe wykonywanie programu, śledzenie wartości zmiennych i identyfikowanie miejsc, w których występują błędy logiczne lub składniowe. Debugger umożliwia zatrzymanie wykonania programu w dowolnym miejscu, ustawienie tzw. breakpointów (punktów przerwania) i monitorowanie przepływu sterowania. Dzięki temu programista może dokładnie przeanalizować, dlaczego program nie działa zgodnie z oczekiwaniami i szybko znaleźć przyczynę problemu. Debuggery są dostępne w większości zintegrowanych środowisk programistycznych (IDE), takich jak Visual Studio, PyCharm czy IntelliJ IDEA.

Pytanie 38

Jakie narzędzie jest najbardziej odpowiednie do identyfikacji błędów w trakcie działania programu?

A. Interpreter
B. Kompilator
C. Debugger
D. Linker

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Debugger to narzędzie przeznaczone do wyszukiwania błędów w czasie wykonywania programu. Pozwala na zatrzymywanie aplikacji w wybranych miejscach, analizowanie wartości zmiennych i śledzenie przepływu sterowania, co umożliwia szybkie wykrywanie błędów logicznych i błędów czasu wykonania. Debugger jest niezbędny w procesie rozwoju oprogramowania, ponieważ pomaga programistom w zrozumieniu, jak ich kod działa w rzeczywistości i jak różne warunki wpływają na jego funkcjonowanie.

Pytanie 39

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

console.log(typeof null);
console.log(typeof undefined);
console.log(typeof []);
console.log(typeof NaN);
A. null, undefined, array, number
B. null, undefined, object, NaN
C. object, undefined, array, number
D. object, undefined, object, number

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Wynikowy wyraz z konsoli, czyli 'object, undefined, object, number' jest zgodny z zachowaniem typu danych w JavaScript. Funkcja typeof zwraca typ zmiennej, a w przypadku null to zaskakujący wynik, bo według standardów ECMAScript, null jest traktowane jako obiekt. To historyczny błąd w języku, który z biegiem czasu się utrzymał. Z kolei undefined oznacza, że zmienna nie została przypisana, co jest jasne i zrozumiałe. Jeśli chodzi o tablice, w JavaScript są one traktowane jako obiekty, dlatego wynik typeof dla pustej tablicy również to pokazuje. NaN, będące skrótem od 'Not-a-Number', jest szczególnym przypadkiem, który wskazuje, że coś poszło nie tak z operacją arytmetyczną. Jego typ to number, ponieważ w JavaScript wszystko jest na poziomie liczbowym. Wiedza na temat typów danych jest kluczowa w programowaniu, szczególnie przy pracy z danymi i funkcjami, które oczekują konkretnego typu. Użycie typeof jest bardzo praktyczne, gdy chcemy dynamicznie zarządzać typami w kodzie.

Pytanie 40

Jakie z wymienionych działań jest fundamentalne w modelu kaskadowym?

A. Iteracyjne wprowadzanie modyfikacji na każdym poziomie
B. Przeprowadzanie testów systemu po zakończeniu każdej fazy
C. Zakończenie jednej fazy przed rozpoczęciem następnej
D. Równoległe prowadzenie wielu etapów projektu

Brak odpowiedzi na to pytanie.

Wyjaśnienie poprawnej odpowiedzi:
Kończenie jednej fazy przed rozpoczęciem kolejnej to kluczowa cecha modelu kaskadowego (Waterfall). W tym podejściu projekt jest realizowany etapami – analiza, projektowanie, implementacja, testowanie i wdrożenie – bez możliwości powrotu do poprzednich faz. Dzięki temu model Waterfall jest przejrzysty i łatwy do zarządzania, szczególnie w projektach o stabilnych wymaganiach. Jednak jego ograniczeniem jest brak elastyczności, co może prowadzić do problemów, jeśli wymagania zmienią się w trakcie trwania projektu.