Wyniki egzaminu

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

Egzamin zdany!

Wynik: 33/40 punktów (82,5%)

Wymagane minimum: 20 punktów (50%)

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

Aplikacje webowe stworzone z użyciem frameworka Angular lub biblioteki React, działające na standardowych portach, można uruchomić na lokalnym serwerze, wpisując w przeglądarkę

A. localhost:3000 (React) lub localhost:4200 (Angular)
B. localhost:8000 (React) lub localhost:49887 (Angular)
C. localhost:8080 (React) lub localhost:8000 (Angular)
D. localhost:5001 (React) lub localhost:8080 (Angular)
React domyślnie startuje na porcie 3000, a Angular na 4200 – to są takie standardy, które praktycznie wszyscy w branży znają i stosują. Kiedy zaczynasz nowy projekt w React, korzystając na przykład z create-react-app, serwer deweloperski po prostu nasłuchuje na http://localhost:3000. Analogicznie, jak generujesz projekt w Angular CLI i odpalasz ng serve, wtedy aplikacja wystartuje na http://localhost:4200. To są domyślne porty – nie musisz nic specjalnie ustawiać, wystarczy wpisać te adresy w przeglądarce. Z mojego doświadczenia, dobrze jest zapamiętać te ustawienia, bo praktycznie na każdym warsztacie czy bootcampie te adresy padają od ręki. Jeśli chodzi o praktykę, czasami port jest już zajęty i wtedy narzędzie zaproponuje inny, ale te wartości startowe to taka baza. Warto pamiętać, że zmiana portu wynika zazwyczaj z konfliktu, a nie z jakiejś specjalnej potrzeby. Dodatkowo, rozpoznanie tych portów pozwala szybciej debugować problemy z uruchomieniem aplikacji – jak coś nie wstaje na tych adresach, to od razu wiadomo, gdzie szukać. Ogólnie rzecz biorąc, korzystanie z tych domyślnych portów przyspiesza współpracę w zespole, bo każdy wie, gdzie szukać aplikacji, więc nie trzeba się rozpisywać w README, na jakim porcie coś działa. Moim zdaniem, to jeden z tych drobnych szczegółów, które składają się na dobre nawyki programistyczne.

Pytanie 2

Który protokół jest używany do bezpiecznej komunikacji przez Internet?

A. FTP
B. SMTP
C. HTTPS
D. HTTP
HTTPS (Hypertext Transfer Protocol Secure) to protokół komunikacyjny, który zapewnia bezpieczną transmisję danych w Internecie poprzez zastosowanie kryptografii. W przeciwieństwie do swojego poprzednika HTTP, HTTPS korzysta z SSL/TLS (Secure Sockets Layer/Transport Layer Security), co pozwala na szyfrowanie danych przesyłanych pomiędzy przeglądarką internetową a serwerem. Dzięki temu, wszelkie informacje, takie jak dane osobowe, hasła czy numery kart kredytowych, są chronione przed podsłuchiwaniem i manipulacją. Użycie HTTPS jest obecnie standardem w branży, zwłaszcza w przypadku stron internetowych, które przetwarzają wrażliwe dane, takich jak sklepy internetowe czy serwisy bankowe. Przykłady zastosowania HTTPS obejmują popularne platformy e-commerce, które implementują ten protokół, aby zbudować zaufanie użytkowników oraz zwiększyć bezpieczeństwo transakcji online. Warto również zauważyć, że wyszukiwarki internetowe, takie jak Google, preferują strony korzystające z HTTPS, co wpływa na ich pozycjonowanie w wynikach wyszukiwania. Wprowadzenie HTTPS jest zatem nie tylko kwestią bezpieczeństwa, ale także praktyki zgodnej z wymaganiami SEO.

Pytanie 3

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

A. Tworzenie kodu źródłowego
B. Kompilowanie kodu źródłowego
C. Generowanie plików wykonywalnych
D. Analiza i usuwanie błędów w kodzie
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 4

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

A. Specyfikacje techniczne serwera
B. Harmonogram wdrożenia aplikacji
C. Opis procedur testowych oraz rezultaty wykonanych testów
D. Zalecenia dotyczące optymalizacji kodu
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 5

Aplikacje funkcjonujące w systemach Android do komunikacji z użytkownikiem wykorzystują klasę

A. Fragments
B. Activity
C. Screens
D. Windows
W systemie Android klasa Activity to absolutna podstawa komunikacji aplikacji z użytkownikiem. To właśnie ona reprezentuje jeden ekran interfejsu użytkownika, coś w stylu okna dialogowego w klasycznych aplikacjach desktopowych. Cały cykl życia aplikacji, obsługa zdarzeń, wyświetlanie elementów graficznych czy reagowanie na akcje użytkownika – wszystko to ogarnia Activity. Bez niej praktycznie żadna aplikacja nie ruszy, bo to właśnie Activity zarządza np. wywołaniem widoku, obsługą kliknięć czy przekazywaniem danych pomiędzy różnymi ekranami. Moim zdaniem, jeśli ktoś chce programować na Androida, najpierw powinien dobrze przyswoić, jak działa Activity i jej cykl życia (onCreate, onStart itd.), bo to pozwala tworzyć aplikacje zgodne z założeniami platformy. W praktyce deweloperzy bardzo często korzystają z dziedziczenia po klasie Activity, aby rozszerzyć funkcjonalność swoich aplikacji, a także używają jej do uruchamiania nowych ekranów oraz zarządzania nawigacją. Warto jeszcze pamiętać, że dobra znajomość Activity pomaga unikać typowych problemów z zarządzaniem pamięcią czy nieprawidłowym obsługiwaniem powrotów do aplikacji po przerwie. Z mojego doświadczenia, zrozumienie działania Activity to taka baza, bez której trudno iść dalej w temacie Androida.

