Wyniki egzaminu

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

Egzamin zdany!

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

Co to jest dokumentacja instruktażowa programu?

A. Instrukcją opisującą, jak używać funkcji programu
B. Zbiorem szczegółów technicznych dotyczących kodu źródłowego
C. Kolekcją testów jednostkowych oraz ich wyników
D. Dokumentem przedstawiającym plany rozwoju oprogramowania
Instrukcja wyjaśniająca, jak korzystać z funkcji programu, to podstawowy element dokumentacji pomocy programu. Tego rodzaju dokumentacja jest skierowana do użytkowników końcowych i zawiera opisy interfejsu, funkcji oraz dostępnych narzędzi. Instrukcja użytkownika może obejmować zrzuty ekranu, filmy instruktażowe oraz FAQ (często zadawane pytania), co ułatwia szybkie wdrożenie w obsługę aplikacji. Celem dokumentacji pomocy jest nie tylko wyjaśnienie podstawowych funkcji programu, ale także zwiększenie komfortu użytkownika i minimalizacja problemów związanych z obsługą oprogramowania. Przejrzysta i dobrze napisana instrukcja wpływa na pozytywne doświadczenia użytkowników, redukując liczbę zgłoszeń do działu wsparcia technicznego.

Pytanie 2

Które z wymienionych stwierdzeń najtrafniej charakteryzuje WPF?

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

Pytanie 3

Która z wymienionych topologii sieci wykazuje cechę, że wszystkie urządzenia są połączone jednym kablem?

A. Topologia gwiazdy
B. Topologia pierścienia
C. Topologia siatki
D. Topologia magistrali
Topologia gwiazdy, w przeciwieństwie do magistrali, charakteryzuje się tym, że wszystkie urządzenia są podłączone do centralnego urządzenia, zazwyczaj switcha lub koncentratora. W tej konfiguracji, jeżeli wystąpi awaria jednego z urządzeń, pozostałe nadal mogą funkcjonować, co czyni tę topologię bardziej niezawodną. Topologia pierścienia polega na połączeniu wszystkich urządzeń w formie zamkniętego pierścienia, gdzie dane przekazywane są z jednego urządzenia do drugiego w określonym kierunku. W tej topologii każda awaria jednego z urządzeń lub kabla powoduje zakłócenia w całej sieci, co czyni ją mniej odporną na błędy. Z kolei topologia siatki, w której każde urządzenie jest połączone z wieloma innymi, zapewnia najwyższy poziom redundancji i niezawodności, ponieważ nawet w przypadku awarii jednego lub kilku połączeń, dane mogą nadal być przesyłane przez inne dostępne trasy. W przeciwieństwie do magistrali, siatka wymaga znacznie większej ilości kabli i jest bardziej skomplikowana w konfiguracji i zarządzaniu, co zwiększa koszty implementacji. Każda z tych topologii ma swoje unikalne właściwości i zastosowania, co sprawia, że wybór odpowiedniej topologii zależy od specyficznych wymagań danego projektu sieciowego.

Pytanie 4

Jakie jest podstawowe zadanie funkcji zaprzyjaźnionej w danej klasie?

A. Ograniczenie widoczności atrybutów klasy
B. Generowanie kopii pól obiektu w innej klasie
C. Dodawanie nowych instancji do klasy
D. Umożliwienie funkcji dostępu do prywatnych atrybutów klasy
Funkcja zaprzyjaźniona umożliwia dostęp do prywatnych i chronionych składowych klasy, z którą jest zaprzyjaźniona. To mechanizm, który pozwala na utrzymanie hermetyzacji, jednocześnie umożliwiając wybranym funkcjom lub klasom bezpośredni dostęp do wewnętrznych danych innej klasy. Funkcje zaprzyjaźnione często są stosowane do operacji, które wymagają dostępu do wewnętrznych danych klasy, ale nie powinny być jej metodami, np. operacje arytmetyczne lub porównawcze na obiektach tej klasy.

Pytanie 5

W jakim celu wykorzystuje się diagram Gantta?

A. do dokładnej analizy czasowo-kosztowej projektu
B. do przedstawiania funkcjonalności systemu
C. do wizualizacji powiązań między elementami systemów
D. do planowania i zarządzania projektem
Diagram Gantta to jeden z podstawowych i – moim zdaniem – najfajniejszych narzędzi używanych w zarządzaniu projektami, zwłaszcza w budowlance, IT czy produkcji. Jest bardzo praktyczny, bo pozwala wizualnie rozplanować, jakie zadania są do wykonania, ile mają trwać i co od czego zależy. Dzięki prostemu układowi poziomych pasków na osi czasu można szybko ogarnąć całość projektu, zobaczyć które zadania się pokrywają i gdzie mogą być wąskie gardła. Branżowe standardy, np. PMBOK, zalecają korzystanie z diagramu Gantta właśnie do planowania i monitorowania postępu. Z mojego doświadczenia to narzędzie, które łączy ludzi – wszyscy od razu widzą, kto co robi i na kiedy. Fajne jest też to, że łatwo aktualizować taki diagram w miarę zmian w projekcie. Diagram Gantta pomaga też w kontroli terminowości i identyfikacji opóźnień. Jeśli ktoś kiedyś miał styczność z programami jak MS Project czy nawet prostym Excelem – na pewno widział taki wykres. Można tam nawet dodać kamienie milowe czy zależności między zadaniami (np. jedno musi się skończyć, zanim drugie się zacznie). Tak naprawdę, w profesjonalnych firmach, zarządzanie projektem bez takiego narzędzia byłoby trochę strzałem w stopę.

Pytanie 6

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

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

Pytanie 7

Jaką nazwę elementu interfejsu należy wprowadzić w pierwszej linii kodu, na miejscu <??? aby został on wyświetlony w podany sposób?

<???
    android:layout_margin="50dp"
    android:switchMinWidth="60dp"
    android:text="Zgadzasz się?"
    android:textOff="NIE"
    android:testOn="TAK" />
