Wyniki egzaminu

Informacje o egzaminie:
  • Zawód: Technik programista
  • Kwalifikacja: INF.04 - Projektowanie, programowanie i testowanie aplikacji
  • Data rozpoczęcia: 7 maja 2026 22:38
  • Data zakończenia: 7 maja 2026 22:51

Egzamin zdany!

Wynik: 31/40 punktów (77,5%)

Wymagane minimum: 20 punktów (50%)

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

Co to jest SQL injection?

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

Pytanie 2

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

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

Pytanie 3

Co to jest CORS (Cross-Origin Resource Sharing)?

A. Mechanizm bezpieczeństwa określający, które domeny mogą uzyskiwać dostęp do zasobów na serwerze
B. System zarządzania plikami statycznymi w aplikacjach SPA
C. Metoda kompresji danych w aplikacjach webowych
D. Protokół komunikacji między różnymi bazami danych
CORS, czyli Cross-Origin Resource Sharing, to mechanizm bezpieczeństwa, który pozwala kontrolować, które domeny mają dostęp do zasobów na serwerze. Jest to niezwykle ważne w kontekście aplikacji webowych, które często korzystają z zasobów z różnych źródeł. Dzięki CORS serwery mogą definiować, które domeny mogą wysyłać żądania HTTP i uzyskiwać odpowiedzi z ich zasobów. Na przykład, jeśli Twoja aplikacja webowa działa na domenie 'example.com', ale potrzebuje danych z API na 'api.example.org', CORS pozwala na skonfigurowanie serwera API, aby zezwalał na te żądania. CORS jest kluczowy dla bezpieczeństwa aplikacji, ponieważ zapobiega atakom typu cross-site scripting (XSS) i innym nieautoryzowanym dostępom. Praktyczne zastosowanie CORS wprowadza nagłówki HTTP, takie jak 'Access-Control-Allow-Origin', które informują przeglądarki, jakie domeny mają prawo do interakcji z danym zasobem. Korzystanie z CORS jest uznawane za dobrą praktykę w budowaniu bezpiecznych aplikacji webowych, co podkreśla znaczenie jego implementacji.

Pytanie 4

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

A. obiekt jest instancją klasy
B. obiekt pozwala na zdefiniowanie klasy
C. obiekt to typ złożony
D. obiekt oraz klasa są identyczne
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 5

Która z wymienionych zasad odnosi się do zachowania prywatności w sieci?

A. Przechowywanie haseł w wiadomościach e-mail
B. Publikowanie danych osobowych na otwartych platformach
C. Umieszczanie wszystkich zdjęć na platformach społecznościowych
D. Stosowanie pseudonimów zamiast rzeczywistych imion na mediach społecznościowych
Używanie pseudonimów zamiast prawdziwych imion na portalach społecznościowych jest jedną z podstawowych zasad ochrony prywatności w internecie. Dzięki temu ograniczasz możliwość identyfikacji i śledzenia Twojej aktywności przez osoby trzecie. Pseudonimy minimalizują ryzyko kradzieży tożsamości i redukują ilość danych osobowych dostępnych publicznie. To działanie jest szczególnie ważne dla dzieci i młodzieży, chroniąc ich przed cyberprzemocą i innymi zagrożeniami. W wielu serwisach można także dostosować ustawienia prywatności, ukrywając profil przed osobami spoza listy znajomych.

Pytanie 6

Jakie jest najważniejsze działanie w trakcie analizy wymagań klienta przed rozpoczęciem realizacji projektu aplikacji?

A. Stworzenie diagramu Gantta
B. Zrozumienie potrzeb biznesowych i oczekiwań klienta
C. Selekcja języka programowania
D. Rozdzielenie ról w zespole projektowym
Fajnie, że zauważyłeś, jak ważne jest zrozumienie potrzeb biznesowych i oczekiwań klienta. To kluczowa sprawa przed rozpoczęciem pracy nad projektem aplikacji. Bez tego, nawet najfajniejszy kod może nie spełniać wymagań, a to byłoby szkoda, prawda? Analiza wymagań to nie tylko rozpoznanie celów, ale też spotkania z osobami zaangażowanymi w projekt i zbadanie rynku. Dzięki temu możemy stworzyć aplikację, która naprawdę odpowiada na specyficzne potrzeby, co czyni ją bardziej użyteczną i konkurencyjną. No i oczywiście, jak dobrze określimy, czego potrzebują użytkownicy, to mniej nieporozumień po drodze, a klienci będą bardziej zadowoleni, co zawsze jest na plus.

Pytanie 7

Które z wymienionych narzędzi najlepiej chroni dane na urządzeniach mobilnych?

A. Szyfrowanie danych na urządzeniu
B. Hasło ustawione na urządzeniu
C. Zainstalowanie aplikacji rozrywkowych
D. Nieaktualne oprogramowanie
Szyfrowanie danych na urządzeniu przenośnym to jedna z najskuteczniejszych metod zabezpieczania poufnych informacji. Szyfrowanie przekształca dane w formę, która jest nieczytelna dla osób nieposiadających odpowiedniego klucza deszyfrującego. Dzięki temu, nawet jeśli urządzenie zostanie zgubione lub skradzione, dane pozostają zabezpieczone przed nieautoryzowanym dostępem. Szyfrowanie to standardowa praktyka stosowana przez największe firmy technologiczne i jest zalecana we wszystkich urządzeniach przenośnych, takich jak laptopy i smartfony.

Pytanie 8

Jakie jest oznaczenie normy międzynarodowej?

A. CE
B. PN
C. ISO
D. EN
PN (Polska Norma) to krajowy odpowiednik norm, który dotyczy produktów i usług w Polsce – nie jest to oznaczenie międzynarodowe. EN (European Norm) to europejskie standardy, które są stosowane na poziomie Unii Europejskiej i nie mają statusu globalnego. Oznaczenie CE (Conformité Européenne) wskazuje, że produkt spełnia wymagania dyrektyw unijnych dotyczących bezpieczeństwa, zdrowia i ochrony środowiska, jednak nie jest to norma międzynarodowa, lecz certyfikat obowiązujący na terenie UE.