Pytanie 6

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], [2], [3], [4]
C. [1], [2], [3], [4, 3]
D. [1], [1, 2], [3], [3, 4]
Wybór błędnych odpowiedzi często wynika z niewłaściwego zrozumienia działania domyślnych argumentów funkcji w Pythonie. Przykładowo, stwierdzenie, że drugi wynik to [2], a czwarty to [4], pokazuje, że nie uwzględniono, iż domyślna lista 'l' nie jest tworzona od nowa przy każdym wywołaniu funkcji. W Pythonie, jeśli nie podasz innej listy, wszystkie wywołania funkcji dzielą się tą samą referencją do oryginalnej listy, co prowadzi do sytuacji, w której dodawane są nowe elementy do już istniejącej listy. Właśnie dlatego drugi wynik to [1, 2], a nie [2], ponieważ element 1 został dodany do tej samej listy. Przy trzecim wywołaniu funkcji, gdy przekazujemy pustą listę, rzeczywiście otrzymujemy [3], ale czwarty wynik znowu odnosi się do listy, która zawiera już elementy 1 i 2. Z tego powodu, wynik to [1, 2, 4] zamiast [4]. Warto zwrócić uwagę, że typowe błędy w myśleniu często prowadzą do uproszczeń, które mogą zakłócać zrozumienie bardziej złożonych koncepcji, takich jak zarządzanie pamięcią i zmiennymi lokalnymi versus globalnymi. Ostatecznie, znajomość zasad działania domyślnych argumentów w Pythonie jest kluczowa w praktycznym programowaniu, ponieważ pozwala unikać nieoczekiwanych zachowań w kodzie.

Pytanie 7

Na jakim etapie cyklu życia projektu tworzony jest szczegółowy opis wymagań funkcjonalnych oraz niefunkcjonalnych?

A. Analiza
B. Planowanie
C. Wdrożenie
D. Weryfikacja
Etap analizy to kluczowy moment w cyklu życia projektu, gdy powstaje szczegółowy opis wymagań funkcjonalnych i niefunkcjonalnych. W praktyce, właśnie wtedy zbierane są wszelkie informacje od interesariuszy – klient opowiada, czego oczekuje, a zespół projektowy zadaje mnóstwo pytań, by naprawdę zrozumieć potrzeby. Moim zdaniem to najważniejsza faza, bo jeśli coś pójdzie nie tak na tym etapie, to cała reszta projektu może się sypnąć. Analiza wymagań to nie tylko spisanie kilku zdań – tu trzeba dokładnie określić, co system ma robić (czyli funkcjonalności, np. użytkownik może dodać produkt do koszyka), oraz jakie ma mieć cechy pozafunkcjonalne, jak wydajność czy bezpieczeństwo. Dobre praktyki, jak np. BABOK czy normy ISO/IEC 29148, podkreślają, że precyzyjna analiza wymagań pozwala uniknąć kosztownych poprawek na późniejszych etapach. W rzeczywistych projektach IT korzysta się często z narzędzi typu diagramy przypadków użycia, user stories albo specyfikacje wymagań – wszystko po to, żeby nie było niejasności. Uczciwie powiem, że im więcej czasu i uwagi poświęci się na analizę, tym mniej niespodzianek pojawi się dalej. Warto to mieć na uwadze.

Pytanie 8

Które z poniższych NIE jest zasadą programowania SOLID?

A. Single Responsibility Principle (Zasada pojedynczej odpowiedzialności)
B. Dependency Inversion Principle (Zasada odwrócenia zależności)
C. Open/Closed Principle (Zasada otwarte/zamknięte)
D. Code Reuse Principle (Zasada ponownego użycia kodu)
Odpowiedź "Code Reuse Principle" jest prawidłowa, ponieważ nie stanowi ona jednej z pięciu zasad programowania SOLID. SOLID to akronim, który odnosi się do pięciu podstawowych zasad, które mają na celu ułatwienie tworzenia oprogramowania, które jest łatwe w utrzymaniu i rozwijaniu. W skład tych zasad wchodzą: Zasada pojedynczej odpowiedzialności (Single Responsibility Principle), Zasada otwarte/zamknięte (Open/Closed Principle), Zasada segregacji interfejsów (Interface Segregation Principle), Zasada odwrócenia zależności (Dependency Inversion Principle) oraz Zasada Liskov (Liskov Substitution Principle). Przykładowo, Zasada pojedynczej odpowiedzialności zakłada, że każda klasa powinna mieć jedną, jasno określoną odpowiedzialność, co pozwala na łatwiejsze testowanie i modyfikowanie kodu bez wpływu na inne jego części. Użycie zasad SOLID w praktyce prowadzi do lepszego rozdzielenia logiki aplikacji i ułatwia jej rozwój oraz utrzymanie, co jest kluczowe w długoterminowych projektach programistycznych.

Pytanie 9

Która z poniższych metod HTTP jest idempotentna?

A. CONNECT
B. GET
C. PATCH
D. POST
Metoda GET jest uznawana za idempotentną, co oznacza, że wielokrotne wykonanie tej samej operacji nie zmienia stanu zasobu na serwerze. W praktyce, jeżeli wysyłamy zapytanie GET do określonego zasobu, niezależnie od tego, ile razy je powtórzymy, zwróci ono tę samą odpowiedź oraz nie wpłynie na stan zasobu. Wykorzystanie metody GET jest powszechne w aplikacjach webowych, na przykład podczas ładowania strony, gdzie użytkownik chce pobrać informacje, takie jak artykuły lub dane z bazy. Zgodnie z zasadami RESTful, metody idempotentne powinny być stosowane w przypadkach, gdy zależy nam na stabilności i przewidywalności działania systemu. Przykładem zastosowania metody GET w praktyce może być API, które zwraca szczegóły użytkownika na podstawie jego identyfikatora. W takim przypadku, wywołanie GET na danym URI zawsze zwróci te same dane, o ile nie nastąpią zmiany w bazie danych.