Ilustracja do pytania
A. Spinner
B. RatingBar
C. SeekBar
D. Switch
Switch to bardzo charakterystyczny element interfejsu Androida, który służy do przełączania między dwoma stanami, np. włącz/wyłącz, tak/nie. Na screenie wyraźnie widać typowy suwak z okrągłym przyciskiem, który przemieszcza się na boki – dokładnie tak działa Switch. W kodzie XML także pojawiają się atrybuty takie jak text, textOff, textOn – one są właściwe właśnie dla komponentu Switch, bo pozwalają podpisać każdy ze stanów na przełączniku. Praktycznie w każdej nowoczesnej aplikacji spotyka się Switcha do wyrażania zgody, akceptacji regulaminu albo przełączania opcji (np. tryb ciemny). Z mojego doświadczenia to jest dużo wygodniejsze dla użytkownika niż klasyczne checkboxy, bo od razu widać, który stan jest aktywny – a UX-owcy też bardzo to chwalą. Warto pamiętać, że Switch ma swoje domyślne style zgodne z Material Design, więc aplikacja wygląda nowocześnie bez dodatkowej pracy. Dobrą praktyką jest wykorzystywanie Switcha właśnie wtedy, gdy potrzebujemy zmiany binarnej, a nie kilku opcji do wyboru. Jeśli ktoś myśli o bardziej zaawansowanych interfejsach, to Switch pozwala łatwo reagować na zmianę stanu w kodzie Java/Kotlin poprzez listener OnCheckedChangeListener. No i jest to jeden z tych komponentów, które naprawdę warto znać, bo są podstawą w każdym projekcie mobilnym.

Pytanie 8

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

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

Pytanie 9

Jaką wydajność posiada sieć, która przesyła 500 MB danych w czasie 10 sekund?

A. 500 Mbps
B. 50 Mbps
C. 400 Mbps
D. 40 Mbps
Przepustowość sieci to jeden z najważniejszych parametrów, który określa, jak szybko możemy przesyłać dane pomiędzy urządzeniami w danej infrastrukturze. W najprostszych słowach jest to ilość informacji, jaka może zostać przesłana w jednostce czasu, zazwyczaj wyrażana w bitach na sekundę (bps – bits per second). W praktyce często spotykamy skróty takie jak kbps, Mbps czy Gbps, oznaczające kolejno tysiące, miliony i miliardy bitów przesyłanych w ciągu sekundy. Aby poprawnie obliczyć przepustowość, musimy więc znać ilość przesyłanych danych oraz czas, w jakim ta transmisja się odbywa. W naszym przypadku mamy do czynienia z przesyłaniem 500 MB danych w ciągu 10 sekund. Pierwszym krokiem jest przeliczenie megabajtów (MB) na megabity (Mb), ponieważ przepustowość zawsze wyraża się w bitach. Warto przypomnieć, że 1 bajt to 8 bitów, dlatego 500 MB należy pomnożyć przez 8. W wyniku otrzymujemy 4000 megabitów (Mb). Kiedy już mamy dane w odpowiedniej jednostce, możemy przejść do drugiego kroku, czyli obliczenia przepustowości. Dzielimy 4000 megabitów przez 10 sekund, co daje 400 megabitów na sekundę (400 Mb/s). Wynik ten można również zapisać jako 400 Mbps, ponieważ obie formy zapisu oznaczają dokładnie to samo – megabity na sekundę. Ostatecznie można więc stwierdzić, że sieć, która przesyła 500 MB danych w 10 sekund, ma przepustowość 400 Mbps. To całkiem wysoki wynik, świadczący o bardzo dobrej jakości połączenia, typowej dla nowoczesnych sieci światłowodowych lub infrastruktury o dużej przepustowości. Warto też dodać, że przepustowość to nie to samo, co prędkość internetu widoczna w testach online – rzeczywista prędkość może być mniejsza z powodu opóźnień, strat pakietów czy ograniczeń sprzętowych. Mimo to, obliczenia te dobrze ilustrują, jak przeliczać jednostki i w prosty sposób określać, jak wydajna jest dana sieć.

Pytanie 10

Co oznacza operator '===' w JavaScript?

A. Porównanie wartości i typów
B. Porównanie wartości
C. Przypisanie wartości
D. Konkatenacja stringów
Operator '===' w JavaScript jest używany do porównania wartości oraz ich typów. To znaczy, że aby dwa elementy uznano za równe, muszą mieć zarówno tę samą wartość, jak i ten sam typ. Przykładowo, porównanie liczby 5 i stringa '5' zwróci false, ponieważ różnią się typem. Używanie '===' jest zalecane w dobrych praktykach programistycznych, ponieważ eliminuje niejednoznaczności związane z równością luźną (operator '=='), która może prowadzić do nieprzewidywalnych wyników. Na przykład, '5' == 5 zwróci true, co może być mylące. Dlatego w sytuacjach, gdzie zależy nam na ścisłym porównaniu, powinno się zawsze stosować '===' dla jasności kodu i uniknięcia błędów. W kontekście profesjonalnego programowania, korzystanie z '===' zapewnia lepszą kontrolę typów danych, co jest kluczowe w większych projektach, gdzie błędy typów mogą prowadzić do poważnych problemów z debugowaniem i utrzymywaniem kodu.

Pytanie 11

Jak nazywa się technika umożliwiająca asynchroniczne wykonywanie operacji w JavaScript?