Pytanie 9

Wykorzystując jeden z dwóch zaprezentowanych sposobów inkrementacji w językach z rodziny C lub Java, można zauważyć, że
Zapis pierwszy:

b = a++;
Zapis drugi:
b = ++a;
A. Wartość zmiennej b będzie wyższa po użyciu drugiego zapisu w porównaniu do pierwszego.
B. Bez względu na zastosowany sposób, w zmiennej b zawsze uzyskamy ten sam rezultat.
C. Drugi zapis nie jest zgodny ze składnią, co doprowadzi do błędów kompilacji.
D. Tylko przy użyciu pierwszego zapisu zmienna a zostanie zwiększona o 1.
Drugi zapis nie jest niezgodny ze składnią – zarówno preinkrementacja, jak i postinkrementacja są w pełni zgodne z zasadami języka i nie powodują błędów kompilacji. Niezależnie od wybranego zapisu, zmienna zostanie zwiększona, lecz kluczowa różnica polega na tym, kiedy dokładnie to następuje. Twierdzenie, że w każdym przypadku wynik będzie taki sam, jest błędne – różnice pojawiają się podczas użycia tych operatorów w bardziej złożonych wyrażeniach. Zapis pierwszy (preinkrementacja) nie jest jedynym sposobem na zwiększenie wartości zmiennej, chociaż w wielu sytuacjach jest preferowany ze względu na efektywność.

Pytanie 10

Jaki będzie wynik działania poniższego kodu JavaScript?

function foo() { console.log(a); var a = 1; console.log(a); } foo();
A. undefined, undefined
B. undefined, 1
C. ReferenceError, 1
D. 1, 1
Wynik działania podanego kodu to 'undefined, 1', co jest zgodne z zasadami hoisting w JavaScript. Kiedy funkcja 'foo' jest wywoływana, zmienna 'a' jest zadeklarowana przy użyciu 'var'. Zgodnie z zasadą hoisting, deklaracja zmiennej jest przenoszona na początek funkcji, ale przypisanie wartości następuje w miejscu, gdzie znajduje się kod. Dlatego, podczas pierwszego wywołania 'console.log(a)', 'a' nie ma jeszcze przypisanej wartości, co skutkuje wyświetleniem 'undefined'. Następnie, po przypisaniu '1' do 'a', w drugim 'console.log(a)' zmienna ta już ma wartość, więc wyświetlane jest '1'. Zrozumienie hoisting jest kluczowe dla programistów, ponieważ może wpływać na logikę działania kodu i prowadzić do błędów, jeśli nie jest odpowiednio uwzględnione. W praktyce powinno się unikać korzystania z hoisting, preferując inicjalizację zmiennych na początku funkcji, co zwiększa czytelność i utrzymanie kodu.

Pytanie 11

Jakie kroki należy podjąć, aby skutecznie zabezpieczyć dane na komputerze?

A. Nie używać kopii zapasowych
B. Przechowywać dane na niezabezpieczonych nośnikach przenośnych
C. Systematycznie aktualizować oprogramowanie i wykonywać kopie zapasowe
D. Dzielić się hasłami do plików z współpracownikami
Regularne aktualizowanie oprogramowania oraz tworzenie kopii zapasowych to kluczowe działania zapewniające bezpieczeństwo danych na komputerze. Aktualizacje łatają luki w zabezpieczeniach i eliminują błędy, które mogą zostać wykorzystane przez hakerów. Kopie zapasowe chronią dane przed utratą spowodowaną awarią sprzętu, atakiem ransomware lub przypadkowym usunięciem. Najlepszą praktyką jest przechowywanie kopii zapasowych w różnych miejscach – lokalnie i w chmurze – co dodatkowo zwiększa poziom zabezpieczenia przed nieprzewidzianymi sytuacjami.

Pytanie 12

Dokumentacja, która została przedstawiona, dotyczy algorytmu sortowania

To prosta metoda sortowania opierająca się na cyklicznym porównywaniu par sąsiadujących ze sobą elementów i zamianie ich miejscami w przypadku, kiedy kryterium porządkowe zbioru nie zostanie spełnione. Operacje te wykonywane są dopóki występują zmiany, czyli tak długo, aż cały zbiór zostanie posortowany.
A. przez wybór
B. bąbelkowe
C. szybkie (Quicksort)
D. przez wstawianie
Opisany w pytaniu algorytm to właśnie sortowanie bąbelkowe (ang. bubble sort). Polega ono na wielokrotnym przechodzeniu przez zbiór danych i zamienianiu miejscami sąsiadujących elementów, jeśli są w złej kolejności. Czynność ta powtarzana jest do momentu, gdy cały zbiór zostanie uporządkowany i żadne zamiany nie będą już potrzebne. Moim zdaniem, to chyba jeden z najbardziej intuicyjnych algorytmów sortowania, jakie się poznaje na początku nauki programowania – łatwo go zaimplementować, bo wymaga właściwie tylko dwóch pętli i porównania sąsiednich elementów. W praktyce bubble sort raczej rzadko używa się w profesjonalnych projektach, bo jego złożoność czasowa to O(n^2), co przy dużych zbiorach jest nieefektywne. Jednak czasami, na bardzo małych listach albo gdy szybko trzeba zrobić prosty prototyp, to można sięgnąć po „bąbelki”. Z mojego doświadczenia wynika też, że sortowanie bąbelkowe dobrze obrazuje podstawowe zasady algorytmiki, na przykład jak działa iteracja czy wymiana miejscami zmiennych – to przydatne w nauce. W wielu językach programowania, nawet tych nowoczesnych, można spotkać przykłady z bubble sort jako ilustrację podstaw. To taki klasyk – mało kto używa go zawodowo, ale każdy programista powinien wiedzieć, jak działa. Warto też pamiętać, że istnieją optymalizacje bubble sortu, np. wcześniejsze zakończenie, gdy w danej iteracji nie wystąpiła żadna zamiana. No i taka ciekawostka: choć algorytm nie jest specjalnie szybki, to bardzo łatwo go zaimplementować nawet w językach niskopoziomowych, bo nie wymaga dodatkowej pamięci.