Pytanie 10

Która z wymienionych bibliotek stanowi element standardowego zestawu narzędzi programistycznych w Pythonie?

A. <math.h>
B. <stdio.h>
C. vector
D. sys
Biblioteka `sys` w Pythonie jest częścią standardowego środowiska programistycznego i dostarcza narzędzi do interakcji z systemem operacyjnym. Umożliwia między innymi dostęp do argumentów wiersza poleceń, zarządzanie ścieżkami modułów, jak również zakończenie działania programu za pomocą `sys.exit()`. Dzięki `sys` programista ma kontrolę nad podstawowymi funkcjami systemowymi, co czyni tę bibliotekę kluczową w wielu aplikacjach i skryptach automatyzujących.

Pytanie 11

Jakie oprogramowanie służy jako przykład programu do komunikacji audio-wideo?

A. Microsoft Teams
B. Slack
C. Google Drive
D. Notion
Microsoft Teams to naprawdę fajne narzędzie do komunikacji. Łączy w sobie czat, wideo i audio, więc wszystko masz w jednym miejscu. Zostało stworzone przez Microsoft, żeby ułatwić współpracę w zespołach. To idealne, gdy trzeba prowadzić spotkania online z kilkoma osobami. Myślę, że to super rozwiązanie dla firm, które pracują zdalnie. Dzięki WebRTC jakość transmisji audio i wideo jest naprawdę wysoka. Można w nim organizować spotkania, webinary, a nawet stworzyć przestrzeń dla zespołów projektowych, gdzie można dzielić się plikami i prowadzić dyskusje. A jak jeszcze połączysz go z innymi aplikacjami Microsoft 365, jak OneNote czy SharePoint, to masz pełny zestaw do zarządzania projektami. Dobrze też, że Microsoft Teams dba o ochronę danych osobowych, więc jest bezpieczny dla różnych organizacji.

Pytanie 12

1 terabajt (TB) to ile gigabajtów (GB)?

A. 1000
B. 2048
C. 1024
D. 512
No to fajnie, że trafiłeś w temat! 1 terabajt (TB) to 1024 gigabajty (GB), co wynika z systemu binarnego, który w IT jest najczęściej używany. Trochę technicznie mówiąc, 1 TB to tak naprawdę 2^40 bajtów, co daje nam ogromną liczbę – dokładnie 1 099 511 627 776 bajtów. Jak podzielisz to przez 1 073 741 824 bajtów, które to są 1 GB, to wyjdzie 1024 GB. Warto wiedzieć, że w świecie komputerów i systemów operacyjnych operujemy głównie na tym systemie binarnym. Ale uwaga, bo producenci dysków często podają pojemności w systemie dziesiętnym, i wtedy 1 TB to jakby 1 000 GB. To może wprowadzać zamieszanie, więc dobrze jest sprawdzać specyfikacje i mieć to na uwadze, żeby nie było nieporozumień. Większość systemów, jak Windows czy Linux, działa w tym binarnym, więc warto to znać, gdyż to ułatwia pracę zarówno użytkownikom, jak i fachowcom z branży IT.

Pytanie 13

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

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

Pytanie 14

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. [1, 2, 3, 4, 5]
B. [2, 4]
C. 2,4
D. [1, 3, 5]
Wybór odpowiedzi [1, 3, 5] lub [2, 4] oraz 2,4 odzwierciedla niezrozumienie działania metody filter w JavaScript. Odpowiedź [1] sugeruje, że program wyświetli wszystkie parzyste liczby, lecz nie uwzględnia, że filter tworzy nową tablicę tylko z liczb spełniających określony warunek, a w tym przypadku tylko liczby parzyste. Ponadto, [3] wskazuje na brak zastosowania filtru, a więc pokazuje wszystkie elementy tablicy, co również jest błędne. Z kolei odpowiedź 2,4 nie jest nawet poprawnym formatem dla JavaScript, gdzie wyniki w konsoli są prezentowane w postaci tablicy z elementami oddzielonymi przecinkami. Takie podejście, aby zapisać wynik w konsoli, a nie odwoływać się do jego struktury, może prowadzić do błędnych interpretacji. Należy pamiętać, że w JavaScript, kluczowym elementem do zrozumienia jest różnica między metodą filter a innymi metodami tablic, takimi jak map czy forEach. Metoda filter zwraca nową tablicę, podczas gdy inne mogą działać na oryginalnych danych bez ich zmiany. Dlatego ważne jest, aby nie tylko znać technikę, ale i jej zastosowanie w kontekście rozwiązania problemu, co jest niezbędne w pracy programisty.

Pytanie 15

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

A. Model wodospadowy (waterfall)
B. Model prototypowy
C. Metodyki zwinne (Agile)
D. Model spiralny
Model kaskadowy, znany też jako waterfall, jest trochę inny. Działa sekwencyjnie, więc każda faza projektu musi się skończyć, zanim zaczniemy następną – nie ma tu miejsca na iteracje. Z kolei model prototypowy polega na tworzeniu próbnych wersji aplikacji, ale też nie skupia się na iteracyjnym dostarczaniu funkcjonalności. A model spiralny łączy w sobie aspekty prototypowania i podejścia kaskadowego, przy czym iteracje są długie i bardziej cykliczne, a nie krótkie i dynamiczne, jak w Agile.

Pytanie 16

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