A. Variable
B. Function
C. Object
D. Promise
Promise to technika w JavaScript, która umożliwia obsługę operacji asynchronicznych. W odróżnieniu od tradycyjnych funkcji, które mogą blokować wykonanie kodu do momentu zakończenia operacji, Promise pozwala na kontynuację wykonywania kodu, a wyniki operacji są dostępne, gdy zostaną one zakończone. Główne zastosowanie Promise polega na obsłudze operacji takich jak żądania sieciowe, które mogą trwać nieprzewidywalnie długo. Przykładem jest użycie Promise do wykonania zapytania do API: fetch('https://api.example.com/data') .then(response => response.json()) .then(data => console.log(data)). Dobrą praktyką jest stosowanie asynchronizacji z użyciem async/await, co pozwala na bardziej czytelny kod. Promise jest częścią ECMAScript 2015 (ES6) i stanowi podstawę dla bardziej zaawansowanych technik, takich jak async/await, co pozwala na jeszcze prostszą obsługę asynchronicznych operacji. Zrozumienie Promise jest kluczowe dla efektywnego programowania w JavaScript, zwłaszcza w kontekście aplikacji webowych, gdzie asynchroniczność odgrywa kluczową rolę.

Pytanie 12

Zasada programowania obiektowego, która polega na ukrywaniu elementów klasy tak, aby były one dostępne wyłącznie dla metod tej klasy lub funkcji zaprzyjaźnionych, to

A. wyjątki
B. dziedziczenie
C. hermetyzacja
D. polimorfizm
Hermetyzacja to taka esencja programowania obiektowego, która polega na ukrywaniu szczegółów implementacyjnych wewnątrz klasy. Dzięki temu tylko wybrane fragmenty kodu mają dostęp do danych czy metod, które faktycznie powinny być widoczne na zewnątrz. W praktyce sprowadza się to do korzystania z modyfikatorów dostępu, takich jak private, protected czy public, co jest podstawą w językach takich jak Java, C++ czy C#. Daje to ogromną przewagę, bo ochrania dane przed przypadkowymi (albo celowymi!) zmianami z zewnątrz. Z mojego doświadczenia wynika, że dobrze zaprojektowana hermetyzacja sprawia, że kod jest bardziej przejrzysty i łatwiejszy do testowania i utrzymania. Przykład? Załóżmy, że mamy klasę KontoBankowe i chcemy, żeby saldo dało się zmieniać tylko poprzez wpłatę i wypłatę, a nie żeby każdy mógł ustawić dowolną kwotę. Wtedy pole 'saldo' robimy private, a dostęp dajemy przez metody public wpłata() i wypłata(). Branżowe praktyki, np. SOLID, wręcz podkreślają wagę hermetyzacji. Ułatwia to też refaktoryzację – jeśli coś zmienisz w środku klasy, a interfejs zewnętrzny zostaje taki sam, reszta programu nawet nie zauważy. Także, moim zdaniem, bez hermetyzacji nie ma sensownego programowania obiektowego – to absolutna podstawa.

Pytanie 13

Jakie funkcje realizuje polecenie "git clone"?

A. Usuwa zdalne repozytorium
B. Tworzy lokalną kopię już istniejącego repozytorium
C. Rejestruje zmiany w historii repozytorium
D. Łączy dwa branche w repozytorium
Polecenie "git clone" to w zasadzie jedna z pierwszych rzeczy, które poznaje się na początku pracy z Gitem. Służy ono do skopiowania całego istniejącego repozytorium – czyli pobiera zarówno wszystkie pliki, jak i całą historię commitów. To jest ogromnie przydatne, bo nie tylko masz najnowszy kod, ale od razu całą historię zmian, branche, tagi i inne rzeczy. Standardowo używa się tego polecenia, kiedy chcesz zacząć pracę nad projektem, który jest już na jakimś zdalnym serwerze (np. Githubie albo GitLabie). W praktyce wygląda to tak, że podajesz adres repozytorium, wpisujesz "git clone https://adres.repo.git" i po kilku chwilach masz pełną kopię projektu u siebie na dysku. Co ciekawe, narzędzie od razu ustawia Ci zdalne połączenie do pierwotnego repozytorium jako "origin", więc potem możesz spokojnie wykonywać polecenia typu git fetch, git pull czy git push. Moim zdaniem to super wygodne, bo cała struktura repozytorium, nawet z podfolderami czy nietypowymi ustawieniami, zostaje zachowana. Warto pamiętać, że git clone to nie tylko kopiowanie plików – to pobieranie całej bazy danych Git, więc masz możliwość cofania się w historii czy przeglądania wszystkich commitów lokalnie i offline. Z mojego doświadczenia: często nowi użytkownicy nie doceniają jeszcze, jak ważne jest to, żeby zawsze pracować na pełnej kopii, a nie wycinku repo. To podstawa bezpiecznej i efektywnej pracy zespołowej.

Pytanie 14

Co to jest algorytm QuickSort?

A. Algorytm wyszukiwania binarnego w posortowanej tablicy
B. Wydajny algorytm sortowania oparty na strategii 'dziel i zwyciężaj'
C. Technika przeszukiwania grafu wszerz
D. Metoda kompresji danych bez strat
Algorytm QuickSort to jeden z najbardziej popularnych i efektywnych algorytmów sortowania, który opiera się na strategii 'dziel i zwyciężaj'. W praktyce działa w ten sposób, że wybiera element zwany pivotem (osią) i dzieli zbiór na dwie części: jeden z elementami mniejszymi od pivota, a drugi z elementami większymi. Następnie rekurencyjnie sortuje te podzbiory. QuickSort jest niezwykle szybki i wydajny, zwłaszcza dla dużych zbiorów danych, a jego średnia złożoność czasowa wynosi O(n log n). Używa się go w wielu aplikacjach, gdzie istotne jest szybkie przetwarzanie danych, takich jak sortowanie list w aplikacjach webowych czy organizacja danych w bazach. Warto jednak pamiętać, że w najgorszym przypadku, gdy pivot jest źle wybierany, złożoność może wynosić O(n^2), co występuje na przykład w przypadku już posortowanej tablicy. W kontekście praktycznym, dobre praktyki obejmują dobór odpowiedniej metody wyboru pivota, co może znacznie poprawić wydajność algorytmu.

Pytanie 15

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

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

Pytanie 16