Pytanie 13

Co to jest event bubbling w JavaScript?

A. Technika optymalizacji wydajności zdarzeń na stronie
B. System powiadomień o błędach w konsoli JavaScript
C. Proces, w którym zdarzenie zaczyna się od najbardziej szczegółowego elementu i propaguje w górę hierarchii DOM
D. Metoda zarządzania kolejką zdarzeń w aplikacjach asynchronicznych
Event bubbling to kluczowy mechanizm w modelu zdarzeń JavaScript, który polega na tym, że gdy zdarzenie zostaje wywołane na danym elemencie DOM, propaguje się ono w górę hierarchii DOM, zaczynając od najniższego elementu (czyli elementu, który bezpośrednio wywołuje zdarzenie) i kierując się ku elementom nadrzędnym. To podejście umożliwia efektywne zarządzanie zdarzeniami, gdyż pozwala na przypisanie pojedynczej funkcji obsługi zdarzeń do elementu nadrzędnego, zamiast do każdego z podrzędnych elementów. Na przykład, jeśli mamy listę elementów <li> w <ul>, możemy ustawić jeden nasłuchiwacz zdarzeń na <ul>, co pozwoli na przechwytywanie kliknięć na wszystkich <li>, wykorzystując obiekt Event do określenia, który element został kliknięty. W praktyce, event bubbling przyczynia się do zmniejszenia liczby nasłuchiwaczy zdarzeń i optymalizacji wydajności aplikacji webowych, a także ułatwia organizację kodu. Warto również pamiętać o metodzie stopPropagation(), która może być używana, aby zatrzymać propagację zdarzenia, gdy zajdzie taka potrzeba. Zrozumienie event bubbling jest istotne w kontekście standardów W3C, które definiują zasady dla przetwarzania zdarzeń.

Pytanie 14

Co to jest lazy loading w kontekście ładowania obrazów na stronie?

A. Format przechowywania obrazów w pamięci podręcznej przeglądarki
B. Metoda kompresji obrazów przed wysłaniem na serwer
C. Protokół transferu obrazów między serwerem a przeglądarką
D. Technika ładowania obrazów dopiero w momencie, gdy stają się widoczne dla użytkownika
Zastosowanie metody kompresji obrazów przed wysłaniem na serwer jest często mylone z techniką lazy loading. Kompresja ma na celu zmniejszenie rozmiaru plików graficznych, co przyspiesza ich przesyłanie, ale nie ma nic wspólnego z opóźnionym ładowaniem, które jest kluczowe dla lazy loadingu. Kompresja polega na redukcji jakości obrazu, co może wpłynąć na jego wygląd, ale nie zmienia faktu, że wszystkie obrazy są ładowane jednocześnie, co może obciążać łącze. Kolejnym błędnym rozumowaniem jest mylenie lazy loadingu z formatem przechowywania obrazów w pamięci podręcznej przeglądarki. Pamięć podręczna działa na zasadzie zapisywania zasobów, aby przyspieszyć ich ponowne ładowanie, ale nie decyduje o tym, kiedy obraz ma być załadowany. Ostatnia koncepcja, dotycząca protokołu transferu obrazów, również jest niepoprawna. Protokół transferu dotyczy metod przesyłania danych pomiędzy serwerem a klientem, ale nie ma bezpośredniego związku z techniką lazy loading. Istotne jest zrozumienie, że lazy loading to nie tylko technika, ale także strategia optymalizacji, a nie każdy aspekt ładowania zasobów wiąże się z tą metodą. Wydaje się, że mylenie tych pojęć wynika z ogólnej nieznajomości zasad działania sieci i efektywności aplikacji internetowych.

Pytanie 15

Jak wygląda kod uzupełnienia do dwóch dla liczby -5 w formacie binarnym przy użyciu 8 bitów?

A. 10000101
B. 11111101
C. 11111011
D. 00000101
Aby obliczyć kod uzupełnieniowy do dwóch dla liczby -5 w zapisie binarnym na 8 bitach, należy najpierw przedstawić liczbę 5 w postaci binarnej, co daje 00000101. Zgodnie z zasadą uzupełnienia do dwóch, aby uzyskać reprezentację liczby ujemnej, najpierw inwertujemy wszystkie bity tej liczby. Inwersja 00000101 prowadzi do 11111010. Następnie dodajemy 1 do wyniku inwersji: 11111010 + 1 = 11111011. Ostatecznie, kod uzupełnieniowy do dwóch dla -5 na 8 bitach to 11111011. Ta metoda jest powszechnie stosowana w systemach komputerowych i umożliwia efektywne operacje arytmetyczne na liczbach całkowitych, w tym na liczbach ujemnych, co jest kluczowe w kontekście programowania i projektowania systemów. Warto zaznaczyć, że standardy takie jak IEEE 754 definiują zasady reprezentacji liczb zmiennoprzecinkowych, ale w przypadku liczb całkowitych, kod uzupełnieniowy do dwóch pozostaje standardem w większości architektur komputerowych.

Pytanie 16

Która z wymienionych właściwości odnosi się do klasy pochodnej?