A. Pominięcie testowania aplikacji w etapie produkcji
B. Koncentracja na wyglądzie interfejsu użytkownika
C. Zastosowanie zaawansowanych systemów ochrony
D. Tworzenie prostych formularzy do rejestracji
Stosowanie zaawansowanych mechanizmów bezpieczeństwa jest kluczowe dla ochrony danych użytkowników w aplikacjach. Wdrożenie technologii takich jak szyfrowanie, autoryzacja dwuskładnikowa (2FA), firewalle oraz regularne testy penetracyjne pozwala na minimalizację ryzyka ataków i naruszeń danych. Mechanizmy te nie tylko zabezpieczają dane, ale również budują zaufanie użytkowników do aplikacji, co jest niezwykle istotne w branżach takich jak bankowość, medycyna czy e-commerce.

Pytanie 17

Jakie z następujących skutków może wystąpić w przypadku naruszenia prawa autorskiego?

A. Unieważnienie umowy licencyjnej użytkownika końcowego
B. Obowiązek zamieszczenia publicznych przeprosin
C. Nałożenie grzywny lub kary więzienia
D. Zakaz korzystania z oprogramowania open-source
Naruszenie prawa autorskiego może skutkować nałożeniem grzywny lub karą więzienia. W zależności od skali naruszenia oraz obowiązujących przepisów, osoba odpowiedzialna za naruszenie może zostać pociągnięta do odpowiedzialności karnej lub cywilnej. Kary mogą obejmować nie tylko grzywny finansowe, ale także konieczność wypłaty odszkodowań na rzecz twórcy lub właściciela praw autorskich. W niektórych przypadkach naruszenie praw autorskich na dużą skalę może prowadzić do kary pozbawienia wolności, co podkreśla wagę przestrzegania przepisów o ochronie własności intelektualnej.

Pytanie 18

Polecenia wydane w kontekście repozytorium Git, przy założeniu, że folder projektu jest aktualnie wybrany, mają na celu

git init
git add .
git commit -m 'first commit'
A. zamknięcie projektu, co spowoduje zarchiwizowanie wszystkich rewizji do lokalnego archiwum pod nazwą first commit
B. rozpoczęcie pracy z nowym repozytorium, dodanie oraz zatwierdzenie kodu projektu jako first commit
C. rozpoczęcie sesji z już istniejącym repozytorium oraz pobranie kodu projektu do lokalnego folderu
D. utworzenie kopii istniejącego repozytorium z jedynie tą rewizją, która zostanie zapisana pod nazwą first commit
Polecenia git init git add . oraz git commit -m 'first commit' są podstawowymi komendami do rozpoczęcia pracy z nowym repozytorium Gita. git init inicjalizuje puste repozytorium w aktualnym katalogu co tworzy podkatalog .git zawierający wszystkie metadane i historię w wersjonowania. Następnie git add . dodaje wszystkie nowe i zmodyfikowane pliki w bieżącym katalogu do indeksu co oznacza że są one gotowe do zatwierdzenia w repozytorium. Kolejne polecenie git commit -m 'first commit' tworzy pierwszy snapshot aktualnego stanu projektu z przypisaną wiadomością 'first commit' co jest dobrą praktyką sygnalizującą początek nowej historii projektu. Taki proces inicjacji jest standardem w zarządzaniu wersjami w branży IT umożliwiając śledzenie zmian w kodzie ułatwiając współpracę zespołową oraz zapewniając kontrolę nad rozwojem oprogramowania. Ważne jest by w pierwszym commicie umieścić podstawowe działające elementy projektu co stanowi solidną bazę do dalszego rozwoju.

Pytanie 19

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. Mobile Virtual Platform - platforma do testowania aplikacji mobilnych
D. Most Valuable Program - program uznany za najbardziej wartościowy w organizacji
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 20

Metodyka zwinna (ang. agile) opiera się na

A. przygotowaniu testów dla całego projektu, a następnie wprowadzaniu kolejnych jego fragmentów
B. podzieleniu projektu na kolejne etapy: planowanie, programowanie, testowanie, z ciągłym oszacowaniem ryzyka projektu
C. dekompozycji przedsięwzięcia na elementy, które są niezależnie projektowane, wytwarzane i testowane w krótkich iteracjach
D. zaplanowaniu całej aplikacji na początku projektu i jej tworzeniu na przemian z testowaniem
Metodyka zwinna (agile) polega na podziale projektu na mniejsze części (iteracje), które są projektowane, implementowane i testowane w krótkich cyklach. Takie podejście pozwala na szybkie reagowanie na zmieniające się wymagania klientów i wprowadzanie poprawek na bieżąco. Agile promuje bliską współpracę z klientem, co minimalizuje ryzyko nieporozumień i zwiększa szanse na stworzenie produktu spełniającego jego oczekiwania. Zamiast czekać na zakończenie całego projektu, poszczególne części aplikacji są dostarczane i testowane stopniowo, co skraca czas wdrożenia i umożliwia szybkie wykrycie błędów. Popularnymi frameworkami bazującymi na Agile są Scrum i Kanban, które organizują pracę zespołu w iteracyjne sprinty lub zadania wizualizowane na tablicach Kanban.

Pytanie 21

Kod funkcji "wykonaj()" przedstawiony poniżej weryfikuje, czy