Jaki jest podstawowy cel przystosowania aplikacji do publikacji w sklepie mobilnym?

A. Zmniejszenie rozmiaru aplikacji poniżej 10 MB
B. Dostosowanie aplikacji do wymogów platformy oraz regulacji sklepu
C. Dostosowanie kodu aplikacji w celu zwiększenia jej wydajności
D. Zapewnienie, że aplikacja działa jedynie w trybie offline
Dostosowanie aplikacji do wymagań platformy i przepisów sklepu mobilnego (np. Google Play lub App Store) to kluczowy krok w procesie publikacji aplikacji. Sklepy mobilne wymagają, aby aplikacje spełniały określone standardy dotyczące bezpieczeństwa, dostępności, wydajności oraz zgodności z wytycznymi interfejsu użytkownika. Proces ten obejmuje testowanie aplikacji pod kątem stabilności, optymalizację grafik i ikon, a także dostosowanie opisów i metadanych aplikacji, co zwiększa jej widoczność i atrakcyjność dla użytkowników. Przestrzeganie wytycznych App Store lub Google Play jest niezbędne, aby aplikacja mogła zostać zatwierdzona i udostępniona do pobrania.

Pytanie 17

Co to jest XSS (Cross-Site Scripting)?

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

Pytanie 18

Który z wymienionych sposobów może przyczynić się do optymalizacji kodu źródłowego?

A. Dodanie większej liczby komentarzy w kodzie
B. Eliminacja nieużywanych zmiennych oraz funkcji
C. Zwiększenie ilości instrukcji warunkowych
D. Zamiana zmiennych globalnych na lokalne
Usunięcie nieużywanych zmiennych i funkcji to jedna z najskuteczniejszych metod optymalizacji kodu źródłowego. Nadmiarowe zmienne i niepotrzebne funkcje mogą spowalniać aplikację, zwiększać jej zużycie pamięci i powodować problemy z czytelnością kodu. Ich eliminacja upraszcza kod, zmniejsza ryzyko błędów i poprawia wydajność programu. Oczyszczanie kodu to kluczowy element procesu refaktoryzacji, który pozwala na utrzymanie wysokiej jakości oprogramowania oraz lepszą organizację projektu. Dodatkowo, minimalizacja kodu pomaga w szybszym ładowaniu aplikacji webowych, co ma bezpośredni wpływ na doświadczenie użytkownika (UX) oraz pozycjonowanie w wyszukiwarkach (SEO).

Pytanie 19

Jaką funkcję pełnią okna dialogowe niemodalne?

A. zarządzania stanem aplikacji za pomocą systemów menu
B. wstrzymywania działania aplikacji w czasie wprowadzania oraz zatwierdzania danych
C. prezentowania komunikatów, które wymagają potwierdzenia, aby kontynuować działanie aplikacji
D. zarządzania ustawieniami aplikacji, jako okno, które pozostaje widoczne na ekranie przez cały czas trwania aplikacji
Okna dialogowe niemodalne, czasem zwane też oknami narzędziowymi albo pomocniczymi, to bardzo praktyczny element interfejsu użytkownika. To, co wyróżnia je spośród innych typów okien, to fakt, że użytkownik może korzystać równocześnie zarówno z tego okna, jak i z głównej aplikacji. Nie blokuje ono działania programu – wszystko jest dostępne w tym samym czasie. Najczęściej takie okna służą do zarządzania ustawieniami aplikacji albo wywoływania funkcji, które użytkownik może modyfikować na bieżąco, bez konieczności zamykania tego okna po każdej zmianie. Przykład z życia: paleta warstw w programach graficznych (np. GIMP czy Photoshop) albo okno stylów w edytorze tekstu. Dla mnie osobiście, taki model pracy jest dużo wygodniejszy niż korzystanie z okien modalnych, bo pozwala płynnie zmieniać ustawienia bez przerywania pracy. Dobrą praktyką w branży jest, żeby okna niemodalne nie zasłaniały kluczowych elementów interfejsu i były jasno oznaczone, by użytkownik wiedział, że może je w każdej chwili zamknąć, nie tracąc postępów. Takie podejście jest wręcz rekomendowane w wytycznych projektowania UX publikowanych przez Apple czy Microsoft (np. Human Interface Guidelines). Okna niemodalne są szczególnie ważne w aplikacjach wymagających ciągłego dostępu do narzędzi lub parametrów, np. edytorach grafiki, IDE czy programach CAD. Warto o tym pamiętać, projektując bardziej złożone systemy.

Pytanie 20

Co to jest git rebase?

A. Narzędzie do rozwiązywania konfliktów między plikami
B. Technika integracji zmian z jednej gałęzi do drugiej przez przeniesienie lub połączenie sekwencji commitów
C. Polecenie do tworzenia nowego repozytorium
D. Metoda tworzenia kopii zapasowej repozytorium
Git rebase to technika stosowana w systemach kontroli wersji, która umożliwia integrację zmian z jednej gałęzi do drugiej poprzez przeniesienie lub połączenie sekwencji commitów. W praktyce, rebase pozwala na 'przeniesienie' commitów z gałęzi roboczej na szczyt gałęzi docelowej, co skutkuje liniowym historią commitów. Taka struktura jest bardziej przejrzysta i ułatwia śledzenie wprowadzonych zmian. Przykładem zastosowania może być sytuacja, gdy pracujesz nad nową funkcjonalnością w gałęzi feature, a w międzyczasie na gałęzi main wprowadzono istotne poprawki. Wykonując rebase na swojej gałęzi feature, możesz szybko zintegrować zmiany z main, co pozwala na uniknięcie problemów z późniejszym scaleniem. Rebase jest zgodny z dobrymi praktykami branżowymi, ponieważ wspiera utrzymanie czystej historii projektu. Należy jednak pamiętać, że rebase zmienia historię, co sprawia, że nie powinno się go stosować na publicznych gałęziach, aby nie komplikować pracy innych deweloperów.