A. Nie ma możliwości dodawania nowych metod
B. Nie może być zastosowana w strukturze dziedziczenia
C. Dziedziczy atrybuty i metody z klasy bazowej
D. Jest automatycznie usuwana po zakończeniu działania programu
Stwierdzenie, że klasa pochodna nie może dodawać nowych metod, jest błędne – klasy pochodne mogą dodawać nowe metody, które rozszerzają funkcjonalność klasy bazowej. Automatyczne usuwanie klasy po zakończeniu programu dotyczy obiektów klasy, a nie samej klasy – za usuwanie obiektów odpowiada destruktor. Klasa, która nie może być używana w hierarchii dziedziczenia, to klasa oznaczona jako 'final' (w C++) lub 'sealed' (w C#), ale standardowe klasy pochodne nie mają tego ograniczenia, chyba że zostanie to jawnie zadeklarowane.

Pytanie 17

Jak oddziaływanie monotonnego środowiska pracy może wpłynąć na organizm człowieka?

A. Wzrost poziomu motywacji
B. Obniżenie koncentracji oraz zwiększone ryzyko popełniania błędów
C. Poprawa kondycji fizycznej
D. Zwiększenie odporności na stres
Kiedy w pracy ciągle powtarzamy te same czynności, to może nas to naprawdę zniechęcać. Zauważyłem, że takie monotonne środowisko potrafi sprawić, że gorzej się skupiamy i łatwiej popełniamy błędy. Jeśli pracownicy cały czas robią to samo bez żadnych zmian, to szybko tracą zapał i nie są zadowoleni z tego, co robią. Moim zdaniem, warto czasem zmieniać zadania, żeby wprowadzić trochę świeżości i wyzwań. Dobrze jest też organizować przerwy, bo to pomaga nabrać energii oraz zadbać o fajną atmosferę w pracy.

Pytanie 18

Jakie jest podstawowe zadanie wykorzystania frameworka Node.js w aplikacjach internetowych?

A. Kreowanie graficznego interfejsu użytkownika
B. Weryfikacja API
C. Budowanie aplikacji mobilnych
D. Zarządzanie aplikacjami serwerowymi i realizacja przetwarzania asynchronicznego
Node.js to w zasadzie takie środowisko, które pozwala na uruchamianie JavaScriptu na serwerze. Dzięki temu można budować różne aplikacje serwerowe i radzić sobie z asynchronicznym przetwarzaniem. Fajnie, że Node.js może obsługiwać wiele połączeń jednocześnie, co sprawia, że nadaje się do aplikacji, które mają dużo użytkowników, jak czaty czy różne API. Jest to dość wydajne rozwiązanie dzięki architekturze opartej na zdarzeniach, więc nie zajmuje za dużo zasobów. Co ciekawe, używając Node.js, można pisać kod zarówno na serwerze, jak i na kliencie, co jest naprawdę dużą oszczędnością czasu.

Pytanie 19

Jakie jest podstawowe użycie metod wirtualnych?

A. Zapewnienie, że metoda działa wyłącznie na danych statycznych
B. Umożliwienie korzystania z metod bezpośrednio z klasy bazowej
C. Umożliwienie dynamicznego wiązania metod w czasie wykonania
D. Umożliwienie wielokrotnego dziedziczenia
Metody wirtualne umożliwiają dynamiczne wiązanie metod w czasie wykonywania programu (ang. runtime). Oznacza to, że wywołanie metody zależy od rzeczywistego typu obiektu, a nie od typu wskaźnika lub referencji, za pomocą której został on wywołany. Mechanizm ten pozwala na implementację polimorfizmu, który jest jednym z kluczowych filarów programowania obiektowego. Dzięki metodom wirtualnym można uzyskać elastyczność i rozszerzalność kodu, umożliwiając klasom pochodnym dostarczanie własnych wersji metod zdefiniowanych w klasie bazowej. To prowadzi do bardziej zorganizowanego i skalowalnego kodu, ponieważ nowe funkcjonalności można dodawać, rozszerzając istniejące klasy, zamiast modyfikować kod bazowy.

Pytanie 20

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

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

Pytanie 21

W jakim języku został stworzony framework Angular?

A. C#
B. Typescript
C. Postscript
D. PHP
Angular został stworzony w języku TypeScript, który to w sumie można uznać za rozszerzenie JavaScriptu – dodaje on typowanie statyczne i sporo udogodnień znanych z języków obiektowych. Moim zdaniem to był strzał w dziesiątkę, bo dzięki temu kod aplikacji Angular jest czytelniejszy, łatwiejszy w utrzymaniu i mniej podatny na takie typowe błędy, które się pojawiały w czystym JS. W praktyce, kiedy piszesz komponenty czy serwisy w Angularze, natychmiast korzystasz z silnych typów, interfejsów czy mechanizmów takich jak dekoratory. To nie tylko poprawia bezpieczeństwo kodu, ale też pomaga zespołom programistycznym lepiej się dogadywać i szybciej wdrażać nowe funkcjonalności. Przemysł poszedł tą drogą, bo TypeScript daje lepsze wsparcie narzędziowe, np. podpowiedzi w edytorach, refaktoryzację czy automatyczne wykrywanie błędów. Wbrew pozorom, nie jest trudno się przestawić z JS na TS – nawet dla osób, które programowały wcześniej tylko w czystym JavaScript. Poza tym, Angular to nie tylko framework do weba – aplikacje tworzone w TypeScript można kompilować na różne platformy, co jest już praktyką w dużych firmach. Takie podejście wpisuje się w obecne trendy w branży, gdzie typowanie i czytelność kodu to podstawa.

Pytanie 22

Jakie zagrożenie związane z użytkowaniem cyberprzestrzeni ma wpływ na zdrowie fizyczne?

A. Uzależnienie od gier komputerowych
B. Rozpowszechnianie nieprawdziwych informacji
C. Depresja spowodowana cyberprzemocą
D. Problemy z kręgosłupem wynikające z długotrwałego siedzenia
Problemy z kręgosłupem wynikające z długotrwałego siedzenia to realne zagrożenie związane z użytkowaniem cyberprzestrzeni, które ewidentnie wpływa na zdrowie fizyczne. Dzisiaj, gdy większość naszej pracy, nauki czy rozrywki przenosi się do internetu, coraz częściej zapominamy o tym, że wielogodzinne siedzenie przed komputerem czy z telefonem w ręku odbija się na naszym ciele. Sam kiedyś miałem tak, że po kilku dniach intensywnej nauki online zaczęły mnie boleć plecy i kark. To typowy objaw, bo siedzenie w nieprawidłowej pozycji prowadzi do przeciążenia kręgosłupa, zwłaszcza w odcinku lędźwiowym i szyjnym. Branża IT już od lat podkreśla konieczność stosowania ergonomicznych stanowisk pracy – odpowiednie krzesło, wysokość monitora, przerwy co 45 minut. Standardy BHP bardzo mocno akcentują takie aspekty, zwłaszcza przy pracy zdalnej. Fajnie jest też stosować technikę 20-20-20, czyli co 20 minut patrzymy przez 20 sekund na coś oddalonego o 20 stóp, żeby dać odpocząć oczom i kręgosłupowi. Takie rzeczy naprawdę robią różnicę. Moim zdaniem, wielu ludzi lekceważy ten temat, a skutki siedzącego trybu życia mogą być odczuwalne już po kilku miesiącach. Warto więc od razu wyrobić sobie zdrowe nawyki – to inwestycja w siebie.

Pytanie 23

Jakie narzędzie służy do zarządzania wersjami?

A. Trello
B. Bugzilla
C. Jira
D. Git
Dokładnie tak – Git to obecnie najpopularniejsze narzędzie do zarządzania wersjami kodu źródłowego. Wykorzystuje się go praktycznie w każdej większej firmie IT, a nawet w małych zespołach projektowych. Git pozwala śledzić wszelkie zmiany w projekcie, przywracać starsze wersje plików czy nawet łączyć pracę wielu osób nad tym samym kodem bez ryzyka konfliktów. Największą przewagą Gita nad starszymi systemami jak SVN jest rozproszony charakter – każdy programista ma lokalną kopię całej historii projektu i może pracować offline, a dopiero potem synchronizować zmiany. Z mojego doświadczenia przechodzenie na Gita wymaga chwili nauki, ale to narzędzie daje ogromną kontrolę nad kodem i bezpieczeństwo – nie ma się co bać eksperymentowania, bo zawsze można wrócić do wcześniejszej wersji. W praktyce, na przykład na Githubie czy GitLabie, Git jest podstawą do pracy zespołowej, code review i automatycznych testów. Warto też wspomnieć, że znajomość Gita jest już niemal wymaganiem na rynku pracy, nie tylko wśród programistów, ale też administratorów, testerów czy nawet projektantów dokumentacji. Generalnie, jeśli chodzi o zarządzanie wersjami – Git to złoty standard.

Pytanie 24

Który z paradygmatów programowania najbardziej akcentuje dziedziczenie oraz polimorfizm?

A. Programowanie proceduralne
B. Programowanie obiektowe
C. Programowanie funkcyjne
D. Programowanie strukturalne
Programowanie obiektowe (OOP) to paradygmat, który kładzie największy nacisk na dziedziczenie i polimorfizm. Dziedziczenie pozwala na tworzenie nowych klas na podstawie już istniejących, co umożliwia ponowne wykorzystanie kodu i jego rozszerzanie. Polimorfizm umożliwia definiowanie metod o tej samej nazwie, ale z różnym zachowaniem w zależności od kontekstu lub obiektu, co zwiększa elastyczność i modularność kodu. Programowanie obiektowe jest szeroko stosowane w językach takich jak Java, C++, Python czy C#, ponieważ pozwala na budowanie skalowalnych i łatwych w utrzymaniu aplikacji.

Pytanie 25

Które z wymienionych działań zwiększa bezpieczeństwo transakcji online?

A. Nieaktualizowanie oprogramowania przeglądarki
B. Zastosowanie publicznego Wi-Fi do logowania się na konto bankowe
C. Weryfikowanie certyfikatów SSL na stronach zajmujących się transakcjami
D. Udostępnianie informacji o karcie kredytowej w e-mailach
Sprawdzanie certyfikatów SSL na stronach transakcyjnych to jeden z najważniejszych kroków w zapewnieniu bezpieczeństwa transakcji internetowych. Certyfikat SSL szyfruje dane przesyłane między użytkownikiem a serwerem, chroniąc je przed przechwyceniem przez osoby trzecie. Adresy stron z certyfikatem SSL zaczynają się od 'https', co wskazuje na bezpieczne połączenie. Certyfikaty SSL zapewniają integralność danych i są podstawą dla każdej strony internetowej obsługującej płatności lub przechowującej dane użytkowników. Zignorowanie tej kwestii naraża użytkowników na ataki typu man-in-the-middle i phishing.

Pytanie 26

Wskaż fragment kodu, który stanowi realizację przedstawionego algorytmu w języku C++.

Kod 1
do {
  suma = suma + i;
} while (suma <= liczba);
cout << suma;
Kod 2
if (suma <= liczba) {
  suma = suma + i;
  i++;
}
else
  cout << suma;
Kod 3
for (i = suma; i <= liczba; i++)
  suma = suma + i;
else
  cout << suma;
Kod 4
while (suma <= liczba) {
  suma = suma + i;
  i++;
}
cout << suma;
Ilustracja do pytania
A. kod 4
B. kod 3
C. kod 1
D. kod 2
Wybrałeś fragment kodu, który faktycznie odwzorowuje logikę schematu blokowego: najpierw sprawdzamy warunek suma <= liczba, a dopiero gdy jest spełniony, wchodzimy do pętli, dodajemy i do zmiennej suma, inkrementujemy licznik i i wracamy do ponownego sprawdzenia warunku. To jest klasyczne zastosowanie pętli while, czyli sytuacji, kiedy nie znamy liczby iteracji z góry, ale wiemy, kiedy mamy skończyć – w tym wypadku, gdy suma przekroczy wartość graniczną liczba. Z mojego doświadczenia właśnie tak wygląda typowy fragment kodu sumujący kolejne liczby naturalne, dopóki nie zostanie osiągnięty limit. Ważne jest też to, że instrukcja wypisania wyniku znajduje się dopiero za pętlą, więc zostanie wykonana dokładnie raz, po zakończeniu obliczeń, co idealnie zgadza się z blokiem pisz suma na schemacie. W dobrych praktykach programistycznych zawsze pilnujemy, żeby warunek pętli dokładnie odpowiadał opisowi w algorytmie, a modyfikacja zmiennych sterujących, takich jak suma i i, była wykonywana wewnątrz pętli w spójny sposób. Taka konstrukcja jest potem łatwa w utrzymaniu, przeniesieniu do innych języków czy modyfikacji, na przykład można bez problemu zmienić warunek na suma < liczba albo dodać dodatkowe sprawdzenie, czy i nie rośnie za szybko. W praktycznych projektach, np. przy obliczaniu sum kontrolnych, limitów budżetowych, punktów gracza w grze, dokładnie taki wzorzec while warunek, obliczenia, inkrementacja, wypisz wynik pojawia się naprawdę często.

Pytanie 27

Wskaż kod, który jest funkcjonalnie równoważny zaprezentowanemu poniżej:

switch(nrTel) {
    case 999: opis = "Pogotowie"; break;
    case 998: opis = "Straż"; break;
    case 997: opis = "Policja"; break;
    default: opis = "Inny numer";
}
Kod 1.
with nrTel {
    if (999) opis = "Pogotowie";
    if (998) opis = "Straż";
    if (997) opis = "Policja";
    else opis = "Inny numer";
}
Kod 2.
if (nrTel == 999)
    opis = "Pogotowie";
else if (nrTel == 998)
    opis = "Straż";
else if (nrTel == 997)
    opis = "Policja";
else opis = "Inny numer";
Kod 3.
if (nrTel == 999)
    opis = "Pogotowie";
if (nrTel == 998)
    opis = "Straż";
if (nrTel == 997)
    opis = "Policja";
else
    opis = "Inny numer";
Kod 4.
Opis =
    if (nrTel == 999) => "Pogotowie";
    else if (nrTel == 998) => "Straż";
    else if (nrTel == 997) => "Policja";
    else => "Inny numer";
A. Kod 4.
B. Kod 3.
C. Kod 1.
D. Kod 2.
W tym przypadku Kod 2 jest dokładnym odpowiednikiem funkcjonalnym dla przedstawionej instrukcji switch. To, co tu widać, to klasyczna zamiana konstrukcji switch-case na strukturę if-else if-else, co jest bardzo częstą praktyką w programowaniu, szczególnie w językach, które nie zawsze posiadają rozbudowaną wersję switch. Kod 2 najpierw sprawdza, czy nrTel to 999, jeśli tak – przypisuje "Pogotowie" i nie sprawdza dalszych warunków. Jeśli nie, przechodzi do kolejnego warunku, czyli nrTel == 998, potem 997, w końcu domyślnie daje "Inny numer". Dokładnie tak samo to działało w switchu – tylko jeden warunek się wykonuje i reszta jest ignorowana, co ma znaczenie np. gdybyśmy później rozbudowywali logikę. Takie podejście jest czytelne, uniwersalne i zgodne z dobrymi praktykami kodowania – łatwo to refaktoryzować, debugować i utrzymywać. W wielu firmowych projektach spotkałem się z preferencją dla if-else zamiast switcha, jeśli liczba przypadków nie jest ogromna, bo łatwiej potem dołożyć dodatkowe warunki (np. złożone, nie tylko proste porównanie wartości). Fajnie też wiedzieć, że takie zamiany to podstawa przy migracji kodu między różnymi językami – nie każdy język ma identycznie działający switch. Moim zdaniem, umiejętność takiego przełożenia to dobra baza do nauki algorytmiki i lepszego rozumienia logiki sterowania przepływem kodu.

Pytanie 28

Jaką funkcję pełni operator "|" w języku C++?

A. Bitowe "lub"
B. Logiczne "lub"
C. Operację przesunięcia bitów w prawo
D. Bitowe "xor"
Operator `||` to operator logiczny `OR`, który działa na wartościach logicznych i zwraca `true`, jeśli przynajmniej jeden z operandów jest prawdziwy, ale nie operuje na poziomie bitów. Operator `^` to operator `XOR` (exclusive or), który zwraca `1` tylko wtedy, gdy jeden z operandów ma wartość `1`, a drugi `0`. Operator `>>` to operator przesunięcia bitowego w prawo, który przesuwa bity liczby w prawo o określoną liczbę miejsc, co skutkuje podzieleniem liczby przez potęgę dwójki. Każdy z tych operatorów działa inaczej niż `|`, który jest operatorem bitowego `OR`.

Pytanie 29

Algorytm zaprezentowany w zadaniu można zrealizować w języku Java wykorzystując instrukcję

Ilustracja do pytania
A. try
B. switch
C. while
D. if
Pętla while w języku Java jest idealna do implementacji algorytmów, które wymagają wielokrotnego wykonywania bloku kodu dopóki określony warunek logiczny pozostaje prawdziwy. W przedstawionym schemacie blokowym widzimy iteracyjny proces, który zaczyna się od przypisania wartości 2 do zmiennej number, a następnie kontynuuje dodawanie 2 do tej zmiennej tak długo, jak długo jej wartość nie osiągnie 10. Struktura ta jest typowym przykładem problemu, który najlepiej rozwiązać za pomocą pętli while. Wyrażenie warunkowe number != 10 jest sprawdzane przed każdą iteracją pętli, co umożliwia zakończenie pętli w momencie, gdy warunek przestaje być prawdziwy. To podejście jest zgodne z dobrymi praktykami programistycznymi, które zalecają minimalizowanie niepotrzebnych obliczeń i zwiększanie czytelności kodu. Pętle while są często stosowane w sytuacjach, gdy liczba iteracji nie jest z góry znana i zależy od dynamicznie zmieniających się warunków, co czyni je wszechstronnym narzędziem w wielu aplikacjach, od przetwarzania danych po kontrolę przepływu w symulacjach komputerowych. Praktyczna znajomość pętli pozwala na efektywne rozwiązywanie problemów w złożonych projektach informatycznych.

Pytanie 30

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

A. kod Java
B. kod XML
C. obsługa przycisku ekranu dotykowego
D. obsługa wciśniętego przycisku
Często można się pomylić, sądząc, że narzędzia do projektowania interfejsów użytkownika generują od razu kod w takich językach jak Java czy implementują obsługę konkretnych zdarzeń, np. wciśnięcia przycisku. Z mojego doświadczenia wynika, że to jeden z najczęstszych błędów myślowych na początku nauki programowania. W praktyce, narzędzia typu drag&drop koncentrują się na warstwie prezentacyjnej – opisują, jak mają wyglądać poszczególne elementy, ale nie zajmują się logiką działania. Kod Java albo inny kod źródłowy odpowiedzialny za obsługę zdarzeń czy funkcjonalności aplikacji musi być dopisany ręcznie przez programistę. Automatyczne generowanie kodu logicznego przez edytory graficzne jest raczej niezalecane, bo prowadzi do trudnego w utrzymaniu kodu i sprawia, że aplikacja traci na przejrzystości. Jeśli chodzi o obsługę wciśnięcia przycisku czy przycisku ekranu dotykowego, to są to akcje, które definiuje się później w kodzie źródłowym – na przykład poprzez implementację listenerów w kodzie Java w Androidzie albo przez bindingi w innych frameworkach. Te narzędzia mają za zadanie generować opis struktury interfejsu, a nie jego zachowanie. Często spotyka się też przekonanie, że to właśnie kod Java stanowi podstawę aplikacji – oczywiście to prawda, ale nie w kontekście automatycznego generowania przez narzędzia graficzne; one skupiają się na XML, który jest dużo bardziej uniwersalny do takich celów. Moim zdaniem najlepszą praktyką jest wyraźne oddzielenie warstwy prezentacji (np. XML) od logiki biznesowej i ręcznego kodowania zdarzeń, bo to pozwala na wygodne rozwijanie i utrzymywanie aplikacji, szczególnie w większych zespołach.

Pytanie 31

Który z wymienionych elementów stanowi przykład zbiorowej ochrony?

A. Okulary ochronne
B. Kask ochronny
C. Zatyczki do uszu
D. Ekran akustyczny
Zatyczki do uszu, okulary ochronne i kaski ochronne to środki ochrony indywidualnej, które chronią pojedynczego pracownika przed zagrożeniami. Środki ochrony indywidualnej są stosowane, gdy nie można w pełni wyeliminować zagrożenia za pomocą ochrony zbiorowej. Choć są skuteczne, ich działanie ogranicza się do osób, które je noszą, co oznacza, że zagrożenie nadal istnieje w środowisku pracy dla pozostałych pracowników.

Pytanie 32

Metodyka zwinna (ang. agile) opiera się na

A. podzieleniu projektu na kolejne etapy: planowanie, programowanie, testowanie, z ciągłym oszacowaniem ryzyka projektu
B. przygotowaniu testów dla całego projektu, a następnie wprowadzaniu kolejnych jego fragmentów
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
Podejście kaskadowe (waterfall) zakłada podział projektu na kolejne etapy (projekt, programowanie, testy), ale nie dopuszcza powrotu do wcześniejszych faz, co czyni je mniej elastycznym niż agile. Projektowanie całej aplikacji na początku jest charakterystyczne dla tradycyjnych metodyk, takich jak V-model, ale nie odzwierciedla idei iteracyjnego rozwoju stosowanego w agile. Implementowanie testów po zakończeniu całości projektu ogranicza możliwość szybkiego reagowania na błędy i jest sprzeczne z filozofią agile, gdzie testy są integralną częścią każdego etapu iteracji.

Pytanie 33

Jakie znaczenie ma krajowa normalizacja dla produktów i usług?

A. Gwarantuje lepszą zgodność oraz jakość
B. Restrukcjonuje innowacje technologiczne
C. Usuwa konieczność przeprowadzania kontroli jakości
D. Ogranicza liczbę dostępnych towarów
Normalizacja krajowa to świetny sposób na to, żeby produkty i usługi były bardziej spójne i lepszej jakości. Kiedy mamy standardy, to producenci mogą robić rzeczy, które są zgodne z wymaganiami technicznymi. To z kolei sprawia, że konsumenci mogą bardziej ufać produktom, a ryzyko, że coś będzie wadliwe, spada. Dzięki normalizacji zwiększa się bezpieczeństwo, poprawia interoperacyjność, a to wszystko wspiera rozwój technologiczny. No i jest jeszcze to, że łatwiej jest wymieniać produkty między różnymi rynkami, co ma pozytywny wpływ na całą gospodarkę.

Pytanie 34

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

A. Ilość linii kodu programu
B. Metoda alokacji pamięci dla danych
C. Typ zastosowanego kompilatora
D. Narzędzia do analizy błędów
Sposób alokacji pamięci dla danych to kluczowy element projektowania zestawów danych, ponieważ wpływa na wydajność i efektywność programu. Dynamiczna alokacja pamięci pozwala na tworzenie struktur, których rozmiar jest zmienny i dostosowuje się w trakcie działania aplikacji. Dzięki temu programiści mogą optymalnie zarządzać zasobami systemowymi, unikając marnowania pamięci lub jej niedoboru. Wybór odpowiedniej metody alokacji, np. stosowanie wskaźników, dynamicznych tablic lub struktur danych takich jak lista czy mapa, pozwala na budowanie bardziej skalowalnych i elastycznych aplikacji.

Pytanie 35

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

A. Dependency Inversion Principle (Zasada odwrócenia zależności)
B. Single Responsibility Principle (Zasada pojedynczej odpowiedzialności)
C. Code Reuse Principle (Zasada ponownego użycia kodu)
D. Open/Closed Principle (Zasada otwarte/zamknięte)
Programowanie zgodne z zasadami SOLID jest kluczowym elementem w budowaniu oprogramowania o wysokiej jakości. Odpowiedzi takie jak Zasada ponownego użycia kodu mogą wydawać się atrakcyjne, jednak nie są częścią formalnego zbioru zasad SOLID. Zasady te skupiają się na aspektach architektury i projektowania kodu, które wspierają jego elastyczność i zrozumiałość. W rzeczywistości, zasada ponownego użycia kodu, choć istotna w praktyce, nie odnosi się bezpośrednio do celów osiąganych przez zasady SOLID. Wprowadzenie do projektu zasady, że każda klasa czy moduł powinny mieć wyłącznie jedną odpowiedzialność, jak przewiduje Zasada pojedynczej odpowiedzialności, może prowadzić do znacznie lepszego zrozumienia struktury kodu i ułatwić jego modyfikacje w przyszłości. Wiele osób błędnie interpretuje potrzebę ponownego użycia kodu jako priorytet, co może prowadzić do tworzenia monolitycznych klas, które są trudne do zarządzania. Ponadto, Zasada otwarte/zamknięte sugeruje, że komponenty powinny być otwarte na rozszerzenia, ale zamknięte na modyfikacje, co stanowi fundament dla stabilnego i skalowalnego oprogramowania. Ignorując te zasady, programiści mogą tworzyć kod, który jest trudny do zrozumienia i utrzymania, co w dłuższej perspektywie zwiększa koszty i ryzyko błędów.

Pytanie 36

Który z wymienionych elementów interfejsu użytkownika jest charakterystyczny dla aplikacji działającej na komputerze?

A. Routing
B. Przycisk (Button)
C. Strona HTML
D. API REST
Przycisk, czyli ten mały element, co go klikamy w aplikacjach, to naprawdę ważna część interfejsu. Używamy go, żeby coś zainicjować, na przykład zapisać dane czy wywołać jakąś funkcję. Fajnie, że można go dowolnie ustawiać – zmieniać wygląd, rozmiar, a nawet to, jak się zachowuje. Dzięki temu pasuje do każdej aplikacji. W dzisiejszych programach, jak WPF, te przyciski mogą mieć różne kolorowe ikony albo nawet animacje, co sprawia, że aplikacja wygląda super. Generalnie, bez przycisków użytkownik by się w aplikacji nie połapał, bo to dzięki nim możemy nawigować, zatwierdzać formularze czy otwierać nowe okna dialogowe.

Pytanie 37

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. Przycisk
D. ListView
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 38

Co to jest Webpack?

A. Narzędzie do budowania modułów i zarządzania zależnościami w aplikacjach JavaScript
B. Biblioteka do testowania kodu JavaScript
C. Framework JavaScript do tworzenia aplikacji mobilnych
D. System zarządzania bazami danych dla aplikacji Node.js
Webpack to zaawansowane narzędzie do budowania modułów, które znacząco ułatwia zarządzanie zależnościami w aplikacjach JavaScript. Umożliwia on zorganizowane łączenie różnych zasobów, takich jak skrypty JavaScript, style CSS, obrazy i inne pliki, w jeden lub kilka plików wyjściowych. Dzięki temu programiści mogą zoptymalizować czas ładowania aplikacji, minimalizując rozmiar plików i eliminując zbędne zapytania do serwera. Przykładowo, korzystając z Webpacka, można skonfigurować automatyczną kompresję kodu i zastosowanie technik takich jak kod dzielony (code splitting), co znacząco podnosi wydajność aplikacji. Dodatkowo, Webpack wspiera różne wtyczki i loadery, co pozwala na łatwą integrację z narzędziami do kompilacji, takimi jak Babel, umożliwiający użycie nowoczesnych funkcji JavaScript, które mogą nie być jeszcze wspierane przez wszystkie przeglądarki. Standardy branżowe kładą duży nacisk na efektywność i utrzymywalność kodu, a Webpack, będąc częścią ekosystemu JavaScript, skutecznie wspiera te zasady.

Pytanie 39

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

A. Odporność na awarie pojedynczych komponentów
B. Niezależne wdrażanie poszczególnych usług
C. Wspólna baza danych dla wszystkich usług
D. Autonomia zespołów rozwijających poszczególne usługi
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 40

Jakie narzędzie wspiera tworzenie aplikacji desktopowych?

A. WPF
B. Symfony
C. Angular
D. Xamarin
WPF, czyli Windows Presentation Foundation, to narzędzie, które zdecydowanie kojarzy się z aplikacjami desktopowymi na platformie Windows. Pozwala budować nowoczesne, bogate graficznie interfejsy użytkownika, wykorzystując deklaracyjny język XAML oraz logikę programistyczną w C#. Moim zdaniem WPF to nadal bardzo solidny wybór, jeśli chcemy robić rozbudowane aplikacje okienkowe, które muszą korzystać z możliwości systemu operacyjnego, takich jak obsługa plików, drukowanie czy integracja z innymi aplikacjami Windows. Co ciekawe, wielu dużych graczy rynkowych wciąż używa WPF w swoich rozwiązaniach – choćby aplikacje biurowe, narzędzia branżowe do projektowania graficznego, systemy zarządzania produkcją czy rozbudowane panele administracyjne. Osobiście doceniam fakt, że WPF pozwala stosować wzorzec MVVM, co w realnych projektach pomaga utrzymać kod w porządku i łatwo zarządzać złożonymi aplikacjami. No i jeszcze jedno – dzięki bogatej bazie komponentów oraz możliwości stylizacji, z WPF można wycisnąć naprawdę ciekawe UI. Warto też wiedzieć, że choć pojawiły się nowsze technologie (jak WinUI czy .NET MAUI), to w praktyce WPF jest nadal szeroko wspierany i rozwijany. Jeśli ktoś chce zacząć z aplikacjami desktopowymi na Windows, to moim zdaniem WPF to po prostu dobry start.