bool wykonaj(int argument)
{
    int T[] = {4, 15, -2, 9, 202};
    for(int i=0; i<5; i++) {
        if(T[i] == argument)
            return true;
    }
    return false;
}
A. w tablicy liczb całkowitych znajdują się jedynie wartości 4, 15, -2, 9, 202
B. wszystkie elementy w tablicy są równe wartości przekazanego argumentu
C. przekazany argument mieści się w zakresie od 0 do 4
D. konkretny element (argument) jest obecny w tablicy liczb całkowitych
Przy interpretowaniu działania funkcji wykonaj() łatwo popełnić błąd, jeśli nie prześledzimy dokładnie jej przebiegu. Niektórzy zakładają, że skoro funkcja używa pętli for, to musi sprawdzać wszystkie elementy w tablicy i wymagać, aby każdy z nich spełniał jakiś warunek – stąd błędny wniosek, że weryfikuje czy wszystkie elementy są równe wartości argumentu. Jednak w rzeczywistości wyrażenie return true jest wykonywane natychmiast po znalezieniu pierwszego pasującego elementu, nie kontynuując sprawdzania reszty. To typowy błąd myślowy, polegający na myleniu operacji „wszystkie” z „dowolny”. Inni mogą odczytać inicjalizację tablicy jako wyznaczenie pełnego zakresu dopuszczalnych wartości i uznać, że funkcja sprawdza, czy argument należy do tego konkretnego zestawu liczb, co jest częściowo prawdą – jednak odpowiedź mówiąca, że w tablicy znajdują się tylko te liczby, nie oddaje istoty działania funkcji. Funkcja nie analizuje zawartości tablicy, tylko obecność argumentu wśród jej elementów – to kolosalna różnica, bo moglibyśmy podać dowolny argument, a odpowiedź zawsze zależy od tego, czy znajduje się on w tym konkretnym zbiorze. Część osób błędnie interpretuje także indeksowanie tablicy, sądząc, że funkcja sprawdza, czy argument mieści się w zakresie od 0 do 4 – co wynika zapewne z zamieszania z długością tablicy oraz mylenia wartości z indeksami. Jednak w kodzie argument porównywany jest z wartością, a nie z indeksem – to fundamentalna różnica. Zresztą, w programowaniu takie subtelności często prowadzą do nieoczekiwanych błędów, dlatego warto zawsze bardzo dokładnie analizować logikę pętli i warunków. Dobra praktyka branżowa podpowiada, że zawsze trzeba zwracać uwagę na to, co dokładnie jest sprawdzane w warunku if, oraz do czego odnosi się każda zmienna. Takie analizy są bardzo przydatne na rozmowach kwalifikacyjnych i w praktycznych zadaniach – szczególnie wtedy, gdy liczy się precyzja i umiejętność czytania cudzego kodu.

Pytanie 22

Na ilustracji pokazano fragment emulacji iOS z elementem kontrolnym. Który fragment kodu XAML opisuje ten element?

Ilustracja do pytania
A. <Switch IsToggled= "true" />
B. <Stepper Increment= "1" />
C. <Entry IsPassword= "true" />
D. <Slider Maximum= "255" />
Kontrolka <Switch IsToggled= "true" /> w XAML to taki przełącznik. Ma dwa stany: włączony (true) i wyłączony (false). Można to porównać do zwykłego włącznika, tylko że w aplikacjach. Fajnie się z tego korzysta, bo pozwala szybko zmieniać ustawienia, nie trzeba nic więcej wpisywać. To jest dosyć intuicyjne dla użytkowników, więc można nim łatwo zarządzać funkcjami aplikacji.

Pytanie 23

Jakie jest główne zadanie ochrony danych osobowych?

A. Utrudnianie działalności organom ścigania
B. Udostępnianie danych osobowych w celach marketingowych
C. Zabezpieczenie danych osobowych przed nieautoryzowanym dostępem i ich wykorzystaniem
D. Gwarantowanie anonimowości dla internautów
Ochrona danych osobowych przed nieuprawnionym dostępem i wykorzystaniem to podstawowy cel ochrony danych osobowych. Zasady ochrony prywatności, takie jak RODO (GDPR), zapewniają użytkownikom prawo do kontroli nad swoimi danymi i decydowania, kto może je przetwarzać. Firmy i organizacje muszą wdrażać środki techniczne oraz organizacyjne, aby zabezpieczyć dane przed wyciekiem, kradzieżą i nadużyciami. Przestrzeganie tych zasad nie tylko chroni jednostki, ale również buduje zaufanie klientów do przedsiębiorstw.

Pytanie 24

Który z poniższych przykładów ilustruje deklarację złożonego typu w języku C++?

A. int wynik = 100;
B. float ocena = 4.5;
C. class Student {};
D. bool status;
Deklaracja `class Student {};` w języku C++ przedstawia przykład tworzenia typu złożonego w postaci klasy. Klasa to podstawowy element programowania obiektowego, który pozwala na łączenie danych (pól) i funkcji (metod) w jednej strukturze. Klasy umożliwiają modelowanie rzeczywistych obiektów i ich zachowań, co prowadzi do bardziej zorganizowanego i skalowalnego kodu. Klasy mogą być rozszerzane przez dziedziczenie, co jest kluczową zaletą programowania obiektowego.

Pytanie 25

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

A. JavaScript
B. HTML
C. CSS
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 26

Zaznaczone elementy w przedstawionych obramowaniach mają na celu:
Fragment kodu w WPF/XAML:

<Windows Title="Tekst"...>
Fragment kodu w Java:
public class Okno extends JFrame {
    ...
    public Okno() {
        super();
        this.setTitle("Tekst");
    }
    ...
A. uzyskanie nazwy obiektu obrazującego okno aplikacji
B. zapisanie tytułu okna do obiektu Tekst
C. przypisanie nazwy obiektu obrazującego okno aplikacji
D. ustawienie tytułu okna na "Tekst"
Wybrana odpowiedź dokładnie oddaje sens działania kodu zarówno w WPF/XAML, jak i w Javie z użyciem JFrame. W jednym i drugim przypadku chodzi o ustawienie tytułu okna aplikacji, czyli tego tekstu, który pojawia się na pasku tytułowym okienka po uruchomieniu programu. Z mojego doświadczenia, jest to jedna z pierwszych rzeczy, jakie użytkownicy widzą w każdej aplikacji okienkowej, więc warto pamiętać, jak ją ustawić. W WPF właściwość Title w tagu Window służy właśnie do wyświetlenia krótkiego opisu albo nazwy programu. Z kolei w Javie metoda setTitle pozwala dynamicznie przypisywać tekst, co jest bardzo przydatne przy pisaniu aplikacji z wieloma oknami albo zmieniającym się stanem (np. można dodać tam nazwę pliku, z którym pracujemy). Branżowe standardy zachęcają do tego, żeby tytuły okien były krótkie, jednoznaczne i faktycznie informowały użytkownika o funkcji aktualnego widoku. Co ciekawe, w niektórych frameworkach można nawet dodać ikonę do tego paska tytułowego. Samo ustawienie tytułu nie zmienia żadnych właściwości obiektu aplikacji poza tym, jak jest widoczny dla użytkownika. To mały detal, ale bardzo ważny w codziennej pracy programisty interfejsów graficznych.

Pytanie 27

Na ilustracji pokazany jest fragment diagramu blokowego pewnego algorytmu. Ile razy warunek n<7 będzie badany?

Ilustracja do pytania
A. 8
B. 7
C. 6
D. 5
Wybór innej odpowiedzi niż 4 wskazuje na nieprawidłowe rozumienie mechanizmu działania pętli z warunkiem końcowym Problem może tkwić w błędnym założeniu dotyczącym liczby iteracji które ma miejsce gdy nie uwzględnia się początkowej wartości n Wynik 8 mógłby wynikać z mylnego założenia że pętla sprawdza warunek również po zakończeniu gdy n wynosi 7 co jest nieprawidłowe Ponadto wybór 5 może sugerować że zrozumienie zakresu wartości n jest niepełne ponieważ pomija się pierwszą iterację gdy n równa się 1 Odpowiedź 7 mogłaby wynikać z błędnego przeliczania liczby iteracji lub niepoprawnego przeanalizowania działania inkrementacji w algorytmie Ważne jest aby zrozumieć że warunek n mniejsze od 7 jest sprawdzany na początku każdej iteracji pętli i gdy n osiąga wartość 7 pętla nie wykonuje się ponownie Zrozumienie tego mechanizmu jest kluczowe do poprawnego projektowania algorytmów i unikania typowych błędów logicznych które mogą prowadzić do nieefektywności kodu oraz trudności w jego debugowaniu i utrzymaniu Praktykując analizę schematów blokowych i algorytmów warto zwrócić uwagę na działanie warunków i ich wpływ na przebieg pętli co ma szerokie zastosowanie zarówno w programowaniu jak i w analizie danych oraz automatyzacji procesów

Pytanie 28

Aby zdefiniować zmienną, która będzie działała jako licznik instancji danej klasy, należy wprowadzenie takiego zmiennej poprzedzić słowem kluczowym

A. operator
B. virtual
C. static
D. register
Pojęcia takie jak register, operator czy virtual bywają mylące, zwłaszcza na początku nauki programowania obiektowego. Słowo kluczowe register bardziej kojarzy się z próbą optymalizacji przechowywania zmiennej – zasugerowanie kompilatorowi, by trzymał ją w rejestrze procesora, co dziś i tak jest rzadko praktykowane i nie dotyczy współdzielonych zmiennych klasowych. Operator z kolei służy do przeciążania operatorów w językach takich jak C++ – czyli np. nadawania własnego znaczenia znakom typu + czy == dla obiektów konkretnej klasy. To narzędzie bardzo użyteczne, ale kompletnie niezwiązane z mechanizmem liczników czy zmiennych wspólnych. Z kolei virtual dotyczy metod, a konkretnie polimorfizmu, czyli możliwości nadpisywania funkcji w klasach pochodnych. Umożliwia to dynamiczne wiązanie wywołań funkcji, co jest kluczowe przy projektowaniu hierarchii klas, ale nie ma przełożenia na definiowanie pól klasowych jako współdzielonych. Moim zdaniem sporym problemem jest tu mylenie zakresu działania tych słów kluczowych – każdemu przypisuje się inne zadanie w języku. Typowym błędem jest myślenie, że wszystko co brzmi "technicznie" może pasować do każdej sytuacji, a tymczasem każde z tych słów ma bardzo konkretne zastosowania. Licznik instancji musi być jeden dla całej klasy, a do tego właśnie static jest stworzone. Reszta pojęć, choć brzmi oficjalnie, nie zapewni takiej funkcjonalności i lepiej nie używać ich w tym kontekście, bo potem kod staje się niezrozumiały i pełen dziwnych błędów.

Pytanie 29

Co to jest BEM w kontekście CSS?

A. Backend Encryption Method - metoda szyfrowania danych w backendzie
B. Browser Extension Module - moduł rozszerzeń przeglądarki
C. Bootstrap Element Manager - narzędzie do zarządzania elementami Bootstrap
D. Metodologia nazewnictwa klas CSS: Block, Element, Modifier
BEM, czyli Block, Element, Modifier, to metodologia służąca do organizacji i strukturyzacji kodu CSS, co znacząco ułatwia zarządzanie i rozwijanie projektów internetowych. W BEM każda klasa CSS jest zbudowana w sposób, który jasno definiuje jej rolę w kontekście całej aplikacji. Na przykład, blok to niezależny komponent, taki jak 'navbar' czy 'button', element to część bloku, która nie ma sensu sama w sobie, jak 'navbar__item', a modyfikator wskazuje na różne stany lub warianty bloku lub elementu, jak 'button--primary' lub 'button--disabled'. Zastosowanie BEM pozwala na lepszą czytelność kodu oraz unikanie konfliktów nazw, co jest kluczowe w dużych projektach. Praktyka ta jest szeroko stosowana w branży, a wiele frameworków CSS, takich jak Bootstrap, przyjmuje zasady BEM dla swoich komponentów, co wspiera stworzenie spójnego i łatwego w utrzymaniu stylu. Zrozumienie BEM jest fundamentem dla programistów front-end, ponieważ pozwala na efektywniejszą współpracę w zespole oraz lepszą organizację kodu.

Pytanie 30

Która z poniższych nie jest cechą architektury mikroserwisów?

A. Odporność na awarie pojedynczych komponentów
B. Autonomia zespołów rozwijających poszczególne usługi
C. Wspólna baza danych dla wszystkich usług
D. Niezależne wdrażanie poszczególnych usług
W architekturze mikroserwisów kluczową cechą jest niezależność każdej usługi, co obejmuje również niezależne zarządzanie danymi. Wspólna baza danych dla wszystkich usług narusza tę zasadę, ponieważ prowadzi do silnych powiązań między usługami, co ogranicza ich autonomię. Przykładem dobrych praktyk w architekturze mikroserwisów jest stosowanie wzorca bazy danych per mikroserwis, co pozwala na niezależne skalowanie, wdrażanie i rozwijanie poszczególnych usług. W praktyce, takie podejście zwiększa elastyczność w rozwoju i ułatwia szybkie wprowadzanie zmian, co jest kluczowe w nowoczesnym świecie IT. Zgodnie z zasadami DevOps i CI/CD, mikroserwisy powinny być w stanie wprowadzać zmiany w sposób autonomiczny, bez wpływu na inne komponenty systemu. Na przykład, jeżeli jedna usługa wymaga zmiany schematu bazy danych, to nie powinno to wpływać na inne usługi, co umożliwia stabilność oraz ciągłość działania całego systemu.

Pytanie 31

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

console.log(0.1 + 0.2 === 0.3);
console.log(0.1 + 0.2);
A. false, 0.3
B. true, 0.30000000000000004
C. true, 0.3
D. false, 0.30000000000000004
Wynik wyrażenia `0.1 + 0.2` w JavaScript nie jest równy `0.3` ze względu na sposób reprezentacji liczb zmiennoprzecinkowych w pamięci komputera. W programowaniu, liczby zmiennoprzecinkowe są przechowywane zgodnie z normą IEEE 754, co prowadzi do drobnych błędów zaokrągleń. W przypadku `0.1` oraz `0.2` ich suma w rzeczywistości daje wynik `0.30000000000000004`, co jest nieco większe niż `0.3`. Z tego powodu, porównując `0.1 + 0.2` z `0.3`, otrzymujemy `false`. To zjawisko ilustruje potrzebę ostrożności przy porównywaniu wartości zmiennoprzecinkowych i zachęca do używania metod porównawczych, które uwzględniają tolerancję błędu, takich jak `Math.abs(a - b) < epsilon`, gdzie `epsilon` to bardzo mała liczba. W praktyce, zrozumienie tych zasad jest kluczowe dla zapobiegania błędom w obliczeniach finansowych czy innych zastosowaniach wymagających wysokiej precyzji.

Pytanie 32

Który z wymienionych poniżej wzorców projektowych można zakwalifikować jako wzorzec strukturalny?

A. Metoda szablonowa (Template method)
B. Fabryka abstrakcyjna (Abstract Factory)
C. Fasada (Facade)
D. Obserwator (Observer)
Fasada (Facade) to wzorzec projektowy, który jest przykładem wzorca strukturalnego. Umożliwia on tworzenie uproszczonego interfejsu dla bardziej złożonego systemu, integrując wiele podsystemów i dostarczając jednolity punkt dostępu. Strukturalne wzorce projektowe skupiają się na organizacji klas i obiektów, a Fasada doskonale wpisuje się w tę kategorię, redukując złożoność i zwiększając czytelność kodu. Wzorzec ten jest szeroko stosowany w architekturze aplikacji, gdzie występuje potrzeba uproszczenia dostępu do skomplikowanych bibliotek lub systemów wewnętrznych.

Pytanie 33

Które z poniższych pojęć nie jest związane z React.js?

A. Directives
B. Virtual DOM
C. Hooks
D. JSX
Directives to pojęcie związane głównie z frameworkiem Angular, a nie z React.js. W kontekście Angular, dyrektywy są używane do rozszerzania HTML-a o nowe funkcje, co pozwala na bezpośrednią manipulację DOM-em i tworzenie niestandardowych znaczników. React.js natomiast korzysta z zupełnie innej filozofii, w której komponenty są podstawowym budulcem aplikacji. W React.js używamy JSX, co jest syntaktycznym rozszerzeniem JavaScriptu, pozwalającym na pisanie kodu w sposób przypominający HTML. Dodatkowo, React korzysta z Virtual DOM, co zwiększa wydajność poprzez minimalizację operacji na prawdziwym DOM-ie. React wprowadził także mechanizm Hooks, który pozwala na użycie stanu i efektów ubocznych w komponentach funkcyjnych, co jest istotne w nowoczesnym podejściu do tworzenia aplikacji. Zrozumienie różnic pomiędzy tymi podejściami jest kluczowe dla efektywnego korzystania z odpowiednich narzędzi w zależności od wymagań projektu.

Pytanie 34

Wskaż typy numeryczne o stałej precyzji

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

Pytanie 35

Jakie narzędzie najlepiej sprawdza się w przekształcaniu liczby szesnastkowej na binarną?

A. Program do arkuszy kalkulacyjnych
B. Kalkulator programisty
C. Program do edycji tekstu
D. Aplikacja internetowa
Kalkulator programisty jest najbardziej odpowiednim narzędziem do konwersji liczby szesnastkowej na binarną ze względu na swoje wyspecjalizowane funkcje matematyczne i programistyczne. Narzędzia te umożliwiają użytkownikom łatwe przekształcanie różnych systemów liczbowych, w tym konwersji z systemu szesnastkowego (hex) na system binarny. Kalkulatory programistyczne często zawierają dedykowane opcje dla konwersji liczbowej, co pozwala na szybkie i dokładne uzyskanie wyników bez potrzeby stosowania skomplikowanych algorytmów lub wzorów. Na przykład, aby przekształcić liczbę szesnastkową '1A' na binarną, użytkownik wprowadza '1A' do kalkulatora, a wynik '00011010' zostaje automatycznie wygenerowany. Dodatkowo, wiele kalkulatorów programistycznych jest zgodnych z międzynarodowymi standardami, co zapewnia ich wiarygodność w obliczeniach. Warto również zauważyć, że kalkulatory programistyczne mogą obsługiwać konwersje z różnych systemów liczbowych, co czyni je wszechstronnym narzędziem w pracy z danymi cyfrowymi i kodowaniem. Dzięki temu, kalkulator programisty stanowi idealne rozwiązanie dla programistów i inżynierów, którzy regularnie pracują z różnymi formatami danych.

Pytanie 36

Która z poniższych informacji o pojęciu obiekt jest prawdziwa?

A. obiekt to typ złożony
B. obiekt oraz klasa są identyczne
C. obiekt jest instancją klasy
D. obiekt pozwala na zdefiniowanie klasy
Prawidłowo, obiekt w programowaniu obiektowym to konkretny egzemplarz, czyli instancja klasy. Wyobraź sobie klasę jako przepis (np. instrukcja budowy samochodu), a obiekt to już gotowy samochód wyprodukowany według tej instrukcji. W praktyce, kiedy definiujesz klasę w języku takim jak Java, C++ czy Python, tworzysz pewnego rodzaju szablon opisujący, co dany obiekt będzie mógł robić (metody) i jakie będzie miał dane (pola/atrybuty). Dopiero utworzenie instancji tej klasy, czyli wywołanie np. new Car(), powoduje, że powstaje prawdziwy, działający obiekt, z którym możesz coś zrobić – na przykład ustawić mu kolor, zapalić światła czy uruchomić silnik. Z mojego doświadczenia wynika, że właśnie rozróżnienie klasy i obiektu pozwala pisać kod bardziej uniwersalny i czytelny. W dobrych praktykach, na przykład zgodnie z zasadami SOLID, klasa powinna być zrozumiała i opisująca pewien spójny koncept, zaś obiekty powstające na jej podstawie mogą zachowywać się różnie zależnie od wprowadzonych danych. To podejście jest fundamentem programowania nowoczesnych aplikacji, bo pozwala łatwo zarządzać złożonością, testować kod i rozwijać projekty. Warto też pamiętać, że instancja klasy może mieć swój własny, unikalny stan, co odróżnia ją od samej definicji klasy. Bez tworzenia obiektów klasy nie mają praktycznego zastosowania – to właśnie obiekty wykonują zadania w programie.

Pytanie 37

Przedstawiony na filmie kod napisany w języku C++ nie kompiluje się. Co należy zmienić w tym kodzie, aby proces kompilacji wykonał się bez błędów?

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

Pytanie 38

Co oznacza termin 'immutability' w programowaniu funkcyjnym?

A. Kod może być wykonywany równolegle
B. Stan obiektu nie może być modyfikowany po jego utworzeniu
C. Funkcje mogą być przypisywane do zmiennych
D. Obiekty są automatycznie usuwane z pamięci
Termin 'immutability' w programowaniu funkcyjnym odnosi się do właściwości obiektów, które po utworzeniu nie mogą być modyfikowane. W kontekście programowania funkcyjnego, gdzie funkcje są kluczowym składnikiem, immutability jest fundamentalnym założeniem, które pozwala na tworzenie bardziej przewidywalnych i bezpiecznych aplikacji. Kiedy obiekty są niemodyfikowalne, każde ich 'zmiana' generuje nowy obiekt, zamiast aktualizować istniejący, co eliminuję problemy związane z nieprzewidywalnym stanem aplikacji. Przykładem może być język programowania Scala, gdzie kolekcje, takie jak List, są niemodyfikowalne z założenia. Z perspektywy dobrych praktyk, immutability przyczynia się do łatwiejszej analizy kodu, testowania jednostkowego oraz równoległego przetwarzania danych. Ponadto, programowanie funkcyjne, bazujące na tej koncepcji, sprzyja tworzeniu czystych, modularnych i łatwych do przetestowania aplikacji.

Pytanie 39

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. success
B. first then
C. success, first then
D. first then, success
W przypadku błędnych odpowiedzi można zauważyć kilka typowych nieporozumień dotyczących działania obietnic w JavaScript. Odpowiedzi sugerujące, że najpierw zostanie wyświetlony 'first then' lub że będzie tylko jeden wynik, są wynikiem niezrozumienia, jak działa asynchroniczność oraz jak obietnice przetwarzają wyniki. Obietnice w JavaScript są zaprojektowane tak, aby zarządzać operacjami asynchronicznymi, co oznacza, że kod wewnątrz obietnicy nie blokuje wykonania innych operacji. W momencie, gdy obietnica jest utworzona, kod wykonuje się dalej, a funkcja `setTimeout` działa w tle. Gdy po upływie określonego czasu obietnica jest spełniona, następuje przekazanie wyniku do łańcucha `then`, a nie jakiegokolwiek innego miejsca w kodzie. To oznacza, że wyniki są zwracane w kolejności, w jakiej są zadeklarowane, co w tym przypadku prowadzi do wyświetlenia najpierw 'success', a potem 'first then'. Takie podejście do asynchroniczności jest fundamentalne w JavaScript, a jego zrozumienie jest kluczowe dla każdego programisty. Błędne odpowiedzi pochodzą często z mylnego przekonania, że wyniki obietnic są natychmiastowe lub że działają w tej samej kolejności, co kod synchroniczny. Dlatego ważne jest, aby zrozumieć, że asynchroniczność zmienia sposób, w jaki operacje są wykonywane i jak wyniki są zwracane.

Pytanie 40

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

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