Pytanie 21

Które z poniższych nie jest algorytmem sortowania?

A. Bubble Sort
B. Merge Sort
C. Quick Sort
D. Binary Search
Binary Search jest algorytmem, który służy do efektywnego przeszukiwania uporządkowanych zbiorów danych, a nie do sortowania. Działa na zasadzie dzielenia zbioru na pół i eliminowania połowy z nich w każdym kroku, co pozwala na szybkie znalezienie poszukiwanej wartości. Jest to przykład algorytmu o czasie działania O(log n), co sprawia, że jest znacznie szybszy od prostego przeszukiwania liniowego. Przykładowo, gdy mamy posortowaną tablicę liczb, Binary Search może być użyty do znalezienia konkretnej liczby, eliminując w każdym kroku połowę zbioru, aż do odnalezienia wartości lub stwierdzenia, że jej nie ma. W kontekście branżowym, Binary Search jest szeroko stosowany w różnych aplikacjach, gdzie wymagane jest szybkie przeszukiwanie danych, na przykład w bazach danych i aplikacjach wyszukiwania. Kluczowe jest zrozumienie różnicy między algorytmem przeszukiwania a algorytmem sortowania; sortowanie odnosi się do organizacji danych w określonym porządku, podczas gdy Binary Search koncentruje się na znajdowaniu elementów w już posortowanych zbiorach.

Pytanie 22

Jakie pola powinny być umieszczone w klasie nadrzędnej w strukturze dziedziczenia?

A. Pola, które są tylko prywatne
B. Pola, które są charakterystyczne jedynie dla pojedynczej klasy pochodnej
C. Pola, które są wspólne dla wszystkich klas pochodnych
D. Pola, które są wykorzystywane tylko w funkcjach statycznych
W klasie bazowej w hierarchii dziedziczenia umieszcza się pola, które są wspólne dla wszystkich klas pochodnych. Dzięki temu klasy pochodne mogą dziedziczyć te same właściwości, co eliminuje konieczność ich wielokrotnego definiowania. Jest to jedna z głównych zalet programowania obiektowego, umożliwiająca reużywalność kodu i zwiększenie spójności w projekcie. Przykładem może być klasa 'Pracownik', która zawiera pola takie jak 'imię', 'nazwisko' i 'wynagrodzenie', a klasy pochodne, takie jak 'Inżynier' czy 'Księgowy', mogą dziedziczyć te same pola, dodając jedynie specyficzne właściwości dla swojej roli.

Pytanie 23

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

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

Pytanie 24

Które z poniższych nie jest systemem kontroli wersji?

A. Mercurial
B. MongoDB
C. SVN
D. Git
MongoDB jest systemem zarządzania bazami danych, który nie jest systemem kontroli wersji. Jego głównym celem jest przechowywanie i zarządzanie danymi w formacie dokumentów, co czyni go idealnym rozwiązaniem w aplikacjach wymagających elastyczności w strukturze danych. W odróżnieniu od systemów kontroli wersji, takich jak Git, SVN czy Mercurial, MongoDB nie śledzi zmian w kodzie źródłowym, a zamiast tego skupia się na operacjach na danych. W praktyce, MongoDB znajduje zastosowanie w projektach, gdzie wymagana jest szybka iteracja i przetwarzanie dużych zbiorów danych, takich jak aplikacje mobilne, platformy e-commerce czy analizy danych. Dobre praktyki wskazują, że przy budowie nowoczesnych aplikacji warto korzystać z rozwiązań NoSQL, takich jak MongoDB, w połączeniu z systemami kontroli wersji, aby efektywnie zarządzać zarówno kodem, jak i danymi.

Pytanie 25

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], [2], [3], [4]
B. [1], [1, 2], [3], [3, 4]
C. [1], [2], [3], [4, 3]
D. [1], [1, 2], [3], [1, 2, 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 26

Po wykonaniu poniższego kodu na konsoli zostanie wyświetlona liczba:

int a = 0x73;
cout << a;
A. 115
B. 108
C. 73
D. 0
Wartość 0x73 w kodzie oznacza liczbę zapisaną w systemie szesnastkowym (heksadecymalnym). To bardzo często wykorzystywana notacja w programowaniu, szczególnie gdy pracuje się z pamięcią, kodowaniem kolorów lub niskopoziomową obsługą sprzętu. 0x73 to po prostu 7 * 16 + 3, co daje 115 w systemie dziesiętnym. Gdy taki zapis przekażesz do cout, kompilator automatycznie prezentuje tę wartość jako liczbę w systemie dziesiętnym, czyli właśnie 115. Szczerze mówiąc, moim zdaniem warto jak najczęściej ćwiczyć odczytywanie i zamianę wartości pomiędzy systemami liczbowymi, bo to się naprawdę przydaje przy analizie kodu, debugowaniu czy choćby rozumieniu dokumentacji technicznej. Taka umiejętność jest praktycznie niezbędna w embedded, ale i w zwykłym C++ można czasem natknąć się na takie zapisy – szczególnie w kodzie legacy. Osobiście uważam, że dobrze od razu rozpoznawać takie zapisy i nie tracić czasu na kalkulatory. Warto też pamiętać, że podobnie działają inne systemy: np. 0b1101 to binarny, a 0x to zawsze heksadecymalny. W standardzie C++ zapis z prefiksem 0x jest w pełni poprawny i zalecany przy pracy z wartościami bitowymi. Fajnie, jak ktoś łapie takie rzeczy od razu, bo później w pracy nad większymi projektami to ogromne ułatwienie.

Pytanie 27

Zastosowanie typu DECIMAL języka SQL wymaga wcześniejszego zdefiniowania długości (liczby cyfr) przed przecinkiem oraz długości cyfr po przecinku. Jest to zapis:

A. zmiennoprzecinkowy
B. logicznym
C. stałoprzecinkowy
D. łańcuchowym
Poprawnie – typ DECIMAL w SQL to typ stałoprzecinkowy. Oznacza to, że już przy definicji kolumny musisz podać dwie wartości: całkowitą liczbę cyfr (PRECISION) oraz liczbę cyfr po przecinku (SCALE), np. DECIMAL(10,2). W praktyce oznacza to, że możesz przechowywać liczby z maksymalnie 10 cyframi, z czego 2 są po przecinku, czyli zakres jest kontrolowany i przewidywalny. Moim zdaniem to jest kluczowa cecha: stała dokładność i brak „pływania” wyniku.
W relacyjnych bazach danych DECIMAL jest używany wszędzie tam, gdzie pieniądze, kursy walut, stawki VAT, ilości w magazynie itp. – wszędzie, gdzie liczy się precyzja i nie można sobie pozwolić na błędy zaokrągleń typowe dla typów zmiennoprzecinkowych (FLOAT, DOUBLE). Standard SQL właśnie dla takich zastosowań przewiduje typy numeryczne dokładne (exact numeric types), do których należy DECIMAL/NUMERIC. Dobre praktyki branżowe mówią wprost: kwoty finansowe trzymaj w DECIMAL, a nie w FLOAT.
Warto też wiedzieć, że DECIMAL jest przechowywany w sposób „cyfrowy”, a nie binarny jak float, więc operacje arytmetyczne dają wyniki dokładne w zadanej skali. To bardzo ułatwia raportowanie, księgowość, rozliczenia między systemami. W wielu firmach spotkasz standardy projektowe w stylu: „wszystkie kwoty w systemie mają typ DECIMAL(18,2)” albo podobny. Taki zapis daje spójność danych, przewidywalne zużycie miejsca w bazie i mniejsze ryzyko błędów biznesowych. W skrócie: DECIMAL = stałoprzecinkowy, z góry określona liczba cyfr i powtarzalne wyniki obliczeń, co w systemach produkcyjnych jest bardzo ważne.

Pytanie 28

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 29

Jaką wartość jest w stanie przechować tablica jednowymiarowa?

A. Wartość logiczną true lub false
B. Wiele wartości pod tym samym indeksem
C. Jedną wartość
D. Wiele wartości pod różnymi indeksami
Tablica jednowymiarowa przechowuje wiele wartości pod różnymi indeksami. Każdy element tablicy jest dostępny za pomocą indeksu, co pozwala na szybkie i efektywne przechowywanie oraz przetwarzanie danych. W programowaniu tablice jednowymiarowe są podstawą do implementacji algorytmów sortowania, wyszukiwania oraz przechowywania sekwencji danych. Tego rodzaju tablice są niezwykle użyteczne w organizowaniu danych o powtarzalnej strukturze, takich jak listy imion, wyniki testów czy współrzędne.

Pytanie 30

Która z poniższych technologii jest używana do tworzenia animacji na stronach internetowych?

A. CSS Animations
B. HTTP Headers
C. MySQL
D. XML
CSS Animations to technologia, która pozwala na tworzenie dynamicznych efektów wizualnych na stronach internetowych. Umożliwia ona animowanie różnych właściwości CSS, takich jak kolor, położenie, rozmiar czy przezroczystość, w prosty sposób. Dzięki CSS Animations, deweloperzy mogą tworzyć płynne przejścia i efekty bez potrzeby używania JavaScriptu, co zwiększa wydajność i responsywność witryn. Przykładem zastosowania CSS Animations może być animowanie przycisków na stronie, które zmieniają kolor po najechaniu na nie kursorem. Z punktu widzenia dobrych praktyk, warto pamiętać o optymalizacji efektów animacyjnych, aby nie obciążały one zbytnio zasobów przeglądarki. CSS Animations są częścią standardu CSS3, co oznacza, że są szeroko wspierane przez różne przeglądarki i można je łatwo implementować w projektach webowych.

Pytanie 31

Który z wymienionych parametrów określa prędkość procesora?

A. Liczba rdzeni
B. Rodzaj złącza
C. Częstotliwość taktowania
D. Wielkość pamięci podręcznej
Częstotliwość taktowania procesora, wyrażana najczęściej w gigahercach (GHz), jest kluczowym parametrem opisującym szybkość działania jednostki centralnej. Określa, ile cykli zegara procesor jest w stanie wykonać w ciągu jednej sekundy. Wyższa częstotliwość oznacza większą ilość operacji, które procesor może przetworzyć w danym czasie, co bezpośrednio wpływa na jego wydajność. Przykładowo, procesor o częstotliwości 3,0 GHz może wykonać 3 miliardy cykli na sekundę, co sprawia, że jest w stanie przeprowadzać bardziej skomplikowane obliczenia i efektywniej zarządzać zadaniami. W praktyce jednak sama częstotliwość nie jest jedynym wskaźnikiem wydajności; istotne są też inne czynniki, takie jak architektura procesora, liczba rdzeni czy szybkość pamięci RAM. Standardy, takie jak Intel Core i9 czy AMD Ryzen 5000, dostarczają informacji na temat maksymalnej częstotliwości taktowania, co pozwala konsumentom lepiej dobierać sprzęt do swoich potrzeb. Warto również zauważyć, że wielu nowoczesnych procesorów stosuje technologię Turbo Boost, która pozwala na chwilowe zwiększenie częstotliwości w celu uzyskania lepszej wydajności przy intensywnych obciążeniach.

Pytanie 32

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

A. Python
B. Java
C. JavaScript
D. C#
Framework Django został zaprojektowany specjalnie dla języka Python i z tego powodu wszystkie projekty, aplikacje czy rozszerzenia w Django realizuje się właśnie w tym języku. To nie jest przypadek – Python od lat cieszy się ogromną popularnością w branży webowej, między innymi dzięki swojej czytelności i elastyczności. Moim zdaniem to właśnie ta prostota składni Pythona sprawia, że tak łatwo zacząć nawet większe projekty – nie trzeba tracić czasu na walkę z zawiłościami języka. W praktyce programiści korzystający z Django piszą zarówno widoki, modele, jak i całą logikę aplikacji w Pythonie, wykorzystując przy tym liczne biblioteki i narzędzia tego ekosystemu. Django jest zgodny z filozofią DRY (Don’t Repeat Yourself), co oznacza, że kod w Pythonie staje się bardzo zwięzły i przejrzysty. Często można spotkać się z opinią, że nauka Django to świetny sposób na wejście w świat programowania webowego – sam się z tym zgadzam. Warto wiedzieć, że ogromna społeczność Pythona i Django oferuje mnóstwo wsparcia, dokumentacji oraz gotowych rozwiązań, co na co dzień ułatwia pracę. Tylko w Pythonie zbudujesz pełnoprawną aplikację w Django, bo framework ten nie wspiera innych języków – to się po prostu nie uda, nawet jeśli ktoś próbuje kombinować z integracjami. Widać to choćby po oficjalnych tutorialach i dokumentacji – wszystko, od konfiguracji po deployment, opiera się na pythonowych narzędziach.

Pytanie 33

Jakie są kluczowe etapy resuscytacji krążeniowo-oddechowej?

A. 10 uciśnięć klatki piersiowej bez wdechów
B. 30 uciśnięć klatki piersiowej na przemian z 2 wdechami ratowniczymi
C. 30 wdechów ratowniczych bez uciśnięć
D. 20 uciśnięć klatki piersiowej na przemian z 5 wdechami ratowniczymi
30 uciśnięć klatki piersiowej na przemian z 2 wdechami ratowniczymi to standardowy protokół resuscytacji krążeniowo-oddechowej (RKO) zgodny z wytycznymi Europejskiej Rady Resuscytacji (ERC). Uciśnięcia wykonywane są na głębokość około 5-6 cm w tempie 100-120 uciśnięć na minutę. Po 30 uciśnięciach wykonuje się 2 wdechy ratownicze, które powinny być wykonywane z odpowiednią siłą, aby unieść klatkę piersiową poszkodowanego. Taka sekwencja jest podstawą pierwszej pomocy i może uratować życie osoby, u której doszło do zatrzymania akcji serca. Resuscytację należy kontynuować do momentu przybycia służb ratunkowych lub odzyskania przytomności przez poszkodowanego.

Pytanie 34

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

A. 2048
B. 512
C. 1000
D. 1024
Odpowiedzi 1000, 2048 i 512 są błędne z różnych powodów. Zaczynając od 1000 – często spotykana w reklamach, zwłaszcza w kontekście dysków twardych, odnosi się do systemu dziesiętnego, gdzie 1 TB to 1 000 GB. Ale w informatyce to tak nie działa, bo 1 TB to 1024 GB, co może nieco mylić. Odpowiedź 2048 to też nie to, bo tu mamy do czynienia z pomyleniem jednostek – 2048 wynika z 2^11 i nie pasuje do terabajtów i gigabajtów. Na koniec, 512, to w ogóle nie gra, bo 512 MB to tylko 0,5 GB, co w porównaniu do 1 TB jest po prostu za małe. Dlatego warto ogarnąć te różnice między systemami binarnym i dziesiętnym, żeby dobrze wiedzieć, jak przeliczać jednostki pamięci.

Pytanie 35

Programista aplikacji mobilnych chce przekwalifikować się na pracownika Full-Stack Developer. Wskaż kurs, który powinien wybrać, aby było to możliwe

A. Mastering Cross-platform Developping
B. Ultimate C# Serier from Beginner to Advanced
C. Complete JavaScript React, SQL, Node.js Cource
D. Raster and Vector Graphics with Adobe
Wybór kursu "Complete JavaScript React, SQL, Node.js Course" to zdecydowanie najbardziej logiczna opcja, jeśli ktoś myśli poważnie o przejściu na ścieżkę Full-Stack Developera. Full-stack to bardzo specyficzne pojęcie – chodzi tu o umiejętność poruszania się zarówno po stronie front-endu (czyli tego, co widzi użytkownik), jak i back-endu (czyli serwera, bazy danych, logiki biznesowej). Ten kurs obejmuje JavaScript, który jest teraz królem w świecie web developmentu – daje ogromne możliwości i na froncie (np. React), i na backendzie (Node.js). Do tego dochodzi SQL, czyli język zapytań do baz danych, bez którego ciężko sobie wyobrazić jakąkolwiek aplikację z prawdziwego zdarzenia. Przerobienie takiego kursu zapewnia znajomość pełnego cyklu tworzenia aplikacji webowych: od interfejsu użytkownika, przez komunikację z API, aż po operacje na bazach danych. W praktyce, firmy szukające full-stacków oczekują właśnie takiego wachlarza umiejętności, bo to pozwala tworzyć całe systemy praktycznie w pojedynkę lub w małych zespołach. Z mojego doświadczenia, nawet podstawowa znajomość Reacta i Node.js otwiera drzwi do wielu ofert pracy i własnych projektów, bo można szybko stworzyć MVP i sprawnie wdrażać nowe funkcjonalności. Warto też dodać, że technologie te mają świetną dokumentację i aktywne społeczności, gdzie można znaleźć wsparcie i praktyczne porady. Według mnie, to najlepszy kierunek na rynku dla kogoś, kto zna już programowanie mobilne i chce się rozwinąć na pełen stos webowy, bo można wykorzystać wiele dotychczasowych umiejętności, a jednocześnie nauczyć się rzeczy praktycznie wykorzystywanych na co dzień w nowoczesnych firmach IT.

Pytanie 36

W obrębie klasy pracownik zdefiniowano następujące metody:

pracownik() { ... }
static void wypisz() { ... }
int operator== (const pracownik &prac) { ... }
~pracownik() { ... }
Którą z nich można, zgodnie z jej funkcją, rozszerzyć o element diagnostyczny o treści:
cout << "Obiekt został usunięty";
A. ~pracownik
B. wypisz
C. pracownik
D. operator==
Wybranie destruktora ~pracownik do umieszczenia komunikatu diagnostycznego o usunięciu obiektu jest jak najbardziej słuszne i zgodne z praktykami programowania obiektowego w C++. To właśnie destruktor odpowiada za wykonywanie wszelkich czynności „na pożegnanie” obiektu, czyli w momencie jego zwalniania z pamięci. Właśnie tu umieszcza się takie rzeczy jak logowanie faktu usunięcia, czyszczenie zasobów zewnętrznych czy zwalnianie pamięci dynamicznej. W praktyce, gdy zadeklarujemy cout << "Obiekt został usunięty"; w destruktorze, będziemy mieli jasny sygnał przy każdym końcu życia obiektu, co świetnie nadaje się do diagnostyki i szukania błędów w zarządzaniu pamięcią. Moim zdaniem każdy programista, nawet początkujący, powinien chwilę pobawić się takimi komunikatami, żeby lepiej zrozumieć, kiedy dokładnie destruktor jest wołany (np. przy wyjściu ze scope’u, delete, końcu programu itp.). To też dobry sposób, żeby wychwycić niechciane wycieki pamięci lub zrozumieć, dlaczego obiekt nie został jeszcze usunięty. Wzorce projektowe, takie jak RAII, wręcz opierają się na działaniu destruktorów. W branży często stosuje się podobne rozwiązania do debugowania problematycznych fragmentów kodu. Ogólnie rzecz biorąc, umieszczanie komunikatów w destruktorze jest praktycznym i polecanym sposobem na rozpoznanie cyklu życia obiektu – i to w każdej większej aplikacji C++.

Pytanie 37

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

A. Model prototypowy
B. Model spiralny
C. Model wodospadowy (waterfall)
D. Metodyki zwinne (Agile)
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 38

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

A. Type Definition Document - dokumentacja typów danych w aplikacji
B. Task Deployment Diagram - schemat wdrażania zadań w projekcie
C. Test-Driven Development - praktyka pisania testów przed implementacją kodu
D. Technical Design Document - dokumentacja techniczna projektu
Pojęcia takie jak Type Definition Document, Technical Design Document, czy Task Deployment Diagram są związane z dokumentacją i zarządzaniem projektami, a niekoniecznie z samym procesem programowania, jakim jest TDD. Type Definition Document odnosi się do szczegółowego opisu typów danych używanych w aplikacji, co jest ważne, ale nie wpływa na proces tworzenia kodu i testowania. Z kolei Technical Design Document to dokument, który opisuje architekturę i techniczne aspekty projektu, ale nie stanowi podstawy dla praktyki TDD, w której testy są kluczowym elementem cyklu życia oprogramowania. Task Deployment Diagram to wizualizacja procesu wdrażania zadań w projekcie, co ma zastosowanie w zarządzaniu projektami, lecz nie odnosi się do samego wytwarzania oprogramowania. Takie nieporozumienia mogą wynikać z mylnego przekonania, że dokumentacja jest kluczowym elementem procesu programowania, co nie jest do końca prawdą. W rzeczywistości, TDD skupia się na iteracyjnym rozwoju poprzez testy, co prowadzi do lepszej jakości kodu, a jego podstawą jest koncepcja "testy przed kodem", a nie tworzenie dokumentacji czy schematów. Zrozumienie TDD jako podejścia programistycznego, które koncentruje się na testach, a nie na dokumentowaniu typu danych czy architektury, jest kluczowe dla właściwego podejścia do programowania w nowoczesnych projektach IT.

Pytanie 39

Która z poniższych technologii jest używana do tworzenia wykresów i animacji w przeglądarce?

A. JSON
B. SVG
C. XML
D. CSV
Odpowiedź SVG (Scalable Vector Graphics) jest prawidłowa, ponieważ jest to standardowy format grafiki wektorowej, który jest szeroko stosowany do tworzenia dynamicznych wykresów i animacji w przeglądarkach internetowych. SVG pozwala na łatwe skalowanie grafik bez utraty jakości, co czyni go idealnym wyborem do aplikacji internetowych, które muszą wyświetlać wykresy w różnych rozmiarach. Przykłady zastosowania SVG obejmują interaktywne wizualizacje danych, takie jak wykresy liniowe, słupkowe czy kołowe, które można zrealizować przy użyciu biblioteki JavaScript, takiej jak D3.js. Ponadto, SVG jest kompatybilne z CSS i JavaScript, co umożliwia stylizowanie oraz dodawanie interakcji do grafik. Warto również zauważyć, że SVG jest częścią specyfikacji HTML5, co podkreśla jego znaczenie w nowoczesnym tworzeniu stron internetowych. Dobrą praktyką jest także dbanie o dostępność i zapewnianie odpowiednich atrybutów, takich jak 'title' i 'desc', aby poprawić doświadczenie użytkowników niepełnosprawnych.

Pytanie 40

Który z języków programowania jest powszechnie stosowany do tworzenia interfejsów użytkownika przy użyciu XAML?

A. C#
B. Objective-C
C. C++
D. Java
C# to język programowania szeroko stosowany w tworzeniu aplikacji desktopowych, w tym do budowy interfejsów użytkownika przy użyciu XAML. XAML (Extensible Application Markup Language) to język znaczników wykorzystywany w środowisku WPF (Windows Presentation Foundation) oraz UWP (Universal Windows Platform) do projektowania graficznych interfejsów użytkownika. C# i XAML doskonale się uzupełniają, pozwalając na tworzenie nowoczesnych, interaktywnych aplikacji desktopowych, w których logika (C#) jest oddzielona od warstwy wizualnej (XAML). Dzięki tej separacji możliwe jest szybkie prototypowanie i łatwa rozbudowa aplikacji, co czyni je preferowanym wyborem dla deweloperów pracujących w ekosystemie Microsoftu.